6 6 | //! Definitions of high level Telemetry Providers.
|
7 7 |
|
8 8 | use std::sync::Arc;
|
9 9 |
|
10 10 | use crate::{meter::ProvideMeter, noop::NoopMeterProvider};
|
11 11 |
|
12 12 | /// A struct to hold the various types of telemetry providers.
|
13 13 | #[non_exhaustive]
|
14 14 | pub struct TelemetryProvider {
|
15 15 | meter_provider: Arc<dyn ProvideMeter + Send + Sync>,
|
16 + | is_otel: bool,
|
16 17 | }
|
17 18 |
|
18 19 | impl TelemetryProvider {
|
19 20 | /// Returns a builder struct for [TelemetryProvider]
|
20 21 | pub fn builder() -> TelemetryProviderBuilder {
|
21 22 | TelemetryProviderBuilder {
|
22 23 | meter_provider: Arc::new(NoopMeterProvider),
|
24 + | is_otel: false,
|
23 25 | }
|
24 26 | }
|
25 27 |
|
26 28 | /// Returns a noop [TelemetryProvider]
|
27 29 | pub fn noop() -> TelemetryProvider {
|
28 30 | Self {
|
29 31 | meter_provider: Arc::new(NoopMeterProvider),
|
32 + | is_otel: false,
|
30 33 | }
|
31 34 | }
|
32 35 |
|
33 36 | /// Get the set [ProvideMeter]
|
34 37 | pub fn meter_provider(&self) -> &(dyn ProvideMeter + Send + Sync) {
|
35 38 | self.meter_provider.as_ref()
|
36 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 + | self.meter_provider
|
50 + | .as_any()
|
51 + | .downcast_ref::<NoopMeterProvider>()
|
52 + | .is_some()
|
53 + | }
|
37 54 | }
|
38 55 |
|
39 56 | // If we choose to expand our Telemetry provider and make Logging and Tracing
|
40 57 | // configurable at some point in the future we can do that by adding default
|
41 58 | // logger_provider and tracer_providers based on `tracing` to maintain backwards
|
42 59 | // compatibilty with what we have today.
|
43 60 | impl Default for TelemetryProvider {
|
44 61 | fn default() -> Self {
|
45 62 | Self {
|
46 63 | meter_provider: Arc::new(NoopMeterProvider),
|
64 + | is_otel: false,
|
47 65 | }
|
48 66 | }
|
49 67 | }
|
50 68 |
|
51 69 | /// A builder for [TelemetryProvider].
|
52 70 | #[non_exhaustive]
|
53 71 | pub struct TelemetryProviderBuilder {
|
54 72 | meter_provider: Arc<dyn ProvideMeter + Send + Sync>,
|
73 + | is_otel: bool,
|
55 74 | }
|
56 75 |
|
57 76 | impl TelemetryProviderBuilder {
|
58 77 | /// Set the [ProvideMeter].
|
59 78 | pub fn meter_provider(mut self, meter_provider: Arc<impl ProvideMeter + 'static>) -> Self {
|
60 79 | self.meter_provider = meter_provider;
|
61 80 | self
|
62 81 | }
|
63 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 + |
|
64 89 | /// Build the [TelemetryProvider].
|
65 90 | pub fn build(self) -> TelemetryProvider {
|
66 91 | TelemetryProvider {
|
67 92 | meter_provider: self.meter_provider,
|
93 + | is_otel: self.is_otel,
|
68 94 | }
|
69 95 | }
|
70 96 | }
|
71 97 |
|
72 98 | /// Wrapper type to hold a implementer of TelemetryProvider in an Arc so that
|
73 99 | /// it can be safely used across threads.
|
74 100 | #[non_exhaustive]
|
75 101 | pub(crate) struct GlobalTelemetryProvider {
|
76 102 | pub(crate) telemetry_provider: Arc<TelemetryProvider>,
|
77 103 | }
|