1use relay_cogs::{AppFeature, FeatureWeights};
4
5use crate::{Bucket, BucketView, MetricNamespace};
6
7pub 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
16pub 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}