| 553 | } |
| 554 | |
| 555 | pub fn emit_sandbox_activity_summary<I>( |
| 556 | network_activity_count: u64, |
| 557 | denied_action_count: u64, |
| 558 | denial_rate_pct: f64, |
| 559 | denials_by_group: I, |
| 560 | ) where |
| 561 | I: IntoIterator<Item = (DenyGroup, u64)>, |
| 562 | { |
| 563 | if !valid_count(network_activity_count) |
| 564 | || !valid_count(denied_action_count) |
| 565 | || !denial_rate_pct.is_finite() |
| 566 | || !(0.0..=100.0).contains(&denial_rate_pct) |
| 567 | { |
| 568 | return; |
| 569 | } |
| 570 | let Some(denials_by_group) = sanitize_denials_by_group(denials_by_group) else { |
| 571 | return; |
| 572 | }; |
| 573 | let rows: Vec<Value> = denials_by_group |
| 574 | .into_iter() |
| 575 | .map(|(group, count)| json!({ "denyGroup": group.as_str(), "deniedCount": count })) |
| 576 | .collect(); |
| 577 | emit_event( |
| 578 | "openshell_sandbox_activity_summary_event", |
| 579 | json!({ |
| 580 | "nvidiaSource": SOURCE.as_str(), |
| 581 | "networkActivityCount": network_activity_count, |
| 582 | "deniedActionCount": denied_action_count, |
| 583 | "denialRatePct": denial_rate_pct, |
| 584 | "denialsByGroup": rows, |
| 585 | }), |
| 586 | ); |
| 587 | } |
| 588 | |
| 589 | fn valid_count(value: u64) -> bool { |
| 590 | value <= MAX_TELEMETRY_INTEGER |