Skip to content

Commit 81a95e3

Browse files
lalitbcijothomas
andauthored
Improve internal opentelemetry logging - directly using tracing mcros (#2152)
Co-authored-by: Cijo Thomas <cithomas@microsoft.com>
1 parent 8bdd189 commit 81a95e3

File tree

7 files changed

+99
-10
lines changed

7 files changed

+99
-10
lines changed

examples/self-diagnostics/Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ publish = false
77

88
[dependencies]
99
opentelemetry = { path = "../../opentelemetry" }
10-
opentelemetry_sdk = { path = "../../opentelemetry-sdk", features = ["rt-tokio"]}
10+
opentelemetry_sdk = { path = "../../opentelemetry-sdk", features = ["rt-tokio", "experimental-internal-logs"]}
1111
opentelemetry-stdout = { path = "../../opentelemetry-stdout"}
1212
opentelemetry-appender-tracing = { path = "../../opentelemetry-appender-tracing"}
1313
tokio = { workspace = true, features = ["full"] }
1414
tracing = { workspace = true, features = ["std"]}
1515
tracing-core = { workspace = true }
1616
tracing-subscriber = { version = "0.3.18", features = ["env-filter","registry", "std"]}
17-
opentelemetry-otlp = { path = "../../opentelemetry-otlp", features = ["http-proto", "reqwest-client", "logs"] }
17+
opentelemetry-otlp = { path = "../../opentelemetry-otlp", features = ["http-proto", "reqwest-client", "logs", "experimental-internal-logs"] }
1818
once_cell ={ version = "1.19.0"}
1919
ctrlc = "3.4"

examples/self-diagnostics/src/main.rs

+30-5
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ use opentelemetry::global::{self, set_error_handler, Error as OtelError};
22
use opentelemetry::KeyValue;
33
use opentelemetry_appender_tracing::layer;
44
use opentelemetry_otlp::WithExportConfig;
5+
use tracing_subscriber::filter::{EnvFilter, LevelFilter};
6+
use tracing_subscriber::fmt;
57
use tracing_subscriber::prelude::*;
6-
use tracing_subscriber::EnvFilter;
78

89
use std::error::Error;
910
use tracing::error;
@@ -59,6 +60,7 @@ fn init_logger_provider() -> opentelemetry_sdk::logs::LoggerProvider {
5960
)
6061
.install_batch(opentelemetry_sdk::runtime::Tokio)
6162
.unwrap();
63+
let cloned_provider = provider.clone();
6264

6365
// Add a tracing filter to filter events from crates used by opentelemetry-otlp.
6466
// The filter levels are set as follows:
@@ -72,11 +74,34 @@ fn init_logger_provider() -> opentelemetry_sdk::logs::LoggerProvider {
7274
.add_directive("hyper=error".parse().unwrap())
7375
.add_directive("tonic=error".parse().unwrap())
7476
.add_directive("reqwest=error".parse().unwrap());
75-
let cloned_provider = provider.clone();
76-
let layer = layer::OpenTelemetryTracingBridge::new(&cloned_provider);
77+
78+
// Configuring the formatting layer specifically for OpenTelemetry internal logs.
79+
// These logs starts with "opentelemetry" prefix in target. This allows specific logs
80+
// from the OpenTelemetry-related components to be filtered and handled separately
81+
// from the application logs
82+
83+
let opentelemetry_filter = tracing_subscriber::filter::filter_fn(|metadata| {
84+
metadata.target().starts_with("opentelemetry")
85+
});
86+
87+
let fmt_opentelemetry_layer = fmt::layer()
88+
.with_filter(LevelFilter::DEBUG)
89+
.with_filter(opentelemetry_filter);
90+
91+
// Configures the appender tracing layer, filtering out OpenTelemetry internal logs
92+
// to prevent infinite logging loops.
93+
94+
let non_opentelemetry_filter = tracing_subscriber::filter::filter_fn(|metadata| {
95+
!metadata.target().starts_with("opentelemetry")
96+
});
97+
98+
let otel_layer = layer::OpenTelemetryTracingBridge::new(&cloned_provider)
99+
.with_filter(non_opentelemetry_filter.clone());
100+
77101
tracing_subscriber::registry()
78-
.with(filter)
79-
.with(layer)
102+
.with(fmt_opentelemetry_layer)
103+
.with(fmt::layer().with_filter(filter))
104+
.with(otel_layer)
80105
.init();
81106
provider
82107
}

opentelemetry-otlp/Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ opentelemetry = { version = "0.25", default-features = false, path = "../opentel
3232
opentelemetry_sdk = { version = "0.25", default-features = false, path = "../opentelemetry-sdk" }
3333
opentelemetry-http = { version = "0.25", path = "../opentelemetry-http", optional = true }
3434
opentelemetry-proto = { version = "0.25", path = "../opentelemetry-proto", default-features = false }
35+
tracing = {workspace = true, optional = true}
3536

3637
prost = { workspace = true, optional = true }
3738
tonic = { workspace = true, optional = true }
@@ -57,6 +58,7 @@ trace = ["opentelemetry/trace", "opentelemetry_sdk/trace", "opentelemetry-proto/
5758
metrics = ["opentelemetry/metrics", "opentelemetry_sdk/metrics", "opentelemetry-proto/metrics"]
5859
logs = ["opentelemetry/logs", "opentelemetry_sdk/logs", "opentelemetry-proto/logs"]
5960
populate-logs-event-name = ["opentelemetry-proto/populate-logs-event-name"]
61+
experimental-internal-logs = ["tracing"]
6062

6163
# add ons
6264
serialize = ["serde", "serde_json"]

opentelemetry-otlp/src/metric.rs

+23-1
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,29 @@ impl TemporalitySelector for MetricsExporter {
294294
#[async_trait]
295295
impl PushMetricsExporter for MetricsExporter {
296296
async fn export(&self, metrics: &mut ResourceMetrics) -> Result<()> {
297-
self.client.export(metrics).await
297+
#[cfg(feature = "experimental-internal-logs")]
298+
tracing::debug!(
299+
name = "export_metrics",
300+
target = "opentelemetry-otlp",
301+
metrics_count = metrics
302+
.scope_metrics
303+
.iter()
304+
.map(|scope| scope.metrics.len())
305+
.sum::<usize>(),
306+
status = "started"
307+
);
308+
let result = self.client.export(metrics).await;
309+
#[cfg(feature = "experimental-internal-logs")]
310+
tracing::debug!(
311+
name = "export_metrics",
312+
target = "opentelemetry-otlp",
313+
status = if result.is_ok() {
314+
"completed"
315+
} else {
316+
"failed"
317+
}
318+
);
319+
result
298320
}
299321

300322
async fn force_flush(&self) -> Result<()> {

opentelemetry-sdk/Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ url = { workspace = true, optional = true }
2828
tokio = { workspace = true, features = ["rt", "time"], optional = true }
2929
tokio-stream = { workspace = true, optional = true }
3030
http = { workspace = true, optional = true }
31+
tracing = {workspace = true, optional = true}
3132

3233
[package.metadata.docs.rs]
3334
all-features = true
@@ -51,6 +52,7 @@ testing = ["opentelemetry/testing", "trace", "metrics", "logs", "rt-async-std",
5152
rt-tokio = ["tokio", "tokio-stream"]
5253
rt-tokio-current-thread = ["tokio", "tokio-stream"]
5354
rt-async-std = ["async-std"]
55+
experimental-internal-logs = ["tracing"]
5456

5557
[[bench]]
5658
name = "context"

opentelemetry-sdk/src/logs/log_processor.rs

+13
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,13 @@ impl LogProcessor for SimpleLogProcessor {
101101
return;
102102
}
103103

104+
#[cfg(feature = "experimental-internal-logs")]
105+
tracing::debug!(
106+
name: "simple_log_processor_emit",
107+
target: "opentelemetry-sdk",
108+
event_name = record.event_name
109+
);
110+
104111
let result = self
105112
.exporter
106113
.lock()
@@ -217,6 +224,12 @@ impl<R: RuntimeChannel> BatchLogProcessor<R> {
217224
// Log has finished, add to buffer of pending logs.
218225
BatchMessage::ExportLog(log) => {
219226
logs.push(log);
227+
#[cfg(feature = "experimental-internal-logs")]
228+
tracing::debug!(
229+
name: "batch_log_processor_record_count",
230+
target: "opentelemetry-sdk",
231+
current_batch_size = logs.len()
232+
);
220233

221234
if logs.len() == config.max_export_batch_size {
222235
let result = export_with_timeout(

opentelemetry-sdk/src/metrics/periodic_reader.rs

+27-2
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,8 @@ struct PeriodicReaderWorker<RT: Runtime> {
234234

235235
impl<RT: Runtime> PeriodicReaderWorker<RT> {
236236
async fn collect_and_export(&mut self) -> Result<()> {
237+
#[cfg(feature = "experimental-internal-logs")]
238+
tracing::debug!(name: "metrics_collect_and_export", target: "opentelemetry-sdk", status = "started");
237239
self.reader.collect(&mut self.rm)?;
238240
if self.rm.scope_metrics.is_empty() {
239241
// No metrics to export.
@@ -246,25 +248,48 @@ impl<RT: Runtime> PeriodicReaderWorker<RT> {
246248
pin_mut!(timeout);
247249

248250
match future::select(export, timeout).await {
249-
Either::Left((res, _)) => res, // return the status of export.
250-
Either::Right(_) => Err(MetricsError::Other("export timed out".into())),
251+
Either::Left((res, _)) => {
252+
#[cfg(feature = "experimental-internal-logs")]
253+
tracing::debug!(
254+
name: "collect_and_export",
255+
target: "opentelemetry-sdk",
256+
status = "completed",
257+
result = ?res
258+
);
259+
res // return the status of export.
260+
}
261+
Either::Right(_) => {
262+
#[cfg(feature = "experimental-internal-logs")]
263+
tracing::error!(
264+
name = "collect_and_export",
265+
target = "opentelemetry-sdk",
266+
status = "timed_out"
267+
);
268+
Err(MetricsError::Other("export timed out".into()))
269+
}
251270
}
252271
}
253272

254273
async fn process_message(&mut self, message: Message) -> bool {
255274
match message {
256275
Message::Export => {
276+
#[cfg(feature = "experimental-internal-logs")]
277+
tracing::debug!(name: "process_message", target: "opentelemetry-sdk", message_type = "export");
257278
if let Err(err) = self.collect_and_export().await {
258279
global::handle_error(err)
259280
}
260281
}
261282
Message::Flush(ch) => {
283+
#[cfg(feature = "experimental-internal-logs")]
284+
tracing::debug!(name: "process_message", target: "opentelemetry-sdk", message_type = "flush");
262285
let res = self.collect_and_export().await;
263286
if ch.send(res).is_err() {
264287
global::handle_error(MetricsError::Other("flush channel closed".into()))
265288
}
266289
}
267290
Message::Shutdown(ch) => {
291+
#[cfg(feature = "experimental-internal-logs")]
292+
tracing::debug!(name: "process_message", target: "opentelemetry-sdk", message_type = "shutdown");
268293
let res = self.collect_and_export().await;
269294
let _ = self.reader.exporter.shutdown();
270295
if ch.send(res).is_err() {

0 commit comments

Comments
 (0)