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