wasmcloud_tracing/
metrics.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
50
51
52
53
54
55
56
57
58
59
#[cfg(feature = "otel")]
use anyhow::Context;

#[cfg(feature = "otel")]
#[allow(clippy::missing_errors_doc)]
#[allow(clippy::module_name_repetitions)]
pub fn configure_metrics(
    service_name: &str,
    otel_config: &wasmcloud_core::OtelConfig,
) -> anyhow::Result<()> {
    use opentelemetry_otlp::{WithExportConfig, WithHttpConfig};
    use opentelemetry_sdk::metrics::{
        periodic_reader_with_async_runtime::PeriodicReader, SdkMeterProvider,
    };
    use wasmcloud_core::OtelProtocol;

    let exporter = match otel_config.protocol {
        OtelProtocol::Http => {
            let client = crate::get_http_client(otel_config)
                .context("failed to get an http client for otel metrics exporter")?;
            opentelemetry_otlp::MetricExporter::builder()
                .with_http()
                .with_http_client(client)
                .with_protocol(opentelemetry_otlp::Protocol::HttpBinary)
                .with_endpoint(otel_config.metrics_endpoint())
                .build()
                .context("failed to create OTEL http exporter")?
        }
        OtelProtocol::Grpc => {
            // TODO(joonas): Configure tonic::transport::ClientTlsConfig via .with_tls_config(...), passing in additional certificates.
            opentelemetry_otlp::MetricExporter::builder()
                .with_tonic()
                .with_endpoint(otel_config.metrics_endpoint())
                .build()
                .context("failed to create OTEL tonic exporter")?
        }
    };

    let reader = PeriodicReader::builder(exporter, opentelemetry_sdk::runtime::Tokio).build();

    let meter_provider = SdkMeterProvider::builder()
        .with_resource(
            opentelemetry_sdk::Resource::builder_empty()
                .with_detector(Box::new(
                    opentelemetry_sdk::resource::EnvResourceDetector::new(),
                ))
                .with_attribute(opentelemetry::KeyValue::new(
                    "service.name",
                    service_name.to_string(),
                ))
                .build(),
        )
        .with_reader(reader)
        .build();

    opentelemetry::global::set_meter_provider(meter_provider);

    Ok(())
}