use super::CompositeActivationContext;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[non_exhaustive]
pub struct ObservabilityContext {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub composite_activations: Vec<CompositeActivationContext>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metrics: Option<MetricsSnapshot>,
#[serde(skip_serializing_if = "Option::is_none")]
pub middleware: Option<MiddlewareStats>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sli: Option<SliSnapshot>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom: Option<Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricsSnapshot {
pub events_processed: u64,
pub events_in_flight: u32,
pub queue_depth: u32,
pub processing_rate: f64,
pub error_rate: f64,
pub latency_p50_ms: f64,
pub latency_p99_ms: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MiddlewareStats {
pub timing_ms: u64,
pub retry_count: u32,
pub circuit_breaker_state: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub rate_limit_remaining: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SliSnapshot {
pub availability: f64,
pub error_budget_remaining: f64,
pub latency_budget_used: f64,
}