scuffle_bootstrap_telemetry/
opentelemetry.rs1pub use ::opentelemetry::*;
2
3#[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 pub fn new() -> Self {
23 Self::default()
24 }
25
26 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 #[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 #[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 #[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 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 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}