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}
17
18impl TelemetryProvider {
19    /// Returns a builder struct for [TelemetryProvider]
20    pub fn builder() -> TelemetryProviderBuilder {
21        TelemetryProviderBuilder {
22            meter_provider: Arc::new(NoopMeterProvider),
23        }
24    }
25
26    /// Returns a noop [TelemetryProvider]
27    pub fn noop() -> TelemetryProvider {
28        Self {
29            meter_provider: Arc::new(NoopMeterProvider),
30        }
31    }
32
33    /// Get the set [ProvideMeter]
34    pub fn meter_provider(&self) -> &(dyn ProvideMeter + Send + Sync) {
35        self.meter_provider.as_ref()
36    }
37}
38
39// If we choose to expand our Telemetry provider and make Logging and Tracing
40// configurable at some point in the future we can do that by adding default
41// logger_provider and tracer_providers based on `tracing` to maintain backwards
42// compatibilty with what we have today.
43impl Default for TelemetryProvider {
44    fn default() -> Self {
45        Self {
46            meter_provider: Arc::new(NoopMeterProvider),
47        }
48    }
49}
50
51/// A builder for [TelemetryProvider].
52#[non_exhaustive]
53pub struct TelemetryProviderBuilder {
54    meter_provider: Arc<dyn ProvideMeter + Send + Sync>,
55}
56
57impl TelemetryProviderBuilder {
58    /// Set the [ProvideMeter].
59    pub fn meter_provider(mut self, meter_provider: Arc<impl ProvideMeter + 'static>) -> Self {
60        self.meter_provider = meter_provider;
61        self
62    }
63
64    /// Build the [TelemetryProvider].
65    pub fn build(self) -> TelemetryProvider {
66        TelemetryProvider {
67            meter_provider: self.meter_provider,
68        }
69    }
70}
71
72/// Wrapper type to hold a implementer of TelemetryProvider in an Arc so that
73/// it can be safely used across threads.
74#[non_exhaustive]
75pub(crate) struct GlobalTelemetryProvider {
76    pub(crate) telemetry_provider: Arc<TelemetryProvider>,
77}
78
79impl GlobalTelemetryProvider {
80    pub(crate) fn new(telemetry_provider: TelemetryProvider) -> Self {
81        Self {
82            telemetry_provider: Arc::new(telemetry_provider),
83        }
84    }
85
86    pub(crate) fn telemetry_provider(&self) -> &Arc<TelemetryProvider> {
87        &self.telemetry_provider
88    }
89}