feat(agent): expose data quality in portal

This commit is contained in:
igor04091968
2026-06-04 11:49:14 +03:00
parent d7616fd9a9
commit 95e7c0f314
7 changed files with 362 additions and 5 deletions
@@ -171,6 +171,15 @@ impl AwWorktimePublisher {
let mut sent = 0;
let sample_seconds = 60_i64;
for session in sessions {
let ignore_for_kpi = ignored_for_kpi(record, &session);
let active_for_kpi = session.active && !ignore_for_kpi;
let state = if ignore_for_kpi {
"IgnoredForKpi"
} else if session.active {
"Active"
} else {
"Disconnected"
};
let payload = serde_json::json!({
"timestamp": record.timestamp,
"duration": sample_seconds,
@@ -180,8 +189,10 @@ impl AwWorktimePublisher {
"sessionId": session_id_number(&session),
"sessionName": session.session_type,
"sessionSource": session.session_source,
"state": if session.active { "Active" } else { "Disconnected" },
"active": session.active,
"state": state,
"active": active_for_kpi,
"ignoredForKpi": ignore_for_kpi,
"qualityNote": if ignore_for_kpi { Some("local_fallback is diagnostics-only and is not accepted as activity proof") } else { None },
"sampleSeconds": sample_seconds,
"pollSeconds": sample_seconds,
"hostname": record.hostname,
@@ -227,6 +238,11 @@ impl AwWorktimePublisher {
}
}
fn ignored_for_kpi(record: &TelemetryRecord, session: &SessionInfo) -> bool {
record.diagnostics.collector_source == "local_fallback"
|| session.session_source.as_deref() == Some("local_fallback")
}
fn ensure_aw_bucket(
client: &Client,
aw_api_base: &str,
@@ -429,6 +445,30 @@ mod tests {
assert_eq!(session_id_number(&session), 12);
}
#[test]
fn local_fallback_sessions_are_diagnostics_only_for_kpi() {
let mut wts_record = record();
wts_record.diagnostics = diagnostics_for_sessions(&[], &[], "wts_api", None);
let session = SessionInfo {
session_id: "0".to_string(),
username: "user".to_string(),
session_type: "local".to_string(),
session_source: Some("local_fallback".to_string()),
remote_addr: None,
started_at: None,
active: true,
};
assert!(ignored_for_kpi(&wts_record, &session));
let mut fallback_record = record();
fallback_record.diagnostics = diagnostics_for_sessions(&[], &[], "local_fallback", None);
let session = SessionInfo {
session_source: Some("wts_api".to_string()),
..session
};
assert!(ignored_for_kpi(&fallback_record, &session));
}
#[test]
fn worktime_publisher_is_disabled_by_default() {
assert!(AwWorktimePublisher::new(&AgentConfig::default()).is_none());