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 crate::event::{Metric, MetricKind, MetricValue};
28
29    use super::AppsignalMetricsNormalizer;
30    use crate::test_util::metrics::{assert_normalize, tests};
31
32    #[test]
33    fn absolute_counter() {
34        tests::absolute_counter_normalize_to_incremental(AppsignalMetricsNormalizer);
35    }
36
37    #[test]
38    fn incremental_counter() {
39        tests::incremental_counter_normalize_to_incremental(AppsignalMetricsNormalizer);
40    }
41
42    #[test]
43    fn mixed_counter() {
44        tests::mixed_counter_normalize_to_incremental(AppsignalMetricsNormalizer);
45    }
46
47    #[test]
48    fn absolute_gauge() {
49        tests::absolute_gauge_normalize_to_absolute(AppsignalMetricsNormalizer);
50    }
51
52    #[test]
53    fn incremental_gauge() {
54        tests::incremental_gauge_normalize_to_absolute(AppsignalMetricsNormalizer);
55    }
56
57    #[test]
58    fn mixed_gauge() {
59        tests::mixed_gauge_normalize_to_absolute(AppsignalMetricsNormalizer);
60    }
61
62    #[test]
63    fn other_metrics() {
64        let metric = Metric::new(
65            "set",
66            MetricKind::Incremental,
67            MetricValue::Set {
68                values: BTreeSet::new(),
69            },
70        );
71
72        assert_normalize(
73            AppsignalMetricsNormalizer,
74            vec![metric.clone()],
75            vec![Some(metric)],
76        );
77    }
78}