scuffle_bootstrap_telemetry/
opentelemetry.rs

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