relay_metrics/
cogs.rs

1//! COGS related metric utilities.
2
3use relay_cogs::{AppFeature, FeatureWeights};
4
5use crate::{Bucket, BucketView, MetricNamespace};
6
7/// COGS estimator based on the estimated size of each bucket in bytes.
8pub struct BySize<'a>(pub &'a [Bucket]);
9
10impl<'a> From<BySize<'a>> for FeatureWeights {
11    fn from(value: BySize<'a>) -> Self {
12        metric_app_features(value.0, |b| BucketView::new(b).estimated_size())
13    }
14}
15
16/// COGS estimator based on the bucket count.
17pub struct ByCount<'a, T: IntoIterator<Item = &'a Bucket>>(pub T);
18
19impl<'a, T: IntoIterator<Item = &'a Bucket>> From<ByCount<'a, T>> for FeatureWeights {
20    fn from(value: ByCount<'a, T>) -> Self {
21        metric_app_features(value.0, |_| 1)
22    }
23}
24
25fn metric_app_features<'a, T>(buckets: T, f: impl Fn(&Bucket) -> usize) -> FeatureWeights
26where
27    T: IntoIterator<Item = &'a Bucket>,
28{
29    let mut b = FeatureWeights::builder();
30
31    for bucket in buckets.into_iter() {
32        b.add_weight(to_app_feature(bucket.name.namespace()), f(bucket));
33    }
34
35    b.build()
36}
37
38fn to_app_feature(ns: MetricNamespace) -> AppFeature {
39    match ns {
40        MetricNamespace::Sessions => AppFeature::MetricsSessions,
41        MetricNamespace::Transactions => AppFeature::MetricsTransactions,
42        MetricNamespace::Spans => AppFeature::MetricsSpans,
43        MetricNamespace::Custom => AppFeature::MetricsCustom,
44        MetricNamespace::Stats => AppFeature::MetricsStats,
45        MetricNamespace::Unsupported => AppFeature::MetricsUnsupported,
46    }
47}