vector/sinks/appsignal/
normalizer.rs

1use vector_lib::event::{Metric, MetricValue};
2
3use crate::sinks::util::buffer::metrics::{MetricNormalize, MetricSet};
4
5#[derive(Default)]
6pub(crate) struct AppsignalMetricsNormalizer;
7
8impl MetricNormalize for AppsignalMetricsNormalizer {
9    fn normalize(&mut self, state: &mut MetricSet, metric: Metric) -> Option<Metric> {
10        // We only care about making sure that counters are incremental, and that gauges are
11        // always absolute. Other metric types are currently unsupported.
12        match &metric.value() {
13            // We always send counters as incremental and gauges as absolute. Realistically, any
14            // system sending an incremental gauge update is kind of doing it wrong, but alas.
15            MetricValue::Counter { .. } => state.make_incremental(metric),
16            MetricValue::Gauge { .. } => state.make_absolute(metric),
17            // Otherwise, send it through as-is.
18            _ => Some(metric),
19        }
20    }
21}
22
23#[cfg(test)]
24mod tests {
25    use std::collections::BTreeSet;
26
27    use super::AppsignalMetricsNormalizer;
28    use crate::{
29        event::{Metric, MetricKind, MetricValue},
30        test_util::metrics::{assert_normalize, tests},
31    };
32
33    #[test]
34    fn absolute_counter() {
35        tests::absolute_counter_normalize_to_incremental(AppsignalMetricsNormalizer);
36    }
37
38    #[test]
39    fn incremental_counter() {
40        tests::incremental_counter_normalize_to_incremental(AppsignalMetricsNormalizer);
41    }
42
43    #[test]
44    fn mixed_counter() {
45        tests::mixed_counter_normalize_to_incremental(AppsignalMetricsNormalizer);
46    }
47
48    #[test]
49    fn absolute_gauge() {
50        tests::absolute_gauge_normalize_to_absolute(AppsignalMetricsNormalizer);
51    }
52
53    #[test]
54    fn incremental_gauge() {
55        tests::incremental_gauge_normalize_to_absolute(AppsignalMetricsNormalizer);
56    }
57
58    #[test]
59    fn mixed_gauge() {
60        tests::mixed_gauge_normalize_to_absolute(AppsignalMetricsNormalizer);
61    }
62
63    #[test]
64    fn other_metrics() {
65        let metric = Metric::new(
66            "set",
67            MetricKind::Incremental,
68            MetricValue::Set {
69                values: BTreeSet::new(),
70            },
71        );
72
73        assert_normalize(
74            AppsignalMetricsNormalizer,
75            vec![metric.clone()],
76            vec![Some(metric)],
77        );
78    }
79}