wasmcloud_tracing/
metrics.rs

1#[cfg(feature = "otel")]
2use anyhow::Context;
3
4#[cfg(feature = "otel")]
5#[allow(clippy::missing_errors_doc)]
6#[allow(clippy::module_name_repetitions)]
7pub fn configure_metrics(
8    service_name: &str,
9    otel_config: &wasmcloud_core::OtelConfig,
10) -> anyhow::Result<()> {
11    use opentelemetry_otlp::{WithExportConfig, WithHttpConfig};
12    use opentelemetry_sdk::metrics::{
13        periodic_reader_with_async_runtime::PeriodicReader, SdkMeterProvider,
14    };
15    use wasmcloud_core::OtelProtocol;
16
17    let exporter = match otel_config.protocol {
18        OtelProtocol::Http => {
19            let client = crate::get_http_client(otel_config)
20                .context("failed to get an http client for otel metrics exporter")?;
21            opentelemetry_otlp::MetricExporter::builder()
22                .with_http()
23                .with_http_client(client)
24                .with_protocol(opentelemetry_otlp::Protocol::HttpBinary)
25                .with_endpoint(otel_config.metrics_endpoint())
26                .build()
27                .context("failed to create OTEL http exporter")?
28        }
29        OtelProtocol::Grpc => {
30            // TODO(joonas): Configure tonic::transport::ClientTlsConfig via .with_tls_config(...), passing in additional certificates.
31            opentelemetry_otlp::MetricExporter::builder()
32                .with_tonic()
33                .with_endpoint(otel_config.metrics_endpoint())
34                .build()
35                .context("failed to create OTEL tonic exporter")?
36        }
37    };
38
39    let reader = PeriodicReader::builder(exporter, opentelemetry_sdk::runtime::Tokio).build();
40
41    let meter_provider = SdkMeterProvider::builder()
42        .with_resource(
43            opentelemetry_sdk::Resource::builder_empty()
44                .with_detector(Box::new(
45                    opentelemetry_sdk::resource::EnvResourceDetector::new(),
46                ))
47                .with_attribute(opentelemetry::KeyValue::new(
48                    "service.name",
49                    service_name.to_string(),
50                ))
51                .build(),
52        )
53        .with_reader(reader)
54        .build();
55
56    opentelemetry::global::set_meter_provider(meter_provider);
57
58    Ok(())
59}