apollo_router/plugins/telemetry/metrics/
otlp.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
use opentelemetry::runtime;
use opentelemetry::sdk::metrics::PeriodicReader;
use opentelemetry::sdk::metrics::View;
use opentelemetry_otlp::MetricsExporterBuilder;
use tower::BoxError;

use crate::plugins::telemetry::config::MetricsCommon;
use crate::plugins::telemetry::metrics::CustomAggregationSelector;
use crate::plugins::telemetry::metrics::MetricsBuilder;
use crate::plugins::telemetry::metrics::MetricsConfigurator;
use crate::plugins::telemetry::otlp::TelemetryDataKind;

impl MetricsConfigurator for super::super::otlp::Config {
    fn enabled(&self) -> bool {
        self.enabled
    }

    fn apply(
        &self,
        mut builder: MetricsBuilder,
        metrics_config: &MetricsCommon,
    ) -> Result<MetricsBuilder, BoxError> {
        if !self.enabled {
            return Ok(builder);
        }
        let exporter_builder: MetricsExporterBuilder = self.exporter(TelemetryDataKind::Metrics)?;
        let exporter = exporter_builder.build_metrics_exporter(
            (&self.temporality).into(),
            Box::new(
                CustomAggregationSelector::builder()
                    .boundaries(metrics_config.buckets.clone())
                    .build(),
            ),
        )?;

        builder.public_meter_provider_builder = builder.public_meter_provider_builder.with_reader(
            PeriodicReader::builder(exporter, runtime::Tokio)
                .with_interval(self.batch_processor.scheduled_delay)
                .with_timeout(self.batch_processor.max_export_timeout)
                .build(),
        );
        for metric_view in metrics_config.views.clone() {
            let view: Box<dyn View> = metric_view.try_into()?;
            builder.public_meter_provider_builder =
                builder.public_meter_provider_builder.with_view(view);
        }
        Ok(builder)
    }
}