use std::sync::atomic::Ordering;
use super::{AS4_RECEIPT_TAXONOMY_OUTCOME_TOTAL, AsxEvent, EventBusMetrics, MetricsSink};
pub(super) fn observe_event(metrics: &EventBusMetrics, event: &AsxEvent, sink: &dyn MetricsSink) {
if let AsxEvent::ReceiptTaxonomyOutcome {
signal,
outcome,
detail,
..
} = event
{
metrics
.receipt_taxonomy_total
.fetch_add(1, Ordering::Relaxed);
sink.increment_counter(
AS4_RECEIPT_TAXONOMY_OUTCOME_TOTAL,
1,
&[
("protocol", "as4"),
("signal", *signal),
("outcome", *outcome),
("detail", *detail),
],
);
match *outcome {
"security_verification_failed" => {
metrics
.receipt_taxonomy_security_verification_failed
.fetch_add(1, Ordering::Relaxed);
}
"semantic_interop_failure" => {
metrics
.receipt_taxonomy_semantic_interop_failure
.fetch_add(1, Ordering::Relaxed);
}
_ => {}
}
}
if let AsxEvent::SpoolKeyProviderHealthStateChanged { current_state, .. } = event {
metrics
.provider_health_transition_total
.fetch_add(1, Ordering::Relaxed);
if *current_state == "failing" {
metrics
.provider_health_transition_to_failing
.fetch_add(1, Ordering::Relaxed);
}
}
}