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