use crate::api::{MetricKey, MetricsCollector};
#[derive(Debug, Clone, Copy)]
pub enum RuntimeMetricKey {
Steps,
MessagesOut,
MessagesDropped,
BackpressureEvents,
IdleSkips,
StepDurationNs,
Phase,
Workers,
}
impl MetricKey for RuntimeMetricKey {
fn name(&self) -> &str {
match self {
Self::Steps => "runtime.steps",
Self::MessagesOut => "runtime.messages_out",
Self::MessagesDropped => "runtime.messages_dropped",
Self::BackpressureEvents => "runtime.backpressure_events",
Self::IdleSkips => "runtime.idle_skips",
Self::StepDurationNs => "runtime.step_duration_ns",
Self::Phase => "runtime.phase",
Self::Workers => "runtime.workers",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum RuntimeEvent {
Built,
Validated,
Initialized,
Started,
Draining,
Shutdown,
Cleanup,
Step {
n: u64,
},
}
pub fn emit_lifecycle(metrics: &dyn MetricsCollector, enabled: bool, event: &RuntimeEvent) {
if !enabled {
return;
}
let key = match event {
RuntimeEvent::Built => "runtime.event.built",
RuntimeEvent::Validated => "runtime.event.validated",
RuntimeEvent::Initialized => "runtime.event.initialized",
RuntimeEvent::Started => "runtime.event.started",
RuntimeEvent::Draining => "runtime.event.draining",
RuntimeEvent::Shutdown => "runtime.event.shutdown",
RuntimeEvent::Cleanup => "runtime.event.cleanup",
RuntimeEvent::Step { .. } => "runtime.event.step",
};
metrics.record_counter(&StrKey(key), 1);
}
#[derive(Debug)]
struct StrKey(&'static str);
impl MetricKey for StrKey {
fn name(&self) -> &str {
self.0
}
}