scuffle_bootstrap_telemetry/
opentelemetry.rs

1pub use ::opentelemetry::*;
2
3/// OpenTelemetry configuration.
4///
5/// This struct contains different OpenTelemetry providers for metrics, traces, and logs.
6/// If set, these providers will be used to collect and export telemetry data.
7#[derive(Debug, Default, Clone)]
8pub struct OpenTelemetry {
9    #[cfg(feature = "opentelemetry-metrics")]
10    #[cfg_attr(docsrs, doc(cfg(feature = "opentelemetry-metrics")))]
11    metrics: Option<opentelemetry_sdk::metrics::SdkMeterProvider>,
12    #[cfg(feature = "opentelemetry-traces")]
13    #[cfg_attr(docsrs, doc(cfg(feature = "opentelemetry-traces")))]
14    traces: Option<opentelemetry_sdk::trace::SdkTracerProvider>,
15    #[cfg(feature = "opentelemetry-logs")]
16    #[cfg_attr(docsrs, doc(cfg(feature = "opentelemetry-logs")))]
17    logs: Option<opentelemetry_sdk::logs::SdkLoggerProvider>,
18}
19
20impl OpenTelemetry {
21    /// Creates a new empty OpenTelemetry configuration.
22    pub fn new() -> Self {
23        Self::default()
24    }
25
26    /// Checks if any of the providers are enabled.
27    pub fn is_enabled(&self) -> bool {
28        #[cfg_attr(
29            not(any(
30                feature = "opentelemetry-metrics",
31                feature = "opentelemetry-traces",
32                feature = "opentelemetry-logs"
33            )),
34            allow(unused_mut)
35        )]
36        let mut enabled = false;
37        #[cfg(feature = "opentelemetry-metrics")]
38        {
39            enabled |= self.metrics.is_some();
40        }
41        #[cfg(feature = "opentelemetry-traces")]
42        {
43            enabled |= self.traces.is_some();
44        }
45        #[cfg(feature = "opentelemetry-logs")]
46        {
47            enabled |= self.logs.is_some();
48        }
49        enabled
50    }
51
52    /// Sets the metrics provider.
53    #[cfg(feature = "opentelemetry-metrics")]
54    #[cfg_attr(docsrs, doc(cfg(feature = "opentelemetry-metrics")))]
55    pub fn with_metrics(self, metrics: impl Into<Option<opentelemetry_sdk::metrics::SdkMeterProvider>>) -> Self {
56        Self {
57            metrics: metrics.into(),
58            #[cfg(feature = "opentelemetry-traces")]
59            traces: self.traces,
60            #[cfg(feature = "opentelemetry-logs")]
61            logs: self.logs,
62        }
63    }
64
65    /// Sets the traces provider.
66    #[cfg(feature = "opentelemetry-traces")]
67    #[cfg_attr(docsrs, doc(cfg(feature = "opentelemetry-traces")))]
68    pub fn with_traces(self, traces: impl Into<Option<opentelemetry_sdk::trace::SdkTracerProvider>>) -> Self {
69        Self {
70            traces: traces.into(),
71            #[cfg(feature = "opentelemetry-metrics")]
72            metrics: self.metrics,
73            #[cfg(feature = "opentelemetry-logs")]
74            logs: self.logs,
75        }
76    }
77
78    /// Sets the logs provider.
79    #[cfg(feature = "opentelemetry-logs")]
80    #[cfg_attr(docsrs, doc(cfg(feature = "opentelemetry-logs")))]
81    pub fn with_logs(self, logs: impl Into<Option<opentelemetry_sdk::logs::SdkLoggerProvider>>) -> Self {
82        Self {
83            logs: logs.into(),
84            #[cfg(feature = "opentelemetry-traces")]
85            traces: self.traces,
86            #[cfg(feature = "opentelemetry-metrics")]
87            metrics: self.metrics,
88        }
89    }
90
91    /// Flushes all metrics, traces, and logs.
92    ///
93    /// <div class="warning">Warning: This blocks the current thread.</div>
94    pub fn flush(&self) -> Result<(), opentelemetry_sdk::error::OTelSdkError> {
95        #[cfg(feature = "opentelemetry-metrics")]
96        if let Some(metrics) = &self.metrics {
97            metrics.force_flush()?;
98        }
99
100        #[cfg(feature = "opentelemetry-traces")]
101        if let Some(traces) = &self.traces {
102            traces.force_flush()?;
103        }
104
105        #[cfg(feature = "opentelemetry-logs")]
106        if let Some(logs) = &self.logs {
107            logs.force_flush()?;
108        }
109
110        Ok(())
111    }
112
113    /// Shuts down all metrics, traces, and logs.
114    pub fn shutdown(&self) -> Result<(), opentelemetry_sdk::error::OTelSdkError> {
115        #[cfg(feature = "opentelemetry-metrics")]
116        if let Some(metrics) = &self.metrics {
117            metrics.shutdown()?;
118        }
119
120        #[cfg(feature = "opentelemetry-traces")]
121        if let Some(traces) = &self.traces {
122            traces.shutdown()?;
123        }
124
125        #[cfg(feature = "opentelemetry-logs")]
126        if let Some(logs) = &self.logs {
127            logs.shutdown()?;
128        }
129
130        Ok(())
131    }
132}