wasmcloud_tracing/
metrics.rs1#[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 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}