aws_smithy_observability_otel/
lib.rs1#![cfg_attr(docsrs, feature(doc_cfg))]
8#![warn(
10 missing_docs,
11 rustdoc::missing_crate_level_docs,
12 unreachable_pub,
13 rust_2018_idioms
14)]
15#![cfg(all(not(target_arch = "powerpc"), not(target_family = "wasm")))]
18
19pub mod attributes;
24pub mod meter;
25
26#[cfg(test)]
27mod tests {
28
29 use std::sync::Arc;
30
31 use crate::meter::OtelMeterProvider;
32 use aws_smithy_observability::{
33 global::{get_telemetry_provider, set_telemetry_provider},
34 TelemetryProvider,
35 };
36 use opentelemetry_sdk::metrics::{data::Sum, PeriodicReader, SdkMeterProvider};
37 use opentelemetry_sdk::runtime::Tokio;
38 use opentelemetry_sdk::testing::metrics::InMemoryMetricExporter;
39
40 #[tokio::test(flavor = "multi_thread", worker_threads = 1)]
42 async fn can_construct_set_and_use_otel_as_global_telemetry_provider() {
43 let exporter = InMemoryMetricExporter::default();
45 let reader = PeriodicReader::builder(exporter.clone(), Tokio).build();
46 let otel_mp = SdkMeterProvider::builder().with_reader(reader).build();
47
48 let sdk_mp = Arc::new(OtelMeterProvider::new(otel_mp));
50 let sdk_ref = sdk_mp.clone();
51 let sdk_tp = TelemetryProvider::builder().meter_provider(sdk_mp).build();
52
53 let _ = set_telemetry_provider(sdk_tp);
55 let global_tp = get_telemetry_provider().unwrap();
56
57 let global_meter = global_tp
59 .meter_provider()
60 .get_meter("TestGlobalMeter", None);
61
62 let mono_counter = global_meter
63 .create_monotonic_counter("TestMonoCounter")
64 .build();
65 mono_counter.add(4, None, None);
66
67 sdk_ref.flush().unwrap();
68 let finished_metrics = exporter.get_finished_metrics().unwrap();
69
70 let extracted_mono_counter_data = &finished_metrics[0].scope_metrics[0].metrics[0]
71 .data
72 .as_any()
73 .downcast_ref::<Sum<u64>>()
74 .unwrap()
75 .data_points[0]
76 .value;
77 assert_eq!(extracted_mono_counter_data, &4);
78 }
79}