opentelemetry_spanprocessor_any/global/
metrics.rs1use crate::metrics::{self, Meter, MeterProvider};
2use std::sync::{Arc, RwLock};
3
4lazy_static::lazy_static! {
5 static ref GLOBAL_METER_PROVIDER: RwLock<GlobalMeterProvider> = RwLock::new(GlobalMeterProvider::new(metrics::noop::NoopMeterProvider::new()));
7}
8
9#[derive(Debug, Clone)]
12pub struct GlobalMeterProvider {
13 provider: Arc<dyn MeterProvider + Send + Sync>,
14}
15
16impl MeterProvider for GlobalMeterProvider {
17 fn meter(&self, name: &'static str, version: Option<&'static str>) -> Meter {
18 self.provider.meter(name, version)
19 }
20}
21
22impl GlobalMeterProvider {
23 pub fn new<P>(provider: P) -> Self
25 where
26 P: MeterProvider + Send + Sync + 'static,
27 {
28 GlobalMeterProvider {
29 provider: Arc::new(provider),
30 }
31 }
32}
33
34pub fn set_meter_provider<P>(new_provider: P)
37where
38 P: metrics::MeterProvider + Send + Sync + 'static,
39{
40 let mut global_provider = GLOBAL_METER_PROVIDER
41 .write()
42 .expect("GLOBAL_METER_PROVIDER RwLock poisoned");
43 *global_provider = GlobalMeterProvider::new(new_provider);
44}
45
46pub fn meter_provider() -> GlobalMeterProvider {
49 GLOBAL_METER_PROVIDER
50 .read()
51 .expect("GLOBAL_METER_PROVIDER RwLock poisoned")
52 .clone()
53}
54
55pub fn meter(name: &'static str) -> Meter {
61 meter_provider().meter(name, None)
62}
63
64pub fn meter_with_version(name: &'static str, version: &'static str) -> Meter {
66 meter_provider().meter(name, Some(version))
67}