opentelemetry_spanprocessor_any/global/
metrics.rs

1use crate::metrics::{self, Meter, MeterProvider};
2use std::sync::{Arc, RwLock};
3
4lazy_static::lazy_static! {
5    /// The global `Meter` provider singleton.
6    static ref GLOBAL_METER_PROVIDER: RwLock<GlobalMeterProvider> = RwLock::new(GlobalMeterProvider::new(metrics::noop::NoopMeterProvider::new()));
7}
8
9/// Represents the globally configured [`MeterProvider`] instance for this
10/// application.
11#[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    /// Create a new global meter provider
24    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
34/// Sets the given [`MeterProvider`] instance as the current global meter
35/// provider.
36pub 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
46/// Returns an instance of the currently configured global [`MeterProvider`]
47/// through [`GlobalMeterProvider`].
48pub fn meter_provider() -> GlobalMeterProvider {
49    GLOBAL_METER_PROVIDER
50        .read()
51        .expect("GLOBAL_METER_PROVIDER RwLock poisoned")
52        .clone()
53}
54
55/// Creates a named [`Meter`] via the configured [`GlobalMeterProvider`].
56///
57/// If the name is an empty string, the provider will use a default name.
58///
59/// This is a more convenient way of expressing `global::meter_provider().meter(name)`.
60pub fn meter(name: &'static str) -> Meter {
61    meter_provider().meter(name, None)
62}
63
64/// Creates a [`Meter`] with the name and version.
65pub fn meter_with_version(name: &'static str, version: &'static str) -> Meter {
66    meter_provider().meter(name, Some(version))
67}