aws_smithy_observability/
provider.rs

1/*
2 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3 * SPDX-License-Identifier: Apache-2.0
4 */
5
6//! Definitions of high level Telemetry Providers.
7
8use std::sync::Arc;
9
10use crate::{meter::ProvideMeter, noop::NoopMeterProvider};
11
12/// A struct to hold the various types of telemetry providers.
13#[non_exhaustive]
14pub struct TelemetryProvider {
15    meter_provider: Arc<dyn ProvideMeter + Send + Sync>,
16    is_otel: bool,
17}
18
19impl TelemetryProvider {
20    /// Returns a builder struct for [TelemetryProvider]
21    pub fn builder() -> TelemetryProviderBuilder {
22        TelemetryProviderBuilder {
23            meter_provider: Arc::new(NoopMeterProvider),
24            is_otel: false,
25        }
26    }
27
28    /// Returns a noop [TelemetryProvider]
29    pub fn noop() -> TelemetryProvider {
30        Self {
31            meter_provider: Arc::new(NoopMeterProvider),
32            is_otel: false,
33        }
34    }
35
36    /// Get the set [ProvideMeter]
37    pub fn meter_provider(&self) -> &(dyn ProvideMeter + Send + Sync) {
38        self.meter_provider.as_ref()
39    }
40
41    /// Returns true if this provider is using OpenTelemetry
42    pub fn is_otel(&self) -> bool {
43        self.is_otel
44    }
45
46    /// Returns true if this provider is a noop provider
47    pub fn is_noop(&self) -> bool {
48        // Check if the meter provider is the NoopMeterProvider by attempting to downcast
49        use std::any::Any;
50        (&*self.meter_provider as &dyn Any)
51            .downcast_ref::<NoopMeterProvider>()
52            .is_some()
53    }
54}
55
56// If we choose to expand our Telemetry provider and make Logging and Tracing
57// configurable at some point in the future we can do that by adding default
58// logger_provider and tracer_providers based on `tracing` to maintain backwards
59// compatibilty with what we have today.
60impl Default for TelemetryProvider {
61    fn default() -> Self {
62        Self {
63            meter_provider: Arc::new(NoopMeterProvider),
64            is_otel: false,
65        }
66    }
67}
68
69/// A builder for [TelemetryProvider].
70#[non_exhaustive]
71pub struct TelemetryProviderBuilder {
72    meter_provider: Arc<dyn ProvideMeter + Send + Sync>,
73    is_otel: bool,
74}
75
76impl TelemetryProviderBuilder {
77    /// Set the [ProvideMeter].
78    pub fn meter_provider(mut self, meter_provider: Arc<impl ProvideMeter + 'static>) -> Self {
79        self.meter_provider = meter_provider;
80        self
81    }
82
83    /// Mark this provider as using OpenTelemetry.
84    pub fn with_otel(mut self, is_otel: bool) -> Self {
85        self.is_otel = is_otel;
86        self
87    }
88
89    /// Build the [TelemetryProvider].
90    pub fn build(self) -> TelemetryProvider {
91        TelemetryProvider {
92            meter_provider: self.meter_provider,
93            is_otel: self.is_otel,
94        }
95    }
96}
97
98/// Wrapper type to hold a implementer of TelemetryProvider in an Arc so that
99/// it can be safely used across threads.
100#[non_exhaustive]
101pub(crate) struct GlobalTelemetryProvider {
102    pub(crate) telemetry_provider: Arc<TelemetryProvider>,
103}
104
105impl GlobalTelemetryProvider {
106    pub(crate) fn new(telemetry_provider: TelemetryProvider) -> Self {
107        Self {
108            telemetry_provider: Arc::new(telemetry_provider),
109        }
110    }
111
112    pub(crate) fn telemetry_provider(&self) -> &Arc<TelemetryProvider> {
113        &self.telemetry_provider
114    }
115}