Compare commits
15
Commits
d17cfe9b83
...
79d252c1df
+294
-3
@@ -8,6 +8,7 @@ use crate::dto::{
|
|||||||
ParamDeclarationDto, LogsParams, ProfileSummaryDto, PromqlParams, SaveDashboardRequest,
|
ParamDeclarationDto, LogsParams, ProfileSummaryDto, PromqlParams, SaveDashboardRequest,
|
||||||
SettingsDto, TestAlertNotificationRequest, TimelineParams, UpdateAlertRuleRequest, UpdateSettingsRequest,
|
SettingsDto, TestAlertNotificationRequest, TimelineParams, UpdateAlertRuleRequest, UpdateSettingsRequest,
|
||||||
};
|
};
|
||||||
|
use crate::data_value::MetricPrimitiveKind;
|
||||||
use crate::engine::{
|
use crate::engine::{
|
||||||
DeclareMetricRequest, DeclareParamRequest, EngineHandle, EngineMessage, EngineQuery,
|
DeclareMetricRequest, DeclareParamRequest, EngineHandle, EngineMessage, EngineQuery,
|
||||||
EngineResponse,
|
EngineResponse,
|
||||||
@@ -55,6 +56,23 @@ impl ApiState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Counterpart to `persist_param_declaration` for `DELETE /api/params` (ticket 052): empties the
|
||||||
|
/// active profile's stored params so the just-cleared set doesn't reappear from `settings.json`
|
||||||
|
/// on next load. Same best-effort semantics — a no-op if no profile is active, I/O failures only
|
||||||
|
/// logged, since the engine-side clear (already applied by the time this runs) is the source of
|
||||||
|
/// truth for the running process.
|
||||||
|
fn persist_clear_params(&self) {
|
||||||
|
let mut settings = self.settings.lock().unwrap();
|
||||||
|
let Some(profile_name) = settings.active_profile.clone() else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
if let Err(err) = settings.clear_param_declarations(&self.settings_path, &profile_name) {
|
||||||
|
eprintln!(
|
||||||
|
"warning: failed to clear persisted param declarations for profile '{profile_name}': {err}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Same as `persist_param_declaration`, for metric declarations. Also promotes any of the
|
/// Same as `persist_param_declaration`, for metric declarations. Also promotes any of the
|
||||||
/// metric's referenced params that only exist as auto-derived engine state (see
|
/// metric's referenced params that only exist as auto-derived engine state (see
|
||||||
/// `promoted_param_records`) into persisted profile params, so a metric built against an
|
/// `promoted_param_records`) into persisted profile params, so a metric built against an
|
||||||
@@ -115,6 +133,21 @@ impl ApiState {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Best-effort, matching `persist_param_declaration`'s intent — a no-op if no profile is
|
||||||
|
/// active, and I/O failures are only logged, since the engine's removal is already the source
|
||||||
|
/// of truth for what the live process shows.
|
||||||
|
fn persist_metric_declaration_removal(&self, name: &str) {
|
||||||
|
let mut settings = self.settings.lock().unwrap();
|
||||||
|
let Some(profile_name) = settings.active_profile.clone() else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
if let Err(err) = settings.remove_metric_declaration(&self.settings_path, &profile_name, name) {
|
||||||
|
eprintln!(
|
||||||
|
"warning: failed to remove metric declaration '{name}' from profile '{profile_name}': {err}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn router(engine: EngineHandle, settings: SettingsHandle, settings_path: PathBuf) -> Router {
|
pub fn router(engine: EngineHandle, settings: SettingsHandle, settings_path: PathBuf) -> Router {
|
||||||
@@ -128,11 +161,11 @@ pub fn router(engine: EngineHandle, settings: SettingsHandle, settings_path: Pat
|
|||||||
.route("/api/logs", get(get_logs))
|
.route("/api/logs", get(get_logs))
|
||||||
.route("/api/timeline", get(get_timeline))
|
.route("/api/timeline", get(get_timeline))
|
||||||
.route("/api/stats", get(get_stats))
|
.route("/api/stats", get(get_stats))
|
||||||
.route("/api/params", get(list_params).post(declare_param))
|
.route("/api/params", get(list_params).post(declare_param).delete(clear_params))
|
||||||
.route("/api/metrics", get(list_metrics).post(declare_metric))
|
.route("/api/metrics", get(list_metrics).post(declare_metric))
|
||||||
.route(
|
.route(
|
||||||
"/api/metrics/{name}",
|
"/api/metrics/{name}",
|
||||||
get(get_metric_bucket_values).put(update_metric),
|
get(get_metric_bucket_values).put(update_metric).delete(delete_metric),
|
||||||
)
|
)
|
||||||
.route("/api/query", get(run_promql_query))
|
.route("/api/query", get(run_promql_query))
|
||||||
.route("/api/settings", get(get_settings).patch(update_settings))
|
.route("/api/settings", get(get_settings).patch(update_settings))
|
||||||
@@ -280,12 +313,61 @@ async fn get_stats(State(state): State<ApiState>) -> impl IntoResponse {
|
|||||||
|
|
||||||
async fn list_params(State(state): State<ApiState>) -> impl IntoResponse {
|
async fn list_params(State(state): State<ApiState>) -> impl IntoResponse {
|
||||||
match ask(&state.engine, EngineQuery::ParamDeclarations).await {
|
match ask(&state.engine, EngineQuery::ParamDeclarations).await {
|
||||||
Ok(EngineResponse::ParamDeclarations(declarations)) => Json(declarations).into_response(),
|
Ok(EngineResponse::ParamDeclarations(mut declarations)) => {
|
||||||
|
// `ottyl_seq`/`ottyl_ts`/`ottyl_fmt` (ticket 055) are computed line-locally rather than
|
||||||
|
// stored as index `ParamDeclaration` entries (see `crate::engine::declare_param`'s
|
||||||
|
// rejection of these names), so they're merged in here purely for discoverability
|
||||||
|
// rather than via `param_declarations_range`. This is deliberately a merge only in this
|
||||||
|
// one HTTP-facing listing, not in `EngineQuery::ParamDeclarations` itself — other
|
||||||
|
// internal callers of that query (promoting a metric's referenced params, replaying
|
||||||
|
// declarations on profile switch) must keep seeing only real, persistable entries.
|
||||||
|
declarations.extend(reserved_param_declaration_dtos());
|
||||||
|
Json(declarations).into_response()
|
||||||
|
}
|
||||||
Ok(_) => StatusCode::INTERNAL_SERVER_ERROR.into_response(),
|
Ok(_) => StatusCode::INTERNAL_SERVER_ERROR.into_response(),
|
||||||
Err(status) => status.into_response(),
|
Err(status) => status.into_response(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// `GET /api/params`-only synthesized entries for the three reserved names
|
||||||
|
/// (`crate::engine::OTTYL_RESERVED_PARAM_NAMES`) — see `list_params`. `message_match_regex`/
|
||||||
|
/// `capture_group` are empty since these are never text-extracted; `reserved: true` marks them as
|
||||||
|
/// non-deletable/non-editable, distinct from `auto_derived`.
|
||||||
|
fn reserved_param_declaration_dtos() -> [ParamDeclarationDto; 3] {
|
||||||
|
[
|
||||||
|
ParamDeclarationDto {
|
||||||
|
name: "ottyl_seq".to_string(),
|
||||||
|
message_match_regex: String::new(),
|
||||||
|
capture_group: String::new(),
|
||||||
|
json_field_path: None,
|
||||||
|
kind: MetricPrimitiveKind::Number,
|
||||||
|
elapsed_since_last: false,
|
||||||
|
auto_derived: false,
|
||||||
|
reserved: true,
|
||||||
|
},
|
||||||
|
ParamDeclarationDto {
|
||||||
|
name: "ottyl_ts".to_string(),
|
||||||
|
message_match_regex: String::new(),
|
||||||
|
capture_group: String::new(),
|
||||||
|
json_field_path: None,
|
||||||
|
kind: MetricPrimitiveKind::Timestamp,
|
||||||
|
elapsed_since_last: false,
|
||||||
|
auto_derived: false,
|
||||||
|
reserved: true,
|
||||||
|
},
|
||||||
|
ParamDeclarationDto {
|
||||||
|
name: "ottyl_fmt".to_string(),
|
||||||
|
message_match_regex: String::new(),
|
||||||
|
capture_group: String::new(),
|
||||||
|
json_field_path: None,
|
||||||
|
kind: MetricPrimitiveKind::String,
|
||||||
|
elapsed_since_last: false,
|
||||||
|
auto_derived: false,
|
||||||
|
reserved: true,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
async fn declare_param(
|
async fn declare_param(
|
||||||
State(state): State<ApiState>,
|
State(state): State<ApiState>,
|
||||||
Json(body): Json<DeclareParamRequest>,
|
Json(body): Json<DeclareParamRequest>,
|
||||||
@@ -313,6 +395,7 @@ async fn declare_param(
|
|||||||
// A request that reached here was accepted by `declare_param`, which always stores
|
// A request that reached here was accepted by `declare_param`, which always stores
|
||||||
// it as non-auto (see `engine::declare_param`).
|
// it as non-auto (see `engine::declare_param`).
|
||||||
auto_derived: false,
|
auto_derived: false,
|
||||||
|
reserved: false,
|
||||||
};
|
};
|
||||||
(StatusCode::CREATED, Json(dto)).into_response()
|
(StatusCode::CREATED, Json(dto)).into_response()
|
||||||
}
|
}
|
||||||
@@ -321,6 +404,25 @@ async fn declare_param(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// `DELETE /api/params` (ticket 052): clears every declared param (manual and auto-derived) and
|
||||||
|
/// immediately re-derives whatever `auto_declare_params` can still find in log text the engine
|
||||||
|
/// still retains. The response body's `logs_considered` tells the caller how many retained lines
|
||||||
|
/// were re-scanned, so the UI can make clear that lines evicted by `max_logs` before this ran
|
||||||
|
/// can't regain their params — this is expected behavior, not a partial failure.
|
||||||
|
async fn clear_params(State(state): State<ApiState>) -> impl IntoResponse {
|
||||||
|
let (respond_to, response) = oneshot::channel();
|
||||||
|
if state.engine.send(EngineMessage::ClearParams { respond_to }).await.is_err() {
|
||||||
|
return StatusCode::SERVICE_UNAVAILABLE.into_response();
|
||||||
|
}
|
||||||
|
match response.await {
|
||||||
|
Ok(result) => {
|
||||||
|
state.persist_clear_params();
|
||||||
|
Json(result).into_response()
|
||||||
|
}
|
||||||
|
Err(_) => StatusCode::SERVICE_UNAVAILABLE.into_response(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async fn list_metrics(State(state): State<ApiState>) -> impl IntoResponse {
|
async fn list_metrics(State(state): State<ApiState>) -> impl IntoResponse {
|
||||||
match ask(&state.engine, EngineQuery::MetricDeclarations).await {
|
match ask(&state.engine, EngineQuery::MetricDeclarations).await {
|
||||||
Ok(EngineResponse::MetricDeclarations(declarations)) => Json(declarations).into_response(),
|
Ok(EngineResponse::MetricDeclarations(declarations)) => Json(declarations).into_response(),
|
||||||
@@ -395,6 +497,35 @@ async fn update_metric(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Deletes the metric declaration named by the URL path — both from the live engine index and,
|
||||||
|
/// if a profile is active, from persisted settings (ticket 051), so it doesn't reappear on
|
||||||
|
/// restart. Its recorded bucket-value history is purged along with it (see the comment on
|
||||||
|
/// `EngineMessage::RemoveMetricDeclaration`'s handler in `engine.rs`), rather than left orphaned,
|
||||||
|
/// so a dashboard panel or PromQL query still referencing the metric by name fails with a clear
|
||||||
|
/// "unknown metric" error instead of silently keeping stale data alive.
|
||||||
|
async fn delete_metric(
|
||||||
|
State(state): State<ApiState>,
|
||||||
|
AxumPath(name): AxumPath<String>,
|
||||||
|
) -> impl IntoResponse {
|
||||||
|
let (respond_to, response) = oneshot::channel();
|
||||||
|
if state
|
||||||
|
.engine
|
||||||
|
.send(EngineMessage::RemoveMetricDeclaration { name: name.clone(), respond_to })
|
||||||
|
.await
|
||||||
|
.is_err()
|
||||||
|
{
|
||||||
|
return StatusCode::SERVICE_UNAVAILABLE.into_response();
|
||||||
|
}
|
||||||
|
match response.await {
|
||||||
|
Ok(true) => {
|
||||||
|
state.persist_metric_declaration_removal(&name);
|
||||||
|
StatusCode::NO_CONTENT.into_response()
|
||||||
|
}
|
||||||
|
Ok(false) => StatusCode::NOT_FOUND.into_response(),
|
||||||
|
Err(_) => StatusCode::SERVICE_UNAVAILABLE.into_response(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Malformed pairs (no `=`) are skipped rather than rejected.
|
/// Malformed pairs (no `=`) are skipped rather than rejected.
|
||||||
fn parse_labels_filter(raw: &str) -> BTreeMap<String, String> {
|
fn parse_labels_filter(raw: &str) -> BTreeMap<String, String> {
|
||||||
raw.split(',')
|
raw.split(',')
|
||||||
@@ -937,6 +1068,60 @@ mod tests {
|
|||||||
assert_eq!(body["capture_group"], "level");
|
assert_eq!(body["capture_group"], "level");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Ticket 052's core acceptance criteria: `DELETE /api/params` removes every declared param
|
||||||
|
/// (manual and auto-derived), that removal survives a reload of persisted settings, and —
|
||||||
|
/// without any new line being ingested — the retained `IngestedLog` entries immediately
|
||||||
|
/// re-derive a fresh (auto-derived) param set.
|
||||||
|
#[tokio::test]
|
||||||
|
async fn clearing_params_persists_and_reextracts_from_retained_logs() {
|
||||||
|
let (app, engine, settings_handle, dir) = test_app();
|
||||||
|
|
||||||
|
let settings_path = dir.path().join("settings.json");
|
||||||
|
{
|
||||||
|
let mut settings = settings_handle.lock().unwrap();
|
||||||
|
settings.create_profile(&settings_path, "web".to_string()).unwrap();
|
||||||
|
settings.set_active_profile(&settings_path, Some("web".to_string())).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
// A manual declaration plus an auto-derived one (from ingesting a logfmt line before "path" is declared).
|
||||||
|
declare_test_param(&app, "path", r"request path=(?P<path>\S+)", "path", "string").await;
|
||||||
|
ingest_lines(&engine, 0, &["request path=/a", "level=info x=1"]).await;
|
||||||
|
|
||||||
|
let (_, before) = get_json(&app, "/api/params").await;
|
||||||
|
// Ticket 055 merges the three non-deletable `ottyl_*` reserved names into this listing
|
||||||
|
// too; `DELETE /api/params` (ticket 052) only ever clears real declarations, so the
|
||||||
|
// reserved ones must be excluded from the "everything got removed" count below.
|
||||||
|
let before_declared: Vec<&str> = before
|
||||||
|
.as_array()
|
||||||
|
.unwrap()
|
||||||
|
.iter()
|
||||||
|
.filter(|p| p["reserved"] != true)
|
||||||
|
.map(|p| p["name"].as_str().unwrap())
|
||||||
|
.collect();
|
||||||
|
assert!(before_declared.contains(&"path"));
|
||||||
|
assert!(before_declared.contains(&"level"));
|
||||||
|
assert!(before_declared.contains(&"x"));
|
||||||
|
|
||||||
|
let (status, result) = send_json(&app, "DELETE", "/api/params", json!({})).await;
|
||||||
|
assert_eq!(status, StatusCode::OK);
|
||||||
|
assert_eq!(result["removed"], before_declared.len() as u64);
|
||||||
|
// Re-derived without any new ingest — same three keys come back, now all auto-derived.
|
||||||
|
assert_eq!(result["reextracted"], 3);
|
||||||
|
assert_eq!(result["logs_considered"], 2);
|
||||||
|
|
||||||
|
let (_, after) = get_json(&app, "/api/params").await;
|
||||||
|
let after_declared: Vec<_> =
|
||||||
|
after.as_array().unwrap().iter().filter(|p| p["reserved"] != true).collect();
|
||||||
|
assert_eq!(after_declared.len(), 3);
|
||||||
|
assert!(after_declared.iter().all(|p| p["auto_derived"] == true));
|
||||||
|
|
||||||
|
// The clear persisted: "path" (the only manually-declared, profile-stored param) doesn't
|
||||||
|
// reappear from settings.json on a fresh load.
|
||||||
|
let reloaded_settings = Settings::load(&settings_path);
|
||||||
|
let profile = reloaded_settings.profile("web").unwrap();
|
||||||
|
assert!(profile.params.is_empty());
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn rejects_invalid_param_regex_with_400_and_error_body() {
|
async fn rejects_invalid_param_regex_with_400_and_error_body() {
|
||||||
let (app, _engine, _settings, _dir) = test_app();
|
let (app, _engine, _settings, _dir) = test_app();
|
||||||
@@ -1106,6 +1291,112 @@ mod tests {
|
|||||||
assert!(body["error"].as_str().unwrap().contains("duration"));
|
assert!(body["error"].as_str().unwrap().contains("duration"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn deletes_metric_and_it_disappears_from_the_list() {
|
||||||
|
let (app, _engine, _settings, _dir) = test_app();
|
||||||
|
send_json(
|
||||||
|
&app,
|
||||||
|
"POST",
|
||||||
|
"/api/metrics",
|
||||||
|
json!({
|
||||||
|
"name": "requests",
|
||||||
|
"message_match_regex": r"request path=(?P<path>\S+)",
|
||||||
|
"label_params": []
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
|
||||||
|
let status = delete_request(&app, "/api/metrics/requests").await;
|
||||||
|
assert_eq!(status, StatusCode::NO_CONTENT);
|
||||||
|
|
||||||
|
let (status, body) = get_json(&app, "/api/metrics").await;
|
||||||
|
assert_eq!(status, StatusCode::OK);
|
||||||
|
assert!(body.as_array().unwrap().is_empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn deleting_unknown_metric_name_returns_404_not_500() {
|
||||||
|
let (app, _engine, _settings, _dir) = test_app();
|
||||||
|
let status = delete_request(&app, "/api/metrics/does-not-exist").await;
|
||||||
|
assert_eq!(status, StatusCode::NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Acceptance criterion: deleting a metric persists the removal into the active profile too, so
|
||||||
|
/// it doesn't reappear from `settings.json` on the next restart.
|
||||||
|
#[tokio::test]
|
||||||
|
async fn deleting_metric_persists_removal_and_it_does_not_reappear_after_restart() {
|
||||||
|
let (app, _engine, settings_handle, dir) = test_app();
|
||||||
|
|
||||||
|
let settings_path = dir.path().join("settings.json");
|
||||||
|
{
|
||||||
|
let mut settings = settings_handle.lock().unwrap();
|
||||||
|
settings.create_profile(&settings_path, "web".to_string()).unwrap();
|
||||||
|
settings.set_active_profile(&settings_path, Some("web".to_string())).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
send_json(
|
||||||
|
&app,
|
||||||
|
"POST",
|
||||||
|
"/api/metrics",
|
||||||
|
json!({
|
||||||
|
"name": "requests",
|
||||||
|
"message_match_regex": r"request path=(?P<path>\S+)",
|
||||||
|
"label_params": []
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
assert_eq!(Settings::load(&settings_path).profile("web").unwrap().metrics.len(), 1);
|
||||||
|
|
||||||
|
let status = delete_request(&app, "/api/metrics/requests").await;
|
||||||
|
assert_eq!(status, StatusCode::NO_CONTENT);
|
||||||
|
|
||||||
|
assert!(Settings::load(&settings_path).profile("web").unwrap().metrics.is_empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Acceptance criterion: a dashboard panel (PromQL query) that still references a metric by
|
||||||
|
/// name after it's been deleted fails with a readable "unknown metric" error, rather than a
|
||||||
|
/// panic or a silently-empty series — seeded here by declaring, ingesting into, deleting, then
|
||||||
|
/// re-querying the same metric name.
|
||||||
|
#[tokio::test]
|
||||||
|
async fn promql_query_against_deleted_metric_fails_with_readable_error() {
|
||||||
|
let (app, engine, _settings, _dir) = test_app();
|
||||||
|
|
||||||
|
declare_test_param(&app, "path", r"request path=(?P<path>\S+)", "path", "string").await;
|
||||||
|
send_json(
|
||||||
|
&app,
|
||||||
|
"POST",
|
||||||
|
"/api/metrics",
|
||||||
|
json!({
|
||||||
|
"name": "requests",
|
||||||
|
"message_match_regex": r"request path=(?P<path>\S+)",
|
||||||
|
"label_params": ["path"]
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
engine
|
||||||
|
.send(EngineMessage::Ingest(IngestedLine {
|
||||||
|
sequence: 0,
|
||||||
|
timestamp: Timestamp::from_millis(0),
|
||||||
|
text: "request path=/a".to_string(),
|
||||||
|
}))
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// Sanity check: the dashboard-panel-style query works before deletion.
|
||||||
|
let (status, _body) = get_json(&app, "/api/query?promql=requests").await;
|
||||||
|
assert_eq!(status, StatusCode::OK);
|
||||||
|
|
||||||
|
let status = delete_request(&app, "/api/metrics/requests").await;
|
||||||
|
assert_eq!(status, StatusCode::NO_CONTENT);
|
||||||
|
|
||||||
|
let (status, body) = get_json(&app, "/api/query?promql=requests").await;
|
||||||
|
assert_eq!(status, StatusCode::BAD_REQUEST);
|
||||||
|
assert!(
|
||||||
|
body["error"].as_str().unwrap().contains("unknown metric"),
|
||||||
|
"expected a readable 'unknown metric' error, got: {body}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn queries_bucket_values_with_label_filter_and_range() {
|
async fn queries_bucket_values_with_label_filter_and_range() {
|
||||||
let (app, engine, _settings, _dir) = test_app();
|
let (app, engine, _settings, _dir) = test_app();
|
||||||
|
|||||||
@@ -28,6 +28,14 @@ pub struct ParamDeclarationDto {
|
|||||||
/// See `crate::data_value::ParamDeclaration::auto_derived`. The frontend uses this to disable
|
/// See `crate::data_value::ParamDeclaration::auto_derived`. The frontend uses this to disable
|
||||||
/// editing — `POST /api/params` also rejects a request naming an auto-derived param.
|
/// editing — `POST /api/params` also rejects a request naming an auto-derived param.
|
||||||
pub auto_derived: bool,
|
pub auto_derived: bool,
|
||||||
|
/// Set only for the built-in `ottyl_seq`/`ottyl_ts`/`ottyl_fmt` names
|
||||||
|
/// (`crate::engine::OTTYL_RESERVED_PARAM_NAMES`), synthesized into the `GET /api/params`
|
||||||
|
/// response by `crate::api::list_params` rather than backed by any index entry — distinct from
|
||||||
|
/// `auto_derived` (which *is* a real, if machine-discovered, `ParamDeclaration`). Always
|
||||||
|
/// `false` for every other entry. There is no removal path for these at all (not just a
|
||||||
|
/// disabled one), so the frontend should treat `reserved` as non-deletable/non-editable.
|
||||||
|
#[serde(default)]
|
||||||
|
pub reserved: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize)]
|
#[derive(Debug, Clone, Serialize)]
|
||||||
|
|||||||
+648
-7
@@ -36,6 +36,19 @@ pub struct MetricSample {
|
|||||||
/// Also the request body for `POST /api/params` — `Deserialize` is derived directly here rather than adding a separate DTO, since the shape already matches `ParamDeclaration`.
|
/// Also the request body for `POST /api/params` — `Deserialize` is derived directly here rather than adding a separate DTO, since the shape already matches `ParamDeclaration`.
|
||||||
pub type DeclareParamRequest = ParamDeclaration;
|
pub type DeclareParamRequest = ParamDeclaration;
|
||||||
|
|
||||||
|
/// Response to `EngineMessage::ClearParams` (ticket 052) — also the JSON body for `DELETE /api/params`.
|
||||||
|
#[derive(Debug, Clone, serde::Serialize)]
|
||||||
|
pub struct ClearParamsResult {
|
||||||
|
/// How many param declarations (manual + auto-derived) were removed.
|
||||||
|
pub removed: usize,
|
||||||
|
/// How many params `auto_declare_params` re-derived immediately afterward from retained log text.
|
||||||
|
pub reextracted: usize,
|
||||||
|
/// How many `IndexKey::IngestedLog` entries were still retained (not yet evicted by `max_logs`)
|
||||||
|
/// and so were re-scanned — surfaced so a caller can tell the user re-extraction only covers
|
||||||
|
/// logs still held in memory, not lines evicted before the clear.
|
||||||
|
pub logs_considered: usize,
|
||||||
|
}
|
||||||
|
|
||||||
/// A metric references its params by name (resolved against the engine's standalone
|
/// A metric references its params by name (resolved against the engine's standalone
|
||||||
/// `ParamDeclaration` store in `apply_metric_to_log`) rather than embedding its own
|
/// `ParamDeclaration` store in `apply_metric_to_log`) rather than embedding its own
|
||||||
/// regex/capture-group/kind per param — see ticket 037. Also the request body for
|
/// regex/capture-group/kind per param — see ticket 037. Also the request body for
|
||||||
@@ -90,6 +103,16 @@ pub enum EngineMessage {
|
|||||||
name: String,
|
name: String,
|
||||||
respond_to: oneshot::Sender<bool>,
|
respond_to: oneshot::Sender<bool>,
|
||||||
},
|
},
|
||||||
|
/// Ticket 052: wipes the entire standalone-param set (manual *and* auto-derived — unlike
|
||||||
|
/// `reload_engine_declarations`'s profile-switch cleanup, this is an explicit user-driven reset,
|
||||||
|
/// not a "keep engine-discovered facts across profiles" cleanup), then immediately re-runs
|
||||||
|
/// `auto_declare_params` over every `IndexKey::IngestedLog` entry still retained in the index,
|
||||||
|
/// oldest to newest, so declaration-order semantics match a fresh ingest. Lines already evicted
|
||||||
|
/// by `max_logs` can't regain their params — `ClearParamsResult::logs_considered` reports how
|
||||||
|
/// many retained lines were re-scanned, so a caller can surface that bound to the user.
|
||||||
|
ClearParams {
|
||||||
|
respond_to: oneshot::Sender<ClearParamsResult>,
|
||||||
|
},
|
||||||
DeclareMetric {
|
DeclareMetric {
|
||||||
request: DeclareMetricRequest,
|
request: DeclareMetricRequest,
|
||||||
respond_to: oneshot::Sender<Result<(), String>>,
|
respond_to: oneshot::Sender<Result<(), String>>,
|
||||||
@@ -152,6 +175,7 @@ pub async fn run(mut rx: mpsc::Receiver<EngineMessage>, settings: SettingsHandle
|
|||||||
DataValue::LogLiteral { text: text.clone() },
|
DataValue::LogLiteral { text: text.clone() },
|
||||||
);
|
);
|
||||||
log_count += 1;
|
log_count += 1;
|
||||||
|
auto_declare_log_stream_params(&mut index, &text);
|
||||||
auto_declare_params(&mut index, &text);
|
auto_declare_params(&mut index, &text);
|
||||||
apply_all_metrics(&mut index, sequence, timestamp, &text);
|
apply_all_metrics(&mut index, sequence, timestamp, &text);
|
||||||
evict_excess_logs(&mut index, &mut log_count, max_logs, &mut approx_bytes_total);
|
evict_excess_logs(&mut index, &mut log_count, max_logs, &mut approx_bytes_total);
|
||||||
@@ -195,6 +219,11 @@ pub async fn run(mut rx: mpsc::Receiver<EngineMessage>, settings: SettingsHandle
|
|||||||
let existed = index.remove(&IndexKey::ParamDeclaration { name }).is_some();
|
let existed = index.remove(&IndexKey::ParamDeclaration { name }).is_some();
|
||||||
let _ = respond_to.send(existed);
|
let _ = respond_to.send(existed);
|
||||||
}
|
}
|
||||||
|
EngineMessage::ClearParams { respond_to } => {
|
||||||
|
let removed = clear_all_param_declarations(&mut index);
|
||||||
|
let (reextracted, logs_considered) = reextract_params_from_retained_logs(&mut index);
|
||||||
|
let _ = respond_to.send(ClearParamsResult { removed, reextracted, logs_considered });
|
||||||
|
}
|
||||||
EngineMessage::DeclareMetric { request, respond_to } => {
|
EngineMessage::DeclareMetric { request, respond_to } => {
|
||||||
let result = declare_metric(&mut index, request);
|
let result = declare_metric(&mut index, request);
|
||||||
let _ = respond_to.send(result);
|
let _ = respond_to.send(result);
|
||||||
@@ -204,7 +233,7 @@ pub async fn run(mut rx: mpsc::Receiver<EngineMessage>, settings: SettingsHandle
|
|||||||
let _ = respond_to.send(result);
|
let _ = respond_to.send(result);
|
||||||
}
|
}
|
||||||
EngineMessage::RemoveMetricDeclaration { name, respond_to } => {
|
EngineMessage::RemoveMetricDeclaration { name, respond_to } => {
|
||||||
let existed = index.remove(&IndexKey::MetricDeclaration { name }).is_some();
|
let existed = remove_metric_declaration(&mut index, &name);
|
||||||
let _ = respond_to.send(existed);
|
let _ = respond_to.send(existed);
|
||||||
}
|
}
|
||||||
EngineMessage::Query { query, respond_to } => {
|
EngineMessage::Query { query, respond_to } => {
|
||||||
@@ -220,6 +249,13 @@ fn declare_param(
|
|||||||
index: &mut BTreeMap<IndexKey, DataValue>,
|
index: &mut BTreeMap<IndexKey, DataValue>,
|
||||||
request: DeclareParamRequest,
|
request: DeclareParamRequest,
|
||||||
) -> Result<(), String> {
|
) -> Result<(), String> {
|
||||||
|
if OTTYL_RESERVED_PARAM_NAMES.contains(&request.name.as_str()) {
|
||||||
|
return Err(format!(
|
||||||
|
"'{}' is a reserved name, present on every log line without declaring anything; \
|
||||||
|
it can't be redeclared as a param",
|
||||||
|
request.name
|
||||||
|
));
|
||||||
|
}
|
||||||
if let Some(DataValue::ParamDeclaration(existing)) =
|
if let Some(DataValue::ParamDeclaration(existing)) =
|
||||||
index.get(&IndexKey::ParamDeclaration { name: request.name.clone() })
|
index.get(&IndexKey::ParamDeclaration { name: request.name.clone() })
|
||||||
{
|
{
|
||||||
@@ -298,14 +334,46 @@ fn build_auto_param_pattern(key: &str, group: &str, quoted: bool) -> String {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Hard ceiling on how many params `auto_declare_params` will ever create automatically over the
|
||||||
|
/// life of the engine. Without this, one unusual input can permanently inflate the declared-param
|
||||||
|
/// set forever — `auto_declare_params` never overwrites or prunes a declaration, so every distinct
|
||||||
|
/// key ever seen sticks around. Ticket 050's real `log stream` dump discovered 220 distinct keys from
|
||||||
|
/// under 700 lines, mostly one-off WiFi/radio stat counters (e.g. `txRTSFrm`/`rxCTSUcast`/...) that
|
||||||
|
/// will never recur meaningfully. Chosen alongside `MAX_NEW_AUTO_PARAMS_PER_LINE` (below) rather than
|
||||||
|
/// on its own: a per-line cap alone still lets an unbounded *variety* of lines each contribute a few
|
||||||
|
/// new keys forever, so this total ceiling is the actual backstop.
|
||||||
|
const MAX_AUTO_DECLARED_PARAMS: usize = 64;
|
||||||
|
|
||||||
|
/// Per-line ceiling on how many *new* params a single ingested line may contribute to the auto-derived
|
||||||
|
/// set. Without this, one unusually wide line (the fixture's WiFi stat dump has 20+ `key=value` pairs
|
||||||
|
/// in a single line) could burn most of `MAX_AUTO_DECLARED_PARAMS` in one shot, crowding out keys from
|
||||||
|
/// more representative lines ingested later. Pairs beyond the cap are simply never declared (from this
|
||||||
|
/// line or any other, since a later line with fewer pairs would still need to reach them within its own
|
||||||
|
/// per-line budget) — acceptable since they're exactly the low-value, one-off counters ticket 050 flags.
|
||||||
|
const MAX_NEW_AUTO_PARAMS_PER_LINE: usize = 8;
|
||||||
|
|
||||||
|
fn auto_derived_param_count(index: &BTreeMap<IndexKey, DataValue>) -> usize {
|
||||||
|
param_declarations_range(index).filter(|declaration| declaration.6).count()
|
||||||
|
}
|
||||||
|
|
||||||
/// Scans `text` for `key=value`/`key="value"` pairs (`crate::logfmt::extract_pairs`) and declares a
|
/// Scans `text` for `key=value`/`key="value"` pairs (`crate::logfmt::extract_pairs`) and declares a
|
||||||
/// standalone param for any key not already declared — auto or manual. A manual declaration for a
|
/// standalone param for any key not already declared — auto or manual. A manual declaration for a
|
||||||
/// name always wins and is never touched here; this only fills in names nobody has declared yet.
|
/// name always wins and is never touched here; this only fills in names nobody has declared yet.
|
||||||
/// Run on every ingested line (`EngineMessage::Ingest`), same as `apply_all_metrics`, but note param
|
/// Run on every ingested line (`EngineMessage::Ingest`), same as `apply_all_metrics`, but note param
|
||||||
/// *values* are still recomputed from raw text at read time (`derive_log_params`), not stored here —
|
/// *values* are still recomputed from raw text at read time (`derive_log_params`), not stored here —
|
||||||
/// so a key discovered on line N also back-fills the column for lines before N on the next read.
|
/// so a key discovered on line N also back-fills the column for lines before N on the next read.
|
||||||
|
/// Bounded by `MAX_AUTO_DECLARED_PARAMS`/`MAX_NEW_AUTO_PARAMS_PER_LINE` (see their doc comments) so a
|
||||||
|
/// single burst of unusual lines can't permanently inflate the declared-param set (ticket 050).
|
||||||
fn auto_declare_params(index: &mut BTreeMap<IndexKey, DataValue>, text: &str) {
|
fn auto_declare_params(index: &mut BTreeMap<IndexKey, DataValue>, text: &str) {
|
||||||
|
let mut total = auto_derived_param_count(index);
|
||||||
|
if total >= MAX_AUTO_DECLARED_PARAMS {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let mut new_this_line = 0;
|
||||||
for (key, value, quoted) in crate::logfmt::extract_pairs(text) {
|
for (key, value, quoted) in crate::logfmt::extract_pairs(text) {
|
||||||
|
if new_this_line >= MAX_NEW_AUTO_PARAMS_PER_LINE || total >= MAX_AUTO_DECLARED_PARAMS {
|
||||||
|
break;
|
||||||
|
}
|
||||||
let index_key = IndexKey::ParamDeclaration { name: key.to_string() };
|
let index_key = IndexKey::ParamDeclaration { name: key.to_string() };
|
||||||
if index.contains_key(&index_key) {
|
if index.contains_key(&index_key) {
|
||||||
continue;
|
continue;
|
||||||
@@ -323,9 +391,86 @@ fn auto_declare_params(index: &mut BTreeMap<IndexKey, DataValue>, text: &str) {
|
|||||||
auto_derived: true,
|
auto_derived: true,
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
new_this_line += 1;
|
||||||
|
total += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Declares `log_type`/`process`/`pid` as standalone params the first time a `log stream`-shaped line
|
||||||
|
/// is seen (ticket 050/054) — `Type`, the process name, and `PID` are low-cardinality, genuinely
|
||||||
|
/// useful columns derivable directly from `log stream`'s fixed-column shape
|
||||||
|
/// (`crate::logfmt::is_log_stream_line`), with none of the `=`-scanning ambiguity `auto_declare_params`
|
||||||
|
/// has to guard against. Gated on that shape so ordinary logfmt/JSON/prose input never gets these three
|
||||||
|
/// params. Unlike `auto_declare_params`, adding these is never *skipped* on account of
|
||||||
|
/// `MAX_AUTO_DECLARED_PARAMS` — it can only ever add exactly these three names, once each — though
|
||||||
|
/// since they're stored as `auto_derived` too, once present they do count against that shared ceiling,
|
||||||
|
/// tightening (slightly) the budget left for generic `key=value` pairs. Like `auto_declare_params`,
|
||||||
|
/// never overwrites an existing declaration (manual or auto) for any of the three names.
|
||||||
|
fn auto_declare_log_stream_params(index: &mut BTreeMap<IndexKey, DataValue>, text: &str) {
|
||||||
|
if !crate::logfmt::is_log_stream_line(text) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let candidates: [(&str, &str, &str, MetricPrimitiveKind); 3] = [
|
||||||
|
("log_type", crate::logfmt::LOG_STREAM_TYPE_PATTERN, "log_type", MetricPrimitiveKind::String),
|
||||||
|
("process", crate::logfmt::LOG_STREAM_PROCESS_PATTERN, "process", MetricPrimitiveKind::String),
|
||||||
|
("pid", crate::logfmt::LOG_STREAM_PID_PATTERN, "pid", MetricPrimitiveKind::Number),
|
||||||
|
];
|
||||||
|
for (name, pattern, group, kind) in candidates {
|
||||||
|
let index_key = IndexKey::ParamDeclaration { name: name.to_string() };
|
||||||
|
if index.contains_key(&index_key) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
index.insert(
|
||||||
|
index_key,
|
||||||
|
DataValue::ParamDeclaration(ParamDeclaration {
|
||||||
|
name: name.to_string(),
|
||||||
|
message_match_regex: pattern.to_string(),
|
||||||
|
capture_group: group.to_string(),
|
||||||
|
json_field_path: None,
|
||||||
|
kind,
|
||||||
|
elapsed_since_last: false,
|
||||||
|
auto_derived: true,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Ticket 052: removes every `IndexKey::ParamDeclaration` entry — manual and auto-derived alike.
|
||||||
|
/// Returns how many were removed. Unlike `RemoveParamDeclaration`'s single-name removal (used by
|
||||||
|
/// `reload_engine_declarations` during a profile switch, which deliberately keeps auto-derived
|
||||||
|
/// params since they're engine-discovered facts rather than profile state), this is a full reset:
|
||||||
|
/// the caller (`EngineMessage::ClearParams`) immediately re-runs `auto_declare_params` afterward, so
|
||||||
|
/// wiping the auto-derived ones too just means they come back fresh instead of stale.
|
||||||
|
fn clear_all_param_declarations(index: &mut BTreeMap<IndexKey, DataValue>) -> usize {
|
||||||
|
let names: Vec<String> =
|
||||||
|
param_declarations_range(index).map(|(name, ..)| name.to_string()).collect();
|
||||||
|
let removed = names.len();
|
||||||
|
for name in names {
|
||||||
|
index.remove(&IndexKey::ParamDeclaration { name });
|
||||||
|
}
|
||||||
|
removed
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Ticket 052: re-runs `auto_declare_params` against every `IndexKey::IngestedLog` entry still held
|
||||||
|
/// in the index, oldest to newest (matching normal ingest order, so declaration-order semantics —
|
||||||
|
/// e.g. which key "wins" a naming collision — come out the same as if the lines were freshly
|
||||||
|
/// ingested). Only ever called right after `clear_all_param_declarations`, so every param produced
|
||||||
|
/// here is fresh, not a re-declaration.
|
||||||
|
///
|
||||||
|
/// Returns `(reextracted, logs_considered)`: how many params came back, and how many retained log
|
||||||
|
/// lines were re-scanned. Lines already dropped by `evict_excess_logs` before this ran aren't in the
|
||||||
|
/// index anymore and so can't contribute — `logs_considered` is how the caller surfaces that bound
|
||||||
|
/// to the user, rather than the re-extraction silently looking complete when it isn't.
|
||||||
|
fn reextract_params_from_retained_logs(index: &mut BTreeMap<IndexKey, DataValue>) -> (usize, usize) {
|
||||||
|
let texts: Vec<String> = logs_range(index).map(|(_, _, text)| text.to_string()).collect();
|
||||||
|
let logs_considered = texts.len();
|
||||||
|
for text in &texts {
|
||||||
|
auto_declare_params(index, text);
|
||||||
|
}
|
||||||
|
let reextracted = param_declarations_range(index).count();
|
||||||
|
(reextracted, logs_considered)
|
||||||
|
}
|
||||||
|
|
||||||
/// Validates the metric's own regex plus that every name in `label_params`/`value_param` refers to
|
/// Validates the metric's own regex plus that every name in `label_params`/`value_param` refers to
|
||||||
/// an already-declared standalone param (not just the first bad one, so a rejection reports every
|
/// an already-declared standalone param (not just the first bad one, so a rejection reports every
|
||||||
/// problem at once). Shared by `declare_metric` and `update_metric` so both reject a bad
|
/// problem at once). Shared by `declare_metric` and `update_metric` so both reject a bad
|
||||||
@@ -442,6 +587,18 @@ fn clear_metric_data(index: &mut BTreeMap<IndexKey, DataValue>, metric_name: &st
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Removes `name`'s declaration and, per ticket 051, purges its bucket history along with it
|
||||||
|
/// (reusing `clear_metric_data`, same as `update_metric`'s re-backfill does for the old
|
||||||
|
/// declaration) rather than leaving it orphaned — an orphaned bucket would let a stale dashboard
|
||||||
|
/// panel or PromQL query keep silently returning old data by name instead of failing with a clear
|
||||||
|
/// "unknown metric" error (see the declared-or-has-data check in `evaluate_promql`). Returns
|
||||||
|
/// whether a declaration existed, which the caller maps to 404 vs success at the API layer.
|
||||||
|
fn remove_metric_declaration(index: &mut BTreeMap<IndexKey, DataValue>, name: &str) -> bool {
|
||||||
|
let existed = index.remove(&IndexKey::MetricDeclaration { name: name.to_string() }).is_some();
|
||||||
|
clear_metric_data(index, name);
|
||||||
|
existed
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns `None` on a parse failure, which the caller treats as "this match doesn't apply".
|
/// Returns `None` on a parse failure, which the caller treats as "this match doesn't apply".
|
||||||
fn parse_metric_primitive(raw: &str, kind: MetricPrimitiveKind) -> Option<MetricPrimitive> {
|
fn parse_metric_primitive(raw: &str, kind: MetricPrimitiveKind) -> Option<MetricPrimitive> {
|
||||||
match kind {
|
match kind {
|
||||||
@@ -1348,6 +1505,7 @@ fn handle_query(
|
|||||||
kind,
|
kind,
|
||||||
elapsed_since_last,
|
elapsed_since_last,
|
||||||
auto_derived,
|
auto_derived,
|
||||||
|
reserved: false,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
@@ -1457,13 +1615,41 @@ fn project_labels(
|
|||||||
/// just converts at the boundary and delegates — the actual window-scan logic lives only in
|
/// just converts at the boundary and delegates — the actual window-scan logic lives only in
|
||||||
/// `crate::rate::windowed_rate_series`, also used (via `crate::rate::RateWindow`) by alert
|
/// `crate::rate::windowed_rate_series`, also used (via `crate::rate::RateWindow`) by alert
|
||||||
/// `Threshold`/`Ratio` conditions in `crate::alerts`, so both agree on what "windowed rate" means.
|
/// `Threshold`/`Ratio` conditions in `crate::alerts`, so both agree on what "windowed rate" means.
|
||||||
fn windowed_rate_series(points: &[(i64, f64)], range_ms: i64) -> Vec<(i64, f64)> {
|
///
|
||||||
let points: Vec<(Timestamp, f64)> =
|
/// Ticket 057: `rate::windowed_rate_series` only evaluates *at each occurrence's own timestamp*,
|
||||||
|
/// so a metric whose occurrences stop (or start) well inside a much wider queried range produces a
|
||||||
|
/// series that just ends (or begins) at the last (or first) real occurrence — nothing says "the
|
||||||
|
/// rate is 0 here" for the rest of the range. When `start_ms`/`end_ms` are given (a dashboard panel
|
||||||
|
/// always supplies both), this appends a synthetic boundary point at each edge — computed via
|
||||||
|
/// `rate::rate_at` against the original occurrence points, so a boundary that falls inside a
|
||||||
|
/// still-warm window reads its true partial value rather than being forced to 0 — whenever the
|
||||||
|
/// real series doesn't already reach that edge.
|
||||||
|
fn windowed_rate_series(
|
||||||
|
points: &[(i64, f64)],
|
||||||
|
range_ms: i64,
|
||||||
|
start_ms: Option<i64>,
|
||||||
|
end_ms: Option<i64>,
|
||||||
|
) -> Vec<(i64, f64)> {
|
||||||
|
let ts_points: Vec<(Timestamp, f64)> =
|
||||||
points.iter().map(|(ms, value)| (Timestamp::from_millis(*ms), *value)).collect();
|
points.iter().map(|(ms, value)| (Timestamp::from_millis(*ms), *value)).collect();
|
||||||
rate::windowed_rate_series(&points, range_ms)
|
let mut series: Vec<(i64, f64)> = rate::windowed_rate_series(&ts_points, range_ms)
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(ts, value)| (ts.as_millis(), value))
|
.map(|(ts, value)| (ts.as_millis(), value))
|
||||||
.collect()
|
.collect();
|
||||||
|
|
||||||
|
if let Some(end) = end_ms {
|
||||||
|
if series.last().is_none_or(|(ts, _)| *ts < end) {
|
||||||
|
let value = rate::rate_at(&ts_points, Timestamp::from_millis(end), range_ms);
|
||||||
|
series.push((end, value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let Some(start) = start_ms {
|
||||||
|
if series.first().is_none_or(|(ts, _)| *ts > start) {
|
||||||
|
let value = rate::rate_at(&ts_points, Timestamp::from_millis(start), range_ms);
|
||||||
|
series.insert(0, (start, value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
series
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Fixed window width (ms) used by `merge_series_windowed` to combine multiple raw-occurrence
|
/// Fixed window width (ms) used by `merge_series_windowed` to combine multiple raw-occurrence
|
||||||
@@ -1553,6 +1739,24 @@ fn declared_value_kind(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The three reserved param names usable without declaring anything — see `compile_ottyl_seq_comparison`/
|
||||||
|
/// `compile_ottyl_ts_comparison`/`compile_ottyl_fmt_comparison` for the filter-bar equivalent, and
|
||||||
|
/// `webapp/src/components/Docs.tsx` for the user-facing docs. Shared by `evaluate_promql` (dashboard
|
||||||
|
/// panels, this file) and `crate::api::list_params` (`GET /api/params` discoverability).
|
||||||
|
pub const OTTYL_RESERVED_PARAM_NAMES: [&str; 3] = ["ottyl_seq", "ottyl_ts", "ottyl_fmt"];
|
||||||
|
|
||||||
|
/// For `ottyl_seq`/`ottyl_ts` only (not `ottyl_fmt`, which `evaluate_promql` rejects outright before
|
||||||
|
/// this is consulted): returns a `(sequence, timestamp_ms) -> value` mapping used to synthesize a
|
||||||
|
/// virtual PromQL series straight from the ingested-log index, since neither is backed by a
|
||||||
|
/// `MetricDeclaration`/bucket the way every other metric name is.
|
||||||
|
fn ottyl_reserved_numeric_value_fn(metric_name: &str) -> Option<fn(u64, i64) -> f64> {
|
||||||
|
match metric_name {
|
||||||
|
"ottyl_seq" => Some(|sequence, _timestamp_ms| sequence as f64),
|
||||||
|
"ottyl_ts" => Some(|_sequence, timestamp_ms| timestamp_ms as f64),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Evaluates a parsed PromQL query against `index`, producing chart-ready series: baseline is one series per label combination; `sum()`/`avg()` merge series into one series per `by_labels` group (the whole result collapses to a single label-less series when `by_labels` is empty); `rate()` — bare or wrapped in `sum()`/`avg()` — turns each series into a windowed occurrences-per-second reading via `windowed_rate_series`, so it plots as a real line rather than one trailing point; `histogram()` groups by `by_labels` the same way sum()/avg() do, then buckets each group's values independently, so `histogram(m) by (label)` yields one histogram (a family of `le`-labeled series carrying the group's own labels) per label group instead of collapsing all groups together.
|
/// Evaluates a parsed PromQL query against `index`, producing chart-ready series: baseline is one series per label combination; `sum()`/`avg()` merge series into one series per `by_labels` group (the whole result collapses to a single label-less series when `by_labels` is empty); `rate()` — bare or wrapped in `sum()`/`avg()` — turns each series into a windowed occurrences-per-second reading via `windowed_rate_series`, so it plots as a real line rather than one trailing point; `histogram()` groups by `by_labels` the same way sum()/avg() do, then buckets each group's values independently, so `histogram(m) by (label)` yields one histogram (a family of `le`-labeled series carrying the group's own labels) per label group instead of collapsing all groups together.
|
||||||
/// `sum()`/`avg()` over a `String`-kind metric are rejected up front — `coerce_to_f64` has no
|
/// `sum()`/`avg()` over a `String`-kind metric are rejected up front — `coerce_to_f64` has no
|
||||||
/// numeric reading for a string, so silently treating every occurrence as `1.0` would let a sum
|
/// numeric reading for a string, so silently treating every occurrence as `1.0` would let a sum
|
||||||
@@ -1565,6 +1769,37 @@ fn evaluate_promql(
|
|||||||
start_ms: Option<i64>,
|
start_ms: Option<i64>,
|
||||||
end_ms: Option<i64>,
|
end_ms: Option<i64>,
|
||||||
) -> Result<Vec<PromqlSeriesDto>, String> {
|
) -> Result<Vec<PromqlSeriesDto>, String> {
|
||||||
|
// `ottyl_fmt` is categorical ("json"/"logfmt"/"none", `crate::logfmt::detect_format`) with no
|
||||||
|
// sensible numeric reading, unlike `ottyl_seq`/`ottyl_ts` below — rather than silently
|
||||||
|
// returning an empty series (the failure mode ticket 055 calls out), a dashboard query over it
|
||||||
|
// is rejected up front with a message pointing back at the filter/query bar, where it already
|
||||||
|
// works (see `compile_ottyl_fmt_comparison`).
|
||||||
|
if parsed.metric_name == "ottyl_fmt" {
|
||||||
|
return Err(
|
||||||
|
"'ottyl_fmt' is a categorical value (json/logfmt/none), not a number, so it can't be \
|
||||||
|
used in a dashboard PromQL query; filter on it in the search bar instead, e.g. \
|
||||||
|
ottyl_fmt==json"
|
||||||
|
.to_string(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ticket 051: a metric with neither a declaration nor any recorded bucket data is genuinely
|
||||||
|
// unknown (as opposed to a declared-but-empty-so-far metric, or an undeclared scraped
|
||||||
|
// Prometheus metric ingested via `--metrics-url`'s `IngestMetricSample`, which never gets a
|
||||||
|
// `MetricDeclaration` but still has bucket data) — most commonly because a dashboard panel
|
||||||
|
// still references a metric that has since been deleted. Failing here with a clear error beats
|
||||||
|
// a panic or a silently-empty result. `ottyl_seq`/`ottyl_ts` (ticket 055) are exempt: they're
|
||||||
|
// synthesized straight from the ingested-log index below and never have a `MetricDeclaration`
|
||||||
|
// or bucket entries of their own.
|
||||||
|
if ottyl_reserved_numeric_value_fn(&parsed.metric_name).is_none()
|
||||||
|
&& !index.contains_key(&IndexKey::MetricDeclaration { name: parsed.metric_name.clone() })
|
||||||
|
&& bucket_values(index, &parsed.metric_name, None).next().is_none()
|
||||||
|
{
|
||||||
|
return Err(format!(
|
||||||
|
"unknown metric \"{}\": no declaration or recorded data for it (was it deleted?)",
|
||||||
|
parsed.metric_name
|
||||||
|
));
|
||||||
|
}
|
||||||
if matches!(parsed.agg, Some(AggOp::Sum) | Some(AggOp::Avg))
|
if matches!(parsed.agg, Some(AggOp::Sum) | Some(AggOp::Avg))
|
||||||
&& !parsed.inner_rate
|
&& !parsed.inner_rate
|
||||||
&& declared_value_kind(index, &parsed.metric_name) == Some(MetricPrimitiveKind::String)
|
&& declared_value_kind(index, &parsed.metric_name) == Some(MetricPrimitiveKind::String)
|
||||||
@@ -1576,6 +1811,27 @@ fn evaluate_promql(
|
|||||||
}
|
}
|
||||||
|
|
||||||
let mut series_points: BTreeMap<BTreeMap<String, String>, Vec<(i64, f64)>> = BTreeMap::new();
|
let mut series_points: BTreeMap<BTreeMap<String, String>, Vec<(i64, f64)>> = BTreeMap::new();
|
||||||
|
if let Some(reserved_value) = ottyl_reserved_numeric_value_fn(&parsed.metric_name) {
|
||||||
|
// `ottyl_seq`/`ottyl_ts` are computed line-locally (see `compile_ottyl_seq_comparison`/
|
||||||
|
// `compile_ottyl_ts_comparison`) rather than backed by a `MetricDeclaration` and bucket
|
||||||
|
// entries, so they're synthesized here straight from the ingested-log index instead of
|
||||||
|
// going through `bucket_values`. Neither carries any labels, so a non-empty matcher list
|
||||||
|
// simply matches nothing, same as an unmatched label filter would against a real metric.
|
||||||
|
let no_labels: BTreeMap<String, MetricPrimitive> = BTreeMap::new();
|
||||||
|
if matches_label_matchers(&no_labels, &parsed.matchers) {
|
||||||
|
for (sequence, timestamp, _text) in logs_range(index) {
|
||||||
|
let timestamp_ms = timestamp.as_millis();
|
||||||
|
if start_ms.is_none_or(|start| timestamp_ms >= start)
|
||||||
|
&& end_ms.is_none_or(|end| timestamp_ms <= end)
|
||||||
|
{
|
||||||
|
series_points
|
||||||
|
.entry(BTreeMap::new())
|
||||||
|
.or_default()
|
||||||
|
.push((timestamp_ms, reserved_value(sequence, timestamp_ms)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
for (labels, (_, timestamp, value)) in bucket_values(index, &parsed.metric_name, None)
|
for (labels, (_, timestamp, value)) in bucket_values(index, &parsed.metric_name, None)
|
||||||
.filter(|(labels, _)| matches_label_matchers(labels, &parsed.matchers))
|
.filter(|(labels, _)| matches_label_matchers(labels, &parsed.matchers))
|
||||||
.filter(|(_, (_, timestamp, _))| {
|
.filter(|(_, (_, timestamp, _))| {
|
||||||
@@ -1590,6 +1846,7 @@ fn evaluate_promql(
|
|||||||
.or_default()
|
.or_default()
|
||||||
.push((timestamp.as_millis(), coerce_to_f64(value)));
|
.push((timestamp.as_millis(), coerce_to_f64(value)));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
for points in series_points.values_mut() {
|
for points in series_points.values_mut() {
|
||||||
points.sort_by_key(|(timestamp_ms, _)| *timestamp_ms);
|
points.sort_by_key(|(timestamp_ms, _)| *timestamp_ms);
|
||||||
}
|
}
|
||||||
@@ -1628,7 +1885,7 @@ fn evaluate_promql(
|
|||||||
let mut groups: BTreeMap<BTreeMap<String, String>, Vec<Vec<(i64, f64)>>> = BTreeMap::new();
|
let mut groups: BTreeMap<BTreeMap<String, String>, Vec<Vec<(i64, f64)>>> = BTreeMap::new();
|
||||||
for (labels, points) in series_points {
|
for (labels, points) in series_points {
|
||||||
let points = match rate_range_ms {
|
let points = match rate_range_ms {
|
||||||
Some(range_ms) => windowed_rate_series(&points, range_ms),
|
Some(range_ms) => windowed_rate_series(&points, range_ms, start_ms, end_ms),
|
||||||
None => points,
|
None => points,
|
||||||
};
|
};
|
||||||
let group_key = project_labels(&labels, &parsed.by_labels);
|
let group_key = project_labels(&labels, &parsed.by_labels);
|
||||||
@@ -1654,7 +1911,7 @@ fn evaluate_promql(
|
|||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(labels, points)| PromqlSeriesDto {
|
.map(|(labels, points)| PromqlSeriesDto {
|
||||||
labels,
|
labels,
|
||||||
points: windowed_rate_series(&points, range_ms),
|
points: windowed_rate_series(&points, range_ms, start_ms, end_ms),
|
||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
@@ -1782,6 +2039,94 @@ mod tests {
|
|||||||
assert!(declarations[0].6, "the original auto-derived declaration must be untouched");
|
assert!(declarations[0].6, "the original auto-derived declaration must be untouched");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const LOG_STREAM_FIXTURE: &str = include_str!("fixtures/log_stream_sample.txt");
|
||||||
|
|
||||||
|
/// Runs both auto-declaration passes over every fixture line, same order as `EngineMessage::Ingest`.
|
||||||
|
fn ingest_log_stream_fixture(index: &mut BTreeMap<IndexKey, DataValue>) {
|
||||||
|
for line in LOG_STREAM_FIXTURE.lines() {
|
||||||
|
auto_declare_log_stream_params(index, line);
|
||||||
|
auto_declare_params(index, line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn ingesting_log_stream_fixture_does_not_blow_up_declared_param_count() {
|
||||||
|
// Ticket 050: unbounded auto-declaration on this real `log stream` dump produced 220 distinct
|
||||||
|
// params. The bound (MAX_AUTO_DECLARED_PARAMS + the 3 fixed log_stream params) must keep the
|
||||||
|
// total in the tens, nowhere near "hundreds".
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
ingest_log_stream_fixture(&mut index);
|
||||||
|
|
||||||
|
let declared = param_declarations_range(&index).count();
|
||||||
|
// `log_type`/`process`/`pid` are stored as `auto_derived` too, so the shared
|
||||||
|
// `MAX_AUTO_DECLARED_PARAMS` ceiling covers all of them together (see
|
||||||
|
// `auto_declare_log_stream_params`'s doc comment).
|
||||||
|
assert!(
|
||||||
|
declared <= MAX_AUTO_DECLARED_PARAMS,
|
||||||
|
"expected at most {MAX_AUTO_DECLARED_PARAMS} declared params, got {declared}"
|
||||||
|
);
|
||||||
|
assert!(declared < 100, "declared param count ({declared}) should stay well under the old ~220");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn base64_padding_fragments_in_log_stream_fixture_are_never_auto_declared() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
ingest_log_stream_fixture(&mut index);
|
||||||
|
|
||||||
|
let names: HashSet<&str> = param_declarations_range(&index).map(|d| d.0).collect();
|
||||||
|
// The mDNSResponder lines' `<mask.hash: '...=='>` blobs would otherwise surface as params
|
||||||
|
// named after the tail of the base64 payload (see `looks_like_base64_padding_artifact`).
|
||||||
|
assert!(!names.contains("rKTEtG7JmnThhoKPbZiVrA"));
|
||||||
|
assert!(!names.contains("gEdA8N4g"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn log_stream_shaped_lines_expose_type_process_and_pid_as_queryable_params() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
ingest_log_stream_fixture(&mut index);
|
||||||
|
|
||||||
|
let declared: HashSet<&str> = param_declarations_range(&index).map(|d| d.0).collect();
|
||||||
|
assert!(declared.contains("log_type"));
|
||||||
|
assert!(declared.contains("process"));
|
||||||
|
assert!(declared.contains("pid"));
|
||||||
|
|
||||||
|
let compiled = compiled_param_declarations(&index);
|
||||||
|
let data_line = LOG_STREAM_FIXTURE.lines().nth(1).unwrap();
|
||||||
|
let params = derive_log_params(data_line, &compiled);
|
||||||
|
assert_eq!(params.get("log_type"), Some(&MetricPrimitive::String("Default".to_string())));
|
||||||
|
assert_eq!(params.get("process"), Some(&MetricPrimitive::String("kitty".to_string())));
|
||||||
|
assert_eq!(params.get("pid"), Some(&MetricPrimitive::Number(Number::Int(1343))));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn non_log_stream_lines_do_not_get_log_type_process_or_pid_declared() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
auto_declare_log_stream_params(&mut index, r#"ts=1788648105773 msg="entity_moved" x1=-4"#);
|
||||||
|
|
||||||
|
assert!(param_declarations_range(&index).next().is_none());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore] // manual throughput measurement, not part of the regular suite
|
||||||
|
fn bench_ingest_fixture_throughput() {
|
||||||
|
let repeats = 50;
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
let start = std::time::Instant::now();
|
||||||
|
for _ in 0..repeats {
|
||||||
|
for line in LOG_STREAM_FIXTURE.lines() {
|
||||||
|
auto_declare_log_stream_params(&mut index, line);
|
||||||
|
auto_declare_params(&mut index, line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let elapsed = start.elapsed();
|
||||||
|
let total_lines = repeats * LOG_STREAM_FIXTURE.lines().count();
|
||||||
|
eprintln!(
|
||||||
|
"ingested {total_lines} lines in {elapsed:?} ({:.0} lines/sec), {} params declared",
|
||||||
|
total_lines as f64 / elapsed.as_secs_f64(),
|
||||||
|
param_declarations_range(&index).count(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn rejects_invalid_regex() {
|
fn rejects_invalid_regex() {
|
||||||
let mut index = BTreeMap::new();
|
let mut index = BTreeMap::new();
|
||||||
@@ -1928,6 +2273,73 @@ mod tests {
|
|||||||
assert_eq!(approx_bytes_total, 3);
|
assert_eq!(approx_bytes_total, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn insert_ingested_log(index: &mut BTreeMap<IndexKey, DataValue>, sequence: u64, text: &str) {
|
||||||
|
index.insert(
|
||||||
|
IndexKey::IngestedLog { sequence, timestamp: Timestamp::from_millis(sequence as i64) },
|
||||||
|
DataValue::LogLiteral { text: text.to_string() },
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn clear_all_param_declarations_removes_manual_and_auto_derived() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
auto_declare_params(&mut index, "x1=-4");
|
||||||
|
declare_param(&mut index, request("level", r"level=(?P<level>\w+)", "level")).unwrap();
|
||||||
|
assert_eq!(param_declarations_range(&index).count(), 2);
|
||||||
|
|
||||||
|
let removed = clear_all_param_declarations(&mut index);
|
||||||
|
|
||||||
|
assert_eq!(removed, 2);
|
||||||
|
assert_eq!(param_declarations_range(&index).count(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn reextract_params_from_retained_logs_rebuilds_from_ingested_text_without_new_ingest() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
insert_ingested_log(&mut index, 0, r#"level=info msg="started""#);
|
||||||
|
insert_ingested_log(&mut index, 1, "x1=-4 y1=34");
|
||||||
|
auto_declare_params(&mut index, r#"level=info msg="started""#);
|
||||||
|
auto_declare_params(&mut index, "x1=-4 y1=34");
|
||||||
|
assert_eq!(param_declarations_range(&index).count(), 4);
|
||||||
|
|
||||||
|
clear_all_param_declarations(&mut index);
|
||||||
|
assert_eq!(param_declarations_range(&index).count(), 0);
|
||||||
|
|
||||||
|
// No new lines ingested — re-extraction works purely off the `IngestedLog` entries already
|
||||||
|
// retained in the index (ticket 052's core acceptance criterion).
|
||||||
|
let (reextracted, logs_considered) = reextract_params_from_retained_logs(&mut index);
|
||||||
|
|
||||||
|
assert_eq!(logs_considered, 2);
|
||||||
|
assert_eq!(reextracted, 4);
|
||||||
|
let declarations: HashMap<&str, _> =
|
||||||
|
param_declarations_range(&index).map(|d| (d.0, d)).collect();
|
||||||
|
assert!(declarations.contains_key("level"));
|
||||||
|
assert!(declarations.contains_key("msg"));
|
||||||
|
assert!(declarations.contains_key("x1"));
|
||||||
|
assert!(declarations.contains_key("y1"));
|
||||||
|
assert!(declarations.values().all(|d| d.6), "re-extracted params must be flagged auto_derived");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn reextract_params_from_retained_logs_only_covers_lines_still_in_the_index() {
|
||||||
|
// Simulates a line evicted (by `max_logs`) before the clear+re-extract runs: its key/value
|
||||||
|
// pair is simply gone from the index, same as `evict_excess_logs` leaves things, so
|
||||||
|
// `auto_declare_params` never sees it again.
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
insert_ingested_log(&mut index, 1, "x1=-4");
|
||||||
|
auto_declare_params(&mut index, "evicted_only_key=1");
|
||||||
|
auto_declare_params(&mut index, "x1=-4");
|
||||||
|
assert_eq!(param_declarations_range(&index).count(), 2);
|
||||||
|
|
||||||
|
clear_all_param_declarations(&mut index);
|
||||||
|
let (reextracted, logs_considered) = reextract_params_from_retained_logs(&mut index);
|
||||||
|
|
||||||
|
assert_eq!(logs_considered, 1, "only the retained log line should be re-scanned");
|
||||||
|
assert_eq!(reextracted, 1, "the evicted line's key can't come back");
|
||||||
|
let declarations: Vec<_> = param_declarations_range(&index).collect();
|
||||||
|
assert_eq!(declarations[0].0, "x1");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn declarations_stay_within_their_range() {
|
fn declarations_stay_within_their_range() {
|
||||||
let mut index = BTreeMap::new();
|
let mut index = BTreeMap::new();
|
||||||
@@ -2098,6 +2510,64 @@ mod tests {
|
|||||||
assert!(metric_declarations_range(&index).next().is_none());
|
assert!(metric_declarations_range(&index).next().is_none());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn remove_metric_declaration_reports_whether_it_existed() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
declare_requests_metric(&mut index);
|
||||||
|
assert!(remove_metric_declaration(&mut index, "requests"));
|
||||||
|
// Removing an already-gone (or never-declared) metric is a clean `false`, not a panic —
|
||||||
|
// this is what the API layer's 404 branch relies on.
|
||||||
|
assert!(!remove_metric_declaration(&mut index, "requests"));
|
||||||
|
assert!(!remove_metric_declaration(&mut index, "never-declared"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Ticket 051: deleting a metric purges its bucket history too, so a stale PromQL query
|
||||||
|
/// (e.g. a dashboard panel that still names the deleted metric) fails with a readable
|
||||||
|
/// "unknown metric" error instead of silently returning orphaned data.
|
||||||
|
#[test]
|
||||||
|
fn remove_metric_declaration_purges_bucket_history_so_promql_reports_unknown_metric() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
declare_requests_metric(&mut index);
|
||||||
|
ingest_log(&mut index, 0, "request path=/a");
|
||||||
|
|
||||||
|
let parsed = promql::parse_query("requests").unwrap();
|
||||||
|
assert!(evaluate_promql(&index, &parsed, None, None).unwrap().len() == 1);
|
||||||
|
|
||||||
|
assert!(remove_metric_declaration(&mut index, "requests"));
|
||||||
|
assert!(bucket_values(&index, "requests", None).next().is_none());
|
||||||
|
|
||||||
|
let err = evaluate_promql(&index, &parsed, None, None).unwrap_err();
|
||||||
|
assert!(err.contains("unknown metric"), "unexpected error message: {err}");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A metric that was ingested via `--metrics-url` scraping (`IngestMetricSample`) never gets a
|
||||||
|
/// `MetricDeclaration` at all, so the "unknown metric" check must key off having *either* a
|
||||||
|
/// declaration *or* recorded data — not declaration alone — or every scraped metric would be
|
||||||
|
/// rejected as unknown.
|
||||||
|
#[test]
|
||||||
|
fn undeclared_metric_with_bucket_data_is_still_queryable_via_promql() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
push_bucket_value(
|
||||||
|
&mut index,
|
||||||
|
"scraped_metric",
|
||||||
|
BTreeMap::new(),
|
||||||
|
0,
|
||||||
|
Timestamp::from_millis(0),
|
||||||
|
MetricPrimitive::Number(Number::Float(1.0)),
|
||||||
|
);
|
||||||
|
let parsed = promql::parse_query("scraped_metric").unwrap();
|
||||||
|
let series = evaluate_promql(&index, &parsed, None, None).unwrap();
|
||||||
|
assert_eq!(series.len(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn promql_rejects_metric_with_no_declaration_and_no_data() {
|
||||||
|
let index = BTreeMap::new();
|
||||||
|
let parsed = promql::parse_query("never_declared").unwrap();
|
||||||
|
let err = evaluate_promql(&index, &parsed, None, None).unwrap_err();
|
||||||
|
assert!(err.contains("unknown metric"), "unexpected error message: {err}");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn update_metric_rejects_when_no_declaration_exists_yet() {
|
fn update_metric_rejects_when_no_declaration_exists_yet() {
|
||||||
let mut index = BTreeMap::new();
|
let mut index = BTreeMap::new();
|
||||||
@@ -2610,6 +3080,77 @@ mod tests {
|
|||||||
assert_eq!(series[1].points, vec![(0, 0.5)]);
|
assert_eq!(series[1].points, vec![(0, 0.5)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Ticket 057: reproduces the reported `sum by (code) (rate(KeyPressed[5m]))` chart — a burst
|
||||||
|
/// of occurrences confined to the very start of a much wider queried range. Without a
|
||||||
|
/// synthetic trailing point, the series would just stop at the last occurrence's timestamp
|
||||||
|
/// (`1`), giving no indication the rate has decayed to 0 for the rest of `end_ms`.
|
||||||
|
#[test]
|
||||||
|
fn rate_series_gets_a_trailing_zero_point_once_occurrences_stop_early_in_a_wider_range() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
declare_requests_metric(&mut index);
|
||||||
|
ingest_log(&mut index, 0, "request path=/a");
|
||||||
|
ingest_log(&mut index, 1, "request path=/a");
|
||||||
|
|
||||||
|
let parsed = promql::parse_query("rate(requests[2s])").unwrap();
|
||||||
|
let series = evaluate_promql(&index, &parsed, None, Some(100_000)).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(series.len(), 1);
|
||||||
|
assert_eq!(
|
||||||
|
series[0].points,
|
||||||
|
vec![(0, 0.5), (1, 1.0), (100_000, 0.0)],
|
||||||
|
"the window (2s) is long since aged out by end_ms, so the appended boundary point must read 0"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Mirror of the trailing case: occurrences starting well after `start_ms` shouldn't make the
|
||||||
|
/// line appear to begin mid-range with no indication the rate was 0 beforehand.
|
||||||
|
#[test]
|
||||||
|
fn rate_series_gets_a_leading_zero_point_when_occurrences_start_late_in_a_wider_range() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
declare_requests_metric(&mut index);
|
||||||
|
ingest_log(&mut index, 50_000, "request path=/a");
|
||||||
|
|
||||||
|
let parsed = promql::parse_query("rate(requests[2s])").unwrap();
|
||||||
|
let series = evaluate_promql(&index, &parsed, Some(0), None).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(series[0].points, vec![(0, 0.0), (50_000, 0.5)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Same shape as the two tests above, but through `sum(rate(...)) by (label)` — the exact
|
||||||
|
/// query form from the ticket's report — so each label's line independently reflects
|
||||||
|
/// rate-zero for the remainder of the range instead of just its own group stopping early.
|
||||||
|
#[test]
|
||||||
|
fn sum_by_rate_gets_boundary_points_per_group_across_a_wider_range() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
declare_requests_metric(&mut index);
|
||||||
|
ingest_log(&mut index, 0, "request path=/a");
|
||||||
|
ingest_log(&mut index, 1, "request path=/a");
|
||||||
|
ingest_log(&mut index, 0, "request path=/b");
|
||||||
|
|
||||||
|
let parsed = promql::parse_query("sum(rate(requests[2s])) by (path)").unwrap();
|
||||||
|
let mut series = evaluate_promql(&index, &parsed, None, Some(100_000)).unwrap();
|
||||||
|
series.sort_by(|a, b| a.labels.get("path").cmp(&b.labels.get("path")));
|
||||||
|
|
||||||
|
assert_eq!(series.len(), 2);
|
||||||
|
assert_eq!(series[0].points, vec![(0, 0.5), (1, 1.0), (100_000, 0.0)]);
|
||||||
|
assert_eq!(series[1].points, vec![(0, 0.5), (100_000, 0.0)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A boundary point is only appended when the real series doesn't already reach that edge —
|
||||||
|
/// continuously-occurring metrics (the common case) must render exactly as before.
|
||||||
|
#[test]
|
||||||
|
fn rate_series_skips_boundary_points_already_covered_by_real_data() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
declare_requests_metric(&mut index);
|
||||||
|
ingest_log(&mut index, 0, "request path=/a");
|
||||||
|
ingest_log(&mut index, 1000, "request path=/a");
|
||||||
|
|
||||||
|
let parsed = promql::parse_query("rate(requests[2s])").unwrap();
|
||||||
|
let series = evaluate_promql(&index, &parsed, Some(0), Some(1000)).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(series[0].points, vec![(0, 0.5), (1000, 1.0)]);
|
||||||
|
}
|
||||||
|
|
||||||
/// Ticket 040 acceptance criterion: a dashboard `rate()` chart and an alert `Threshold`
|
/// Ticket 040 acceptance criterion: a dashboard `rate()` chart and an alert `Threshold`
|
||||||
/// condition over the same metric/window agree on the computed rate for the same historical
|
/// condition over the same metric/window agree on the computed rate for the same historical
|
||||||
/// data, since both now go through the single shared implementation in `crate::rate` rather
|
/// data, since both now go through the single shared implementation in `crate::rate` rather
|
||||||
@@ -3005,6 +3546,106 @@ mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn promql_count_over_ottyl_seq_gives_one_point_per_ingested_log_with_no_metric_declaration() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
ingest_log(&mut index, 0, "line one");
|
||||||
|
ingest_log(&mut index, 1, "line two");
|
||||||
|
ingest_log(&mut index, 2, "line three");
|
||||||
|
|
||||||
|
let parsed = promql::parse_query("count(ottyl_seq)").unwrap();
|
||||||
|
let series = evaluate_promql(&index, &parsed, None, None).unwrap();
|
||||||
|
assert_eq!(series.len(), 1);
|
||||||
|
assert_eq!(series[0].points, vec![(0, 1.0), (1, 1.0), (2, 1.0)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn promql_bare_ottyl_seq_returns_the_actual_sequence_numbers() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
ingest_log(&mut index, 0, "line zero");
|
||||||
|
ingest_log(&mut index, 5, "line five");
|
||||||
|
|
||||||
|
let parsed = promql::parse_query("ottyl_seq").unwrap();
|
||||||
|
let mut series = evaluate_promql(&index, &parsed, None, None).unwrap();
|
||||||
|
assert_eq!(series.len(), 1);
|
||||||
|
series[0].points.sort_by_key(|(ts, _)| *ts);
|
||||||
|
assert_eq!(series[0].points, vec![(0, 0.0), (5, 5.0)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn promql_bare_ottyl_ts_returns_ingest_timestamps() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
ingest_log(&mut index, 0, "a");
|
||||||
|
ingest_log(&mut index, 1, "b");
|
||||||
|
|
||||||
|
let parsed = promql::parse_query("ottyl_ts").unwrap();
|
||||||
|
let series = evaluate_promql(&index, &parsed, None, None).unwrap();
|
||||||
|
assert_eq!(series.len(), 1);
|
||||||
|
assert_eq!(series[0].points, vec![(0, 0.0), (1, 1.0)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn promql_rate_over_ottyl_ts_produces_a_windowed_series_not_an_empty_one() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
for sequence in 0..5u64 {
|
||||||
|
ingest_log(&mut index, sequence, "line");
|
||||||
|
}
|
||||||
|
|
||||||
|
let parsed = promql::parse_query("rate(ottyl_ts[5s])").unwrap();
|
||||||
|
let series = evaluate_promql(&index, &parsed, None, None).unwrap();
|
||||||
|
assert_eq!(series.len(), 1);
|
||||||
|
assert!(!series[0].points.is_empty(), "rate(ottyl_ts[...]) must not silently return no data");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn promql_ottyl_seq_with_label_matcher_matches_nothing_since_it_has_no_labels() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
ingest_log(&mut index, 0, "line");
|
||||||
|
|
||||||
|
let parsed = promql::parse_query(r#"ottyl_seq{path="/a"}"#).unwrap();
|
||||||
|
let series = evaluate_promql(&index, &parsed, None, None).unwrap();
|
||||||
|
assert!(series.is_empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn promql_over_ottyl_fmt_is_explicitly_rejected_not_silently_empty() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
ingest_log(&mut index, 0, r#"{"level":"error"}"#);
|
||||||
|
|
||||||
|
let parsed = promql::parse_query("count(ottyl_fmt)").unwrap();
|
||||||
|
let err = evaluate_promql(&index, &parsed, None, None).unwrap_err();
|
||||||
|
assert!(err.contains("ottyl_fmt"), "error should name the rejected metric: {err}");
|
||||||
|
assert!(err.contains("categorical") || err.contains("filter"), "error should explain why: {err}");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn handle_query_promql_returns_series_for_ottyl_seq_end_to_end() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
ingest_log(&mut index, 0, "a");
|
||||||
|
ingest_log(&mut index, 1, "b");
|
||||||
|
|
||||||
|
let response = handle_query(
|
||||||
|
&index,
|
||||||
|
EngineQuery::Promql { query: "count(ottyl_seq)".to_string(), start_ms: None, end_ms: None },
|
||||||
|
0,
|
||||||
|
);
|
||||||
|
match response {
|
||||||
|
EngineResponse::Promql(Ok(series)) => {
|
||||||
|
assert_eq!(series[0].points, vec![(0, 1.0), (1, 1.0)]);
|
||||||
|
}
|
||||||
|
_ => panic!("expected EngineResponse::Promql(Ok(_))"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn declare_param_rejects_reserved_ottyl_names() {
|
||||||
|
let mut index = BTreeMap::new();
|
||||||
|
for name in OTTYL_RESERVED_PARAM_NAMES {
|
||||||
|
let err = declare_param(&mut index, request(name, "x", "x")).unwrap_err();
|
||||||
|
assert!(err.contains("reserved"), "expected a 'reserved' error for '{name}', got: {err}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// -- FilterBar query integration --
|
// -- FilterBar query integration --
|
||||||
|
|
||||||
fn logs_query(filter: Option<&str>) -> EngineQuery {
|
fn logs_query(filter: Option<&str>) -> EngineQuery {
|
||||||
|
|||||||
@@ -0,0 +1,697 @@
|
|||||||
|
Timestamp Thread Type Activity PID TTL
|
||||||
|
2026-09-06 01:48:54.465144+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:54.466387+0100 0x4a3b07 Default 0x0 0 0 kernel: [745895.196298]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:54.466396+0100 0x4a3b07 Default 0x0 0 0 kernel: [745895.196300]: arm_cpu_init(): cpu 11 online
|
||||||
|
2026-09-06 01:48:54.466397+0100 0x4a3b07 Default 0x0 0 0 kernel: [745895.196305]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:54.466397+0100 0x4a3b07 Default 0x0 0 0 kernel: [745895.196308]: arm_cpu_init(): cpu 14 online
|
||||||
|
2026-09-06 01:48:54.466386+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:54.496702+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:54.500366+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:54.518117+0100 0x4dfed2 Default 0x0 606 0 WindowServer: (HSTouchHIDService) [com.apple.Multitouch:Plugin] [TP] Dispatching digitizer event with 3 children, _eventMask=0x0 _childEventMask=0x2 Cancel=0 Touching=1 inRange=1
|
||||||
|
2026-09-06 01:48:54.532524+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:54.554814+0100 0x144b Default 0x0 606 7 WindowServer: (SkyLight) [com.apple.SkyLight:KeyboardEvent] kCGSEventKeyUp was part of a sequence with destination <keyboardFocus; pid: 1343; token: viewbridge-key-window>
|
||||||
|
2026-09-06 01:48:54.555315+0100 0x2e72 Default 0x0 1343 0 kitty: (TextInputUIMacHelper) [com.apple.TextInputUI:CursorUI] -[TUINSCursorUIController scheduleUpdateCursorLocation]
|
||||||
|
2026-09-06 01:48:54.562153+0100 0x3d1 Default 0x0 0 0 kernel: (AppleAVD) AppleAVD: INFO: logPerfAndUserClientStats(): core 0, Vmin/nom/max: 99% 0% 0%, clientCount 1 1 1 1 1
|
||||||
|
2026-09-06 01:48:54.564722+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:54.598759+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:54.632768+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:54.666589+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:54.671971+0100 0x1551 Default 0x0 642 0 airportd: (IO80211) [com.apple.WiFiManager:] Driver Event: <airport[642]> _bsd_80211_event_callback: APPLE80211_M_WEIGHT_AVG_LQM_UPDATE/145 (en0)
|
||||||
|
2026-09-06 01:48:54.680948+0100 0x4e20a1 Default 0x0 538 8 powerd: [com.apple.powerd:displayState] DesktopMode check on Battery 0
|
||||||
|
2026-09-06 01:48:54.700119+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:54.732678+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:54.766150+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:54.801202+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:54.807884+0100 0x4e1fd2 Activity 0x9cc91e 975 0 CoreServicesUIAgent: Handle XPC Request
|
||||||
|
2026-09-06 01:48:54.807881+0100 0x4e214c Activity 0x9cc91d 975 0 CoreServicesUIAgent: Handle XPC Request
|
||||||
|
2026-09-06 01:48:54.807903+0100 0x4e23c3 Activity 0x9cc91f 975 0 CoreServicesUIAgent: Handle XPC Request
|
||||||
|
2026-09-06 01:48:54.808141+0100 0x4e23c4 Error 0x9cc91e 975 2 CoreServicesUIAgent: [com.apple.launchservices:uiagent] CSUIGetDisplayName, failing with -10810 for path '<private>
|
||||||
|
2026-09-06 01:48:54.808194+0100 0x4e23c4 Error 0x9cc91f 975 2 CoreServicesUIAgent: [com.apple.launchservices:uiagent] CSUIGetDisplayName, failing with -10810 for path '<private>
|
||||||
|
2026-09-06 01:48:54.808238+0100 0x4e23c4 Error 0x9cc91d 975 2 CoreServicesUIAgent: [com.apple.launchservices:uiagent] CSUIGetDisplayName, failing with -10810 for path '<private>
|
||||||
|
2026-09-06 01:48:54.823648+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9668] : In AW: Tx:0 Rx:0 Prev Tx:0 Rx:0 time since 255552387 indatamode 1 infraPriority 1 cpc 0
|
||||||
|
2026-09-06 01:48:54.823667+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9673] : Ignore changing the state as infraPriority 1 P2P-CPC 0
|
||||||
|
2026-09-06 01:48:54.832643+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:54.845410+0100 0x4dff68 Default 0x0 589 0 bluetoothd: [com.apple.bluetooth:Server.LE.Scan] Matched UUID 0xFCB2 for device "A1161273-82A9-54D0-9283-720AC7DD464C"
|
||||||
|
2026-09-06 01:48:54.845529+0100 0x4dff68 Default 0x0 589 0 bluetoothd: [com.apple.bluetooth:Server.LE.Scan] Matched UUID 0xFCB2 for device "A1161273-82A9-54D0-9283-720AC7DD464C"
|
||||||
|
2026-09-06 01:48:54.845773+0100 0x4df240 Default 0x0 572 0 locationd: [com.apple.locationd.Core:Harvester] {"msg":"onAvengerAdvertisementDetected: got avenger advertisement", "subHarvester":"Avenger"}
|
||||||
|
2026-09-06 01:48:54.845815+0100 0x4defc1 Default 0x0 572 0 locationd: (SPFinder) [com.apple.icloud.SPFinder:advertisementCache] saveBeaconPayload: 1
|
||||||
|
2026-09-06 01:48:54.845818+0100 0x4df240 Default 0x0 572 0 locationd: [com.apple.locationd.Core:Harvester] {"msg":"convertToSPAdvertisement", "address":<private>, "data":<private>, "date":<private>, "rssi":<private>, "status":<private>, "reserved":<private>, "subHarvester":"Avenger"}
|
||||||
|
2026-09-06 01:48:54.845837+0100 0x4defc1 Activity 0x9d0e2a 572 0 locationd: (SPFinder) SPAdvertisementCache saveBeaconPayloads:completion:
|
||||||
|
2026-09-06 01:48:54.845847+0100 0x4df240 Default 0x0 572 0 locationd: [com.apple.locationd.Core:Harvester] {"msg":"onAvengerAdvertisementDetected: advertisement is near-owner from other people and do not process it", "subHarvester":"Avenger"}
|
||||||
|
2026-09-06 01:48:54.846284+0100 0x4dfe20 Activity 0x9d0dbf 746 0 searchpartyd: (FindMyBase) SaveObservedAdvertisment
|
||||||
|
2026-09-06 01:48:54.846660+0100 0x4dfe20 Default 0x9d0dbf 746 0 searchpartyd: (FindMyBase) [com.apple.icloud.searchpartyd:observationStoring] TIME: ObservationStoring.Reconcile: <private>
|
||||||
|
2026-09-06 01:48:54.865403+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:54.889179+0100 0x4de289 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:54.899419+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:54.932587+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:54.940343+0100 0x4e20a1 Default 0x0 538 8 powerd: [com.apple.powerd:displayState] DesktopMode check on Battery 0
|
||||||
|
2026-09-06 01:48:54.965716+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:54.969316+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:54.999946+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.002756+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLState[10141] : Active Sockets false ValidSvc 4 NumAirplay 0 AFHandlePending 0 TimeOfLastAFHandleRequest 141710 ms
|
||||||
|
2026-09-06 01:48:55.002786+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLState[10239]: BonJourTrig 1 ValidSvc 4 RTApp 0 TSReq 0 HasActAirDrop 0 SocketsActive 0
|
||||||
|
2026-09-06 01:48:55.002799+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: setScheduleState[11041]: reason:UserTriggered sc:Infra Priority and force:NO, AWDL-restore:No
|
||||||
|
2026-09-06 01:48:55.002824+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: AWDLStateDump: AWDL up time: 15732 Secs, 82:45:A3:D5:31:34 peers:0, cached:0(0), rtg(0), <SDB: :(00:00:00:00:00:00) 44, infraRT:Yes, country:GB>
|
||||||
|
2026-09-06 01:48:55.002862+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: AWDLStateDump: Services[Valid 4 Airplay 0 WiFid 0 AirDrop 0 nonAirplay:4 rdlink:0 clink:0]
|
||||||
|
2026-09-06 01:48:55.002872+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: AWDLStateDump: AirPlay:0 AirPlayToHT:0 AirPlayOverInfra:0 SideCar:0 SideCarSender:0 SideCarPeer:0x0 TimeSync:0 HighThroughput:0
|
||||||
|
2026-09-06 01:48:55.002892+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: AWDLStateDump: AWDL enabled with no data connection from 15732 seconds
|
||||||
|
2026-09-06 01:48:55.002901+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: AWDLStateDump: PSFDwell Support/Active: 1/0 {0ms 0ms}, miconfigured:0 sessin count:7, MIoNDwell:35, dwelEvent:0
|
||||||
|
2026-09-06 01:48:55.002922+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: AWDL ON:[infra(44) 90%] [sdb:0] (6/44/44) [44 0 44 0 0 0 0 0 6 0 44 0 0 0 0 0] Infra Priority
|
||||||
|
2026-09-06 01:48:55.002931+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.stats.awdl0: -------------------------------------------------------------------------------------------------------------
|
||||||
|
2026-09-06 01:48:55.002941+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.stats.awdl0: AFSPerSlot : [0 0 0 0] [0 0 0 0] [0 0 0 0] [0 0 0 0]
|
||||||
|
2026-09-06 01:48:55.002945+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.stats.awdl0: AFsPerSignal (batchSize -1) : 0 <= 1, 0 <= 10, 0 <= 30, 0 <= 50, 0 <= 100, 0 > 100
|
||||||
|
2026-09-06 01:48:55.002949+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.stats.awdl0: TimePerSignal : 0 < 250uSec, 0 250-500uSec, 0 500-1000uSec, 0 1000-2000uSec, 0 > 2000uSec
|
||||||
|
2026-09-06 01:48:55.002951+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.stats.awdl0: TimePerAF : 0 < 100uSec, 0 100-250uSec, 0 250-500uSec, 0 500-1000uSec, 0 > 1000uSec
|
||||||
|
2026-09-06 01:48:55.002954+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.stats.awdl0: -------------------------------------------------------------------------------------------------------------
|
||||||
|
2026-09-06 01:48:55.002965+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.wifi.awdl0: LQM-WiFi:AWDL State #16 Infra Priority(29) DutyCycle 10 StateDuration 45lu.791s[255506.775 - 0.000] StateComplete 0
|
||||||
|
2026-09-06 01:48:55.002969+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.wifi.awdl0: LQM-WiFi:AWDL Active Time 500ms(9%) 5.002s[255547.563s - 255552.566s]
|
||||||
|
2026-09-06 01:48:55.003060+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) IO80211PeerMonitor::checkForDPS() Enter
|
||||||
|
2026-09-06 01:48:55.003076+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: MonitorTimer en0/5000: packet counts: I239 Q0 O295
|
||||||
|
2026-09-06 01:48:55.003089+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: postMessageOnInfraInterface:3463 posting msgId:169 on skywalk infraInterface
|
||||||
|
2026-09-06 01:48:55.003106+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) LQM-WiFi: BE : Count: 292 avgLatencyMs:3 maxLatencyMs:7
|
||||||
|
2026-09-06 01:48:55.003109+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) LQM-WiFi: BK : Count: 2 avgLatencyMs:1 maxLatencyMs:1
|
||||||
|
2026-09-06 01:48:55.003110+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) LQM-WiFi: VI : Count: 0 avgLatencyMs:0 maxLatencyMs:0
|
||||||
|
2026-09-06 01:48:55.003112+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) LQM-WiFi: VO : Count: 1 avgLatencyMs:1 maxLatencyMs:1
|
||||||
|
2026-09-06 01:48:55.020289+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:55.032976+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.056189+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:55.066877+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.099602+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.134018+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.165500+0100 0x4a3b07 Default 0x0 0 0 kernel: [745895.914235]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:55.165510+0100 0x4a3b07 Default 0x0 0 0 kernel: [745895.914238]: arm_cpu_init(): cpu 11 online
|
||||||
|
2026-09-06 01:48:55.165510+0100 0x4a3b07 Default 0x0 0 0 kernel: [745895.914246]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:55.165500+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.200023+0100 0x4e20a1 Default 0x0 538 8 powerd: [com.apple.powerd:displayState] DesktopMode check on Battery 0
|
||||||
|
2026-09-06 01:48:55.200400+0100 0x4a3b07 Default 0x0 0 0 kernel: [745895.925162]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:55.200409+0100 0x4a3b07 Default 0x0 0 0 kernel: [745895.925165]: arm_cpu_init(): cpu 11 online
|
||||||
|
2026-09-06 01:48:55.200409+0100 0x4a3b07 Default 0x0 0 0 kernel: [745895.925172]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:55.200409+0100 0x4a3b07 Default 0x0 0 0 kernel: [745895.934699]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:55.200410+0100 0x4a3b07 Default 0x0 0 0 kernel: [745895.934702]: arm_cpu_init(): cpu 11 online
|
||||||
|
2026-09-06 01:48:55.200410+0100 0x4a3b07 Default 0x0 0 0 kernel: [745895.934708]: arm_cpu_init(): cpu 12 online
|
||||||
|
2026-09-06 01:48:55.200410+0100 0x4a3b07 Default 0x0 0 0 kernel: [745895.934712]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:55.200411+0100 0x4a3b07 Default 0x0 0 0 kernel: [745895.934718]: arm_cpu_init(): cpu 14 online
|
||||||
|
2026-09-06 01:48:55.200415+0100 0x4a3b07 Default 0x0 0 0 kernel: [745895.934722]: arm_cpu_init(): cpu 15 online
|
||||||
|
2026-09-06 01:48:55.200398+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.232960+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.236607+0100 0x4e2059 Default 0x0 12260 0 firefox: (Network) [com.apple.network:path] nw_path_libinfo_path_check [C2C8616C-6980-4FDC-9314-BD5FEF18542E Hostname#d4e6e062:0 tcp, legacy-socket, attribution: developer]
|
||||||
|
libinfo check path: <private>
|
||||||
|
2026-09-06 01:48:55.236975+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114820] DNSServiceQueryRecord START -- qname: <mask.hash: 'rKTEtG7JmnThhoKPbZiVrA=='>, qtype: A, flags: 0x1D000, interface index: 0, client pid: 12260 (firefox), name hash: 70429ff7
|
||||||
|
2026-09-06 01:48:55.237323+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114820->Q2661] Question assigned DNS service 84
|
||||||
|
2026-09-06 01:48:55.237423+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114821] DNSServiceQueryRecord START -- qname: <mask.hash: 'rKTEtG7JmnThhoKPbZiVrA=='>, qtype: AAAA, flags: 0x1D000, interface index: 0, client pid: 12260 (firefox), name hash: 70429ff7
|
||||||
|
2026-09-06 01:48:55.237588+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114821->Q58675] Question assigned DNS service 84
|
||||||
|
2026-09-06 01:48:55.237601+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [Q58675] DetermineUnicastQuerySuppression: Query suppressed for <mask.hash: 'rKTEtG7JmnThhoKPbZiVrA=='> AAAA (AAAA records are unusable)
|
||||||
|
2026-09-06 01:48:55.237640+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [Q58675] GenerateNegativeResponse: Generating negative response for question
|
||||||
|
2026-09-06 01:48:55.237651+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114821->Q58675] DNSServiceQueryRecord result -- event: add, expired: no, ifindex: 0, name hash: 70429ff7, type: AAAA, rdata: <none>
|
||||||
|
2026-09-06 01:48:55.237903+0100 0x4e172c Default 0x0 639 0 mDNSResponder: [com.apple.mdns:resolver] [Q2661] Sent 55-byte query #1 to <IPv4:BBEFvEFo> over UDP via en0/14 -- id: 0x089F (2207), flags: 0x0100 (Q/Query, RD, NoError), counts: 1/0/0/0, BBgyliWZ IN A?
|
||||||
|
2026-09-06 01:48:55.254247+0100 0x4e172c Default 0x0 639 0 mDNSResponder: [com.apple.mdns:resolver] [Q2661] Received acceptable 155-byte response from <IPv4:BBEFvEFo> over UDP via en0/14 -- id: 0x089F (2207), flags: 0x8180 (R/Query, RD, RA, NoError), counts: 1/5/0/0, BBgyliWZ IN A?, 45 IN CNAME BBRnzZbz, 34 IN A BBXtrByy, 34 IN A BBEFKvtH, 34 IN A BBOpbcRV, 34 IN A BBcTGmrX
|
||||||
|
2026-09-06 01:48:55.254376+0100 0x4e2058 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [Q2661] Handling concluded querier: BBgyliWZ A IN
|
||||||
|
2026-09-06 01:48:55.254443+0100 0x4e2058 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114820->Q2661] DNSServiceQueryRecord result -- event: add, expired: no, ifindex: 0, name hash: 70429ff7, type: CNAME, rdata: <mask.hash: 'cDKUsCTEZJB+B/gEdA8N4g=='>
|
||||||
|
2026-09-06 01:48:55.254463+0100 0x4e2058 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [Q2661] AnswerQuestionByFollowingCNAME: following CNAME referral -- CNAME: <mask.hash: 'hCeMQekHxjAP1gJ3ZlTg5A=='>, referral count: 0
|
||||||
|
2026-09-06 01:48:55.254711+0100 0x4e2058 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114820->Q8111] Question assigned DNS service 84
|
||||||
|
2026-09-06 01:48:55.254778+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114820->Q8111] DNSServiceQueryRecord result -- event: add, expired: no, ifindex: 0, name hash: 4d30d13e, type: A, rdata: <mask.hash: '6b9WEaPm7Gqw4Flcl9+ddQ=='>
|
||||||
|
2026-09-06 01:48:55.254807+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114820->Q8111] DNSServiceQueryRecord result -- event: add, expired: no, ifindex: 0, name hash: 4d30d13e, type: A, rdata: <mask.hash: 'TfCnnBV+Z8bdyTgzgKVY6A=='>
|
||||||
|
2026-09-06 01:48:55.254820+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114820->Q8111] DNSServiceQueryRecord result -- event: add, expired: no, ifindex: 0, name hash: 4d30d13e, type: A, rdata: <mask.hash: 'I/iOn17GO6bh2gByjdYhqw=='>
|
||||||
|
2026-09-06 01:48:55.254831+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114820->Q8111] DNSServiceQueryRecord result -- event: add, expired: no, ifindex: 0, name hash: 4d30d13e, type: A, rdata: <mask.hash: 'J24bRFaq4i4juI0qgCq6/g=='>
|
||||||
|
2026-09-06 01:48:55.254894+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114820] DNSServiceQueryRecord STOP -- name hash: 4d30d13e, duration: 1s
|
||||||
|
2026-09-06 01:48:55.254919+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114821] DNSServiceQueryRecord STOP -- name hash: 70429ff7, duration: 1s
|
||||||
|
2026-09-06 01:48:55.255418+0100 0x11696 Default 0x0 0 0 kernel: [745895.993200]: arm_cpu_init(): cpu 11 online
|
||||||
|
2026-09-06 01:48:55.255424+0100 0x11696 Default 0x0 0 0 kernel: [745895.993205]: arm_cpu_init(): cpu 14 online
|
||||||
|
2026-09-06 01:48:55.255425+0100 0x11696 Default 0x0 0 0 kernel: [745895.993207]: arm_cpu_init(): cpu 15 online
|
||||||
|
2026-09-06 01:48:55.255417+0100 0x11696 Default 0x0 0 0 kernel: SK[6]: flow_entry_alloc fe "0 proc kernel_task(0)firefox nx_port 1 flow_uuid 74BDAEDA-44EF-49A6-9EF0-A23219CFCCE0 flags 0x14120<CONNECTED,QOS_MARKING,EXT_PORT,EXT_FLOWID> ipver=4,src=<IPv4-redacted>.53525,dst=<IPv4-redacted>.443,proto=0x06 mask=0x0000003f,hash=0x7baac1cc tp_proto=0x06"
|
||||||
|
2026-09-06 01:48:55.255454+0100 0x11696 Default 0x0 0 0 kernel: tcp connect outgoing: [<IPv4-redacted>:53525<-><IPv4-redacted>:443] interface: en0 (skipped: 593)
|
||||||
|
so_gencnt: 3510228 t_state: SYN_SENT process: firefox:12260 SYN in/out: 0/1 bytes in/out: 0/0 pkts in/out: 0/0 rtt: 0.0 ms rttvar: 250.0 ms base_rtt: 5 ms error: 0 so_error: 0 svc/tc: 0 flow: 0x96139917
|
||||||
|
2026-09-06 01:48:55.261279+0100 0x1c98 Default 0x0 0 0 kernel: tcp connected: [<IPv4-redacted>:53525<-><IPv4-redacted>:443] interface: en0 (skipped: 593)
|
||||||
|
so_gencnt: 3510228 t_state: ESTABLISHED process: firefox:12260 SYN in/out: 1/1 bytes in/out: 0/0 pkts in/out: 0/0 rtt: 0.0 ms rttvar: 250.0 ms base_rtt: 5 ms error: 0 so_error: 0 svc/tc: 0 flow: 0x96139917
|
||||||
|
2026-09-06 01:48:55.267182+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.300375+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.043247]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:55.300382+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.043252]: arm_cpu_init(): cpu 12 online
|
||||||
|
2026-09-06 01:48:55.300383+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.043256]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:55.300383+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.043260]: arm_cpu_init(): cpu 15 online
|
||||||
|
2026-09-06 01:48:55.300384+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.053765]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:55.300385+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.053794]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:55.300386+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.053827]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:55.300386+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.053860]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:55.300388+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.053892]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:55.300388+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.053923]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:55.300389+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.053958]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:55.300395+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.053990]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:55.300396+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.054022]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:55.300365+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.311658+0100 0x4e2059 Default 0x0 12260 0 firefox: (Network) [com.apple.network:path] nw_path_libinfo_path_check [B2491361-91B6-46C7-842E-F521AA802C01 Hostname#12130b20:0 tcp, legacy-socket, attribution: developer]
|
||||||
|
libinfo check path: <private>
|
||||||
|
2026-09-06 01:48:55.311755+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114822] DNSServiceQueryRecord START -- qname: <mask.hash: 'jTFU35oMx3mxTHXGo40ISg=='>, qtype: A, flags: 0x1D000, interface index: 0, client pid: 12260 (firefox), name hash: cc4a6c20
|
||||||
|
2026-09-06 01:48:55.312122+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114822->Q38154] Question assigned DNS service 84
|
||||||
|
2026-09-06 01:48:55.312209+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114823] DNSServiceQueryRecord START -- qname: <mask.hash: 'jTFU35oMx3mxTHXGo40ISg=='>, qtype: AAAA, flags: 0x1D000, interface index: 0, client pid: 12260 (firefox), name hash: cc4a6c20
|
||||||
|
2026-09-06 01:48:55.312387+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114823->Q15486] Question assigned DNS service 84
|
||||||
|
2026-09-06 01:48:55.312402+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [Q15486] DetermineUnicastQuerySuppression: Query suppressed for <mask.hash: 'jTFU35oMx3mxTHXGo40ISg=='> AAAA (AAAA records are unusable)
|
||||||
|
2026-09-06 01:48:55.312448+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [Q15486] GenerateNegativeResponse: Generating negative response for question
|
||||||
|
2026-09-06 01:48:55.312465+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114823->Q15486] DNSServiceQueryRecord result -- event: add, expired: no, ifindex: 0, name hash: cc4a6c20, type: AAAA, rdata: <none>
|
||||||
|
2026-09-06 01:48:55.312719+0100 0x4e2058 Default 0x0 639 0 mDNSResponder: [com.apple.mdns:resolver] [Q38154] Sent 53-byte query #1 to <IPv4:BBEFvEFo> over UDP via en0/14 -- id: 0xCBF5 (52213), flags: 0x0100 (Q/Query, RD, NoError), counts: 1/0/0/0, BBmCsKYR IN A?
|
||||||
|
2026-09-06 01:48:55.329218+0100 0x4e2058 Default 0x0 639 0 mDNSResponder: [com.apple.mdns:resolver] [Q38154] Received acceptable 69-byte response from <IPv4:BBEFvEFo> over UDP via en0/14 -- id: 0xCBF5 (52213), flags: 0x8180 (R/Query, RD, RA, NoError), counts: 1/1/0/0, BBmCsKYR IN A?, 2008 IN A BBYEzGsX
|
||||||
|
2026-09-06 01:48:55.329361+0100 0x4e172c Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [Q38154] Handling concluded querier: BBmCsKYR A IN
|
||||||
|
2026-09-06 01:48:55.329425+0100 0x4e172c Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114822->Q38154] DNSServiceQueryRecord result -- event: add, expired: no, ifindex: 0, name hash: cc4a6c20, type: A, rdata: <mask.hash: 'JGEmga7PvGVKnDgblBSHtg=='>
|
||||||
|
2026-09-06 01:48:55.329646+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114822] DNSServiceQueryRecord STOP -- name hash: cc4a6c20, duration: 0s
|
||||||
|
2026-09-06 01:48:55.329671+0100 0x1639 Default 0x0 639 0 mDNSResponder: [com.apple.mDNSResponder:Default] [R114823] DNSServiceQueryRecord STOP -- name hash: cc4a6c20, duration: 0s
|
||||||
|
2026-09-06 01:48:55.329920+0100 0x11696 Default 0x0 0 0 kernel: [745896.057369]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:55.329927+0100 0x11696 Default 0x0 0 0 kernel: [745896.057375]: arm_cpu_init(): cpu 14 online
|
||||||
|
2026-09-06 01:48:55.329927+0100 0x11696 Default 0x0 0 0 kernel: [745896.065099]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:55.329927+0100 0x11696 Default 0x0 0 0 kernel: [745896.065103]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:55.329927+0100 0x11696 Default 0x0 0 0 kernel: [745896.065106]: arm_cpu_init(): cpu 15 online
|
||||||
|
2026-09-06 01:48:55.329928+0100 0x11696 Default 0x0 0 0 kernel: [745896.072609]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:55.329927+0100 0x11696 Default 0x0 0 0 kernel: [745896.072615]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:55.329920+0100 0x11696 Default 0x0 0 0 kernel: SK[7]: flow_entry_alloc fe "0 proc kernel_task(0)firefox nx_port 1 flow_uuid 543F6B4B-FE19-4D0E-B3DD-2A550A742A3D flags 0x14120<CONNECTED,QOS_MARKING,EXT_PORT,EXT_FLOWID> ipver=4,src=<IPv4-redacted>.53540,dst=<IPv4-redacted>.443,proto=0x06 mask=0x0000003f,hash=0x7c762c2b tp_proto=0x06"
|
||||||
|
2026-09-06 01:48:55.329956+0100 0x11696 Default 0x0 0 0 kernel: tcp connect outgoing: [<IPv4-redacted>:53540<-><IPv4-redacted>:443] interface: en0 (skipped: 593)
|
||||||
|
so_gencnt: 3510252 t_state: SYN_SENT process: firefox:12260 SYN in/out: 0/1 bytes in/out: 0/0 pkts in/out: 0/0 rtt: 0.0 ms rttvar: 250.0 ms base_rtt: 0 ms error: 0 so_error: 0 svc/tc: 0 flow: 0x90dee0b7
|
||||||
|
2026-09-06 01:48:55.333766+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.336428+0100 0x1c98 Default 0x0 0 0 kernel: tcp connected: [<IPv4-redacted>:53540<-><IPv4-redacted>:443] interface: en0 (skipped: 593)
|
||||||
|
so_gencnt: 3510252 t_state: ESTABLISHED process: firefox:12260 SYN in/out: 1/1 bytes in/out: 0/0 pkts in/out: 0/0 rtt: 0.0 ms rttvar: 250.0 ms base_rtt: 0 ms error: 0 so_error: 0 svc/tc: 0 flow: 0x90dee0b7
|
||||||
|
2026-09-06 01:48:55.348649+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: isInfraRealtimePacketThresholdAllowed allowed:1 option:32 threshold:50 noRegistrations:1 cachedPeerCount:0 fastDiscoveryInactive:1 fastDiscoveryOnSince:255552912
|
||||||
|
2026-09-06 01:48:55.348674+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: currentInfraTrafficType:9277 checking if realtime upgrade required with inputPackets:62 outputPackets:53 packetThreshold:50
|
||||||
|
2026-09-06 01:48:55.348689+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: peerChannelSteer: PEER_CHANNEL_STEER isSteeringRequired 0 Attempt Count 0
|
||||||
|
2026-09-06 01:48:55.348696+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: peerChannelSteer: PEER_CHANNEL_STEER isRestartSteeringRequired is false
|
||||||
|
2026-09-06 01:48:55.348709+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9668] : In AW: Tx:0 Rx:0 Prev Tx:0 Rx:0 time since 255552912 indatamode 1 infraPriority 1 cpc 0
|
||||||
|
2026-09-06 01:48:55.348719+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9673] : Ignore changing the state as infraPriority 1 P2P-CPC 0
|
||||||
|
2026-09-06 01:48:55.365920+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.381034+0100 0x4de1c1 Default 0x0 589 0 bluetoothd: [com.apple.bluetooth:Server.MacCoex] Posting Bluetooth Status Notification <private>
|
||||||
|
2026-09-06 01:48:55.399752+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.130195]: arm_cpu_init(): cpu 12 online
|
||||||
|
2026-09-06 01:48:55.399761+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.130199]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:55.399761+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.130202]: arm_cpu_init(): cpu 14 online
|
||||||
|
2026-09-06 01:48:55.399766+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.141340]: arm_cpu_init(): cpu 11 online
|
||||||
|
2026-09-06 01:48:55.399766+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.141344]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:55.399766+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.141347]: arm_cpu_init(): cpu 14 online
|
||||||
|
2026-09-06 01:48:55.399750+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.407537+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:55.415091+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:55.433664+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.466363+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.190261]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:55.466373+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.190271]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:55.466361+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.499477+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.533288+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.544460+0100 0x4de289 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:55.556747+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:55.566993+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.600082+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.632344+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.666250+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.679793+0100 0x1f39 Default 0x0 1018 3 sharingd: (CoreUtils) [com.apple.sharing:SFBLEScanner] [NearbyInfo] Clearing duplicate cache
|
||||||
|
2026-09-06 01:48:55.679857+0100 0x1f39 Default 0x0 1018 0 sharingd: (WirelessProximity) [com.apple.bluetooth:WirelessProximity] Nearby clear duplicate filter cache type 1
|
||||||
|
2026-09-06 01:48:55.679911+0100 0x1f39 Default 0x0 1018 3 sharingd: (CoreUtils) [com.apple.sharing:SFBLEScanner] [NearbyAction] Clearing duplicate cache
|
||||||
|
2026-09-06 01:48:55.679932+0100 0x1f39 Default 0x0 1018 0 sharingd: (WirelessProximity) [com.apple.bluetooth:WirelessProximity] Nearby clear duplicate filter cache type 0
|
||||||
|
2026-09-06 01:48:55.680056+0100 0x1f39 Default 0x0 1018 3 sharingd: (CoreUtils) [com.apple.sharing:SDNearbyAgentCore] Identification removed stale 27b8d190-4d1a-f393-5364-ee9e347ff0ff
|
||||||
|
2026-09-06 01:48:55.680234+0100 0x4de1c1 Default 0x0 589 0 bluetoothd: (WPDaemon) [com.apple.bluetooth:WirelessProximity] clear dup filter cache for process sharingd (1018) with scan request of type 16, blob: {length = 0, bytes = 0x}, mask {length = 0, bytes = 0x}, active: 0, duplicates: 0, screen on: No Scan, screen off: No Scan, locked: 1, rssi: -90, peers: (
|
||||||
|
) nearby scan mode: 10, advbuf: 0, priority critical: 0, range: 0, usecases:
|
||||||
|
2026-09-06 01:48:55.680281+0100 0x4de1c1 Default 0x0 589 0 bluetoothd: (WPDaemon) [com.apple.bluetooth:WirelessProximity] About to clearDuplicateFilterCache for type: 16
|
||||||
|
2026-09-06 01:48:55.680354+0100 0x4dbefc Default 0x0 589 0 bluetoothd: [com.apple.bluetooth:Server.XPC] Received XPC message "CBMsgIdClearDuplicateFilterCache" from session "com.apple.bluetoothd-central-589-1"
|
||||||
|
2026-09-06 01:48:55.680398+0100 0x4de1c1 Default 0x0 589 0 bluetoothd: (WPDaemon) [com.apple.bluetooth:WirelessProximity] clear dup filter cache for process sharingd (1018) with scan request of type 15, blob: {length = 0, bytes = 0x}, mask {length = 0, bytes = 0x}, active: 0, duplicates: 0, screen on: No Scan, screen off: No Scan, locked: 1, rssi: -90, peers: (
|
||||||
|
) nearby scan mode: 10, advbuf: 0, priority critical: 0, range: 0, usecases:
|
||||||
|
2026-09-06 01:48:55.680422+0100 0x4de1c1 Default 0x0 589 0 bluetoothd: (WPDaemon) [com.apple.bluetooth:WirelessProximity] About to clearDuplicateFilterCache for type: 15
|
||||||
|
2026-09-06 01:48:55.684985+0100 0x4dbefc Default 0x0 589 0 bluetoothd: [com.apple.bluetooth:Server.App] clearDuplicateFilterCache for session "com.apple.bluetoothd" type 16
|
||||||
|
2026-09-06 01:48:55.685072+0100 0x4dbefc Default 0x0 589 0 bluetoothd: [com.apple.bluetooth:Server.XPC] Received XPC message "CBMsgIdClearDuplicateFilterCache" from session "com.apple.bluetoothd-central-589-1"
|
||||||
|
2026-09-06 01:48:55.688823+0100 0x4dbefc Default 0x0 589 0 bluetoothd: [com.apple.bluetooth:Server.App] clearDuplicateFilterCache for session "com.apple.bluetoothd" type 15
|
||||||
|
2026-09-06 01:48:55.699243+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.719580+0100 0x4e1c4e Default 0x0 1376 0 WallpaperAerialsExtension: (MediaToolbox) [com.apple.coremedia:] <<<< FigVideoQueue >>>> FigVideoQueueGMStats: (0x86f1eb400) 0 frames enqueued in the last 6 seconds; 0 were suspended. sbuf queue contains 0 frames (0.000 sec), max PTS: nan; LWM: 1.000 HWM: 2.000. Timebase time 238.895, rate 0.00. (pid 1376)
|
||||||
|
2026-09-06 01:48:55.728451+0100 0x4e1c4e Default 0x0 1376 0 WallpaperAerialsExtension: (MediaToolbox) [com.apple.coremedia:] <<<< FigVideoQueue >>>> FigVideoQueueGMStats: (0x86f1eb800) 0 frames enqueued in the last 6 seconds; 0 were suspended. sbuf queue contains 0 frames (0.000 sec), max PTS: nan; LWM: 1.000 HWM: 2.000. Timebase time 238.895, rate 0.00. (pid 1376)
|
||||||
|
2026-09-06 01:48:55.728480+0100 0x4e1c50 Default 0x0 1376 0 WallpaperAerialsExtension: (MediaToolbox) [com.apple.coremedia:] <<<< FigVideoQueue >>>> FigVideoQueueGMStats: (0x86f1ea800) 0 frames enqueued in the last 6 seconds; 0 were suspended. sbuf queue contains 0 frames (0.000 sec), max PTS: nan; LWM: 1.000 HWM: 2.000. Timebase time 238.895, rate 0.00. (pid 1376)
|
||||||
|
2026-09-06 01:48:55.728505+0100 0x4e23d2 Default 0x0 1376 0 WallpaperAerialsExtension: (MediaToolbox) [com.apple.coremedia:] <<<< FigVideoQueue >>>> FigVideoQueueGMStats: (0x86f1ebc00) 0 frames enqueued in the last 6 seconds; 0 were suspended. sbuf queue contains 0 frames (0.000 sec), max PTS: nan; LWM: 1.000 HWM: 2.000. Timebase time 238.895, rate 0.00. (pid 1376)
|
||||||
|
2026-09-06 01:48:55.731950+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.736436+0100 0x4defc2 Default 0x0 572 0 locationd: (SPFinder) [com.apple.icloud.SPFinder:advertisementCache] saveBeaconPayload: 1
|
||||||
|
2026-09-06 01:48:55.736480+0100 0x4df240 Default 0x0 572 0 locationd: [com.apple.locationd.Core:Harvester] {"msg":"onAvengerAdvertisementDetected: got avenger advertisement", "subHarvester":"Avenger"}
|
||||||
|
2026-09-06 01:48:55.736490+0100 0x4defc2 Activity 0x9d0e2b 572 0 locationd: (SPFinder) SPAdvertisementCache saveBeaconPayloads:completion:
|
||||||
|
2026-09-06 01:48:55.736553+0100 0x4df240 Default 0x0 572 0 locationd: [com.apple.locationd.Core:Harvester] {"msg":"convertToSPAdvertisement", "address":<private>, "data":<private>, "date":<private>, "rssi":<private>, "status":<private>, "reserved":<private>, "subHarvester":"Avenger"}
|
||||||
|
2026-09-06 01:48:55.736607+0100 0x4df240 Default 0x0 572 0 locationd: [com.apple.locationd.Core:Harvester] {"msg":"onAvengerAdvertisementDetected: advertisement is near-owner from other people and do not process it", "subHarvester":"Avenger"}
|
||||||
|
2026-09-06 01:48:55.736837+0100 0x4dfe20 Activity 0x9d0ff0 746 0 searchpartyd: (FindMyBase) SaveObservedAdvertisment
|
||||||
|
2026-09-06 01:48:55.737231+0100 0x4dfe20 Default 0x9d0ff0 746 0 searchpartyd: (FindMyBase) [com.apple.icloud.searchpartyd:observationStoring] TIME: ObservationStoring.Reconcile: <private>
|
||||||
|
2026-09-06 01:48:55.765790+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.799736+0100 0x4e0051 Activity 0x9d0fd0 553 0 mds: (CoreDuetContext) CoreDuet: ClientContext objectForContextualKeyPath:
|
||||||
|
2026-09-06 01:48:55.801580+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.824926+0100 0x4e20a1 Default 0x0 538 8 powerd: [com.apple.powerd:displayState] DesktopMode check on Battery 0
|
||||||
|
2026-09-06 01:48:55.830347+0100 0x4e1ff6 Error 0x0 0 0 kernel: (Sandbox) Sandbox: spotlightknowledged(19183) deny(1) mach-lookup com.apple.diagnosticd
|
||||||
|
2026-09-06 01:48:55.831847+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.841825+0100 0x4db1a8 Default 0x0 1157 0 mediaanalysisd: Running task MADServiceTextProcessingTask (57542) [QoS: 21]
|
||||||
|
2026-09-06 01:48:55.841897+0100 0x4db1a8 Default 0x0 1157 0 mediaanalysisd: Watchdog already enabled
|
||||||
|
2026-09-06 01:48:55.841929+0100 0x4db1a8 Default 0x0 1157 5 mediaanalysisd: [com.apple.mediaanalysis:persistent] [Scheduler] Running <private> (57542) [QoS: 21 Cost: 0.100]; remaining resource: 0.90
|
||||||
|
2026-09-06 01:48:55.841976+0100 0x4db1a8 Default 0x0 1157 5 mediaanalysisd: [com.apple.mediaanalysis:persistent] [QueuingScheduler] Scheduled foreground task MADServiceTextProcessingTask (MADRequestID 377, VCPMADTaskID 57542) for client <private>
|
||||||
|
2026-09-06 01:48:55.842274+0100 0x4d2d86 Default 0x0 1157 0 mediaanalysisd: (CoreSceneUnderstanding) Setting new context length 512
|
||||||
|
2026-09-06 01:48:55.860531+0100 0x4d2d86 Default 0x0 1157 0 mediaanalysisd: (MIL) MMapped <private> to base address 100d80000 with size 2008
|
||||||
|
2026-09-06 01:48:55.866558+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.872246+0100 0x4de289 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9668] : In AW: Tx:0 Rx:0 Prev Tx:0 Rx:0 time since 255553435 indatamode 1 infraPriority 1 cpc 0
|
||||||
|
2026-09-06 01:48:55.872263+0100 0x4de289 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9673] : Ignore changing the state as infraPriority 1 P2P-CPC 0
|
||||||
|
2026-09-06 01:48:55.875121+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:55.881387+0100 0x4d2d86 Default 0x0 1157 0 mediaanalysisd: (MIL) MMapped <private> to base address 10c840000 with size 677474
|
||||||
|
2026-09-06 01:48:55.899719+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.934529+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.673815]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:55.934541+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.673820]: arm_cpu_init(): cpu 12 online
|
||||||
|
2026-09-06 01:48:55.934542+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.673825]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:55.934527+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.937693+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:55.966206+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:55.966800+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:55.992284+0100 0x35de04 Default 0x0 0 0 kernel: [745896.723885]: arm_cpu_init(): cpu 12 online
|
||||||
|
2026-09-06 01:48:55.992293+0100 0x35de04 Default 0x0 0 0 kernel: [745896.723889]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:55.992294+0100 0x35de04 Default 0x0 0 0 kernel: [745896.723892]: arm_cpu_init(): cpu 14 online
|
||||||
|
2026-09-06 01:48:55.992294+0100 0x35de04 Default 0x0 0 0 kernel: [745896.732976]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:55.992294+0100 0x35de04 Default 0x0 0 0 kernel: [745896.732979]: arm_cpu_init(): cpu 12 online
|
||||||
|
2026-09-06 01:48:55.992294+0100 0x35de04 Default 0x0 0 0 kernel: [745896.732987]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:55.992282+0100 0x35de04 Default 0x0 0 0 kernel: process_is_plugin_host: running binary "sh" in keys-off mode due to identity: com.apple.sh
|
||||||
|
2026-09-06 01:48:55.993293+0100 0x4e23d7 Default 0x0 0 0 kernel: sh[40634] triggered unnest of range 0x1ee000000->0x1f2000000 of DYLD shared region in VM map 0xe6c827f1353fb483. While not abnormal for debuggers, this increases system memory footprint almost permanently (until the shared region is re-slid).
|
||||||
|
2026-09-06 01:48:55.994465+0100 0x4e23d7 Default 0x0 0 0 kernel: process_is_plugin_host: running binary "bash" in keys-off mode due to identity: com.apple.bash
|
||||||
|
2026-09-06 01:48:55.995238+0100 0x4e23d8 Default 0x0 0 0 kernel: bash[40634] triggered unnest of range 0x1ee000000->0x1f2000000 of DYLD shared region in VM map 0x797c4c4fe647b2b9. While not abnormal for debuggers, this increases system memory footprint almost permanently (until the shared region is re-slid).
|
||||||
|
2026-09-06 01:48:56.000882+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLState[10141] : Active Sockets false ValidSvc 4 NumAirplay 0 AFHandlePending 0 TimeOfLastAFHandleRequest 142708 ms
|
||||||
|
2026-09-06 01:48:56.000916+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLState[10239]: BonJourTrig 1 ValidSvc 4 RTApp 0 TSReq 0 HasActAirDrop 0 SocketsActive 0
|
||||||
|
2026-09-06 01:48:56.000928+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: setScheduleState[11041]: reason:UserTriggered sc:Infra Priority and force:NO, AWDL-restore:No
|
||||||
|
2026-09-06 01:48:56.001188+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.001370+0100 0x4e23d9 Default 0x0 0 0 kernel: python3.13[40634] triggered unnest of range 0x1ee000000->0x1f2000000 of DYLD shared region in VM map 0x38801cc981e88d6f. While not abnormal for debuggers, this increases system memory footprint almost permanently (until the shared region is re-slid).
|
||||||
|
2026-09-06 01:48:56.032459+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.772342]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:56.032468+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.772347]: arm_cpu_init(): cpu 12 online
|
||||||
|
2026-09-06 01:48:56.032468+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.772353]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:56.032469+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.772356]: arm_cpu_init(): cpu 15 online
|
||||||
|
2026-09-06 01:48:56.032458+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.049546+0100 0x35de04 Default 0x0 0 0 kernel: process_is_plugin_host: running binary "zsh" in keys-off mode due to identity: com.apple.zsh
|
||||||
|
2026-09-06 01:48:56.050416+0100 0x4e23da Default 0x0 0 0 kernel: zsh[40635] triggered unnest of range 0x1ee000000->0x1f2000000 of DYLD shared region in VM map 0xe6c827f1353fb483. While not abnormal for debuggers, this increases system memory footprint almost permanently (until the shared region is re-slid).
|
||||||
|
2026-09-06 01:48:56.052423+0100 0x4e23da Activity 0x9d1000 40635 0 zsh: (libsystem_info.dylib) Retrieve User by ID
|
||||||
|
2026-09-06 01:48:56.056832+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:56.066425+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.806256]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:56.066433+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.806262]: arm_cpu_init(): cpu 14 online
|
||||||
|
2026-09-06 01:48:56.066423+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.068814+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:56.070421+0100 0x4e23de Default 0x0 0 0 kernel: 2.1.261[40637] triggered unnest of range 0x1ee000000->0x1f2000000 of DYLD shared region in VM map 0xddbc6b7757294f33. While not abnormal for debuggers, this increases system memory footprint almost permanently (until the shared region is re-slid).
|
||||||
|
2026-09-06 01:48:56.100262+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.832882]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:56.100272+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.832886]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:56.100273+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.832889]: arm_cpu_init(): cpu 14 online
|
||||||
|
2026-09-06 01:48:56.100273+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.843348]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:56.100274+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.843354]: arm_cpu_init(): cpu 14 online
|
||||||
|
2026-09-06 01:48:56.100261+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.133625+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.166361+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.200737+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.233953+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.961670]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:56.233962+0100 0x4a3b07 Default 0x0 0 0 kernel: [745896.961676]: arm_cpu_init(): cpu 14 online
|
||||||
|
2026-09-06 01:48:56.233952+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.247221+0100 0x4e20a1 Default 0x0 538 8 powerd: [com.apple.powerd:displayState] DesktopMode check on Battery 0
|
||||||
|
2026-09-06 01:48:56.267171+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.300298+0100 0x4a3b07 Default 0x0 0 0 kernel: [745897.047876]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:56.300305+0100 0x4a3b07 Default 0x0 0 0 kernel: [745897.047905]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:56.300307+0100 0x4a3b07 Default 0x0 0 0 kernel: [745897.047936]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:56.300307+0100 0x4a3b07 Default 0x0 0 0 kernel: [745897.047980]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:56.300309+0100 0x4a3b07 Default 0x0 0 0 kernel: [745897.048016]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:56.300314+0100 0x4a3b07 Default 0x0 0 0 kernel: [745897.048045]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:56.300315+0100 0x4a3b07 Default 0x0 0 0 kernel: [745897.048094]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:56.300317+0100 0x4a3b07 Default 0x0 0 0 kernel: [745897.048123]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:56.300317+0100 0x4a3b07 Default 0x0 0 0 kernel: [745897.048155]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:56.300318+0100 0x4a3b07 Default 0x0 0 0 kernel: [745897.048200]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:56.300319+0100 0x4a3b07 Default 0x0 0 0 kernel: [745897.048233]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:56.300320+0100 0x4a3b07 Default 0x0 0 0 kernel: [745897.048263]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:56.300320+0100 0x4a3b07 Default 0x0 0 0 kernel: [745897.048311]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/ad
|
||||||
|
2026-09-06 01:48:56.300287+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.333609+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.366240+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.396619+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: isInfraRealtimePacketThresholdAllowed allowed:1 option:32 threshold:50 noRegistrations:1 cachedPeerCount:0 fastDiscoveryInactive:1 fastDiscoveryOnSince:255553960
|
||||||
|
2026-09-06 01:48:56.396649+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: currentInfraTrafficType:9277 checking if realtime upgrade required with inputPackets:106 outputPackets:155 packetThreshold:50
|
||||||
|
2026-09-06 01:48:56.396662+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: peerChannelSteer: PEER_CHANNEL_STEER isSteeringRequired 0 Attempt Count 0
|
||||||
|
2026-09-06 01:48:56.396671+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: peerChannelSteer: PEER_CHANNEL_STEER isRestartSteeringRequired is false
|
||||||
|
2026-09-06 01:48:56.396691+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9668] : In AW: Tx:0 Rx:0 Prev Tx:0 Rx:0 time since 255553960 indatamode 1 infraPriority 1 cpc 0
|
||||||
|
2026-09-06 01:48:56.396701+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9673] : Ignore changing the state as infraPriority 1 P2P-CPC 0
|
||||||
|
2026-09-06 01:48:56.400278+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.408316+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:56.432865+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.462152+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:56.466080+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.499132+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.506657+0100 0x4e20a1 Default 0x0 538 8 powerd: [com.apple.powerd:displayState] DesktopMode check on Battery 0
|
||||||
|
2026-09-06 01:48:56.533255+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.556058+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:56.565352+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.591174+0100 0x4e226a Default 0x0 1165 0 parsecd: (ApplePushService) allConsoleUserIDs <private>
|
||||||
|
2026-09-06 01:48:56.591400+0100 0x4e226a Default 0x0 1165 0 parsecd: (ApplePushService) [com.apple.apsd:connection] <private> creating an xpc connection {syncXPC: YES}
|
||||||
|
2026-09-06 01:48:56.591427+0100 0x4e226a Default 0x0 1165 0 parsecd: (libxpc.dylib) [com.apple.xpc:connection] [0xba30a1b80] activating connection: mach=true listener=false peer=false name=com.apple.apsd
|
||||||
|
2026-09-06 01:48:56.591483+0100 0x4e1fdb Error 0x0 0 0 kernel: (Sandbox) 2 duplicate reports for Sandbox: spotlightknowledged(19183) deny(1) mach-lookup com.apple.diagnosticd
|
||||||
|
2026-09-06 01:48:56.591494+0100 0x4e1fdb Error 0x0 0 0 kernel: (Sandbox) Sandbox: parsecd(1165) deny(1) mach-lookup com.apple.apsd
|
||||||
|
2026-09-06 01:48:56.591677+0100 0x4e226a Default 0x0 1165 0 parsecd: (libxpc.dylib) [com.apple.xpc:connection] [0xba30a1b80] failed to do a bootstrap look-up: xpc_error=[159: Unknown error: 159]
|
||||||
|
2026-09-06 01:48:56.591714+0100 0x4e226a Default 0x0 1165 0 parsecd: (libxpc.dylib) [com.apple.xpc:connection] [0xba30a1b80] invalidated after a failed init
|
||||||
|
2026-09-06 01:48:56.591861+0100 0x4e1e08 Error 0x0 1165 0 parsecd: (ApplePushService) [com.apple.apsd:xpc] Connection Invalid for service com.apple.apsd
|
||||||
|
2026-09-06 01:48:56.591878+0100 0x4e1e08 Default 0x0 1165 0 parsecd: (ApplePushService) [com.apple.apsd:connection] invalidationHandler called for <private>
|
||||||
|
2026-09-06 01:48:56.591962+0100 0x4e226a Default 0x0 1165 0 parsecd: (ApplePushService) [com.apple.apsd:connection] <private> Bad response from apsd: <private>
|
||||||
|
2026-09-06 01:48:56.592001+0100 0x4e226a Default 0x0 1165 0 parsecd: (ApplePushService) [com.apple.apsd:connection] Daemon connection did not succeed. Is apsd running?
|
||||||
|
2026-09-06 01:48:56.592065+0100 0x4e226a Default 0x0 1165 0 parsecd: (ApplePushService) [com.apple.apsd:connection] <private>: Will attempt reconnect in 300.000000 seconds
|
||||||
|
2026-09-06 01:48:56.592102+0100 0x4e226a Default 0x0 1165 0 parsecd: (ApplePushService) [com.apple.apsd:connection] <private> disconnected from apsd...
|
||||||
|
2026-09-06 01:48:56.592111+0100 0x4e226a Default 0x0 1165 0 parsecd: (ApplePushService) [com.apple.apsd:connection] <private> failing 0 pending outgoing messages.
|
||||||
|
2026-09-06 01:48:56.592118+0100 0x4e226a Default 0x0 1165 0 parsecd: (ApplePushService) [com.apple.apsd:connection] <private> calling connectIfNecessary
|
||||||
|
2026-09-06 01:48:56.592205+0100 0x4e226a Default 0x0 1165 0 parsecd: (ApplePushService) [com.apple.apsd:connection] <private>: Reconnect scheduled, skipping immediate connection to com.apple.apsd
|
||||||
|
2026-09-06 01:48:56.593107+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:56.599921+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.632882+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.656803+0100 0x4d6c29 Default 0x0 643 0 symptomsd: (SymptomEvaluator) [com.apple.symptomsd:bbh] TCP metrics iteration:270 since 30.00 secs: allflows=44/C=0/R=0/W=0/flows=3/unacked=0/rxbytes=14768/txbytes=4622/rxooo=0/rxdup=0/retx=0
|
||||||
|
2026-09-06 01:48:56.656853+0100 0x4d6c29 Default 0x0 643 0 symptomsd: (SymptomEvaluator) [com.apple.symptomsd:bbh] TCP progress metrics score: 0, problem ratio: 0.00 (baseline: 0.00)
|
||||||
|
2026-09-06 01:48:56.667344+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.699360+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.732739+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.766028+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.766434+0100 0x4e20a1 Default 0x0 538 8 powerd: [com.apple.powerd:displayState] DesktopMode check on Battery 0
|
||||||
|
2026-09-06 01:48:56.800349+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.832644+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.866678+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.897602+0100 0x4dfc8c Activity 0x9d0fd1 553 0 mds: (CoreDuetContext) CoreDuet: ClientContext objectForContextualKeyPath:
|
||||||
|
2026-09-06 01:48:56.897908+0100 0x4dfc8c Activity 0x9d0fd2 553 0 mds: (CoreDuetContext) CoreDuet: ClientContext objectForContextualKeyPath:
|
||||||
|
2026-09-06 01:48:56.898157+0100 0x4dfc8c Activity 0x9d0fd3 553 0 mds: (CoreDuetContext) CoreDuet: ClientContext objectForContextualKeyPath:
|
||||||
|
2026-09-06 01:48:56.898614+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.920820+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9668] : In AW: Tx:0 Rx:0 Prev Tx:0 Rx:0 time since 255554484 indatamode 1 infraPriority 1 cpc 0
|
||||||
|
2026-09-06 01:48:56.920848+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9673] : Ignore changing the state as infraPriority 1 P2P-CPC 0
|
||||||
|
2026-09-06 01:48:56.923048+0100 0x4d2d86 Default 0x0 1157 5 mediaanalysisd: [com.apple.mediaanalysis:persistent] [Scheduler] Completed <private> (57542) [QoS: 21]
|
||||||
|
2026-09-06 01:48:56.923306+0100 0x4e1ff6 Error 0x0 0 0 kernel: (Sandbox) Sandbox: spotlightknowledged(19183) deny(1) mach-lookup com.apple.diagnosticd
|
||||||
|
2026-09-06 01:48:56.927493+0100 0x1f39 Default 0x0 1018 3 sharingd: (CoreUtils) [com.apple.sharing:SFBLEScanner] [Prox] Clearing duplicate cache
|
||||||
|
2026-09-06 01:48:56.927537+0100 0x1f39 Default 0x0 1018 0 sharingd: (WirelessProximity) [com.apple.bluetooth:WirelessProximity] ProximityPairing clear duplicate cache
|
||||||
|
2026-09-06 01:48:56.927786+0100 0x4dff68 Default 0x0 589 0 bluetoothd: (WPDaemon) [com.apple.bluetooth:WirelessProximity] clear dup filter cache for process sharingd (1018) with scan request of type 7, blob: {length = 0, bytes = 0x}, mask {length = 0, bytes = 0x}, active: 0, duplicates: 0, screen on: No Scan, screen off: No Scan, locked: 1, rssi: -90, peers: (
|
||||||
|
) nearby scan mode: 10, advbuf: 0, priority critical: 0, range: 0, usecases:
|
||||||
|
2026-09-06 01:48:56.927825+0100 0x4dff68 Default 0x0 589 0 bluetoothd: (WPDaemon) [com.apple.bluetooth:WirelessProximity] About to clearDuplicateFilterCache for type: 7
|
||||||
|
2026-09-06 01:48:56.927883+0100 0x4de1c1 Default 0x0 589 0 bluetoothd: [com.apple.bluetooth:Server.XPC] Received XPC message "CBMsgIdClearDuplicateFilterCache" from session "com.apple.bluetoothd-central-589-1"
|
||||||
|
2026-09-06 01:48:56.930165+0100 0x4de1c1 Default 0x0 589 0 bluetoothd: [com.apple.bluetooth:Server.App] clearDuplicateFilterCache for session "com.apple.bluetoothd" type 7
|
||||||
|
2026-09-06 01:48:56.933261+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.966964+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:56.986301+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:57.000034+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.001909+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLState[10141] : Active Sockets false ValidSvc 4 NumAirplay 0 AFHandlePending 0 TimeOfLastAFHandleRequest 143709 ms
|
||||||
|
2026-09-06 01:48:57.001941+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLState[10239]: BonJourTrig 1 ValidSvc 4 RTApp 0 TSReq 0 HasActAirDrop 0 SocketsActive 0
|
||||||
|
2026-09-06 01:48:57.001953+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: setScheduleState[11041]: reason:UserTriggered sc:Infra Priority and force:NO, AWDL-restore:No
|
||||||
|
2026-09-06 01:48:57.015059+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:57.026106+0100 0x4e20a1 Default 0x0 538 8 powerd: [com.apple.powerd:displayState] DesktopMode check on Battery 0
|
||||||
|
2026-09-06 01:48:57.033034+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.056352+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:57.066726+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.099720+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.118079+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:57.134134+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.166618+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.196253+0100 0x4df240 Default 0x0 572 0 locationd: (SPFinder) [com.apple.icloud.SPFinder:advertisementCache] saveBeaconPayload: 1
|
||||||
|
2026-09-06 01:48:57.196249+0100 0x4defc1 Default 0x0 572 0 locationd: [com.apple.locationd.Core:Harvester] {"msg":"onAvengerAdvertisementDetected: got avenger advertisement", "subHarvester":"Avenger"}
|
||||||
|
2026-09-06 01:48:57.196286+0100 0x4df240 Activity 0x9d0e2c 572 0 locationd: (SPFinder) SPAdvertisementCache saveBeaconPayloads:completion:
|
||||||
|
2026-09-06 01:48:57.196317+0100 0x4defc1 Default 0x0 572 0 locationd: [com.apple.locationd.Core:Harvester] {"msg":"convertToSPAdvertisement", "address":<private>, "data":<private>, "date":<private>, "rssi":<private>, "status":<private>, "reserved":<private>, "subHarvester":"Avenger"}
|
||||||
|
2026-09-06 01:48:57.196359+0100 0x4defc1 Default 0x0 572 0 locationd: [com.apple.locationd.Core:Harvester] {"msg":"onAvengerAdvertisementDetected: advertisement is near-owner from other people and do not process it", "subHarvester":"Avenger"}
|
||||||
|
2026-09-06 01:48:57.196618+0100 0x4dfe20 Activity 0x9d0ff1 746 0 searchpartyd: (FindMyBase) SaveObservedAdvertisment
|
||||||
|
2026-09-06 01:48:57.197020+0100 0x4e069c Default 0x9d0ff1 746 0 searchpartyd: (FindMyBase) [com.apple.icloud.searchpartyd:observationStoring] TIME: ObservationStoring.Reconcile: <private>
|
||||||
|
2026-09-06 01:48:57.201156+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.231679+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.266391+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.285883+0100 0x4e20a1 Default 0x0 538 8 powerd: [com.apple.powerd:displayState] DesktopMode check on Battery 0
|
||||||
|
2026-09-06 01:48:57.300070+0100 0x4a3b07 Default 0x0 0 0 kernel: [745898.047797]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:57.300086+0100 0x4a3b07 Default 0x0 0 0 kernel: [745898.047821]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:57.300087+0100 0x4a3b07 Default 0x0 0 0 kernel: [745898.047850]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:57.300088+0100 0x4a3b07 Default 0x0 0 0 kernel: [745898.047904]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:57.300089+0100 0x4a3b07 Default 0x0 0 0 kernel: [745898.047934]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:57.300090+0100 0x4a3b07 Default 0x0 0 0 kernel: [745898.047960]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:57.300091+0100 0x4a3b07 Default 0x0 0 0 kernel: [745898.048015]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:57.300091+0100 0x4a3b07 Default 0x0 0 0 kernel: [745898.048040]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:57.300093+0100 0x4a3b07 Default 0x0 0 0 kernel: [745898.048071]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:57.300093+0100 0x4a3b07 Default 0x0 0 0 kernel: [745898.048118]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:57.300095+0100 0x4a3b07 Default 0x0 0 0 kernel: [745898.048150]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:57.300096+0100 0x4a3b07 Default 0x0 0 0 kernel: [745898.048184]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:57.300097+0100 0x4a3b07 Default 0x0 0 0 kernel: [745898.048237]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/ad
|
||||||
|
2026-09-06 01:48:57.300059+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.333480+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.366348+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.400255+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.408573+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:57.412060+0100 0x4e2016 Activity 0x9d0fd4 553 0 mds: (CoreDuetContext) CoreDuet: ClientContext objectForContextualKeyPath:
|
||||||
|
2026-09-06 01:48:57.433241+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.436836+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) 745898.192389 wlan0.E[819960] [wcl] checkTrafficCounters@2686:realTime before<0> -> after<0>, realTimeNumPackets =<2> inactive before<0> -> after<0>, infraNumPackets =<752> statsIntervalMultiplier=<5>
|
||||||
|
2026-09-06 01:48:57.436954+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) 745898.192514 wlan0.E[819961] [wcl] computeAdvisoryScores@666:LQM-WiFi: WiFi Latency: TxLat-hist [3(100 %) / 0(0 %) / 0(0 %) / 0(0 %)] RxLat-hist [0(0 %) / 0(0 %) / 0(0 %) / 0(0 %)]
|
||||||
|
2026-09-06 01:48:57.437120+0100 0x1551 Default 0x0 642 0 airportd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16356
|
||||||
|
2026-09-06 01:48:57.437176+0100 0x4db330 Default 0x0 642 0 airportd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16356
|
||||||
|
2026-09-06 01:48:57.437219+0100 0x4db330 Default 0x0 642 0 airportd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16360
|
||||||
|
2026-09-06 01:48:57.437246+0100 0x4db330 Default 0x0 642 0 airportd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16364
|
||||||
|
2026-09-06 01:48:57.437279+0100 0x4e2150 Default 0x0 929 0 wifip2pd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16356
|
||||||
|
2026-09-06 01:48:57.437351+0100 0x4e2150 Default 0x0 929 0 wifip2pd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16360
|
||||||
|
2026-09-06 01:48:57.437383+0100 0x4e2150 Default 0x0 929 0 wifip2pd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16364
|
||||||
|
2026-09-06 01:48:57.437270+0100 0x4db330 Default 0x0 642 0 airportd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16368
|
||||||
|
2026-09-06 01:48:57.437406+0100 0x4e2150 Default 0x0 929 0 wifip2pd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16368
|
||||||
|
2026-09-06 01:48:57.437428+0100 0x4e2150 Default 0x0 929 0 wifip2pd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16372
|
||||||
|
2026-09-06 01:48:57.437450+0100 0x4e2150 Default 0x0 929 0 wifip2pd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16376
|
||||||
|
2026-09-06 01:48:57.437472+0100 0x4e2150 Default 0x0 929 0 wifip2pd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16380
|
||||||
|
2026-09-06 01:48:57.438233+0100 0x4db330 Default 0x0 642 0 airportd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16372
|
||||||
|
2026-09-06 01:48:57.438397+0100 0x4db330 Default 0x0 642 0 airportd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16376
|
||||||
|
2026-09-06 01:48:57.438965+0100 0x4db330 Default 0x0 642 0 airportd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16380
|
||||||
|
2026-09-06 01:48:57.439214+0100 0x1551 Default 0x0 642 0 airportd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16360
|
||||||
|
2026-09-06 01:48:57.439350+0100 0x1551 Default 0x0 642 0 airportd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16364
|
||||||
|
2026-09-06 01:48:57.439506+0100 0x1551 Default 0x0 642 0 airportd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16368
|
||||||
|
2026-09-06 01:48:57.439540+0100 0x1551 Default 0x0 642 0 airportd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16372
|
||||||
|
2026-09-06 01:48:57.439564+0100 0x1551 Default 0x0 642 0 airportd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16376
|
||||||
|
2026-09-06 01:48:57.439587+0100 0x1551 Default 0x0 642 0 airportd: (IO80211) Apple80211EventMonitoringHelper:5877 Skipping Padding Read offset is 16380
|
||||||
|
2026-09-06 01:48:57.439664+0100 0x1551 Default 0x0 642 0 airportd: (IO80211) [com.apple.WiFiManager:] Driver Event: <airport[642]> _bsd_80211_event_callback: APPLE80211_M_REALTIME_SESSION_NOTIFICATION/156 (en0)
|
||||||
|
2026-09-06 01:48:57.439751+0100 0x4db330 Default 0x0 642 0 airportd: (IO80211) [com.apple.WiFiManager:] Info: <airport[642]> 11ax ASR session: new-state = 0x0
|
||||||
|
2026-09-06 01:48:57.439802+0100 0x4db330 Default 0x0 642 0 airportd: (IO80211) [com.apple.WiFiManager:] Info: <airport[642]> airportdProcessRealtimeSessionNotificationEvent channel score: chq = 3, tx-lat = 5, rx-lat = 3, tx-loss = 5, rx-loss = 5, p95-lat = 3, RT = 0x0, link-reco = 0x0
|
||||||
|
2026-09-06 01:48:57.442603+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) 745898.198158 wlan0.A[819962] [dk] updateLinkQualityMetrics@750:For current session updated fRxDurMulticast 5892240, fRxDurBroadcast 1909060
|
||||||
|
2026-09-06 01:48:57.445101+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: isInfraRealtimePacketThresholdAllowed allowed:1 option:32 threshold:50 noRegistrations:1 cachedPeerCount:0 fastDiscoveryInactive:1 fastDiscoveryOnSince:255555008
|
||||||
|
2026-09-06 01:48:57.445119+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: currentInfraTrafficType:9277 checking if realtime upgrade required with inputPackets:34 outputPackets:35 packetThreshold:50
|
||||||
|
2026-09-06 01:48:57.445143+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: peerChannelSteer: PEER_CHANNEL_STEER isSteeringRequired 0 Attempt Count 0
|
||||||
|
2026-09-06 01:48:57.445152+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: peerChannelSteer: PEER_CHANNEL_STEER isRestartSteeringRequired is false
|
||||||
|
2026-09-06 01:48:57.445166+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9668] : In AW: Tx:0 Rx:0 Prev Tx:0 Rx:0 time since 255555008 indatamode 1 infraPriority 1 cpc 0
|
||||||
|
2026-09-06 01:48:57.445176+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9673] : Ignore changing the state as infraPriority 1 P2P-CPC 0
|
||||||
|
2026-09-06 01:48:57.449237+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: IO80211PeerManager::reportDataPathEvents APPLE80211_M_RSSI_CHANGED RSSI -68 noise -94 snr 27. Core0Rssi:-66 Core1Rssi:-71
|
||||||
|
2026-09-06 01:48:57.449468+0100 0x1551 Default 0x0 642 0 airportd: (IO80211) [com.apple.WiFiManager:] Driver Event: <airport[642]> _bsd_80211_event_callback: APPLE80211_M_RSSI_CHANGED/39 (en0)
|
||||||
|
2026-09-06 01:48:57.449638+0100 0x1551 Default 0x0 642 0 airportd: (IO80211) [com.apple.WiFiManager:] Info: <airport[642]> Per-MLO link stats
|
||||||
|
2026-09-06 01:48:57.449750+0100 0x1551 Default 0x0 642 0 airportd: (IO80211) airportdProcessTrafficEngineeringEvents: <en0> eventType[39] @[745898.205068], took 0.000171
|
||||||
|
2026-09-06 01:48:57.449808+0100 0x1551 Default 0x0 642 0 airportd: (IO80211) [com.apple.WiFiManager:] <airport[642]> airportdProcessTrafficEngineeringEvents: <en0> eventType[39] @[745898.205068], took 0.000171
|
||||||
|
2026-09-06 01:48:57.450027+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM: rssi=-68dBm per_ant_rssi=(-66dBm, -71dBm) noise=-94dBm snr=27 cca=6.0% ccaSelfTotal=1 ccaOtherTotal=1 interferenceTotal=4 txRate=324.3Mbps txFrames=293 txFail=0 txRetrans=48 txFallbackRate=108.1Mbps rxRate=648.5Mbps rxFrames=322 rxRetryFrames=3 rxToss=0 beaconRecv=49 beaconSched=49 txFwFrames=0 txFwFail=0 txFwRetrans=0 network = <redacted> bssid = <redacted> channel = 44 BW = 80 band = 2
|
||||||
|
2026-09-06 01:48:57.450274+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM-WiFi: WeightAvgLQM rssi=-69 snr=27 txRate=301662 rxRate=576470
|
||||||
|
2026-09-06 01:48:57.450293+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM-WiFi: (HighBand) rxCrsGlitch=179 rxBphyCrsGlitch=0 rxStart=2993 rxBadPLCP=18 rxBphyBadPLCP=0 rxBadFCS=6 rxFifo0Ovfl=0 rxFifo1Ovfl=0 rx_nobuf=0 rxAnyErr=1643 rxResponseTimeout=16 rxNoDelim=91 rxFrmTooLong=0 rxFrmTooShort=0
|
||||||
|
2026-09-06 01:48:57.450303+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM-WiFi: (HighBand) txRTSFrm=169 txRTSFail=0 rxCTSUcast=168 rxRTSUcast=201 txCTSFrm=201 txAMPDU=170 rxBACK=155 txPhyError=0 txAllFrm=763 txMPDU=0 txUcast=170 rxACKUcast=0 OfdmDesense=0 dB
|
||||||
|
2026-09-06 01:48:57.450311+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM-WiFi: (HighBand) rxBeaconMbss=49 rxBeaconObss=0 rxDataUcastMbss=189 rxMgmtUcastMbss=0 rxCNTRLUcast=549 txACKFrm=0 txBACK=184 ctxFifoFull=0 ctxFifo2Full=0 rxDataMcast=4 rxMgmtMcast=49 rxDrop20s=210
|
||||||
|
2026-09-06 01:48:57.450316+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM-WiFi: RX AMPDU (HighBand) rxAmpdu=205 txBACK(Ucode)=184 rxMpduInAmpdu=214 rxholes=0 rxdup=0 rxstuck=0 rxoow=0 rxoos=1 rxaddbareq=0 txaddbaresp=0 rxbar=0 txdelba=0 rxdelba=0 rxQueued=1 rxRetryNoBA=0
|
||||||
|
2026-09-06 01:48:57.450322+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM-WiFi: WME RX MPDUs (rxPER 0 %) in tids 0:292, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0
|
||||||
|
2026-09-06 01:48:57.450328+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM-WiFi: Stats12(5G): bt5g_status=0x3 bt5g_defer_cnt=0 bt5g_no_defer_cnt=0 bt5g_defer_max_switch_dur=0 bt5g_no_defer_max_switch_dur=0 bt5g_switch_succ_cnt=0 bt5g_switch_fail_cnt=0 bt5g_switch_reason_bm=0
|
||||||
|
2026-09-06 01:48:57.450335+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM-WiFi: Stats12(2G): btDur=10ms(0%) status=0x10d reqTypeMap=0x500000 req=23 gnt=14 abort=2 rx1ovfl=0 latency=0 pmAttempt=0 sucPM=0 sucCTS2S=0 wlanTXPreempt=19 wlanRXPreempt=0 apTXafterPM=0 gntAudio=0 denyAudio=0 gntA2DP=0 denyA2DP=0
|
||||||
|
2026-09-06 01:48:57.450342+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM-WiFi: (HighBand) rxToss=0 rxLastTossRsn=39 rxNoFrag=0 rxNoCmplId=0 rxNoHaddr=0 rxMulti=2 rxUndec=0
|
||||||
|
2026-09-06 01:48:57.450354+0100 0x4db330 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] BEGIN REQ [GET INTF NAME] (pid=643 proc=symptomsd bundleID=com.apple.symptomsd codesignID=com.apple.symptomsd service=com.apple.private.corewifi-xpc qos=17 intf=(null) uuid=62638 info=(null))
|
||||||
|
2026-09-06 01:48:57.450365+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM-WiFi: Stats12(2G): CrtPriCnt=69 PriCnt=88 gntSniff=0 denySniff=0 antGrant0~10ms=157 antGrant10~30ms=0 antGrant30~60ms=0 antGrant>60ms=0 APLeakiness=0 rr_cnt=0 rr_succ_cnt=0
|
||||||
|
2026-09-06 01:48:57.450398+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM-WiFi: Stats12(2G): btDurAir=97ms(1%) desenseMode=0 wlrssi=0 btrssi=0 profile2gActive=0 profile5gActive=6 inactiveDur=4485 btPmAttemptNoackCnt=0 status2=0x0 [5000ms]
|
||||||
|
2026-09-06 01:48:57.450406+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM-WiFi: 15.4 Coex Stats V3: Mode=0 Request=0 Grant=0 Duration=0us AckedPM=0 TXedCTS2A=0 GrantDelay=0 CritPhyCal=0 CritRateRecovery=0 CritBcnLoss=0 CritHpp=0 CritBT=0 CritAwdlNan=0 CritMaxDur=1050 CirtAggregate=0 CritBitMapMax=2
|
||||||
|
2026-09-06 01:48:57.450429+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM-WiFi: 15.4 Coex Stats V3: 154_tx_req_cnt=0 154_rx_req_cnt=0 154_tx_deny_cnt=0 154_rx_deny_cnt=0 [5000ms]
|
||||||
|
2026-09-06 01:48:57.450417+0100 0x4db330 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] [62638] Incoming QoS is less than 'default', promoting to 'default'
|
||||||
|
2026-09-06 01:48:57.450437+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM-WiFi: TX(00:00:00:00:00:00) AC<SU MS NB NRS NA CM EX TF FFP MRET FLE> BE<292 0 0 0 0 0 0 0 0 0 0> (5002ms)
|
||||||
|
2026-09-06 01:48:57.450474+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM-WiFi: TX(00:00:00:00:00:00) AC<SU MS NB NRS NA CM EX TF FFP MRET FLE> BK<2 0 0 0 0 0 0 0 0 0 0> (5002ms)
|
||||||
|
2026-09-06 01:48:57.450483+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM-WiFi: TX(00:00:00:00:00:00) AC<SU MS NB NRS NA CM EX TF FFP MRET FLE> VI<0 0 0 0 0 0 0 0 0 0 0> (5002ms)
|
||||||
|
2026-09-06 01:48:57.450504+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM-WiFi: TX(00:00:00:00:00:00) AC<SU MS NB NRS NA CM EX TF FFP MRET FLE> VO<1 0 0 0 0 0 0 0 0 0 0> (5002ms)
|
||||||
|
2026-09-06 01:48:57.450596+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] LQM-WiFi: L3 Control VO TX(00:00:00:00:00:00) Success=1 NoACK=0 Expired=0 OtherErr=0
|
||||||
|
2026-09-06 01:48:57.450869+0100 0x4db330 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] END REQ [GET INTF NAME] took 0.000471584s (pid=643 proc=symptomsd bundleID=com.apple.symptomsd codesignID=com.apple.symptomsd service=com.apple.private.corewifi-xpc qos=21 intf=(null) uuid=62638 err=0 reply=<redacted>
|
||||||
|
2026-09-06 01:48:57.450959+0100 0x4df3b0 Default 0x0 643 0 symptomsd: (SymptomEvaluator) [com.apple.symptomsd:rnf] L2 Metrics on en0: rssi: -68 [-1,-1] -> -68, snr: 27 (cca [wake/total] self/other/intf): [1,1]/[0,1]/[4,4]/6 (txFrames/txReTx/txFail): 293/48/0 -> (was/is) 0/0, txRate: 324.0, rxRate: 648.0, rssiEMA: -67.6, snrEMA: 27.0, txRateEMA: 312.7, rxRateEMA: 534.6, isPrimary: 1, radio: 802.11ax
|
||||||
|
2026-09-06 01:48:57.451145+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] BEGIN REQ [GET BSSID] (pid=643 proc=symptomsd bundleID=com.apple.symptomsd codesignID=com.apple.symptomsd service=com.apple.private.corewifi-xpc qos=17 intf=(null) uuid=67C47 info=(null))
|
||||||
|
2026-09-06 01:48:57.451176+0100 0x4dfc53 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] [67C47] Incoming QoS is less than 'default', promoting to 'default'
|
||||||
|
2026-09-06 01:48:57.451603+0100 0x4dc356 Default 0x0 642 0 airportd: (CoreWiFi) [com.apple.WiFiManager:] [corewifi] END REQ [GET BSSID] took 0.000425417s (pid=643 proc=symptomsd bundleID=com.apple.symptomsd codesignID=com.apple.symptomsd service=com.apple.private.corewifi-xpc qos=21 intf=(null) uuid=67C47 err=0 reply=<redacted>
|
||||||
|
2026-09-06 01:48:57.467726+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.499311+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.510770+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: setSyncFramePeriod:25958 +++ Configuring the sync params(period, length) {16 16}, extlen = 16
|
||||||
|
2026-09-06 01:48:57.510803+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: setSyncFramePeriod::Setting PSF period to 110
|
||||||
|
2026-09-06 01:48:57.510824+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: programChipWithNewMaster: Programming new Mst: 82:45:A3:D5:31:34 at 255555.074ms HC 0 met 510 my met 510
|
||||||
|
2026-09-06 01:48:57.510847+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: setSyncFramePeriod:25958 +++ Configuring the sync params(period, length) {16 16}, extlen = 16
|
||||||
|
2026-09-06 01:48:57.510863+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: setSyncFramePeriod::Setting PSF period to 110
|
||||||
|
2026-09-06 01:48:57.510873+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: runElection: ElectionParamsChanged - Prog (F:0, 0) New P:82:45:A3:D5:31:34 R:82:45:A3:D5:31:34 [RLFC:49492 HC:0 RMet:510 SLFC:49492 SMet:510]
|
||||||
|
2026-09-06 01:48:57.510891+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:57.533659+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.558289+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:57.565927+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.586473+0100 0x4e20a1 Default 0x0 538 8 powerd: [com.apple.powerd:displayState] DesktopMode check on Battery 0
|
||||||
|
2026-09-06 01:48:57.599662+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.633376+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.641692+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:57.665974+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.699771+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.733070+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.766563+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.800210+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.832349+0100 0x4a3b07 Default 0x0 0 0 kernel: [745898.561636]: arm_cpu_init(): cpu 12 online
|
||||||
|
2026-09-06 01:48:57.832356+0100 0x4a3b07 Default 0x0 0 0 kernel: [745898.561642]: arm_cpu_init(): cpu 14 online
|
||||||
|
2026-09-06 01:48:57.832347+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.854407+0100 0x4e20a1 Default 0x0 538 8 powerd: [com.apple.powerd:displayState] DesktopMode check on Battery 0
|
||||||
|
2026-09-06 01:48:57.866599+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.899028+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.932110+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.966597+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:57.969365+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9668] : In AW: Tx:0 Rx:0 Prev Tx:0 Rx:0 time since 255555533 indatamode 1 infraPriority 1 cpc 0
|
||||||
|
2026-09-06 01:48:57.969385+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9673] : Ignore changing the state as infraPriority 1 P2P-CPC 0
|
||||||
|
2026-09-06 01:48:58.000845+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLState[10141] : Active Sockets false ValidSvc 4 NumAirplay 0 AFHandlePending 0 TimeOfLastAFHandleRequest 144708 ms
|
||||||
|
2026-09-06 01:48:58.000878+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLState[10239]: BonJourTrig 1 ValidSvc 4 RTApp 0 TSReq 0 HasActAirDrop 0 SocketsActive 0
|
||||||
|
2026-09-06 01:48:58.000891+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: setScheduleState[11041]: reason:UserTriggered sc:Infra Priority and force:NO, AWDL-restore:No
|
||||||
|
2026-09-06 01:48:58.001361+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.033116+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.034822+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:58.056677+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:58.066963+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.099429+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.132720+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.133661+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:58.139542+0100 0x4e2016 Activity 0x9d0fd5 553 0 mds: (CoreDuetContext) CoreDuet: ClientContext objectForContextualKeyPath:
|
||||||
|
2026-09-06 01:48:58.166016+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:58.166457+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.200626+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.233134+0100 0x4a3b07 Default 0x0 0 0 kernel: [745898.970309]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:58.233143+0100 0x4a3b07 Default 0x0 0 0 kernel: [745898.970312]: arm_cpu_init(): cpu 11 online
|
||||||
|
2026-09-06 01:48:58.233143+0100 0x4a3b07 Default 0x0 0 0 kernel: [745898.970319]: arm_cpu_init(): cpu 14 online
|
||||||
|
2026-09-06 01:48:58.233133+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.266457+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.299153+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.047915]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:58.299159+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.047958]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:58.299161+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.047998]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:58.299168+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.048043]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:58.299168+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.048079]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:58.299169+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.048108]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:58.299170+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.048147]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:58.299171+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.048187]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:58.299171+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.048211]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:58.299173+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.048265]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:58.299173+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.048290]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:58.299174+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.048321]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:58.299175+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.048363]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/ad
|
||||||
|
2026-09-06 01:48:58.299142+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.333347+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.366017+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.400317+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.409677+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:58.432904+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.466670+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.494467+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: isInfraRealtimePacketThresholdAllowed allowed:1 option:32 threshold:50 noRegistrations:1 cachedPeerCount:0 fastDiscoveryInactive:1 fastDiscoveryOnSince:255556058
|
||||||
|
2026-09-06 01:48:58.494496+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: currentInfraTrafficType:9277 checking if realtime upgrade required with inputPackets:33 outputPackets:32 packetThreshold:50
|
||||||
|
2026-09-06 01:48:58.494510+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: peerChannelSteer: PEER_CHANNEL_STEER isSteeringRequired 0 Attempt Count 0
|
||||||
|
2026-09-06 01:48:58.494517+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: peerChannelSteer: PEER_CHANNEL_STEER isRestartSteeringRequired is false
|
||||||
|
2026-09-06 01:48:58.494532+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9668] : In AW: Tx:0 Rx:0 Prev Tx:0 Rx:0 time since 255556058 indatamode 1 infraPriority 1 cpc 0
|
||||||
|
2026-09-06 01:48:58.494541+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9673] : Ignore changing the state as infraPriority 1 P2P-CPC 0
|
||||||
|
2026-09-06 01:48:58.498467+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.533601+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.558028+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:58.561375+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:58.566902+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.599663+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.633427+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.665831+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.683749+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:58.690410+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:58.699997+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.732558+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.765115+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.799353+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.832325+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.865970+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.898628+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.933533+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.966260+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:58.989972+0100 0x4defc1 Default 0x0 572 0 locationd: [com.apple.locationd.Core:Harvester] {"msg":"onAvengerAdvertisementDetected: got avenger advertisement", "subHarvester":"Avenger"}
|
||||||
|
2026-09-06 01:48:58.989993+0100 0x4defc2 Default 0x0 572 0 locationd: (SPFinder) [com.apple.icloud.SPFinder:advertisementCache] saveBeaconPayload: 1
|
||||||
|
2026-09-06 01:48:58.990030+0100 0x4defc2 Activity 0x9d0e2d 572 0 locationd: (SPFinder) SPAdvertisementCache saveBeaconPayloads:completion:
|
||||||
|
2026-09-06 01:48:58.990047+0100 0x4defc1 Default 0x0 572 0 locationd: [com.apple.locationd.Core:Harvester] {"msg":"convertToSPAdvertisement", "address":<private>, "data":<private>, "date":<private>, "rssi":<private>, "status":<private>, "reserved":<private>, "subHarvester":"Avenger"}
|
||||||
|
2026-09-06 01:48:58.990092+0100 0x4defc1 Default 0x0 572 0 locationd: [com.apple.locationd.Core:Harvester] {"msg":"onAvengerAdvertisementDetected: advertisement is near-owner from other people and do not process it", "subHarvester":"Avenger"}
|
||||||
|
2026-09-06 01:48:58.990439+0100 0x4e069c Activity 0x9d0ff2 746 0 searchpartyd: (FindMyBase) SaveObservedAdvertisment
|
||||||
|
2026-09-06 01:48:58.990963+0100 0x4e069c Default 0x9d0ff2 746 0 searchpartyd: (FindMyBase) [com.apple.icloud.searchpartyd:observationStoring] TIME: ObservationStoring.Reconcile: <private>
|
||||||
|
2026-09-06 01:48:59.000898+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:59.002606+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLState[10141] : Active Sockets false ValidSvc 4 NumAirplay 0 AFHandlePending 0 TimeOfLastAFHandleRequest 145710 ms
|
||||||
|
2026-09-06 01:48:59.002639+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLState[10239]: BonJourTrig 1 ValidSvc 4 RTApp 0 TSReq 0 HasActAirDrop 0 SocketsActive 0
|
||||||
|
2026-09-06 01:48:59.002652+0100 0x4df69c Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: setScheduleState[11041]: reason:UserTriggered sc:Infra Priority and force:NO, AWDL-restore:No
|
||||||
|
2026-09-06 01:48:59.017950+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9668] : In AW: Tx:0 Rx:0 Prev Tx:0 Rx:0 time since 255556581 indatamode 1 infraPriority 1 cpc 0
|
||||||
|
2026-09-06 01:48:59.017974+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9673] : Ignore changing the state as infraPriority 1 P2P-CPC 0
|
||||||
|
2026-09-06 01:48:59.031972+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:59.056221+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:59.066719+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:59.081521+0100 0x4e20a1 Default 0x0 538 8 powerd: [com.apple.powerd:displayState] DesktopMode check on Battery 0
|
||||||
|
2026-09-06 01:48:59.081758+0100 0x4dfe54 Default 0x0 538 8 powerd: [com.apple.powerd:BDC] Battery percentage last 80 now 79
|
||||||
|
2026-09-06 01:48:59.082100+0100 0x144b Default 0x0 606 0 WindowServer: (BackBoardHIDEventFoundation) [com.apple.BackBoard:EventDelivery] destinations for Keyboard event: (<keyboardFocus; kitty.1343; token: viewbridge-key-window>)
|
||||||
|
2026-09-06 01:48:59.082142+0100 0x144b Default 0x0 606 7 WindowServer: (SkyLight) [com.apple.SkyLight:KeyboardEvent] delivery manager destinations for kCGSEventFlagsChanged event: <keyboardFocus; pid: 1343; token: viewbridge-key-window>
|
||||||
|
2026-09-06 01:48:59.082554+0100 0x2e72 Default 0x0 1343 0 kitty: (TextInputUIMacHelper) [com.apple.TextInputUI:CursorUI] -[TUINSCursorUIController scheduleUpdateCursorLocation]
|
||||||
|
2026-09-06 01:48:59.083180+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:59.083489+0100 0x4e002b Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:59.087177+0100 0x4dfe54 Default 0x0 538 8 powerd: [com.apple.powerd:BDC] Sending data to powerlog for group BDC_SBC
|
||||||
|
2026-09-06 01:48:59.099446+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:59.110515+0100 0x1bf1 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) IO80211ControllerMonitor::setAMPDUstat unhandled kAMPDUStat_ type 14
|
||||||
|
2026-09-06 01:48:59.110533+0100 0x1bf1 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) IO80211ControllerMonitor::setAMPDUstat unhandled kAMPDUStat_ type 13
|
||||||
|
2026-09-06 01:48:59.110544+0100 0x1bf1 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) IO80211ControllerMonitor::setAMPDUstat unhandled kAMPDUStat_ type 18
|
||||||
|
2026-09-06 01:48:59.115191+0100 0x1bf1 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) 745899.870747 wlan0.A[819963] [dk] parsePHYEcounterV5@31099: Version = 5, ChanSpec=0xe22a, noise_req=13095, noise_crsbit=8021, cal_counter=4181, rxchain=15, chiptemp=37, femtemp=-50, btcx_mode=0, ltecx_mode=0, weakest_rssi=-74, chan_switc
|
||||||
|
2026-09-06 01:48:59.115222+0100 0x1bf1 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) 745899.870782 wlan0.A[819964] [dk] parsePHYEcounterV5@31104: gbd_ofdm_desense=0, gbd_bphy_desense=0, featureflag=96, crsmin_pwr_apply_cnt=33882, preempt_status2=64278, ed_crs_status=0, measurehold=0, ocl_disable_reqs=0, gci_rst_tx= 15463,
|
||||||
|
2026-09-06 01:48:59.115234+0100 0x1bf1 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) 745899.870797 wlan0.A[819965] [dk] parsePHYEcounterV5@31109: asym_intf_avg_noise[0/1]= [-98, -98], asym_intf_latest_noise[0/1]=[-98, -98], pwridx_init[0/1]=[35, 37], baseindxval[0/1]=[36, 37]
|
||||||
|
2026-09-06 01:48:59.115247+0100 0x1bf1 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) 745899.870809 wlan0.A[819966] [dk] parsePHYEcounterV5@31115: estpwradj[0/1]=[60, 60], ed_threshold[0/1]=[-74, -75], crsmin_pwr_idx[0/1]=[7, 7], crsmin_pwr[0/1]=[-95, -94], noise_level_inst[0/1]=[-96, -95]
|
||||||
|
2026-09-06 01:48:59.120723+0100 0x1bf1 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) 745899.876283 wlan0.A[819967] [dk] updateChanSeqCommonStats@3612:P2P chan 44: dur 744287836, entry 18673, crsglitch 9822232, start 132520737, badplcp 763283, badfcs 3170566, f0ov 420, f1ov 577, anyerr 30581679, resptout 1168070, frmtooln 0
|
||||||
|
2026-09-06 01:48:59.120738+0100 0x1bf1 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) 745899.876300 wlan0.A[819968] [dk] updateChanSeqCommonStats@3612:P2P chan 6: dur 15735521, entry 1, crsglitch 696648, start 188156, badplcp 6484, badfcs 33786, f0ov 0, f1ov 0, anyerr 23863, resptout 0, frmtooln 0, frmtoosh 7630
|
||||||
|
2026-09-06 01:48:59.120744+0100 0x1bf1 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) 745899.876308 wlan0.A[819969] NAV stats: ch 44 (135039794 689529 490534 167738 748 86) ch 6 (132084 1835 1281 106 1750 5)
|
||||||
|
2026-09-06 01:48:59.120783+0100 0x1bf1 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) 745899.876346 wlan0.A[819970] [dk] printDeltaSliceUcodeRxErrs@1925:(HighBand) rxNotPrimary20s=1245 ucodeLateDrop=0 rxInvalidUcodeLateWrongMACPHY=0 rxLate30us=0 rxLegacyFrmInvalid=0 txSifsErr=0 ooseqMacSusp=0
|
||||||
|
2026-09-06 01:48:59.132741+0100 0x1551 Default 0x0 642 0 airportd: (IO80211) [com.apple.WiFiManager:] Driver Event: <airport[642]> _bsd_80211_event_callback: APPLE80211_M_BT_COEX_MODE_STATS_EVENT/190 (en0)
|
||||||
|
2026-09-06 01:48:59.133026+0100 0x4dc356 Default 0x0 642 0 airportd: (IO80211) [com.apple.WiFiManager:] Info: <airport[642]> handle airportdProcessBtCoexStatsEvent
|
||||||
|
2026-09-06 01:48:59.133418+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:59.165682+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:59.170964+0100 0x35de04 Default 0x0 0 0 kernel: process_is_plugin_host: running binary "sh" in keys-off mode due to identity: com.apple.sh
|
||||||
|
2026-09-06 01:48:59.172051+0100 0x4e2411 Default 0x0 0 0 kernel: sh[40639] triggered unnest of range 0x1ee000000->0x1f2000000 of DYLD shared region in VM map 0xe6c827f1353fb483. While not abnormal for debuggers, this increases system memory footprint almost permanently (until the shared region is re-slid).
|
||||||
|
2026-09-06 01:48:59.173175+0100 0x4e2411 Default 0x0 0 0 kernel: [745899.928319]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:59.173180+0100 0x4e2411 Default 0x0 0 0 kernel: [745899.928329]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:59.173174+0100 0x4e2411 Default 0x0 0 0 kernel: process_is_plugin_host: running binary "bash" in keys-off mode due to identity: com.apple.bash
|
||||||
|
2026-09-06 01:48:59.174017+0100 0x4e2412 Default 0x0 0 0 kernel: bash[40639] triggered unnest of range 0x1ee000000->0x1f2000000 of DYLD shared region in VM map 0xb2a61f073e8c5e91. While not abnormal for debuggers, this increases system memory footprint almost permanently (until the shared region is re-slid).
|
||||||
|
2026-09-06 01:48:59.200132+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.949345]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:59.200143+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.949348]: arm_cpu_init(): cpu 11 online
|
||||||
|
2026-09-06 01:48:59.200144+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.949354]: arm_cpu_init(): cpu 12 online
|
||||||
|
2026-09-06 01:48:59.200145+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.949357]: arm_cpu_init(): cpu 14 online
|
||||||
|
2026-09-06 01:48:59.200145+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.949360]: arm_cpu_init(): cpu 15 online
|
||||||
|
2026-09-06 01:48:59.200126+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:59.214584+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.en0: set Datapath Open needsTrigger 0
|
||||||
|
2026-09-06 01:48:59.235340+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.984752]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:59.235348+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.984754]: arm_cpu_init(): cpu 11 online
|
||||||
|
2026-09-06 01:48:59.235349+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.984760]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:59.235350+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.984763]: arm_cpu_init(): cpu 14 online
|
||||||
|
2026-09-06 01:48:59.235339+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:59.267868+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.997722]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:59.267880+0100 0x4a3b07 Default 0x0 0 0 kernel: [745899.997727]: arm_cpu_init(): cpu 15 online
|
||||||
|
2026-09-06 01:48:59.267881+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.010921]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:59.267882+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.010924]: arm_cpu_init(): cpu 12 online
|
||||||
|
2026-09-06 01:48:59.267883+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.010929]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:59.267892+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.020472]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:59.267892+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.020475]: arm_cpu_init(): cpu 11 online
|
||||||
|
2026-09-06 01:48:59.267892+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.020480]: arm_cpu_init(): cpu 12 online
|
||||||
|
2026-09-06 01:48:59.267894+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.020483]: arm_cpu_init(): cpu 14 online
|
||||||
|
2026-09-06 01:48:59.267894+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.020486]: arm_cpu_init(): cpu 15 online
|
||||||
|
2026-09-06 01:48:59.267864+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:59.300117+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.030709]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:59.300125+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.030712]: arm_cpu_init(): cpu 11 online
|
||||||
|
2026-09-06 01:48:59.300125+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.030718]: arm_cpu_init(): cpu 12 online
|
||||||
|
2026-09-06 01:48:59.300125+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.030721]: arm_cpu_init(): cpu 14 online
|
||||||
|
2026-09-06 01:48:59.300126+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.046426]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:59.300128+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.046472]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:59.300129+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.046504]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:59.300129+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.046540]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:59.300130+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.046572]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:59.300131+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.046618]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:59.300133+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.046638]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:59.300134+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.046668]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:59.300135+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.046700]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:59.300141+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.046749]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:59.300142+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.046778]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:59.300143+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.046809]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrdincr)/0x0 vc/sc/tz/crh/tid:0x2/0x1/0x0/0x0/0x2f size:0x3 piopkt:0x0 user:0x4 userext:0x0 hasdata/has2data:0x0/0x0 dstchildid/dstparentid:0x3f/0x2 srcchildid/srcparentid:0x8ea/0x1d addrl/addrh:0x0/0x0 timestamp:0x0 errorvec:0x10
|
||||||
|
2026-09-06 01:48:59.300143+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.047460]: Ignored NI0 NI0 niGeneral 2 NO_ACCESS error (0x00000010) cmd/st:0x14(ncrd
|
||||||
|
2026-09-06 01:48:59.300105+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:59.333193+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:59.366943+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.098299]: arm_cpu_init(): cpu 10 online
|
||||||
|
2026-09-06 01:48:59.366951+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.098302]: arm_cpu_init(): cpu 12 online
|
||||||
|
2026-09-06 01:48:59.366952+0100 0x4a3b07 Default 0x0 0 0 kernel: [745900.098309]: arm_cpu_init(): cpu 13 online
|
||||||
|
2026-09-06 01:48:59.366941+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:59.400043+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:59.409533+0100 0x2e72 Default 0x0 1343 7 kitty: (SkyLight) [com.apple.SkyLight:default] SLSGetDisplaysWithOpenGLDisplayMask, 3614: Display 0x00000001: Mode 54, (0 x 0) [1728 x 1117], Depth 32 BPP, active
|
||||||
|
2026-09-06 01:48:59.432119+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:59.467080+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:59.499502+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:59.533324+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:59.543029+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: isInfraRealtimePacketThresholdAllowed allowed:1 option:32 threshold:50 noRegistrations:1 cachedPeerCount:0 fastDiscoveryInactive:1 fastDiscoveryOnSince:255557106
|
||||||
|
2026-09-06 01:48:59.543059+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: currentInfraTrafficType:9277 checking if realtime upgrade required with inputPackets:99 outputPackets:144 packetThreshold:50
|
||||||
|
2026-09-06 01:48:59.543072+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: peerChannelSteer: PEER_CHANNEL_STEER isSteeringRequired 0 Attempt Count 0
|
||||||
|
2026-09-06 01:48:59.543090+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: peerChannelSteer: PEER_CHANNEL_STEER isRestartSteeringRequired is false
|
||||||
|
2026-09-06 01:48:59.543104+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9668] : In AW: Tx:0 Rx:0 Prev Tx:0 Rx:0 time since 255557106 indatamode 1 infraPriority 1 cpc 0
|
||||||
|
2026-09-06 01:48:59.543150+0100 0x4de131 Default 0x0 0 0 kernel: (com.apple.DriverKit-AppleBCMWLAN.dext) wlan0:com.apple.p2p.awdl0: monitorAWDLDataMode[9673] : Ignore changing the state as infraPriority 1 P2P-CPC 0
|
||||||
|
2026-09-06 01:48:59.565970+0100 0x4a3b07 Error 0x0 0 0 kernel: (IOSurface) SID: 0x0 task: <decode: mismatch for [%p] got [SCALAR private sz:0]> buffer: 0x0 buffer->fClientTask = 0x0 not found
|
||||||
|
2026-09-06 01:48:59.577680+0100 0x4dfe54 Default 0x0 538 8 powerd: [com.apple.powerd:displayState] DesktopMode check on Battery 0
|
||||||
|
2026-09-06 01:48:59.578339+0100 0x144b Default 0x0 606 0 WindowServer: (BackBoardHIDEventFoundation) [com.apple.BackBoard:EventDelivery] destinations for Keyboard event: (<keyboardFocus; kitty.1343; token: viewbridge-key-window>)
|
||||||
|
2026-09-06 01:48:59.578385+0100 0x144b Default 0x0 606 7 WindowServer: (SkyLight) [com.apple.SkyLight:KeyboardEvent] delivery manager destinations for kCGSEventKeyDown event: <keyboardFocus; pid: 1343; token: viewbridge-key-window>
|
||||||
|
2026-09-06 01:48:59.579704+0100 0x2e72 Default 0x0 1343 0 kitty: (SidecarCore) [com.apple.sidecar:core] updateDevices: deviceGeneration=0 (prev=0) displayGeneration=0 (prev=0)
|
||||||
|
2026-09-06 01:48:59.579746+0100 0x2e72 Default 0x0 1343 0 kitty: (SidecarCore) [com.apple.sidecar:core] updateDevices(connectedDevices): returning 0 device(s) to caller: (
|
||||||
|
)
|
||||||
|
2026-09-06 01:48:59.579759+0100 0x2e72 Default 0x0 1343 0 kitty: (SidecarCore) [com.apple.sidecar:core] updateDevices: deviceGeneration=0 (prev=0) displayGeneration=0 (prev=0)
|
||||||
|
2026-09-06 01:48:59.579773+0100 0x2e72 Default 0x0 1343 0 kitty: (SidecarCore) [com.apple.sidecar:core] updateDevices(devices): returning 0 device(s) to caller: (
|
||||||
|
)
|
||||||
|
2026-09-06 01:48:59.580218+0100 0x2e72 Default 0x0 1343 0 kitty: (SidecarCore) [com.apple.sidecar:core] updateDevices: deviceGeneration=0 (prev=0) displayGeneration=0 (prev=0)
|
||||||
|
2026-09-06 01:48:59.580238+0100 0x2e72 Default 0x0 1343 0 kitty: (SidecarCore) [com.apple.sidecar:core] updateDevices(connectedDevices): returning 0 device(s) to caller: (
|
||||||
|
)
|
||||||
|
2026-09-06 01:48:59.580248+0100 0x2e72 Default 0x0 1343 0 kitty: (SidecarCore) [com.apple.sidecar:core] updateDevices: deviceGeneration=0 (prev=0) displayGeneration=0 (prev=0)
|
||||||
|
2026-09-06 01:48:59.580273+0100 0x2e72 Default 0x0 1343 0 kitty: (SidecarCore) [com.apple.sidecar:core] updateDevices(devices): returning 0 device(s) to caller: (
|
||||||
|
)
|
||||||
|
2026-09-06 01:48:59.580663+0100 0x2e72 Default 0x0 1343 0 kitty: (TextInputUIMacHelper) [com.apple.TextInputUI:CursorUI] -[TUINSCursorUIController scheduleUpdateCursorLocation]
|
||||||
+110
-6
@@ -6,8 +6,11 @@
|
|||||||
use nom::branch::alt;
|
use nom::branch::alt;
|
||||||
use nom::bytes::complete::{escaped, take_while1};
|
use nom::bytes::complete::{escaped, take_while1};
|
||||||
use nom::character::complete::{char, none_of, one_of};
|
use nom::character::complete::{char, none_of, one_of};
|
||||||
|
use nom::error::{Error, ErrorKind};
|
||||||
use nom::sequence::delimited;
|
use nom::sequence::delimited;
|
||||||
use nom::IResult;
|
use nom::IResult;
|
||||||
|
use regex::Regex;
|
||||||
|
use std::sync::LazyLock;
|
||||||
|
|
||||||
fn key(input: &str) -> IResult<&str, &str> {
|
fn key(input: &str) -> IResult<&str, &str> {
|
||||||
take_while1(|c: char| c.is_ascii_alphanumeric() || c == '_' || c == '.' || c == '-')(input)
|
take_while1(|c: char| c.is_ascii_alphanumeric() || c == '_' || c == '.' || c == '-')(input)
|
||||||
@@ -25,6 +28,17 @@ fn bareword_value(input: &str) -> IResult<&str, &str> {
|
|||||||
take_while1(|c: char| !c.is_whitespace())(input)
|
take_while1(|c: char| !c.is_whitespace())(input)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A bareword value starting with a bare `=` means the raw text actually had `key==...`/`key===...` —
|
||||||
|
/// never a real logfmt pair. This is exactly what `pair` would otherwise produce when it lands
|
||||||
|
/// mid-way through a base64/hash blob whose padding (`=`/`==`) happens to sit right after a run of
|
||||||
|
/// alnum chars that `key()` greedily consumed — e.g. the `huig_dump.txt` fixture's
|
||||||
|
/// `<mask.hash: 'rKTEtG7JmnThhoKPbZiVrA=='>,`: `key()` eats `rKTEtG7JmnThhoKPbZiVrA`, the first `=` is
|
||||||
|
/// consumed as the pair's `=`, leaving a bareword value of `='>,` (ticket 050). Rejected here rather
|
||||||
|
/// than post-filtered by a caller so `extract_pairs` never reports the false positive to anyone.
|
||||||
|
fn looks_like_base64_padding_artifact(value: &str) -> bool {
|
||||||
|
value.starts_with('=')
|
||||||
|
}
|
||||||
|
|
||||||
/// One `key=value` pair found on a line: the key, the raw captured value (unescaped as-is, quotes
|
/// One `key=value` pair found on a line: the key, the raw captured value (unescaped as-is, quotes
|
||||||
/// stripped but any inner `\"`/`\\` left literal since callers only need it for numeric-kind
|
/// stripped but any inner `\"`/`\\` left literal since callers only need it for numeric-kind
|
||||||
/// inference), and whether the value was quoted.
|
/// inference), and whether the value was quoted.
|
||||||
@@ -35,6 +49,9 @@ fn pair(input: &str) -> IResult<&str, (&str, &str, bool)> {
|
|||||||
Ok((rest, (k, v, true)))
|
Ok((rest, (k, v, true)))
|
||||||
} else {
|
} else {
|
||||||
let (rest, v) = bareword_value(input)?;
|
let (rest, v) = bareword_value(input)?;
|
||||||
|
if looks_like_base64_padding_artifact(v) {
|
||||||
|
return Err(nom::Err::Error(Error::new(input, ErrorKind::Verify)));
|
||||||
|
}
|
||||||
Ok((rest, (k, v, false)))
|
Ok((rest, (k, v, false)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -61,14 +78,51 @@ pub fn extract_pairs(line: &str) -> Vec<(&str, &str, bool)> {
|
|||||||
results
|
results
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Fixed-column shape of macOS `log stream` output (ticket 050/054): a line starts with
|
||||||
|
/// `Timestamp Thread Type Activity PID TTL` (date, time+tz, a hex thread id, a bareword type, a hex
|
||||||
|
/// activity id, a decimal pid, a decimal ttl) followed by a free-text `process: message` tail — see
|
||||||
|
/// `huig_dump.txt`'s header row and body. Anchored at the very start of the line and requires the
|
||||||
|
/// hex/decimal shape of each column, so it won't accidentally fire on ordinary logfmt/JSON/prose that
|
||||||
|
/// merely resembles it in one column. Checked ahead of JSON/logfmt in `detect_format` since it's the
|
||||||
|
/// most specific of the three (an all-columns-plus-hex-ids match is a much stronger signal than an
|
||||||
|
/// incidental `key=value` substring), and is deliberately a *format label* rather than a dedicated
|
||||||
|
/// `ottyl_fmt` value change to JSON/logfmt detection — a `log stream` line's message tail can still
|
||||||
|
/// separately contain real `key=value` pairs (see the WiFi/radio stat lines in the fixture), which
|
||||||
|
/// `crate::engine::auto_declare_params` keeps discovering via `extract_pairs` regardless of this
|
||||||
|
/// line's `ottyl_fmt` label.
|
||||||
|
static LOG_STREAM_RE: LazyLock<Regex> = LazyLock::new(|| {
|
||||||
|
Regex::new(
|
||||||
|
r"^\d{4}-\d{2}-\d{2}\s+\S+\s+0x[0-9a-fA-F]+\s+\S+\s+0x[0-9a-fA-F]+\s+\d+\s+\d+\s+[^\s:]+:\s",
|
||||||
|
)
|
||||||
|
.expect("static log_stream regex must compile")
|
||||||
|
});
|
||||||
|
|
||||||
|
pub fn is_log_stream_line(line: &str) -> bool {
|
||||||
|
LOG_STREAM_RE.is_match(line)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `message_match_regex` patterns `crate::engine::auto_declare_log_stream_params` uses to declare
|
||||||
|
/// `log_type`/`process`/`pid` as standalone params the first time a `log stream`-shaped line is seen.
|
||||||
|
/// Each isolates exactly one named capture group (matching `derive_log_params`'s one-group-per-param
|
||||||
|
/// convention) over the same column layout `LOG_STREAM_RE` detects.
|
||||||
|
pub const LOG_STREAM_TYPE_PATTERN: &str =
|
||||||
|
r"^\d{4}-\d{2}-\d{2}\s+\S+\s+0x[0-9a-fA-F]+\s+(?P<log_type>\S+)\s+0x[0-9a-fA-F]+\s+\d+\s+\d+\s+[^\s:]+:\s";
|
||||||
|
pub const LOG_STREAM_PROCESS_PATTERN: &str =
|
||||||
|
r"^\d{4}-\d{2}-\d{2}\s+\S+\s+0x[0-9a-fA-F]+\s+\S+\s+0x[0-9a-fA-F]+\s+\d+\s+\d+\s+(?P<process>[^\s:]+):\s";
|
||||||
|
pub const LOG_STREAM_PID_PATTERN: &str =
|
||||||
|
r"^\d{4}-\d{2}-\d{2}\s+\S+\s+0x[0-9a-fA-F]+\s+\S+\s+0x[0-9a-fA-F]+\s+(?P<pid>\d+)\s+\d+\s+[^\s:]+:\s";
|
||||||
|
|
||||||
/// The value of the `ottyl_fmt` reserved param (`crate::engine::compile_filter`/`eval_alert_expr`):
|
/// The value of the `ottyl_fmt` reserved param (`crate::engine::compile_filter`/`eval_alert_expr`):
|
||||||
/// which format a line was recognized as when parsed. JSON is checked first since a JSON object can
|
/// which format a line was recognized as when parsed. `log stream`'s fixed-column shape is checked
|
||||||
/// incidentally contain `key=value`-shaped substrings that `extract_pairs` would otherwise pick up;
|
/// first (see `LOG_STREAM_RE`'s doc comment for why it's the most specific of the four). JSON is
|
||||||
/// only a top-level object counts (arrays/scalars aren't what `crate::engine::eval_json_comparison`
|
/// checked next since a JSON object can incidentally contain `key=value`-shaped substrings that
|
||||||
/// treats as JSON either). Anything else falls back to logfmt-style pair extraction, and a line with
|
/// `extract_pairs` would otherwise pick up; only a top-level object counts (arrays/scalars aren't what
|
||||||
/// neither is `"none"`.
|
/// `crate::engine::eval_json_comparison` treats as JSON either). Anything else falls back to
|
||||||
|
/// logfmt-style pair extraction, and a line with none of the above is `"none"`.
|
||||||
pub fn detect_format(text: &str) -> &'static str {
|
pub fn detect_format(text: &str) -> &'static str {
|
||||||
if serde_json::from_str::<serde_json::Value>(text).is_ok_and(|value| value.is_object()) {
|
if is_log_stream_line(text) {
|
||||||
|
"log_stream"
|
||||||
|
} else if serde_json::from_str::<serde_json::Value>(text).is_ok_and(|value| value.is_object()) {
|
||||||
"json"
|
"json"
|
||||||
} else if !extract_pairs(text).is_empty() {
|
} else if !extract_pairs(text).is_empty() {
|
||||||
"logfmt"
|
"logfmt"
|
||||||
@@ -146,4 +200,54 @@ mod tests {
|
|||||||
assert_eq!(detect_format("[1,2,3]"), "none");
|
assert_eq!(detect_format("[1,2,3]"), "none");
|
||||||
assert_eq!(detect_format("42"), "none");
|
assert_eq!(detect_format("42"), "none");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rejects_base64_padding_fragment_as_a_pair() {
|
||||||
|
// The exact false-positive shape from ticket 050's fixture: `key()` greedily consumes the
|
||||||
|
// tail of the base64 blob as if it were a key, landing right before the `==` padding.
|
||||||
|
let pairs = extract_pairs(
|
||||||
|
"qname: <mask.hash: 'rKTEtG7JmnThhoKPbZiVrA=='>, qtype: A, client pid: 12260 (firefox)",
|
||||||
|
);
|
||||||
|
assert!(
|
||||||
|
pairs.iter().all(|(k, _, _)| *k != "rKTEtG7JmnThhoKPbZiVrA"),
|
||||||
|
"base64 padding fragment must not be extracted as a pair: {pairs:?}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const LOG_STREAM_FIXTURE: &str = include_str!("fixtures/log_stream_sample.txt");
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn detects_log_stream_shaped_lines() {
|
||||||
|
let data_line = LOG_STREAM_FIXTURE.lines().nth(1).unwrap();
|
||||||
|
assert_eq!(detect_format(data_line), "log_stream");
|
||||||
|
assert!(is_log_stream_line(data_line));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn header_row_is_not_detected_as_log_stream() {
|
||||||
|
let header = LOG_STREAM_FIXTURE.lines().next().unwrap();
|
||||||
|
assert!(!is_log_stream_line(header));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn log_stream_patterns_capture_type_process_and_pid() {
|
||||||
|
let line = "2026-09-06 01:48:54.518117+0100 0x4dfed2 Default 0x0 606 0 WindowServer: (HSTouchHIDService) something happened";
|
||||||
|
let type_re = Regex::new(LOG_STREAM_TYPE_PATTERN).unwrap();
|
||||||
|
let process_re = Regex::new(LOG_STREAM_PROCESS_PATTERN).unwrap();
|
||||||
|
let pid_re = Regex::new(LOG_STREAM_PID_PATTERN).unwrap();
|
||||||
|
assert_eq!(type_re.captures(line).unwrap().name("log_type").unwrap().as_str(), "Default");
|
||||||
|
assert_eq!(process_re.captures(line).unwrap().name("process").unwrap().as_str(), "WindowServer");
|
||||||
|
assert_eq!(pid_re.captures(line).unwrap().name("pid").unwrap().as_str(), "606");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn a_wifi_stat_dump_line_is_still_recognized_as_log_stream_despite_embedded_key_value_pairs() {
|
||||||
|
let line = LOG_STREAM_FIXTURE
|
||||||
|
.lines()
|
||||||
|
.find(|line| line.contains("txRTSFrm="))
|
||||||
|
.expect("fixture must contain the WiFi stat dump line");
|
||||||
|
assert_eq!(detect_format(line), "log_stream");
|
||||||
|
// The embedded key=value pairs are still there for auto_declare_params to see.
|
||||||
|
assert!(!extract_pairs(line).is_empty());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -600,6 +600,26 @@ impl Settings {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Empties `profile_name`'s stored param declarations, persisting settings — the counterpart to
|
||||||
|
/// `record_param_declaration` for `DELETE /api/params` (ticket 052). A profile only ever stores
|
||||||
|
/// manually-declared params (auto-derived ones live only in the engine, never persisted here), so
|
||||||
|
/// this is enough to keep the whole set from reappearing on next load; the engine-side clear
|
||||||
|
/// re-derives whatever auto params the retained log text still supports.
|
||||||
|
pub fn clear_param_declarations(
|
||||||
|
&mut self,
|
||||||
|
settings_path: &Path,
|
||||||
|
profile_name: &str,
|
||||||
|
) -> Result<(), ProfileError> {
|
||||||
|
let profile = self
|
||||||
|
.profiles
|
||||||
|
.iter_mut()
|
||||||
|
.find(|p| p.name == profile_name)
|
||||||
|
.ok_or(ProfileError::NotFound)?;
|
||||||
|
profile.params.clear();
|
||||||
|
self.save(settings_path)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
/// Records/updates a declared param into `profile_name`'s stored declarations (matched by param
|
/// Records/updates a declared param into `profile_name`'s stored declarations (matched by param
|
||||||
/// name), persisting settings. Intended to be called by the HTTP API alongside declaring against
|
/// name), persisting settings. Intended to be called by the HTTP API alongside declaring against
|
||||||
/// the engine, so declarations survive a restart.
|
/// the engine, so declarations survive a restart.
|
||||||
@@ -694,6 +714,27 @@ impl Settings {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Removes `name`'s persisted metric declaration from `profile_name` (ticket 051), so it doesn't
|
||||||
|
/// reappear from `settings.json` on the next restart. A no-op (not an error) if the profile has
|
||||||
|
/// no record under that name — matches `Settings::remove_css`'s sibling calls in spirit, but
|
||||||
|
/// deleting an already-gone declaration is fine here since the caller (the API layer) has
|
||||||
|
/// already confirmed against the live engine index whether the metric existed at all.
|
||||||
|
pub fn remove_metric_declaration(
|
||||||
|
&mut self,
|
||||||
|
settings_path: &Path,
|
||||||
|
profile_name: &str,
|
||||||
|
name: &str,
|
||||||
|
) -> Result<(), ProfileError> {
|
||||||
|
let profile = self
|
||||||
|
.profiles
|
||||||
|
.iter_mut()
|
||||||
|
.find(|p| p.name == profile_name)
|
||||||
|
.ok_or(ProfileError::NotFound)?;
|
||||||
|
profile.metrics.retain(|r| r.name != name);
|
||||||
|
self.save(settings_path)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
/// Lists the dashboards saved on `profile_name`; fails with `NotFound` if it doesn't exist.
|
/// Lists the dashboards saved on `profile_name`; fails with `NotFound` if it doesn't exist.
|
||||||
pub fn list_dashboards(&self, profile_name: &str) -> Result<&[Dashboard], ProfileError> {
|
pub fn list_dashboards(&self, profile_name: &str) -> Result<&[Dashboard], ProfileError> {
|
||||||
let profile = self.profile(profile_name).ok_or(ProfileError::NotFound)?;
|
let profile = self.profile(profile_name).ok_or(ProfileError::NotFound)?;
|
||||||
@@ -1036,6 +1077,28 @@ mod tests {
|
|||||||
assert_eq!(profile.metrics.len(), 1);
|
assert_eq!(profile.metrics.len(), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn remove_metric_declaration_drops_it_and_does_not_reappear_after_restart() {
|
||||||
|
let dir = tempfile::tempdir().unwrap();
|
||||||
|
let settings_path = dir.path().join("settings.json");
|
||||||
|
let mut settings = Settings::default();
|
||||||
|
|
||||||
|
settings.create_profile(&settings_path, "web".to_string()).unwrap();
|
||||||
|
let metric_req = metric_request("requests", r"duration=(?P<duration>\d+)", "duration");
|
||||||
|
settings.record_metric_declaration(&settings_path, "web", &metric_req, &[]).unwrap();
|
||||||
|
assert_eq!(settings.profile("web").unwrap().metrics.len(), 1);
|
||||||
|
|
||||||
|
settings.remove_metric_declaration(&settings_path, "web", "requests").unwrap();
|
||||||
|
assert!(settings.profile("web").unwrap().metrics.is_empty());
|
||||||
|
|
||||||
|
// Removing an unknown metric name is a harmless no-op, not an error.
|
||||||
|
settings.remove_metric_declaration(&settings_path, "web", "never-declared").unwrap();
|
||||||
|
|
||||||
|
// Reload from disk: the removal itself survives a restart (ticket 051's acceptance criterion).
|
||||||
|
let reloaded = Settings::load(&settings_path);
|
||||||
|
assert!(reloaded.profile("web").unwrap().metrics.is_empty());
|
||||||
|
}
|
||||||
|
|
||||||
/// Acceptance criterion: declaring params/metrics, "restarting" (reloading settings from disk), and replaying into a fresh engine reproduces the same declarations and still ingests lines, without re-declaring by hand.
|
/// Acceptance criterion: declaring params/metrics, "restarting" (reloading settings from disk), and replaying into a fresh engine reproduces the same declarations and still ingests lines, without re-declaring by hand.
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn profile_round_trip_reproduces_declarations_in_fresh_engine() {
|
async fn profile_round_trip_reproduces_declarations_in_fresh_engine() {
|
||||||
|
|||||||
@@ -40,6 +40,21 @@ pub enum ColorScheme {
|
|||||||
/// Brighter, light-surfaced counterpart to `Green` (ticket 048).
|
/// Brighter, light-surfaced counterpart to `Green` (ticket 048).
|
||||||
#[serde(rename = "light_green")]
|
#[serde(rename = "light_green")]
|
||||||
LightGreen,
|
LightGreen,
|
||||||
|
/// Brighter, light-surfaced counterpart to `Red` (ticket 056).
|
||||||
|
#[serde(rename = "light_red")]
|
||||||
|
LightRed,
|
||||||
|
/// Brighter, light-surfaced counterpart to `Blue` (ticket 056).
|
||||||
|
#[serde(rename = "light_blue")]
|
||||||
|
LightBlue,
|
||||||
|
/// Brighter, light-surfaced counterpart to `Yellow` (ticket 056).
|
||||||
|
#[serde(rename = "light_yellow")]
|
||||||
|
LightYellow,
|
||||||
|
/// Brighter, light-surfaced counterpart to `Pink` (ticket 056).
|
||||||
|
#[serde(rename = "light_pink")]
|
||||||
|
LightPink,
|
||||||
|
/// Brighter, light-surfaced counterpart to `Orange` (ticket 056).
|
||||||
|
#[serde(rename = "light_orange")]
|
||||||
|
LightOrange,
|
||||||
#[default]
|
#[default]
|
||||||
System,
|
System,
|
||||||
}
|
}
|
||||||
@@ -425,6 +440,23 @@ mod tests {
|
|||||||
assert_eq!(reloaded, settings);
|
assert_eq!(reloaded, settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn light_variant_color_schemes_round_trip_through_serde() {
|
||||||
|
for (scheme, rename) in [
|
||||||
|
(ColorScheme::LightGreen, "light_green"),
|
||||||
|
(ColorScheme::LightRed, "light_red"),
|
||||||
|
(ColorScheme::LightBlue, "light_blue"),
|
||||||
|
(ColorScheme::LightYellow, "light_yellow"),
|
||||||
|
(ColorScheme::LightPink, "light_pink"),
|
||||||
|
(ColorScheme::LightOrange, "light_orange"),
|
||||||
|
] {
|
||||||
|
let json = serde_json::to_string(&scheme).unwrap();
|
||||||
|
assert_eq!(json, format!("\"{rename}\""));
|
||||||
|
let deserialized: ColorScheme = serde_json::from_str(&json).unwrap();
|
||||||
|
assert_eq!(deserialized, scheme);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn legacy_grey_color_scheme_deserializes_as_dark() {
|
fn legacy_grey_color_scheme_deserializes_as_dark() {
|
||||||
let settings: Settings = serde_json::from_str(
|
let settings: Settings = serde_json::from_str(
|
||||||
|
|||||||
@@ -1,84 +0,0 @@
|
|||||||
# 050 — Bound logfmt-overfit param cardinality; derive params from `log stream`-style structured headers
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
|
|
||||||
A real-world `log stream` (macOS unified log) dump (`huig_dump.txt`, ~700
|
|
||||||
lines) exposes two related problems in the auto-param-derivation path
|
|
||||||
(`auto_declare_params` in `src/engine.rs`, backed by `extract_pairs` in
|
|
||||||
`src/logfmt.rs`, run on *every* ingested line at `src/engine.rs:155`):
|
|
||||||
|
|
||||||
1. **`=`-overfitting produces runaway, low-value param cardinality.**
|
|
||||||
`extract_pairs` scans anywhere in the line for `key=value`/`key="value"`
|
|
||||||
and treats every match as a declarable param. On the sample dump this
|
|
||||||
discovers **220 distinct auto-declared param names** from under 700
|
|
||||||
lines — one-off WiFi/radio stat dumps alone contribute lines with
|
|
||||||
20-27 `key=value` pairs each (e.g. `txRTSFrm=169 txRTSFail=0
|
|
||||||
rxCTSUcast=168 ...`), most of which are internal counters that will
|
|
||||||
never recur meaningfully. Some matches are outright false positives:
|
|
||||||
base64-encoded blobs ending in padding (e.g.
|
|
||||||
`rKTEtG7JmnThhoKPbZiVrA=='>,`) get parsed as a `key=value` pair because
|
|
||||||
`=` precedes non-whitespace. Since `auto_declare_params` "never
|
|
||||||
overwrites an existing declaration" and there is no cap or pruning
|
|
||||||
anywhere in the ingest path, every distinct key seen ever becomes a
|
|
||||||
permanent declaration — this is almost certainly the source of the
|
|
||||||
reported ingest lag on this input (per-line nom scanning cost is
|
|
||||||
presumably fine; the unbounded, ever-growing declaration/index set is
|
|
||||||
the more likely culprit and should be measured either way) and it
|
|
||||||
clutters the params UI with noise no user asked for.
|
|
||||||
|
|
||||||
2. **The input's real structure is being ignored.** `log stream` output is
|
|
||||||
not logfmt at all — it's a fixed-column header (`Timestamp`, `Thread`,
|
|
||||||
`Type`, `Activity`, `PID`, `TTL`) followed by a free-text
|
|
||||||
`process: message` tail (see header row and body of `huig_dump.txt`).
|
|
||||||
`Type` (`Default`/`Error`/`Activity`), the process name (`kernel`,
|
|
||||||
`airportd`, `bluetoothd`, `WindowServer`, ...), and `PID` are
|
|
||||||
low-cardinality, genuinely useful params that could be derived
|
|
||||||
directly and cheaply from column position — with no `=`-scanning, no
|
|
||||||
ambiguity, and no risk of false positives — instead of (or in addition
|
|
||||||
to) whatever generic `key=value` pairs happen to appear later in the
|
|
||||||
line.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
- Add a bound/safeguard on `auto_declare_params` so a single burst of
|
|
||||||
unusual lines can't permanently inflate the declared-param set:
|
|
||||||
options include (pick and justify one, or combine) a cap on the total
|
|
||||||
number of auto-derived declarations, a per-line cap on how many
|
|
||||||
`key=value` pairs from one line are eligible for auto-declaration, and/or
|
|
||||||
a heuristic to reject candidate pairs that look like base64 fragments
|
|
||||||
(trailing `=`/`==` with a base64-alphabet value and no realistic bareword
|
|
||||||
shape) in `src/logfmt.rs`'s `extract_pairs`/`pair`.
|
|
||||||
- Add an optional structured-header extractor for `log stream`-shaped
|
|
||||||
input: detect the fixed-column header/row shape (timestamp, thread id,
|
|
||||||
log type, activity id, pid, ttl, `process: message`) and surface
|
|
||||||
`Type`/process-name/`PID` as derivable params, analogous to how
|
|
||||||
`ottyl_fmt` (ticket 044) records which format a line matched. Decide
|
|
||||||
whether this is a new `ottyl_fmt` variant (e.g. `"log_stream"`) or a
|
|
||||||
separate always-attempted extraction that runs alongside
|
|
||||||
logfmt/JSON detection, and record the decision in the PR.
|
|
||||||
- Use `huig_dump.txt` (already in the repo root) as the seed fixture for
|
|
||||||
tests — copy the relevant lines into a test fixture under wherever
|
|
||||||
existing ingest fixtures live, rather than reading the file from the
|
|
||||||
repo root at test time.
|
|
||||||
- Re-measure ingest throughput on this fixture before/after to confirm
|
|
||||||
the lag is actually addressed, and note the before/after numbers in the
|
|
||||||
PR description.
|
|
||||||
|
|
||||||
## Acceptance criteria
|
|
||||||
|
|
||||||
- Ingesting `huig_dump.txt`'s lines no longer produces hundreds of
|
|
||||||
permanent auto-declared params from one-off stat-dump lines; the bound
|
|
||||||
chosen is verified by a test asserting the declared-param count stays
|
|
||||||
under a stated threshold after ingesting the fixture.
|
|
||||||
- Base64-padding false positives (e.g. the `==`-terminated blobs in the
|
|
||||||
fixture) are not auto-declared as params.
|
|
||||||
- `Type`, process name, and `PID` are available as derivable/queryable
|
|
||||||
params for `log stream`-shaped lines, verified against the fixture.
|
|
||||||
- Existing logfmt/JSON auto-declaration behavior for non-`log
|
|
||||||
stream`-shaped lines (existing tests in `src/logfmt.rs`/`src/engine.rs`)
|
|
||||||
is unchanged.
|
|
||||||
|
|
||||||
## Depends on
|
|
||||||
|
|
||||||
044 (reserved param naming / `ottyl_fmt` — this ticket likely extends the
|
|
||||||
same format-detection mechanism).
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
# 051 — Allow deleting a declared metric
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
|
|
||||||
There is currently no way to delete a metric once declared. `src/api.rs`
|
|
||||||
only routes `GET`/`POST /api/metrics` and `GET`/`PUT /api/metrics/{name}`
|
|
||||||
(`src/api.rs:132-135`) — there is no `DELETE`. The engine already has the
|
|
||||||
machinery for it internally: `EngineMessage::RemoveMetricDeclaration`
|
|
||||||
(`src/engine.rs:103`) removes a metric's declaration from the index, but
|
|
||||||
it is only ever sent as part of `delete_profile`'s cleanup
|
|
||||||
(`src/api.rs:689`) when an entire profile is deleted, not as a
|
|
||||||
user-facing action on a single metric. Persistence has the same gap:
|
|
||||||
`Settings`/profile storage (`src/profile.rs`, post ticket 049 now inline
|
|
||||||
in `settings.json`) has `record_metric_declaration`/
|
|
||||||
`record_metric_declaration_update` but no corresponding removal method, so
|
|
||||||
even if a metric were removed from the live engine index there'd be
|
|
||||||
nothing to stop it reappearing on next load. The webapp UI
|
|
||||||
(`webapp/src/components/Metrics.tsx`) has no delete affordance either —
|
|
||||||
compare to param declarations, which have the same underlying gap (no
|
|
||||||
`RemoveParamDeclaration`-triggering UI or persisted-removal path either),
|
|
||||||
though this ticket is scoped to metrics only.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
- Add `DELETE /api/metrics/{name}` in `src/api.rs`, sending
|
|
||||||
`EngineMessage::RemoveMetricDeclaration` to the engine (same message
|
|
||||||
the profile-delete cleanup path already uses) and returning 404 if the
|
|
||||||
metric doesn't exist.
|
|
||||||
- Add a persisted-removal method (e.g. `Settings::remove_metric_declaration`
|
|
||||||
or equivalent, alongside `record_metric_declaration`/
|
|
||||||
`record_metric_declaration_update` in `src/profile.rs`/`src/settings.rs`)
|
|
||||||
so a deleted metric doesn't reappear when declarations replay from
|
|
||||||
`settings.json` on the next restart, and call it from the new route the
|
|
||||||
same way `persist_metric_declaration` is called from `declare_metric`.
|
|
||||||
- Add a delete affordance in `webapp/src/components/Metrics.tsx` (icon
|
|
||||||
button or similar, following whatever confirm-before-destructive-action
|
|
||||||
pattern already exists elsewhere in the settings/profile UI — check
|
|
||||||
`NavMenu.tsx`'s profile deletion for the existing convention) that calls
|
|
||||||
the new endpoint and removes the metric from the list on success.
|
|
||||||
- Decide and document what happens to bucket-value history already
|
|
||||||
recorded under the deleted metric's name (e.g. `MetricPrimitive` samples
|
|
||||||
indexed by metric name in the engine) — either leave it orphaned
|
|
||||||
(queryable by name won't work without a declaration, but doesn't need
|
|
||||||
active cleanup) or purge it; state the choice in the PR.
|
|
||||||
- Decide and document what happens to dashboard panels or alert rules
|
|
||||||
whose PromQL query text/filter references the deleted metric by name —
|
|
||||||
at minimum they should fail gracefully (a clear "unknown metric" error
|
|
||||||
rather than a panic or silent empty result) rather than needing to be
|
|
||||||
actively kept in sync; a full dependent-reference check/warning before
|
|
||||||
delete is out of scope unless trivial.
|
|
||||||
|
|
||||||
## Acceptance criteria
|
|
||||||
|
|
||||||
- A metric can be deleted via the API and the UI; it disappears from
|
|
||||||
`GET /api/metrics` immediately and does not reappear after a restart.
|
|
||||||
- Deleting an unknown metric name returns a clear 404, not a 500 or panic.
|
|
||||||
- A dashboard panel or alert rule referencing the deleted metric by name
|
|
||||||
fails with a readable error rather than crashing the engine or API,
|
|
||||||
verified with a seeded fixture.
|
|
||||||
|
|
||||||
## Depends on
|
|
||||||
|
|
||||||
None (touches the same engine/persistence seam as ticket 049, but that
|
|
||||||
ticket is already merged).
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
# 052 — Allow clearing all params, then re-extract them from already-ingested logs
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
|
|
||||||
There is no bulk "clear params" action. The engine already supports
|
|
||||||
removing a single param declaration internally —
|
|
||||||
`EngineMessage::RemoveParamDeclaration { name, respond_to }`
|
|
||||||
(`src/engine.rs:85-92`), handled at `src/engine.rs:190-197` by removing
|
|
||||||
the `IndexKey::ParamDeclaration` entry — but it is only ever invoked from
|
|
||||||
`reload_engine_declarations` (`src/api.rs:664-682`), a profile-switch
|
|
||||||
cleanup path that filters out auto-derived params (comment at
|
|
||||||
`src/api.rs:665-668`) and removes the rest one at a time. There is no
|
|
||||||
route exposing this to the user, no persistence-side removal method
|
|
||||||
(`src/profile.rs` has `record_param_declaration` at `profile.rs:606` but
|
|
||||||
nothing to un-record it), and no webapp affordance
|
|
||||||
(`webapp/src/lib/api.ts:283-287` only exposes `getParams`/`declareParam`).
|
|
||||||
|
|
||||||
The harder half of this request — "logs get re-iterated to extract
|
|
||||||
params from them" — is not just a rewording of `auto_declare_params`.
|
|
||||||
That function runs once, at ingest time, against each incoming line
|
|
||||||
(`src/engine.rs:154`, `auto_declare_params` defined at
|
|
||||||
`src/engine.rs:307-325`, backed by `extract_pairs` in `src/logfmt.rs`) and
|
|
||||||
is never replayed. Re-extraction after a clear means running that same
|
|
||||||
logic again, after the fact, against lines already sitting in the index.
|
|
||||||
This is structurally possible: raw ingested text is retained as
|
|
||||||
`IndexKey::IngestedLog { sequence, timestamp } -> DataValue::LogLiteral`
|
|
||||||
in the same `BTreeMap` (`src/engine.rs:148-152`), occupying the index
|
|
||||||
range between `IndexKey::Start` and `IndexKey::LogParamSplit`
|
|
||||||
(iterated at `src/engine.rs:1166`, `1181`) — but only for lines that
|
|
||||||
haven't already been evicted by `max_logs`/`evict_excess_logs`
|
|
||||||
(`src/engine.rs:151-156`). Lines evicted before a clear+re-extract cannot
|
|
||||||
regain their params; this bound should be surfaced to the user, not
|
|
||||||
silently ignored.
|
|
||||||
|
|
||||||
Note `main.rs:75-96`'s `profile::load_into_engine` replay path is not
|
|
||||||
directly reusable here — it replays *declarations* into a fresh engine
|
|
||||||
before ingest starts, whereas this feature must re-run *extraction*
|
|
||||||
against logs the engine already holds.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
- Add a bulk "clear params" `EngineMessage` (or reuse
|
|
||||||
`RemoveParamDeclaration` in a loop, mirroring
|
|
||||||
`reload_engine_declarations`'s existing pattern at
|
|
||||||
`src/api.rs:664-682`) that removes all declared params — deciding
|
|
||||||
whether auto-derived and manually-declared params are both cleared or
|
|
||||||
only one category, and stating that choice in the PR (the existing
|
|
||||||
`reload_engine_declarations` precedent excludes auto-derived ones for a
|
|
||||||
reason worth re-reading before copying it here).
|
|
||||||
- Add a persisted-removal counterpart in `src/profile.rs`/`src/settings.rs`
|
|
||||||
so cleared params don't reappear from `settings.json` on next load.
|
|
||||||
- After clearing, re-run `auto_declare_params` against every retained
|
|
||||||
`IndexKey::IngestedLog` entry still in the index (oldest to newest, to
|
|
||||||
preserve declaration-order semantics), producing a fresh param set from
|
|
||||||
currently-available log text.
|
|
||||||
- Expose this as a single user-facing action (`DELETE /api/params` or
|
|
||||||
similar in `src/api.rs`, plus a button in whatever webapp component
|
|
||||||
hosts the params list) — not a per-param loop the user has to drive
|
|
||||||
from the UI.
|
|
||||||
- Surface to the user (via response body or UI copy) that re-extraction
|
|
||||||
only covers logs still retained in memory, not lines already evicted by
|
|
||||||
`max_logs`.
|
|
||||||
|
|
||||||
## Acceptance criteria
|
|
||||||
|
|
||||||
- Triggering "clear params" removes all param declarations from
|
|
||||||
`GET /api/params` and they do not reappear after a restart.
|
|
||||||
- Immediately after clearing, params re-appear derived from the log text
|
|
||||||
still held in the engine's index, without requiring new lines to be
|
|
||||||
ingested, verified with a seeded fixture where params are cleared and
|
|
||||||
re-extracted from a fixed set of already-ingested lines.
|
|
||||||
- If some lines have been evicted before the clear, the re-extracted
|
|
||||||
param set reflects only the retained subset, and this is not reported
|
|
||||||
as an error.
|
|
||||||
|
|
||||||
## Depends on
|
|
||||||
|
|
||||||
None (touches the same `RemoveParamDeclaration`/`reload_engine_declarations`
|
|
||||||
seam used by profile switching).
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
# 053 — Move the log sort selector from Log Preview to the Timeline
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
|
|
||||||
The "Sort by" control lives in the wrong component. It's currently
|
|
||||||
rendered inside `LogPreview`'s own section header
|
|
||||||
(`webapp/src/components/LogPreview.tsx:327-336`) as a `SortPicker`
|
|
||||||
(`LogPreview.tsx:68-107`, a `<select>` plus an "Fall back to ottyl_seq"
|
|
||||||
checkbox), with its `LogSortSettings` type and
|
|
||||||
`loadLogSortSettings`/`saveLogSortSettings` persistence helpers
|
|
||||||
(`LogPreview.tsx:37-66`, localStorage key `ottyl.logPreview.sort`) also
|
|
||||||
defined there. `LogTimeline.tsx` has no sort-related prop at all
|
|
||||||
(`LogTimeline.tsx:44-56`) — its header only has time-range preset buttons
|
|
||||||
and a "Clear selection" link (`LogTimeline.tsx:118-149`).
|
|
||||||
|
|
||||||
The actual sort state is owned one level up, duplicated identically in
|
|
||||||
`App.tsx`'s two top-level render modes: `FullApp`
|
|
||||||
(`App.tsx:389-394`) and `StandaloneLog` (`App.tsx:263-268`), both via
|
|
||||||
`useState<LogSortSettings>(loadLogSortSettings)` plus a
|
|
||||||
`handleSortSettingsChange` callback. Both currently pass
|
|
||||||
`sortSettings`/`onSortSettingsChange` only to `LogPreview`
|
|
||||||
(`App.tsx:361`, `App.tsx:527`), never to `LogTimeline`
|
|
||||||
(`App.tsx:237-243`, `354-360`/`520-526`). The setting already drives
|
|
||||||
`fetchLogs` (`App.tsx:319-326`, `464-471`, dependency at `App.tsx:347`,
|
|
||||||
`494`), which forwards `sortBy`/`sortMissingFallback` to
|
|
||||||
`GET /api/logs` via `fetchLogs` in `webapp/src/lib/api.ts:242-262`. The
|
|
||||||
backend already fully supports this — `src/dto.rs:86-90`'s
|
|
||||||
`sort_by`/`sort_missing_fallback` fields, validated and applied in
|
|
||||||
`src/engine.rs:1223-1281` (400 if `sort_by` isn't a declared param,
|
|
||||||
`engine.rs:1227`; missing-value fallback behavior at `engine.rs:1260-1281`).
|
|
||||||
The timeline query/DTO backing `fetchTimeline`
|
|
||||||
(`webapp/src/lib/api.ts:264-274`) has no `sort_by` field and doesn't need
|
|
||||||
one — this is a frontend-only relocation of where the control lives, not
|
|
||||||
a backend change.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
- Move `SortPicker` (and ideally the `LogSortSettings` type plus
|
|
||||||
`loadLogSortSettings`/`saveLogSortSettings`) out of `LogPreview.tsx`
|
|
||||||
into `LogTimeline.tsx`, rendering it in the Timeline's header
|
|
||||||
(`LogTimeline.tsx:118-149`) alongside the existing range controls.
|
|
||||||
- Add `sortSettings`/`onSortSettingsChange` props to `LogTimeline`.
|
|
||||||
- Update both `App.tsx` render sites (`FullApp` around line 237,
|
|
||||||
`StandaloneLog` around line 354/520) to pass `sortSettings`/
|
|
||||||
`onSortSettingsChange` to `LogTimeline` instead of `LogPreview`.
|
|
||||||
- `LogPreview` keeps rendering the `logs` prop as already sorted by the
|
|
||||||
parent's `fetchLogs` call — remove its own `SortPicker` usage and the
|
|
||||||
now-unused sort-control markup from its header, but keep consuming
|
|
||||||
`sortSettings` if it still needs read access to it (e.g. for a
|
|
||||||
"sorted by X" label), or drop that too if not needed.
|
|
||||||
- No backend changes — `sort_by`/`sort_missing_fallback` on
|
|
||||||
`GET /api/logs` are unaffected.
|
|
||||||
|
|
||||||
## Acceptance criteria
|
|
||||||
|
|
||||||
- The "Sort by" selector and "fall back to ottyl_seq" checkbox appear in
|
|
||||||
the Timeline component's header, not in Log Preview's.
|
|
||||||
- Changing sort order from the Timeline's control changes the order of
|
|
||||||
entries shown in Log Preview (same behavior as today, just relocated).
|
|
||||||
- The chosen sort setting still persists across reloads (localStorage key
|
|
||||||
can be renamed if it moves file, but must not silently reset to
|
|
||||||
default on the first load after this change — migrate or fall back
|
|
||||||
gracefully).
|
|
||||||
- `make build` (webapp `tsc -b && vite build`) passes with no leftover
|
|
||||||
unused imports/types in `LogPreview.tsx`.
|
|
||||||
|
|
||||||
## Depends on
|
|
||||||
|
|
||||||
None.
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
# 054 — `log stream` output isn't recognized as a known format (folds into ticket 050)
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
|
|
||||||
The report was "`log stream |& ottyl` should capture the format
|
|
||||||
properly... tab separated format is being ignored, add it as a known
|
|
||||||
type." Investigating `huig_dump.txt` (a real `log stream` capture already
|
|
||||||
in the repo root) shows the premise needs correcting: the file is **not**
|
|
||||||
tab-separated. `grep -P "\t"` finds a literal tab character on only 3 of
|
|
||||||
697 lines, and none of those are the header or a representative data row
|
|
||||||
— they're incidental (two `libinfo check path:` continuation lines, one
|
|
||||||
WiFi stat line with an embedded tab mid-message). `od -c` on the header
|
|
||||||
and data rows confirms the real structure is **space-padded fixed-width
|
|
||||||
columns** (`Timestamp`, `Thread`, `Type`, `Activity`, `PID`, `TTL`,
|
|
||||||
followed by a free-text `process: message` tail) — visually aligned
|
|
||||||
columns that read as tab-separated but aren't.
|
|
||||||
|
|
||||||
There is no TSV handling anywhere in the codebase today: `src/logfmt.rs`,
|
|
||||||
`src/engine.rs`, and `src/ingest.rs` contain zero references to tabs or
|
|
||||||
TSV. Format detection is entirely `detect_format` (`src/logfmt.rs:70-78`):
|
|
||||||
try JSON, else fall back to `extract_pairs` (`logfmt.rs:45-59`) for
|
|
||||||
logfmt, else `"none"` — no third branch exists, and `ottyl_fmt`
|
|
||||||
(`src/engine.rs:1005`, filter compilation at `engine.rs:775`, `824`) only
|
|
||||||
ever reports one of those three values.
|
|
||||||
|
|
||||||
This is a duplicate of, not distinct from, ticket 050
|
|
||||||
(`tickets/050-structured-header-extraction-and-bounded-logfmt-overfit.md`),
|
|
||||||
which already identifies the exact same root cause — `log stream`
|
|
||||||
output "is not logfmt at all — it's a fixed-column header... followed by
|
|
||||||
a free-text `process: message` tail" — and already scopes a structured-
|
|
||||||
header extractor plus the question of whether it becomes a new
|
|
||||||
`ottyl_fmt` variant (e.g. `"log_stream"`). The reporter most likely
|
|
||||||
visually misread the aligned whitespace columns as tab-separated.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
- Do not implement a separate "TSV `ottyl_fmt` type" — there is no
|
|
||||||
evidence of genuinely tab-delimited `log stream` output in this
|
|
||||||
codebase's fixtures, and building detection for a format that doesn't
|
|
||||||
occur would be speculative.
|
|
||||||
- Close/merge this wishlist item into ticket 050's existing scope: its
|
|
||||||
structured-header extractor for `log stream`-shaped input already
|
|
||||||
covers "capturing the format properly" for this input shape.
|
|
||||||
- If the user can supply a genuinely tab-delimited sample (e.g. from a
|
|
||||||
different `log stream --style` flag, or a shell pipeline that
|
|
||||||
reformats the output with real tabs), re-open this as a distinct
|
|
||||||
ticket scoped to that concrete input — file:line references above
|
|
||||||
should make it easy to confirm one way or the other before implementing
|
|
||||||
anything.
|
|
||||||
|
|
||||||
## Acceptance criteria
|
|
||||||
|
|
||||||
- No code changes result directly from this ticket; instead, ticket 050
|
|
||||||
is updated (or its implementation, when picked up, is confirmed) to
|
|
||||||
cover recognizing `log stream`'s fixed-column shape as a known format.
|
|
||||||
- If a true TSV sample is later provided, a new ticket is filed against
|
|
||||||
it specifically, rather than reopening this one with an unconfirmed
|
|
||||||
premise.
|
|
||||||
|
|
||||||
## Depends on
|
|
||||||
|
|
||||||
050 (this ticket's concern is already inside 050's scope; treat as
|
|
||||||
duplicate/fold-in rather than independent work).
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
# 055 — Make `ottyl_*` reserved params usable in dashboard (PromQL) queries, not just filters
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
|
|
||||||
Three reserved params exist, all hardcoded in the filter compiler:
|
|
||||||
`ottyl_seq` (ingest sequence number), `ottyl_ts` (ingest timestamp,
|
|
||||||
supports relative/absolute values), and `ottyl_fmt` (auto-detected
|
|
||||||
`json`/`logfmt`/`none`) — defined at `src/engine.rs:773-775, 795, 806, 824`,
|
|
||||||
grammar comments at `src/filter_parser.pest:7-9`, docs at
|
|
||||||
`webapp/src/components/Docs.tsx:105-106, 375` ("reserved metric names
|
|
||||||
present on every log line, so they're always filterable without
|
|
||||||
declaring anything"). Alert conditions restrict to the same three plus
|
|
||||||
`regex()`/`json[field]` (`src/alerts.rs:3, 199-225`).
|
|
||||||
|
|
||||||
These already work end-to-end for the filter/query bar syntax used by
|
|
||||||
`GET /api/logs`, `GET /api/timeline`, and alert conditions — that part of
|
|
||||||
"accessible parameters for queries" is true today. What's missing is
|
|
||||||
dashboards: PromQL-style panel queries (`src/promql.rs`,
|
|
||||||
`evaluate_promql` in `src/engine.rs:1562-1601`) have no special case for
|
|
||||||
`ottyl_*` anywhere. A PromQL query resolves `metric_name` via
|
|
||||||
`bucket_values(index, &parsed.metric_name)`
|
|
||||||
(`src/engine.rs`, called from `evaluate_promql`), which only returns data
|
|
||||||
for names backed by a `DataValue::MetricDeclaration` and bucket entries
|
|
||||||
created through `POST /api/metrics`. `ottyl_*` values are computed
|
|
||||||
line-locally at filter-compile time and never written into declared-
|
|
||||||
metric buckets, so `sum(ottyl_seq)` or similar in a dashboard panel would
|
|
||||||
silently return an empty series rather than real data.
|
|
||||||
|
|
||||||
Separately, `ottyl_*` never appear in `GET /api/params`
|
|
||||||
(`src/api.rs:281-287` → `EngineQuery::ParamDeclarations` →
|
|
||||||
`param_declarations_range`, `src/engine.rs:1340-1355`), since that only
|
|
||||||
lists explicit `ParamDeclaration` index entries and `ottyl_*` never
|
|
||||||
create one. `FilterBar.tsx` (`webapp/src/components/FilterBar.tsx:36-41`)
|
|
||||||
has no autocomplete/suggestion list at all today (plain text input), so
|
|
||||||
there's nothing currently excluding them from UI suggestions either —
|
|
||||||
but if param suggestions are ever added, this gap should be kept in mind.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
- Add a special case in `evaluate_promql`/`src/promql.rs` (analogous to
|
|
||||||
the filter compiler's handling at `src/engine.rs:773-775`) that
|
|
||||||
synthesizes a virtual bucket series for `ottyl_seq`/`ottyl_ts`/
|
|
||||||
`ottyl_fmt` metric names from the ingested-log index, instead of
|
|
||||||
requiring a `MetricDeclaration`. Decide and document in the PR how
|
|
||||||
`ottyl_fmt`'s categorical string values map onto a numeric time
|
|
||||||
series (e.g. count-by-value, or reject it from PromQL numeric
|
|
||||||
aggregation with a clear error, since `ottyl_seq`/`ottyl_ts` are
|
|
||||||
naturally numeric but `ottyl_fmt` is not).
|
|
||||||
- Decide whether `ottyl_*` should appear in `GET /api/params` (or a
|
|
||||||
parallel listing) so dashboard panel builders in the webapp can
|
|
||||||
discover them without prior knowledge of the reserved names; if yes,
|
|
||||||
extend `param_declarations_range` or add a small hardcoded merge at the
|
|
||||||
API layer rather than forcing them into the index as real
|
|
||||||
`ParamDeclaration` entries (they aren't user-declared and shouldn't be
|
|
||||||
deletable via ticket 051's/052's params-removal paths).
|
|
||||||
- Update `README.md`/`Docs.tsx` to state whether `ottyl_*` is usable in
|
|
||||||
dashboard queries, once implemented (or explicitly document it as
|
|
||||||
filter-only, if the numeric/categorical mismatch above makes broad
|
|
||||||
PromQL support impractical for `ottyl_fmt`).
|
|
||||||
|
|
||||||
## Acceptance criteria
|
|
||||||
|
|
||||||
- A dashboard panel using a PromQL query over `ottyl_seq` or `ottyl_ts`
|
|
||||||
(e.g. `count(ottyl_seq)` or a rate over `ottyl_ts`) returns real data
|
|
||||||
from ingested logs, verified with a seeded fixture.
|
|
||||||
- The behavior for `ottyl_fmt` in a PromQL query is either implemented
|
|
||||||
(with a stated value-to-series mapping) or explicitly rejected with a
|
|
||||||
clear, documented error — not a silent empty result.
|
|
||||||
- `GET /api/params` behavior for `ottyl_*` is decided and documented;
|
|
||||||
if included, they're clearly marked as reserved/non-deletable rather
|
|
||||||
than indistinguishable from user-declared params.
|
|
||||||
|
|
||||||
## Depends on
|
|
||||||
|
|
||||||
None (independent of the params-removal tickets, but note the
|
|
||||||
non-deletable requirement above if `ottyl_*` end up listed alongside
|
|
||||||
regular params).
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
# 056 — Add `Light *` variants for the remaining colour schemes
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
|
|
||||||
Ticket 048 already added one light-surfaced variant, `light_green`
|
|
||||||
(`webapp/src/lib/themes.ts:231-254`, commit `5371d3e`: "Adds a new
|
|
||||||
'Light Green' scheme (light-surfaced, same green/magenta hue family as
|
|
||||||
'Green') selectable alongside the existing built-ins"). The wishlist
|
|
||||||
comment that prompted 048 — "we need a `Light Green` alongside `Green`"
|
|
||||||
— is now clarified as applying to *every* colour scheme, not just green:
|
|
||||||
the current built-in set is `dark`, `light`, `red`, `green`, `blue`,
|
|
||||||
`yellow`, `pink`, `orange`, `light_green`
|
|
||||||
(`webapp/src/lib/themes.ts:38-255`), so `red`, `blue`, `yellow`, `pink`,
|
|
||||||
and `orange` still have no light-surfaced counterpart.
|
|
||||||
|
|
||||||
Adding a scheme is not fully data-driven from `themes.ts` alone — six
|
|
||||||
files must be kept in sync per scheme, per the no-build-step-links-them
|
|
||||||
comment at `webapp/src/index.css:1-7`:
|
|
||||||
|
|
||||||
1. `webapp/src/index.css:264-300` — the `html.light_green` CSS block is
|
|
||||||
the reference recipe: same hue + same accent hues as the dark
|
|
||||||
counterpart, but with `light`'s inverted (high-lightness)
|
|
||||||
surface/border/text scale, and `light`'s hue-neutral danger colors
|
|
||||||
(comment at `index.css:264-268` documents this explicitly).
|
|
||||||
2. `webapp/src/lib/themes.ts:231-254` — the matching `BUILTIN_THEMES`
|
|
||||||
entry (used for CSS export/download and validation).
|
|
||||||
3. `webapp/src/lib/api.ts:83-93` — the `ColorScheme` TS union type.
|
|
||||||
4. `src/settings.rs:30-42` — the matching Rust `ColorScheme` enum variant,
|
|
||||||
with `#[serde(rename = "light_<name>")]`.
|
|
||||||
5. `webapp/src/lib/useSettingsPanel.ts:24-34` — `THEME_CLASSES`, used to
|
|
||||||
apply/strip the `html.*` class.
|
|
||||||
6. `webapp/src/components/NavMenu.tsx:20-31` — `COLOR_SCHEMES`, which
|
|
||||||
drives the picker UI; `schemeLabel()` (`NavMenu.tsx:34-35`) already
|
|
||||||
auto-titles `light_red` → "Light Red" by replacing underscores, so no
|
|
||||||
extra label wiring is needed once a name is added to this array.
|
|
||||||
|
|
||||||
`PanelChart.tsx`'s multi-accent `color-mix()` series-color logic (touched
|
|
||||||
by ticket 048) is generic per-theme rather than per-scheme-name, so it
|
|
||||||
likely needs no changes — worth a quick check while implementing, not
|
|
||||||
expected to require edits.
|
|
||||||
|
|
||||||
Tickets 047/048's original files were deleted on implementation (git
|
|
||||||
history only shows their removal commits, `5cb2dfd`/`7c331e7`; bodies
|
|
||||||
aren't recoverable), but commit `5371d3e`'s message and the resulting
|
|
||||||
`light_green` block are sufficient as the template.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
- Add `light_red`, `light_blue`, `light_yellow`, `light_pink`, and
|
|
||||||
`light_orange` following the exact `light_green` recipe: same base
|
|
||||||
hue and accent-hue choices as the corresponding dark-surfaced scheme,
|
|
||||||
`light`'s inverted surface/border/text lightness scale, `light`'s
|
|
||||||
neutral danger colors.
|
|
||||||
- Update all six files listed above for each new scheme:
|
|
||||||
`webapp/src/index.css`, `webapp/src/lib/themes.ts`,
|
|
||||||
`webapp/src/lib/api.ts`, `src/settings.rs`,
|
|
||||||
`webapp/src/lib/useSettingsPanel.ts`, `webapp/src/components/NavMenu.tsx`.
|
|
||||||
- Verify `schemeLabel()` produces correct titles ("Light Red", "Light
|
|
||||||
Blue", etc.) without additional label-mapping code.
|
|
||||||
- Spot-check `PanelChart.tsx`'s series-color logic against one new light
|
|
||||||
scheme to confirm it needs no changes (or fix it if it does).
|
|
||||||
|
|
||||||
## Acceptance criteria
|
|
||||||
|
|
||||||
- All five new schemes are selectable in the settings picker
|
|
||||||
(`NavMenu.tsx`), persist correctly, and are downloadable as CSS via
|
|
||||||
the existing "download built-in theme" path.
|
|
||||||
- Each new scheme's CSS block round-trips through `Settings`
|
|
||||||
serialization/deserialization (`src/settings.rs`) without errors,
|
|
||||||
verified with a test analogous to any existing `ColorScheme`
|
|
||||||
serialization test.
|
|
||||||
- `make build` and `make lint` pass with the new schemes added.
|
|
||||||
|
|
||||||
## Depends on
|
|
||||||
|
|
||||||
048 (implemented; this ticket extends its established pattern to the
|
|
||||||
remaining base hues).
|
|
||||||
+12
-3
@@ -6,10 +6,13 @@ import {
|
|||||||
TIME_RANGE_PRESETS,
|
TIME_RANGE_PRESETS,
|
||||||
computeBucketMs,
|
computeBucketMs,
|
||||||
computePresetRange,
|
computePresetRange,
|
||||||
|
loadLogSortSettings,
|
||||||
|
saveLogSortSettings,
|
||||||
|
type LogSortSettings,
|
||||||
type TimeRange,
|
type TimeRange,
|
||||||
type TimeRangePresetId,
|
type TimeRangePresetId,
|
||||||
} from './components/LogTimeline'
|
} from './components/LogTimeline'
|
||||||
import { LogPreview, loadLogSortSettings, saveLogSortSettings, type LogSortSettings } from './components/LogPreview'
|
import { LogPreview } from './components/LogPreview'
|
||||||
import { Params } from './components/Params'
|
import { Params } from './components/Params'
|
||||||
import { Metrics } from './components/Metrics'
|
import { Metrics } from './components/Metrics'
|
||||||
import { Dashboards } from './components/Dashboards'
|
import { Dashboards } from './components/Dashboards'
|
||||||
@@ -357,8 +360,11 @@ function StandaloneLog() {
|
|||||||
onSelectRange={handleManualRangeSelect}
|
onSelectRange={handleManualRangeSelect}
|
||||||
activePreset={activePreset}
|
activePreset={activePreset}
|
||||||
onSelectPreset={selectPreset}
|
onSelectPreset={selectPreset}
|
||||||
|
paramNames={params.map((p) => p.name)}
|
||||||
|
sortSettings={sortSettings}
|
||||||
|
onSortSettingsChange={handleSortSettingsChange}
|
||||||
/>
|
/>
|
||||||
<LogPreview logs={logs} params={params} sortSettings={sortSettings} onSortSettingsChange={handleSortSettingsChange} />
|
<LogPreview logs={logs} params={params} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</StandalonePage>
|
</StandalonePage>
|
||||||
@@ -523,8 +529,11 @@ function FullApp() {
|
|||||||
onSelectRange={handleManualRangeSelect}
|
onSelectRange={handleManualRangeSelect}
|
||||||
activePreset={activePreset}
|
activePreset={activePreset}
|
||||||
onSelectPreset={selectPreset}
|
onSelectPreset={selectPreset}
|
||||||
|
paramNames={params.map((p) => p.name)}
|
||||||
|
sortSettings={sortSettings}
|
||||||
|
onSortSettingsChange={handleSortSettingsChange}
|
||||||
/>
|
/>
|
||||||
<LogPreview logs={logs} params={params} sortSettings={sortSettings} onSortSettingsChange={handleSortSettingsChange} />
|
<LogPreview logs={logs} params={params} />
|
||||||
</div>
|
</div>
|
||||||
{!logViewerCollapsed && <ResizeHandle onResize={handleLogViewerResize} onResizeEnd={handleLogViewerResizeEnd} />}
|
{!logViewerCollapsed && <ResizeHandle onResize={handleLogViewerResize} onResizeEnd={handleLogViewerResizeEnd} />}
|
||||||
<Params params={params} onDeclared={loadParams} />
|
<Params params={params} onDeclared={loadParams} />
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ function PanelPreview({ panel, range }: { panel: Panel; range: TimeRange | null
|
|||||||
if (loading && series.length === 0) {
|
if (loading && series.length === 0) {
|
||||||
return <div className="flex h-48 items-center justify-center text-xs text-text-faint">Loading…</div>
|
return <div className="flex h-48 items-center justify-center text-xs text-text-faint">Loading…</div>
|
||||||
}
|
}
|
||||||
return <PanelChart series={series} chartType={panel.chart_type} />
|
return <PanelChart series={series} chartType={panel.chart_type} range={range} />
|
||||||
}
|
}
|
||||||
|
|
||||||
function AutosaveStatus({ status, error }: { status: SaveStatus; error: string | null }) {
|
function AutosaveStatus({ status, error }: { status: SaveStatus; error: string | null }) {
|
||||||
|
|||||||
@@ -104,7 +104,12 @@ const SECTIONS: DocSection[] = [
|
|||||||
<p>
|
<p>
|
||||||
<Code>ottyl_seq</Code>, <Code>ottyl_ts</Code>, and <Code>ottyl_fmt</Code> are reserved metric names present
|
<Code>ottyl_seq</Code>, <Code>ottyl_ts</Code>, and <Code>ottyl_fmt</Code> are reserved metric names present
|
||||||
on every log line, so they're always filterable without declaring anything. <Code>ottyl_fmt</Code> holds the
|
on every log line, so they're always filterable without declaring anything. <Code>ottyl_fmt</Code> holds the
|
||||||
auto-detected format of the line's text — <Code>json</Code>, <Code>logfmt</Code>, or <Code>none</Code>.
|
auto-detected format of the line's text — <Code>log_stream</Code> (macOS <Code>log stream</Code> output),{' '}
|
||||||
|
<Code>json</Code>, <Code>logfmt</Code>, or <Code>none</Code>. A <Code>log_stream</Code> line also gets{' '}
|
||||||
|
<Code>log_type</Code>, <Code>process</Code>, and <Code>pid</Code> params derived automatically from its
|
||||||
|
fixed-column header. All three reserved names also appear (flagged <Code>reserved</Code>) in{' '}
|
||||||
|
<Code>GET /api/params</Code> for discoverability, though there's no UI to edit or remove them — see also{' '}
|
||||||
|
<em>Dashboards</em> below for using <Code>ottyl_seq</Code>/<Code>ottyl_ts</Code> in a panel query.
|
||||||
</p>
|
</p>
|
||||||
<p className="font-semibold text-text">Date/time formats</p>
|
<p className="font-semibold text-text">Date/time formats</p>
|
||||||
<p>Timestamp comparisons accept three forms:</p>
|
<p>Timestamp comparisons accept three forms:</p>
|
||||||
@@ -335,6 +340,14 @@ const SECTIONS: DocSection[] = [
|
|||||||
Dashboards are saved per profile, so they travel with it when you switch or copy it — an active profile is
|
Dashboards are saved per profile, so they travel with it when you switch or copy it — an active profile is
|
||||||
required to create or save one; pick or create one from the settings menu first.
|
required to create or save one; pick or create one from the settings menu first.
|
||||||
</p>
|
</p>
|
||||||
|
<p>
|
||||||
|
The reserved <Code>ottyl_seq</Code>/<Code>ottyl_ts</Code> names (see <em>Filtering</em> above) work in panel
|
||||||
|
queries the same as any declared metric — e.g. <Code>count(ottyl_seq)</Code> for log volume, or{' '}
|
||||||
|
<Code>rate(ottyl_ts[1m])</Code> for ingest rate — since every log line carries them without a metric
|
||||||
|
declaration. <Code>ottyl_fmt</Code> is categorical (<Code>json</Code>/<Code>logfmt</Code>/<Code>none</Code>
|
||||||
|
), not a number, so it's rejected in a panel query with an explicit error rather than silently charting
|
||||||
|
nothing — filter on it in the filter bar instead.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -25,87 +25,6 @@ function saveVisibleParamColumns(columns: string[]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ticket 045: ordering key + missing-param handling for the log preview / timeline. Scoped like
|
|
||||||
// `VISIBLE_PARAM_COLUMNS_STORAGE_KEY` and `App.tsx`'s `LOG_VIEWER_HEIGHT_STORAGE_KEY` above — one
|
|
||||||
// shared "log viewer" concept, so a single localStorage key covers both the inline viewer
|
|
||||||
// (`FullApp`) and its popout (`StandaloneLog`) rather than each keeping its own copy, which would
|
|
||||||
// surprise a user switching between the two. There's no dashboard/panel-scoped analog for this
|
|
||||||
// setting to divide by (unlike e.g. per-dashboard panels), so a single global key matches how the
|
|
||||||
// rest of the log viewer's own settings are scoped.
|
|
||||||
const LOG_SORT_STORAGE_KEY = 'ottyl.logPreview.sort'
|
|
||||||
|
|
||||||
export interface LogSortSettings {
|
|
||||||
/** An already-declared param name to order log lines by, or `null` for the default (`ottyl_ts`-tracking) order. */
|
|
||||||
sortBy: string | null
|
|
||||||
/** Only meaningful when `sortBy` is set. `true` (default) orders lines missing that param by `ottyl_seq`, appended after the sorted lines; `false` drops them from view. */
|
|
||||||
sortMissingFallback: boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
const DEFAULT_LOG_SORT_SETTINGS: LogSortSettings = { sortBy: null, sortMissingFallback: true }
|
|
||||||
|
|
||||||
export function loadLogSortSettings(): LogSortSettings {
|
|
||||||
try {
|
|
||||||
const raw = localStorage.getItem(LOG_SORT_STORAGE_KEY)
|
|
||||||
if (!raw) return DEFAULT_LOG_SORT_SETTINGS
|
|
||||||
const parsed = JSON.parse(raw)
|
|
||||||
if (!parsed || typeof parsed !== 'object') return DEFAULT_LOG_SORT_SETTINGS
|
|
||||||
const sortBy = typeof parsed.sortBy === 'string' ? parsed.sortBy : null
|
|
||||||
const sortMissingFallback = typeof parsed.sortMissingFallback === 'boolean' ? parsed.sortMissingFallback : true
|
|
||||||
return { sortBy, sortMissingFallback }
|
|
||||||
} catch {
|
|
||||||
return DEFAULT_LOG_SORT_SETTINGS
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function saveLogSortSettings(settings: LogSortSettings) {
|
|
||||||
try {
|
|
||||||
localStorage.setItem(LOG_SORT_STORAGE_KEY, JSON.stringify(settings))
|
|
||||||
} catch {
|
|
||||||
// best-effort — private browsing or full storage just means the selection won't persist across reloads
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function SortPicker({
|
|
||||||
paramNames,
|
|
||||||
settings,
|
|
||||||
onChange,
|
|
||||||
}: {
|
|
||||||
paramNames: string[]
|
|
||||||
settings: LogSortSettings
|
|
||||||
onChange: (next: LogSortSettings) => void
|
|
||||||
}) {
|
|
||||||
return (
|
|
||||||
<div className="flex items-center gap-2 text-xs text-text-secondary">
|
|
||||||
<label className="flex items-center gap-1">
|
|
||||||
Sort by
|
|
||||||
<select
|
|
||||||
value={settings.sortBy ?? ''}
|
|
||||||
onChange={(e) => onChange({ ...settings, sortBy: e.target.value || null })}
|
|
||||||
className="rounded border border-border-soft bg-surface-0 px-1 py-0.5 text-text"
|
|
||||||
>
|
|
||||||
<option value="">ottyl_ts (default)</option>
|
|
||||||
{paramNames.map((name) => (
|
|
||||||
<option key={name} value={name}>
|
|
||||||
{name}
|
|
||||||
</option>
|
|
||||||
))}
|
|
||||||
</select>
|
|
||||||
</label>
|
|
||||||
{settings.sortBy && (
|
|
||||||
<label className="flex cursor-pointer items-center gap-1" title="How lines missing the sort param are handled">
|
|
||||||
<input
|
|
||||||
type="checkbox"
|
|
||||||
checked={settings.sortMissingFallback}
|
|
||||||
onChange={(e) => onChange({ ...settings, sortMissingFallback: e.target.checked })}
|
|
||||||
className="accent-text-muted"
|
|
||||||
/>
|
|
||||||
Fall back to ottyl_seq
|
|
||||||
</label>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
function ColumnPicker({
|
function ColumnPicker({
|
||||||
paramNames,
|
paramNames,
|
||||||
visible,
|
visible,
|
||||||
@@ -293,14 +212,10 @@ function useScrollAnchor(containerRef: React.RefObject<HTMLDivElement | null>, d
|
|||||||
export function LogPreview({
|
export function LogPreview({
|
||||||
logs,
|
logs,
|
||||||
params,
|
params,
|
||||||
sortSettings,
|
|
||||||
onSortSettingsChange,
|
|
||||||
}: {
|
}: {
|
||||||
logs: LogEntry[]
|
logs: LogEntry[]
|
||||||
|
/** Ticket 045/053: already sorted by the caller's `fetchLogs` call per its own sort setting (owned and rendered up in `LogTimeline`'s header now) — this component just renders whatever order it's given. */
|
||||||
params: ParamDeclaration[]
|
params: ParamDeclaration[]
|
||||||
/** Ticket 045: current ordering choice, owned by the caller (it also feeds `fetchLogs`) rather than internally like `visibleParamColumns` — see `App.tsx`'s poll loop. */
|
|
||||||
sortSettings: LogSortSettings
|
|
||||||
onSortSettingsChange: (next: LogSortSettings) => void
|
|
||||||
}) {
|
}) {
|
||||||
const paramNames = params.map((d) => d.name)
|
const paramNames = params.map((d) => d.name)
|
||||||
const [visibleParamColumns, setVisibleParamColumns] = useState<string[]>(loadVisibleParamColumns)
|
const [visibleParamColumns, setVisibleParamColumns] = useState<string[]>(loadVisibleParamColumns)
|
||||||
@@ -330,7 +245,6 @@ export function LogPreview({
|
|||||||
<HelpIcon sectionId="log-preview" label="Help: Log preview" />
|
<HelpIcon sectionId="log-preview" label="Help: Log preview" />
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
<SortPicker paramNames={paramNames} settings={sortSettings} onChange={onSortSettingsChange} />
|
|
||||||
<ColumnPicker paramNames={paramNames} visible={visible} onToggle={toggleColumn} />
|
<ColumnPicker paramNames={paramNames} visible={visible} onToggle={toggleColumn} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -41,18 +41,116 @@ function formatTimestamp(ms: number): string {
|
|||||||
return new Date(ms).toLocaleTimeString()
|
return new Date(ms).toLocaleTimeString()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ticket 053: moved here from LogPreview.tsx, along with the `SortPicker` control below — the
|
||||||
|
// setting now renders in the Timeline's header, but it still drives `fetchLogs` up in App.tsx the
|
||||||
|
// same way it always did. Renamed from the old `ottyl.logPreview.sort` key since the control no
|
||||||
|
// longer lives in "log preview"; `loadLogSortSettings` still falls back to the old key so an
|
||||||
|
// existing choice survives this move instead of silently resetting on first load.
|
||||||
|
const LOG_SORT_STORAGE_KEY = 'ottyl.logTimeline.sort'
|
||||||
|
const LEGACY_LOG_SORT_STORAGE_KEY = 'ottyl.logPreview.sort'
|
||||||
|
|
||||||
|
export interface LogSortSettings {
|
||||||
|
/** An already-declared param name to order log lines by, or `null` for the default (`ottyl_ts`-tracking) order. */
|
||||||
|
sortBy: string | null
|
||||||
|
/** Only meaningful when `sortBy` is set. `true` (default) orders lines missing that param by `ottyl_seq`, appended after the sorted lines; `false` drops them from view. */
|
||||||
|
sortMissingFallback: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
const DEFAULT_LOG_SORT_SETTINGS: LogSortSettings = { sortBy: null, sortMissingFallback: true }
|
||||||
|
|
||||||
|
function parseLogSortSettings(raw: string | null): LogSortSettings | null {
|
||||||
|
if (!raw) return null
|
||||||
|
try {
|
||||||
|
const parsed = JSON.parse(raw)
|
||||||
|
if (!parsed || typeof parsed !== 'object') return null
|
||||||
|
const sortBy = typeof parsed.sortBy === 'string' ? parsed.sortBy : null
|
||||||
|
const sortMissingFallback = typeof parsed.sortMissingFallback === 'boolean' ? parsed.sortMissingFallback : true
|
||||||
|
return { sortBy, sortMissingFallback }
|
||||||
|
} catch {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function loadLogSortSettings(): LogSortSettings {
|
||||||
|
try {
|
||||||
|
return (
|
||||||
|
parseLogSortSettings(localStorage.getItem(LOG_SORT_STORAGE_KEY)) ??
|
||||||
|
parseLogSortSettings(localStorage.getItem(LEGACY_LOG_SORT_STORAGE_KEY)) ??
|
||||||
|
DEFAULT_LOG_SORT_SETTINGS
|
||||||
|
)
|
||||||
|
} catch {
|
||||||
|
return DEFAULT_LOG_SORT_SETTINGS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function saveLogSortSettings(settings: LogSortSettings) {
|
||||||
|
try {
|
||||||
|
localStorage.setItem(LOG_SORT_STORAGE_KEY, JSON.stringify(settings))
|
||||||
|
} catch {
|
||||||
|
// best-effort — private browsing or full storage just means the selection won't persist across reloads
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function SortPicker({
|
||||||
|
paramNames,
|
||||||
|
settings,
|
||||||
|
onChange,
|
||||||
|
}: {
|
||||||
|
paramNames: string[]
|
||||||
|
settings: LogSortSettings
|
||||||
|
onChange: (next: LogSortSettings) => void
|
||||||
|
}) {
|
||||||
|
return (
|
||||||
|
<div className="flex items-center gap-2 text-xs text-text-secondary">
|
||||||
|
<label className="flex items-center gap-1">
|
||||||
|
Sort by
|
||||||
|
<select
|
||||||
|
value={settings.sortBy ?? ''}
|
||||||
|
onChange={(e) => onChange({ ...settings, sortBy: e.target.value || null })}
|
||||||
|
className="rounded border border-border-soft bg-surface-0 px-1 py-0.5 text-text"
|
||||||
|
>
|
||||||
|
<option value="">ottyl_ts (default)</option>
|
||||||
|
{paramNames.map((name) => (
|
||||||
|
<option key={name} value={name}>
|
||||||
|
{name}
|
||||||
|
</option>
|
||||||
|
))}
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
{settings.sortBy && (
|
||||||
|
<label className="flex cursor-pointer items-center gap-1" title="How lines missing the sort param are handled">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
checked={settings.sortMissingFallback}
|
||||||
|
onChange={(e) => onChange({ ...settings, sortMissingFallback: e.target.checked })}
|
||||||
|
className="accent-text-muted"
|
||||||
|
/>
|
||||||
|
Fall back to ottyl_seq
|
||||||
|
</label>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
export function LogTimeline({
|
export function LogTimeline({
|
||||||
buckets,
|
buckets,
|
||||||
range,
|
range,
|
||||||
onSelectRange,
|
onSelectRange,
|
||||||
activePreset,
|
activePreset,
|
||||||
onSelectPreset,
|
onSelectPreset,
|
||||||
|
paramNames,
|
||||||
|
sortSettings,
|
||||||
|
onSortSettingsChange,
|
||||||
}: {
|
}: {
|
||||||
buckets: TimelineBucket[]
|
buckets: TimelineBucket[]
|
||||||
range: TimeRange | null
|
range: TimeRange | null
|
||||||
onSelectRange: (range: TimeRange | null) => void
|
onSelectRange: (range: TimeRange | null) => void
|
||||||
activePreset: TimeRangePresetId | null
|
activePreset: TimeRangePresetId | null
|
||||||
onSelectPreset: (id: TimeRangePresetId) => void
|
onSelectPreset: (id: TimeRangePresetId) => void
|
||||||
|
/** Ticket 045/053: current ordering choice, owned by the caller (it also feeds `fetchLogs`). Omitted by callers with no log list to sort (e.g. the standalone metrics/dashboards popout). */
|
||||||
|
paramNames?: string[]
|
||||||
|
sortSettings?: LogSortSettings
|
||||||
|
onSortSettingsChange?: (next: LogSortSettings) => void
|
||||||
}) {
|
}) {
|
||||||
const containerRef = useRef<HTMLDivElement>(null)
|
const containerRef = useRef<HTMLDivElement>(null)
|
||||||
const [dragStartX, setDragStartX] = useState<number | null>(null)
|
const [dragStartX, setDragStartX] = useState<number | null>(null)
|
||||||
@@ -122,7 +220,11 @@ export function LogTimeline({
|
|||||||
Timeline
|
Timeline
|
||||||
<HelpIcon sectionId="timeline" label="Help: Timeline" />
|
<HelpIcon sectionId="timeline" label="Help: Timeline" />
|
||||||
</span>
|
</span>
|
||||||
<div className="flex items-center gap-1.5 text-xs text-text-subtle">
|
<div className="flex items-center gap-3 text-xs text-text-subtle">
|
||||||
|
{sortSettings && onSortSettingsChange && (
|
||||||
|
<SortPicker paramNames={paramNames ?? []} settings={sortSettings} onChange={onSortSettingsChange} />
|
||||||
|
)}
|
||||||
|
<div className="flex items-center gap-1.5">
|
||||||
<div className="flex items-center gap-1">
|
<div className="flex items-center gap-1">
|
||||||
{TIME_RANGE_PRESETS.map((preset) => (
|
{TIME_RANGE_PRESETS.map((preset) => (
|
||||||
<button
|
<button
|
||||||
@@ -147,6 +249,7 @@ export function LogTimeline({
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div className="p-3">
|
<div className="p-3">
|
||||||
<div
|
<div
|
||||||
ref={containerRef}
|
ref={containerRef}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import type { TimeRange, TimeRangePresetId } from './LogTimeline'
|
|||||||
import {
|
import {
|
||||||
ApiError,
|
ApiError,
|
||||||
declareMetric,
|
declareMetric,
|
||||||
|
deleteMetric,
|
||||||
fetchMetricBucketValues,
|
fetchMetricBucketValues,
|
||||||
fetchMetricDeclarations,
|
fetchMetricDeclarations,
|
||||||
fetchParamDeclarations,
|
fetchParamDeclarations,
|
||||||
@@ -166,6 +167,19 @@ export function Metrics({ range, activePreset }: { range: TimeRange | null; acti
|
|||||||
editMetric(metric)
|
editMetric(metric)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// No confirm-before-delete dialog — matches the rest of this settings UI (e.g. CSS entry / profile
|
||||||
|
// deletion in NavMenu.tsx), which also deletes directly on click rather than prompting first.
|
||||||
|
async function handleDelete(metricName: string) {
|
||||||
|
try {
|
||||||
|
await deleteMetric(metricName)
|
||||||
|
if (selected === metricName) setSelected(null)
|
||||||
|
if (editingName === metricName) resetForm()
|
||||||
|
await loadMetrics()
|
||||||
|
} catch {
|
||||||
|
// best-effort; the declared-metrics list simply keeps showing it if the delete failed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function handleSubmit(e: React.FormEvent) {
|
async function handleSubmit(e: React.FormEvent) {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
setSubmitError(null)
|
setSubmitError(null)
|
||||||
@@ -312,18 +326,27 @@ export function Metrics({ range, activePreset }: { range: TimeRange | null; acti
|
|||||||
<div className="mb-3 flex flex-wrap gap-1">
|
<div className="mb-3 flex flex-wrap gap-1">
|
||||||
{metrics.length === 0 && <span className="text-xs text-text-faint">No metrics declared yet.</span>}
|
{metrics.length === 0 && <span className="text-xs text-text-faint">No metrics declared yet.</span>}
|
||||||
{metrics.map((m) => (
|
{metrics.map((m) => (
|
||||||
<button
|
<div
|
||||||
key={m.name}
|
key={m.name}
|
||||||
onClick={() => selectMetric(m)}
|
className={`flex items-center gap-0.5 rounded border pl-2 pr-1 py-1 text-xs ${
|
||||||
className={`rounded border px-2 py-1 text-xs ${
|
|
||||||
selected === m.name
|
selected === m.name
|
||||||
? 'border-accent bg-accent/10 text-accent-text'
|
? 'border-accent bg-accent/10 text-accent-text'
|
||||||
: 'border-border-soft text-text-secondary hover:bg-surface-2'
|
: 'border-border-soft text-text-secondary hover:bg-surface-2'
|
||||||
}`}
|
}`}
|
||||||
title={m.message_match_regex}
|
|
||||||
>
|
>
|
||||||
|
<button type="button" onClick={() => selectMetric(m)} title={m.message_match_regex}>
|
||||||
{m.name} ({m.label_params.join(', ') || 'no params'})
|
{m.name} ({m.label_params.join(', ') || 'no params'})
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={() => handleDelete(m.name)}
|
||||||
|
className="rounded px-1 text-text-faint hover:bg-danger-bg/50 hover:text-danger-text"
|
||||||
|
aria-label={`Delete metric ${m.name}`}
|
||||||
|
title={`Delete metric "${m.name}"`}
|
||||||
|
>
|
||||||
|
×
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,11 @@ const COLOR_SCHEMES: ColorScheme[] = [
|
|||||||
'pink',
|
'pink',
|
||||||
'orange',
|
'orange',
|
||||||
'light_green',
|
'light_green',
|
||||||
|
'light_red',
|
||||||
|
'light_blue',
|
||||||
|
'light_yellow',
|
||||||
|
'light_pink',
|
||||||
|
'light_orange',
|
||||||
]
|
]
|
||||||
|
|
||||||
/** Display label for a `ColorScheme`: underscores become spaces so `capitalize` (which titles each word) renders e.g. "light_green" as "Light Green". */
|
/** Display label for a `ColorScheme`: underscores become spaces so `capitalize` (which titles each word) renders e.g. "light_green" as "Light Green". */
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import {
|
|||||||
YAxis,
|
YAxis,
|
||||||
} from 'recharts'
|
} from 'recharts'
|
||||||
import type { ChartType, PromqlSeries } from '../lib/api'
|
import type { ChartType, PromqlSeries } from '../lib/api'
|
||||||
|
import type { TimeRange } from './LogTimeline'
|
||||||
|
|
||||||
/// Renders a label combination as a series key/legend string, e.g. `{"path":"/a"}` -> `path=/a`; no labels renders as `value`.
|
/// Renders a label combination as a series key/legend string, e.g. `{"path":"/a"}` -> `path=/a`; no labels renders as `value`.
|
||||||
export function seriesLabel(labels: Record<string, string>): string {
|
export function seriesLabel(labels: Record<string, string>): string {
|
||||||
@@ -91,19 +92,36 @@ function sumValue(series: PromqlSeries): number {
|
|||||||
return series.points.reduce((total, [, value]) => total + value, 0)
|
return series.points.reduce((total, [, value]) => total + value, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function PanelChart({ series, chartType }: { series: PromqlSeries[]; chartType: ChartType }) {
|
export function PanelChart({
|
||||||
|
series,
|
||||||
|
chartType,
|
||||||
|
range,
|
||||||
|
}: {
|
||||||
|
series: PromqlSeries[]
|
||||||
|
chartType: ChartType
|
||||||
|
range?: TimeRange | null
|
||||||
|
}) {
|
||||||
if (series.length === 0) {
|
if (series.length === 0) {
|
||||||
return <div className="flex h-48 items-center justify-center text-xs text-text-faint">No data in range.</div>
|
return <div className="flex h-48 items-center justify-center text-xs text-text-faint">No data in range.</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chartType === 'line') {
|
if (chartType === 'line') {
|
||||||
const { rows, keys } = toLineData(series)
|
const { rows, keys } = toLineData(series)
|
||||||
|
// Ticket 057: without an explicit numeric domain, recharts auto-scales the x-axis to the
|
||||||
|
// min/max timestamp actually present in `rows` — so a metric whose occurrences only cover a
|
||||||
|
// sliver of the queried range (a burst followed by silence) silently renders as if that
|
||||||
|
// sliver *were* the full range, with no visual sign the axis got narrowed. Pinning the domain
|
||||||
|
// to the panel's actual queried range keeps the axis honest; `type="number"` is required for
|
||||||
|
// a `domain` tuple to be interpreted as a value range rather than a category filter.
|
||||||
return (
|
return (
|
||||||
<ResponsiveContainer width="100%" height={220}>
|
<ResponsiveContainer width="100%" height={220}>
|
||||||
<LineChart data={rows} margin={{ top: 8, right: 16, left: 0, bottom: 0 }}>
|
<LineChart data={rows} margin={{ top: 8, right: 16, left: 0, bottom: 0 }}>
|
||||||
<CartesianGrid strokeDasharray="3 3" stroke="var(--c-border)" />
|
<CartesianGrid strokeDasharray="3 3" stroke="var(--c-border)" />
|
||||||
<XAxis
|
<XAxis
|
||||||
dataKey="timestamp_ms"
|
dataKey="timestamp_ms"
|
||||||
|
type="number"
|
||||||
|
domain={range ? [range.startMs, range.endMs] : ['dataMin', 'dataMax']}
|
||||||
|
allowDataOverflow
|
||||||
tickFormatter={formatTimestamp}
|
tickFormatter={formatTimestamp}
|
||||||
stroke="var(--c-text-subtle)"
|
stroke="var(--c-text-subtle)"
|
||||||
tick={{ fontSize: 11, fill: 'var(--c-text-muted)' }}
|
tick={{ fontSize: 11, fill: 'var(--c-text-muted)' }}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useMemo, useState } from 'react'
|
import { useMemo, useState } from 'react'
|
||||||
import { ApiError, declareParam, type ParamDeclaration } from '../lib/api'
|
import { ApiError, clearParams, declareParam, type ParamDeclaration } from '../lib/api'
|
||||||
import {
|
import {
|
||||||
CollapseToggle,
|
CollapseToggle,
|
||||||
handleSectionHeaderKeyDown,
|
handleSectionHeaderKeyDown,
|
||||||
@@ -48,6 +48,15 @@ export function Params({ params, onDeclared }: { params: ParamDeclaration[]; onD
|
|||||||
// in place by name, so changing it here would silently create a second param and orphan the
|
// in place by name, so changing it here would silently create a second param and orphan the
|
||||||
// original (and anything referencing it by name) rather than renaming it.
|
// original (and anything referencing it by name) rather than renaming it.
|
||||||
const [editingName, setEditingName] = useState<string | null>(null)
|
const [editingName, setEditingName] = useState<string | null>(null)
|
||||||
|
const [clearing, setClearing] = useState(false)
|
||||||
|
const [clearResult, setClearResult] = useState<string | null>(null)
|
||||||
|
const [clearError, setClearError] = useState<string | null>(null)
|
||||||
|
|
||||||
|
// `reserved` params (`ottyl_seq`/`ottyl_ts`/`ottyl_fmt`) are synthesized server-side purely for
|
||||||
|
// discoverability (see `GET /api/params`) — they aren't real declarations, so they're kept out of
|
||||||
|
// the editable/clickable list and shown separately, non-interactively.
|
||||||
|
const declaredParams = useMemo(() => params.filter((p) => !p.reserved), [params])
|
||||||
|
const reservedParams = useMemo(() => params.filter((p) => p.reserved), [params])
|
||||||
|
|
||||||
const isBoolean = kind === 'boolean'
|
const isBoolean = kind === 'boolean'
|
||||||
const isElapsedSinceLast = source === 'elapsed_since_last'
|
const isElapsedSinceLast = source === 'elapsed_since_last'
|
||||||
@@ -117,6 +126,33 @@ export function Params({ params, onDeclared }: { params: ParamDeclaration[]; onD
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clears every declared param (manual and auto-derived) in one action, then immediately
|
||||||
|
// re-derives whatever the engine can still find in retained log text (ticket 052) — a single
|
||||||
|
// confirmed click rather than removing params one at a time. `logs_considered` in the response
|
||||||
|
// is surfaced in the status line so it's clear the re-extraction only covers logs the engine
|
||||||
|
// still holds, not ones already evicted by a max-logs cap.
|
||||||
|
async function handleClearAll() {
|
||||||
|
if (params.length === 0) return
|
||||||
|
if (!window.confirm(`Clear all ${params.length} declared param(s)? Params will immediately be re-derived from log lines still held in memory; lines already evicted by a log cap can't regain their params.`)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
setClearing(true)
|
||||||
|
setClearError(null)
|
||||||
|
setClearResult(null)
|
||||||
|
try {
|
||||||
|
const result = await clearParams()
|
||||||
|
setClearResult(
|
||||||
|
`Cleared ${result.removed}, re-derived ${result.reextracted} from ${result.logs_considered} retained log line(s).`,
|
||||||
|
)
|
||||||
|
resetForm()
|
||||||
|
onDeclared()
|
||||||
|
} catch (err) {
|
||||||
|
setClearError(err instanceof ApiError ? err.message : 'Failed to clear params')
|
||||||
|
} finally {
|
||||||
|
setClearing(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="border-b border-border text-sm">
|
<div className="border-b border-border text-sm">
|
||||||
<div
|
<div
|
||||||
@@ -262,10 +298,25 @@ export function Params({ params, onDeclared }: { params: ParamDeclaration[]; onD
|
|||||||
</form>
|
</form>
|
||||||
|
|
||||||
<div className="min-w-0 flex-1">
|
<div className="min-w-0 flex-1">
|
||||||
<div className="mb-1 text-xs text-text-subtle">Declared params</div>
|
<div className="mb-1 flex items-center justify-between gap-2">
|
||||||
|
<span className="text-xs text-text-subtle">Declared params</span>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={handleClearAll}
|
||||||
|
disabled={clearing || params.length === 0}
|
||||||
|
className="rounded border border-border-soft px-2 py-0.5 text-xs text-text-secondary hover:bg-surface-2 disabled:opacity-50"
|
||||||
|
title="Clear every declared param, then re-derive params from log lines still held in memory"
|
||||||
|
>
|
||||||
|
{clearing ? 'Clearing…' : 'Clear all'}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
{clearResult && <div className="mb-1 text-xs text-text-subtle">{clearResult}</div>}
|
||||||
|
{clearError && <div className="mb-1 text-xs text-danger-text">{clearError}</div>}
|
||||||
<div className="flex flex-wrap gap-1">
|
<div className="flex flex-wrap gap-1">
|
||||||
{params.length === 0 && <span className="text-xs text-text-faint">No params declared yet.</span>}
|
{declaredParams.length === 0 && (
|
||||||
{params.map((p) => (
|
<span className="text-xs text-text-faint">No params declared yet.</span>
|
||||||
|
)}
|
||||||
|
{declaredParams.map((p) => (
|
||||||
<button
|
<button
|
||||||
key={p.name}
|
key={p.name}
|
||||||
type="button"
|
type="button"
|
||||||
@@ -287,6 +338,24 @@ export function Params({ params, onDeclared }: { params: ParamDeclaration[]; onD
|
|||||||
</button>
|
</button>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
{reservedParams.length > 0 && (
|
||||||
|
<>
|
||||||
|
<div className="mb-1 mt-2 text-xs text-text-subtle">
|
||||||
|
Reserved (built in — present on every line, not editable)
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-wrap gap-1">
|
||||||
|
{reservedParams.map((p) => (
|
||||||
|
<span
|
||||||
|
key={p.name}
|
||||||
|
className="rounded border border-dashed border-border-soft px-2 py-1 text-xs text-text-faint"
|
||||||
|
title={`${p.name} (${p.kind}, reserved)`}
|
||||||
|
>
|
||||||
|
{p.name} ({p.kind})
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -296,6 +296,166 @@ html.light_green {
|
|||||||
--c-accent-3: hsl(50 70% 38%);
|
--c-accent-3: hsl(50 70% 38%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Brighter, light-surfaced counterpart to `red` (ticket 056): same base hue
|
||||||
|
(0) and accent hues as `red`, with `light`'s inverted surface/border/text
|
||||||
|
scale and `light`'s hue-neutral danger colours. */
|
||||||
|
html.light_red {
|
||||||
|
--c-surface-0: hsl(0 40% 96%);
|
||||||
|
--c-surface-1: hsl(0 35% 92%);
|
||||||
|
--c-surface-2: hsl(0 30% 85%);
|
||||||
|
|
||||||
|
--c-border: hsl(0 25% 80%);
|
||||||
|
--c-border-soft: hsl(0 22% 70%);
|
||||||
|
--c-border-faint: hsl(0 35% 92%);
|
||||||
|
--c-border-strong: hsl(0 20% 40%);
|
||||||
|
|
||||||
|
--c-text: hsl(0 30% 12%);
|
||||||
|
--c-text-secondary: hsl(0 20% 25%);
|
||||||
|
--c-text-muted: hsl(0 15% 40%);
|
||||||
|
--c-text-subtle: hsl(0 10% 50%);
|
||||||
|
--c-text-faint: hsl(0 10% 65%);
|
||||||
|
--c-text-faintest: hsl(0 12% 80%);
|
||||||
|
|
||||||
|
--c-danger-bg: #fee2e2;
|
||||||
|
--c-danger-border: #fca5a5;
|
||||||
|
--c-danger-text: #b91c1c;
|
||||||
|
--c-danger-text-strong: #991b1b;
|
||||||
|
|
||||||
|
--c-accent: hsl(180 70% 40%);
|
||||||
|
--c-accent-soft: hsl(150 60% 85%);
|
||||||
|
--c-accent-text: hsl(180 75% 28%);
|
||||||
|
--c-accent-2: hsl(90 70% 45%);
|
||||||
|
--c-accent-3: hsl(270 70% 38%);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Brighter, light-surfaced counterpart to `blue` (ticket 056): same base hue
|
||||||
|
(210) and accent hues as `blue`, with `light`'s inverted surface/border/text
|
||||||
|
scale and `light`'s hue-neutral danger colours. */
|
||||||
|
html.light_blue {
|
||||||
|
--c-surface-0: hsl(210 40% 96%);
|
||||||
|
--c-surface-1: hsl(210 35% 92%);
|
||||||
|
--c-surface-2: hsl(210 30% 85%);
|
||||||
|
|
||||||
|
--c-border: hsl(210 25% 80%);
|
||||||
|
--c-border-soft: hsl(210 22% 70%);
|
||||||
|
--c-border-faint: hsl(210 35% 92%);
|
||||||
|
--c-border-strong: hsl(210 20% 40%);
|
||||||
|
|
||||||
|
--c-text: hsl(210 30% 12%);
|
||||||
|
--c-text-secondary: hsl(210 20% 25%);
|
||||||
|
--c-text-muted: hsl(210 15% 40%);
|
||||||
|
--c-text-subtle: hsl(210 10% 50%);
|
||||||
|
--c-text-faint: hsl(210 10% 65%);
|
||||||
|
--c-text-faintest: hsl(210 12% 80%);
|
||||||
|
|
||||||
|
--c-danger-bg: #fee2e2;
|
||||||
|
--c-danger-border: #fca5a5;
|
||||||
|
--c-danger-text: #b91c1c;
|
||||||
|
--c-danger-text-strong: #991b1b;
|
||||||
|
|
||||||
|
--c-accent: hsl(30 70% 40%);
|
||||||
|
--c-accent-soft: hsl(0 60% 85%);
|
||||||
|
--c-accent-text: hsl(30 75% 28%);
|
||||||
|
--c-accent-2: hsl(300 70% 45%);
|
||||||
|
--c-accent-3: hsl(120 70% 38%);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Brighter, light-surfaced counterpart to `yellow` (ticket 056): same base
|
||||||
|
hue (50) and accent hues as `yellow`, with `light`'s inverted
|
||||||
|
surface/border/text scale and `light`'s hue-neutral danger colours. */
|
||||||
|
html.light_yellow {
|
||||||
|
--c-surface-0: hsl(50 40% 96%);
|
||||||
|
--c-surface-1: hsl(50 35% 92%);
|
||||||
|
--c-surface-2: hsl(50 30% 85%);
|
||||||
|
|
||||||
|
--c-border: hsl(50 25% 80%);
|
||||||
|
--c-border-soft: hsl(50 22% 70%);
|
||||||
|
--c-border-faint: hsl(50 35% 92%);
|
||||||
|
--c-border-strong: hsl(50 20% 40%);
|
||||||
|
|
||||||
|
--c-text: hsl(50 30% 12%);
|
||||||
|
--c-text-secondary: hsl(50 20% 25%);
|
||||||
|
--c-text-muted: hsl(50 15% 40%);
|
||||||
|
--c-text-subtle: hsl(50 10% 50%);
|
||||||
|
--c-text-faint: hsl(50 10% 65%);
|
||||||
|
--c-text-faintest: hsl(50 12% 80%);
|
||||||
|
|
||||||
|
--c-danger-bg: #fee2e2;
|
||||||
|
--c-danger-border: #fca5a5;
|
||||||
|
--c-danger-text: #b91c1c;
|
||||||
|
--c-danger-text-strong: #991b1b;
|
||||||
|
|
||||||
|
--c-accent: hsl(230 70% 40%);
|
||||||
|
--c-accent-soft: hsl(200 60% 85%);
|
||||||
|
--c-accent-text: hsl(230 75% 28%);
|
||||||
|
--c-accent-2: hsl(140 70% 45%);
|
||||||
|
--c-accent-3: hsl(320 70% 38%);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Brighter, light-surfaced counterpart to `pink` (ticket 056): same base hue
|
||||||
|
(330) and accent hues as `pink`, with `light`'s inverted surface/border/text
|
||||||
|
scale and `light`'s hue-neutral danger colours. */
|
||||||
|
html.light_pink {
|
||||||
|
--c-surface-0: hsl(330 40% 96%);
|
||||||
|
--c-surface-1: hsl(330 35% 92%);
|
||||||
|
--c-surface-2: hsl(330 30% 85%);
|
||||||
|
|
||||||
|
--c-border: hsl(330 25% 80%);
|
||||||
|
--c-border-soft: hsl(330 22% 70%);
|
||||||
|
--c-border-faint: hsl(330 35% 92%);
|
||||||
|
--c-border-strong: hsl(330 20% 40%);
|
||||||
|
|
||||||
|
--c-text: hsl(330 30% 12%);
|
||||||
|
--c-text-secondary: hsl(330 20% 25%);
|
||||||
|
--c-text-muted: hsl(330 15% 40%);
|
||||||
|
--c-text-subtle: hsl(330 10% 50%);
|
||||||
|
--c-text-faint: hsl(330 10% 65%);
|
||||||
|
--c-text-faintest: hsl(330 12% 80%);
|
||||||
|
|
||||||
|
--c-danger-bg: #fee2e2;
|
||||||
|
--c-danger-border: #fca5a5;
|
||||||
|
--c-danger-text: #b91c1c;
|
||||||
|
--c-danger-text-strong: #991b1b;
|
||||||
|
|
||||||
|
--c-accent: hsl(150 70% 40%);
|
||||||
|
--c-accent-soft: hsl(120 60% 85%);
|
||||||
|
--c-accent-text: hsl(150 75% 28%);
|
||||||
|
--c-accent-2: hsl(60 70% 45%);
|
||||||
|
--c-accent-3: hsl(240 70% 38%);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Brighter, light-surfaced counterpart to `orange` (ticket 056): same base
|
||||||
|
hue (30) and accent hues as `orange`, with `light`'s inverted
|
||||||
|
surface/border/text scale and `light`'s hue-neutral danger colours. */
|
||||||
|
html.light_orange {
|
||||||
|
--c-surface-0: hsl(30 40% 96%);
|
||||||
|
--c-surface-1: hsl(30 35% 92%);
|
||||||
|
--c-surface-2: hsl(30 30% 85%);
|
||||||
|
|
||||||
|
--c-border: hsl(30 25% 80%);
|
||||||
|
--c-border-soft: hsl(30 22% 70%);
|
||||||
|
--c-border-faint: hsl(30 35% 92%);
|
||||||
|
--c-border-strong: hsl(30 20% 40%);
|
||||||
|
|
||||||
|
--c-text: hsl(30 30% 12%);
|
||||||
|
--c-text-secondary: hsl(30 20% 25%);
|
||||||
|
--c-text-muted: hsl(30 15% 40%);
|
||||||
|
--c-text-subtle: hsl(30 10% 50%);
|
||||||
|
--c-text-faint: hsl(30 10% 65%);
|
||||||
|
--c-text-faintest: hsl(30 12% 80%);
|
||||||
|
|
||||||
|
--c-danger-bg: #fee2e2;
|
||||||
|
--c-danger-border: #fca5a5;
|
||||||
|
--c-danger-text: #b91c1c;
|
||||||
|
--c-danger-text-strong: #991b1b;
|
||||||
|
|
||||||
|
--c-accent: hsl(210 70% 40%);
|
||||||
|
--c-accent-soft: hsl(180 60% 85%);
|
||||||
|
--c-accent-text: hsl(210 75% 28%);
|
||||||
|
--c-accent-2: hsl(120 70% 45%);
|
||||||
|
--c-accent-3: hsl(300 70% 38%);
|
||||||
|
}
|
||||||
|
|
||||||
@theme inline {
|
@theme inline {
|
||||||
--color-surface-0: var(--c-surface-0);
|
--color-surface-0: var(--c-surface-0);
|
||||||
--color-surface-1: var(--c-surface-1);
|
--color-surface-1: var(--c-surface-1);
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ export interface ParamDeclaration {
|
|||||||
kind: 'string' | 'number' | 'timestamp' | 'duration' | 'boolean'
|
kind: 'string' | 'number' | 'timestamp' | 'duration' | 'boolean'
|
||||||
/** A third extraction source, distinct from `capture_group`/`json_field_path`: when true, this param's value is never parsed from text — it's computed as elapsed time since the previous event sharing the same label set. Only meaningful paired with `kind: 'duration'`. */
|
/** A third extraction source, distinct from `capture_group`/`json_field_path`: when true, this param's value is never parsed from text — it's computed as elapsed time since the previous event sharing the same label set. Only meaningful paired with `kind: 'duration'`. */
|
||||||
elapsed_since_last?: boolean
|
elapsed_since_last?: boolean
|
||||||
|
/** Set only for the built-in `ottyl_seq`/`ottyl_ts`/`ottyl_fmt` names, synthesized into `GET /api/params` for discoverability — they're usable in the filter bar (and `ottyl_seq`/`ottyl_ts` in dashboard PromQL queries) without ever being declared, and can't be edited or removed. */
|
||||||
|
reserved?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface TimelineBucket {
|
export interface TimelineBucket {
|
||||||
@@ -91,6 +93,11 @@ export type ColorScheme =
|
|||||||
| 'pink'
|
| 'pink'
|
||||||
| 'orange'
|
| 'orange'
|
||||||
| 'light_green'
|
| 'light_green'
|
||||||
|
| 'light_red'
|
||||||
|
| 'light_blue'
|
||||||
|
| 'light_yellow'
|
||||||
|
| 'light_pink'
|
||||||
|
| 'light_orange'
|
||||||
|
|
||||||
export interface Settings {
|
export interface Settings {
|
||||||
color_scheme: ColorScheme
|
color_scheme: ColorScheme
|
||||||
@@ -287,6 +294,21 @@ export function declareParam(request: ParamDeclaration): Promise<ParamDeclaratio
|
|||||||
return postJson('/api/params', request)
|
return postJson('/api/params', request)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ClearParamsResult {
|
||||||
|
/** How many param declarations (manual + auto-derived) were removed. */
|
||||||
|
removed: number
|
||||||
|
/** How many params were immediately re-derived from log text still retained by the engine. */
|
||||||
|
reextracted: number
|
||||||
|
/** How many retained log lines were re-scanned — lines already evicted by `max_logs` before the clear can't regain their params, so this can be smaller than the total lines ever ingested. */
|
||||||
|
logs_considered: number
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clears every declared param (ticket 052) and re-derives whatever the engine's still-retained log
|
||||||
|
// text supports — see `ClearParamsResult`'s fields for what came back.
|
||||||
|
export function clearParams(): Promise<ClearParamsResult> {
|
||||||
|
return sendJson('/api/params', 'DELETE')
|
||||||
|
}
|
||||||
|
|
||||||
export function fetchMetricDeclarations(): Promise<MetricDeclaration[]> {
|
export function fetchMetricDeclarations(): Promise<MetricDeclaration[]> {
|
||||||
return getJson('/api/metrics')
|
return getJson('/api/metrics')
|
||||||
}
|
}
|
||||||
@@ -300,6 +322,10 @@ export function updateMetric(existingName: string, request: MetricDeclaration):
|
|||||||
return putJson(`/api/metrics/${encodeURIComponent(existingName)}`, request)
|
return putJson(`/api/metrics/${encodeURIComponent(existingName)}`, request)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function deleteMetric(name: string): Promise<void> {
|
||||||
|
return sendJson(`/api/metrics/${encodeURIComponent(name)}`, 'DELETE')
|
||||||
|
}
|
||||||
|
|
||||||
export function fetchMetricBucketValues(
|
export function fetchMetricBucketValues(
|
||||||
name: string,
|
name: string,
|
||||||
params: {
|
params: {
|
||||||
|
|||||||
@@ -252,6 +252,126 @@ export const BUILTIN_THEMES: Record<string, ThemeVars> = {
|
|||||||
'--c-accent-2': 'hsl(230 70% 45%)',
|
'--c-accent-2': 'hsl(230 70% 45%)',
|
||||||
'--c-accent-3': 'hsl(50 70% 38%)',
|
'--c-accent-3': 'hsl(50 70% 38%)',
|
||||||
},
|
},
|
||||||
|
light_red: {
|
||||||
|
'--c-surface-0': 'hsl(0 40% 96%)',
|
||||||
|
'--c-surface-1': 'hsl(0 35% 92%)',
|
||||||
|
'--c-surface-2': 'hsl(0 30% 85%)',
|
||||||
|
'--c-border': 'hsl(0 25% 80%)',
|
||||||
|
'--c-border-soft': 'hsl(0 22% 70%)',
|
||||||
|
'--c-border-faint': 'hsl(0 35% 92%)',
|
||||||
|
'--c-border-strong': 'hsl(0 20% 40%)',
|
||||||
|
'--c-text': 'hsl(0 30% 12%)',
|
||||||
|
'--c-text-secondary': 'hsl(0 20% 25%)',
|
||||||
|
'--c-text-muted': 'hsl(0 15% 40%)',
|
||||||
|
'--c-text-subtle': 'hsl(0 10% 50%)',
|
||||||
|
'--c-text-faint': 'hsl(0 10% 65%)',
|
||||||
|
'--c-text-faintest': 'hsl(0 12% 80%)',
|
||||||
|
'--c-danger-bg': '#fee2e2',
|
||||||
|
'--c-danger-border': '#fca5a5',
|
||||||
|
'--c-danger-text': '#b91c1c',
|
||||||
|
'--c-danger-text-strong': '#991b1b',
|
||||||
|
'--c-accent': 'hsl(180 70% 40%)',
|
||||||
|
'--c-accent-soft': 'hsl(150 60% 85%)',
|
||||||
|
'--c-accent-text': 'hsl(180 75% 28%)',
|
||||||
|
'--c-accent-2': 'hsl(90 70% 45%)',
|
||||||
|
'--c-accent-3': 'hsl(270 70% 38%)',
|
||||||
|
},
|
||||||
|
light_blue: {
|
||||||
|
'--c-surface-0': 'hsl(210 40% 96%)',
|
||||||
|
'--c-surface-1': 'hsl(210 35% 92%)',
|
||||||
|
'--c-surface-2': 'hsl(210 30% 85%)',
|
||||||
|
'--c-border': 'hsl(210 25% 80%)',
|
||||||
|
'--c-border-soft': 'hsl(210 22% 70%)',
|
||||||
|
'--c-border-faint': 'hsl(210 35% 92%)',
|
||||||
|
'--c-border-strong': 'hsl(210 20% 40%)',
|
||||||
|
'--c-text': 'hsl(210 30% 12%)',
|
||||||
|
'--c-text-secondary': 'hsl(210 20% 25%)',
|
||||||
|
'--c-text-muted': 'hsl(210 15% 40%)',
|
||||||
|
'--c-text-subtle': 'hsl(210 10% 50%)',
|
||||||
|
'--c-text-faint': 'hsl(210 10% 65%)',
|
||||||
|
'--c-text-faintest': 'hsl(210 12% 80%)',
|
||||||
|
'--c-danger-bg': '#fee2e2',
|
||||||
|
'--c-danger-border': '#fca5a5',
|
||||||
|
'--c-danger-text': '#b91c1c',
|
||||||
|
'--c-danger-text-strong': '#991b1b',
|
||||||
|
'--c-accent': 'hsl(30 70% 40%)',
|
||||||
|
'--c-accent-soft': 'hsl(0 60% 85%)',
|
||||||
|
'--c-accent-text': 'hsl(30 75% 28%)',
|
||||||
|
'--c-accent-2': 'hsl(300 70% 45%)',
|
||||||
|
'--c-accent-3': 'hsl(120 70% 38%)',
|
||||||
|
},
|
||||||
|
light_yellow: {
|
||||||
|
'--c-surface-0': 'hsl(50 40% 96%)',
|
||||||
|
'--c-surface-1': 'hsl(50 35% 92%)',
|
||||||
|
'--c-surface-2': 'hsl(50 30% 85%)',
|
||||||
|
'--c-border': 'hsl(50 25% 80%)',
|
||||||
|
'--c-border-soft': 'hsl(50 22% 70%)',
|
||||||
|
'--c-border-faint': 'hsl(50 35% 92%)',
|
||||||
|
'--c-border-strong': 'hsl(50 20% 40%)',
|
||||||
|
'--c-text': 'hsl(50 30% 12%)',
|
||||||
|
'--c-text-secondary': 'hsl(50 20% 25%)',
|
||||||
|
'--c-text-muted': 'hsl(50 15% 40%)',
|
||||||
|
'--c-text-subtle': 'hsl(50 10% 50%)',
|
||||||
|
'--c-text-faint': 'hsl(50 10% 65%)',
|
||||||
|
'--c-text-faintest': 'hsl(50 12% 80%)',
|
||||||
|
'--c-danger-bg': '#fee2e2',
|
||||||
|
'--c-danger-border': '#fca5a5',
|
||||||
|
'--c-danger-text': '#b91c1c',
|
||||||
|
'--c-danger-text-strong': '#991b1b',
|
||||||
|
'--c-accent': 'hsl(230 70% 40%)',
|
||||||
|
'--c-accent-soft': 'hsl(200 60% 85%)',
|
||||||
|
'--c-accent-text': 'hsl(230 75% 28%)',
|
||||||
|
'--c-accent-2': 'hsl(140 70% 45%)',
|
||||||
|
'--c-accent-3': 'hsl(320 70% 38%)',
|
||||||
|
},
|
||||||
|
light_pink: {
|
||||||
|
'--c-surface-0': 'hsl(330 40% 96%)',
|
||||||
|
'--c-surface-1': 'hsl(330 35% 92%)',
|
||||||
|
'--c-surface-2': 'hsl(330 30% 85%)',
|
||||||
|
'--c-border': 'hsl(330 25% 80%)',
|
||||||
|
'--c-border-soft': 'hsl(330 22% 70%)',
|
||||||
|
'--c-border-faint': 'hsl(330 35% 92%)',
|
||||||
|
'--c-border-strong': 'hsl(330 20% 40%)',
|
||||||
|
'--c-text': 'hsl(330 30% 12%)',
|
||||||
|
'--c-text-secondary': 'hsl(330 20% 25%)',
|
||||||
|
'--c-text-muted': 'hsl(330 15% 40%)',
|
||||||
|
'--c-text-subtle': 'hsl(330 10% 50%)',
|
||||||
|
'--c-text-faint': 'hsl(330 10% 65%)',
|
||||||
|
'--c-text-faintest': 'hsl(330 12% 80%)',
|
||||||
|
'--c-danger-bg': '#fee2e2',
|
||||||
|
'--c-danger-border': '#fca5a5',
|
||||||
|
'--c-danger-text': '#b91c1c',
|
||||||
|
'--c-danger-text-strong': '#991b1b',
|
||||||
|
'--c-accent': 'hsl(150 70% 40%)',
|
||||||
|
'--c-accent-soft': 'hsl(120 60% 85%)',
|
||||||
|
'--c-accent-text': 'hsl(150 75% 28%)',
|
||||||
|
'--c-accent-2': 'hsl(60 70% 45%)',
|
||||||
|
'--c-accent-3': 'hsl(240 70% 38%)',
|
||||||
|
},
|
||||||
|
light_orange: {
|
||||||
|
'--c-surface-0': 'hsl(30 40% 96%)',
|
||||||
|
'--c-surface-1': 'hsl(30 35% 92%)',
|
||||||
|
'--c-surface-2': 'hsl(30 30% 85%)',
|
||||||
|
'--c-border': 'hsl(30 25% 80%)',
|
||||||
|
'--c-border-soft': 'hsl(30 22% 70%)',
|
||||||
|
'--c-border-faint': 'hsl(30 35% 92%)',
|
||||||
|
'--c-border-strong': 'hsl(30 20% 40%)',
|
||||||
|
'--c-text': 'hsl(30 30% 12%)',
|
||||||
|
'--c-text-secondary': 'hsl(30 20% 25%)',
|
||||||
|
'--c-text-muted': 'hsl(30 15% 40%)',
|
||||||
|
'--c-text-subtle': 'hsl(30 10% 50%)',
|
||||||
|
'--c-text-faint': 'hsl(30 10% 65%)',
|
||||||
|
'--c-text-faintest': 'hsl(30 12% 80%)',
|
||||||
|
'--c-danger-bg': '#fee2e2',
|
||||||
|
'--c-danger-border': '#fca5a5',
|
||||||
|
'--c-danger-text': '#b91c1c',
|
||||||
|
'--c-danger-text-strong': '#991b1b',
|
||||||
|
'--c-accent': 'hsl(210 70% 40%)',
|
||||||
|
'--c-accent-soft': 'hsl(180 60% 85%)',
|
||||||
|
'--c-accent-text': 'hsl(210 75% 28%)',
|
||||||
|
'--c-accent-2': 'hsl(120 70% 45%)',
|
||||||
|
'--c-accent-3': 'hsl(300 70% 38%)',
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
export function generateThemeCss(vars: ThemeVars): string {
|
export function generateThemeCss(vars: ThemeVars): string {
|
||||||
|
|||||||
@@ -31,6 +31,11 @@ const THEME_CLASSES = [
|
|||||||
'pink',
|
'pink',
|
||||||
'orange',
|
'orange',
|
||||||
'light_green',
|
'light_green',
|
||||||
|
'light_red',
|
||||||
|
'light_blue',
|
||||||
|
'light_yellow',
|
||||||
|
'light_pink',
|
||||||
|
'light_orange',
|
||||||
] as const
|
] as const
|
||||||
|
|
||||||
// Reflects `colorScheme` onto `<html>` as a class + `data-color-scheme`; when a custom theme is active, no built-in class is added at all, since a class selector would out-specificity its injected `:root` override (see `applyCustomThemeCss`) and mask it.
|
// Reflects `colorScheme` onto `<html>` as a class + `data-color-scheme`; when a custom theme is active, no built-in class is added at all, since a class selector would out-specificity its injected `:root` override (see `applyCustomThemeCss`) and mask it.
|
||||||
|
|||||||
Reference in New Issue
Block a user