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