Skip to content

Commit 9eaba05

Browse files
lalitbTommyCpputpilla
authored andcommitted
Improve internal opentelemetry logging (open-telemetry#2128)
Co-authored-by: Zhongyang Wu <[email protected]> Co-authored-by: Utkarsh Umesan Pillai <[email protected]>
1 parent b96ab43 commit 9eaba05

File tree

11 files changed

+258
-119
lines changed

11 files changed

+258
-119
lines changed

examples/self-diagnostics/Cargo.toml

Lines changed: 2 additions & 2 deletions
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", "experimental-internal-logs"]}
10+
opentelemetry_sdk = { path = "../../opentelemetry-sdk", features = ["rt-tokio"]}
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", "experimental-internal-logs"] }
17+
opentelemetry-otlp = { path = "../../opentelemetry-otlp", features = ["http-proto", "reqwest-client", "logs"] }
1818
once_cell ={ version = "1.19.0"}
1919
ctrlc = "3.4"

opentelemetry-appender-tracing/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ tracing-subscriber = { workspace = true, features = ["registry", "std"] }
2222
log = { workspace = true }
2323
opentelemetry-stdout = { path = "../opentelemetry-stdout", features = ["logs"] }
2424
opentelemetry_sdk = { path = "../opentelemetry-sdk", features = ["logs", "testing"] }
25+
tracing-subscriber = { workspace = true, features = ["registry", "std", "env-filter"] }
2526
tracing-log = "0.2"
2627
async-trait = { workspace = true }
2728
criterion = { workspace = true }

opentelemetry-appender-tracing/src/layer.rs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -217,14 +217,26 @@ mod tests {
217217
use opentelemetry_sdk::trace;
218218
use opentelemetry_sdk::trace::{Sampler, TracerProvider};
219219
use tracing::error;
220-
use tracing_subscriber::layer::SubscriberExt;
220+
use tracing_subscriber::prelude::__tracing_subscriber_SubscriberExt;
221+
use tracing_subscriber::Layer;
221222

222223
pub fn attributes_contains(log_record: &LogRecord, key: &Key, value: &AnyValue) -> bool {
223224
log_record
224225
.attributes_iter()
225226
.any(|(k, v)| k == key && v == value)
226227
}
227228

229+
fn create_tracing_subscriber(
230+
_exporter: InMemoryLogsExporter,
231+
logger_provider: &LoggerProvider,
232+
) -> impl tracing::Subscriber {
233+
let level_filter = tracing_subscriber::filter::LevelFilter::WARN; // Capture WARN and ERROR levels
234+
let layer =
235+
layer::OpenTelemetryTracingBridge::new(logger_provider).with_filter(level_filter); // No filter based on target, only based on log level
236+
237+
tracing_subscriber::registry().with(layer)
238+
}
239+
228240
// cargo test --features=testing
229241
#[test]
230242
fn tracing_appender_standalone() {
@@ -234,8 +246,7 @@ mod tests {
234246
.with_simple_exporter(exporter.clone())
235247
.build();
236248

237-
let layer = layer::OpenTelemetryTracingBridge::new(&logger_provider);
238-
let subscriber = tracing_subscriber::registry().with(layer);
249+
let subscriber = create_tracing_subscriber(exporter.clone(), &logger_provider);
239250

240251
// avoiding setting tracing subscriber as global as that does not
241252
// play well with unit tests.
@@ -315,8 +326,7 @@ mod tests {
315326
.with_simple_exporter(exporter.clone())
316327
.build();
317328

318-
let layer = layer::OpenTelemetryTracingBridge::new(&logger_provider);
319-
let subscriber = tracing_subscriber::registry().with(layer);
329+
let subscriber = create_tracing_subscriber(exporter.clone(), &logger_provider);
320330

321331
// avoiding setting tracing subscriber as global as that does not
322332
// play well with unit tests.
@@ -427,16 +437,15 @@ mod tests {
427437
.with_simple_exporter(exporter.clone())
428438
.build();
429439

430-
let layer = layer::OpenTelemetryTracingBridge::new(&logger_provider);
431-
let subscriber = tracing_subscriber::registry().with(layer);
440+
let subscriber = create_tracing_subscriber(exporter.clone(), &logger_provider);
432441

433442
// avoiding setting tracing subscriber as global as that does not
434443
// play well with unit tests.
435444
let _guard = tracing::subscriber::set_default(subscriber);
436445
drop(tracing_log::LogTracer::init());
437446

438447
// Act
439-
log::error!("log from log crate");
448+
log::error!(target: "my-system", "log from log crate");
440449
logger_provider.force_flush();
441450

442451
// Assert TODO: move to helper methods
@@ -493,8 +502,7 @@ mod tests {
493502
.with_simple_exporter(exporter.clone())
494503
.build();
495504

496-
let layer = layer::OpenTelemetryTracingBridge::new(&logger_provider);
497-
let subscriber = tracing_subscriber::registry().with(layer);
505+
let subscriber = create_tracing_subscriber(exporter.clone(), &logger_provider);
498506

499507
// avoiding setting tracing subscriber as global as that does not
500508
// play well with unit tests.
@@ -513,7 +521,7 @@ mod tests {
513521
let span_id = cx.span().span_context().span_id();
514522

515523
// logging is done inside span context.
516-
log::error!("log from log crate");
524+
log::error!(target: "my-system", "log from log crate");
517525
(trace_id, span_id)
518526
});
519527

opentelemetry-otlp/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,12 @@ trace = ["opentelemetry/trace", "opentelemetry_sdk/trace", "opentelemetry-proto/
5858
metrics = ["opentelemetry/metrics", "opentelemetry_sdk/metrics", "opentelemetry-proto/metrics"]
5959
logs = ["opentelemetry/logs", "opentelemetry_sdk/logs", "opentelemetry-proto/logs"]
6060
populate-logs-event-name = ["opentelemetry-proto/populate-logs-event-name"]
61-
experimental-internal-logs = ["tracing"]
61+
internal-logs = ["tracing"]
6262

6363
# add ons
6464
serialize = ["serde", "serde_json"]
6565

66-
default = ["grpc-tonic", "trace", "metrics", "logs"]
66+
default = ["grpc-tonic", "trace", "metrics", "logs", "internal-logs"]
6767

6868
# grpc using tonic
6969
grpc-tonic = ["tonic", "prost", "http", "tokio", "opentelemetry-proto/gen-tonic"]

opentelemetry-sdk/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ temp-env = { workspace = true }
4242
pprof = { version = "0.13", features = ["flamegraph", "criterion"] }
4343

4444
[features]
45-
default = ["trace", "metrics", "logs"]
45+
default = ["trace", "metrics", "logs", "internal-logs"]
4646
trace = ["opentelemetry/trace", "rand", "async-trait", "percent-encoding"]
4747
jaeger_remote_sampler = ["trace", "opentelemetry-http", "http", "serde", "serde_json", "url"]
4848
logs = ["opentelemetry/logs", "async-trait", "serde_json"]
@@ -52,7 +52,7 @@ testing = ["opentelemetry/testing", "trace", "metrics", "logs", "rt-async-std",
5252
rt-tokio = ["tokio", "tokio-stream"]
5353
rt-tokio-current-thread = ["tokio", "tokio-stream"]
5454
rt-async-std = ["async-std"]
55-
experimental-internal-logs = ["tracing"]
55+
internal-logs = ["tracing"]
5656

5757
[[bench]]
5858
name = "context"

opentelemetry-sdk/src/logs/log_emitter.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use super::{BatchLogProcessor, LogProcessor, LogRecord, SimpleLogProcessor, TraceContext};
22
use crate::{export::logs::LogExporter, runtime::RuntimeChannel, Resource};
3+
use opentelemetry::otel_warn;
34
use opentelemetry::{
45
global,
56
logs::{LogError, LogResult},
@@ -49,7 +50,6 @@ impl opentelemetry::logs::LoggerProvider for LoggerProvider {
4950
attributes: Option<Vec<opentelemetry::KeyValue>>,
5051
) -> Logger {
5152
let name = name.into();
52-
5353
let component_name = if name.is_empty() {
5454
Cow::Borrowed(DEFAULT_COMPONENT_NAME)
5555
} else {
@@ -114,6 +114,10 @@ impl LoggerProvider {
114114
let mut errs = vec![];
115115
for processor in &self.inner.processors {
116116
if let Err(err) = processor.shutdown() {
117+
otel_warn!(
118+
name: "logger_provider_shutdown_error",
119+
error = format!("{:?}", err)
120+
);
117121
errs.push(err);
118122
}
119123
}
@@ -124,6 +128,9 @@ impl LoggerProvider {
124128
Err(LogError::Other(format!("{errs:?}").into()))
125129
}
126130
} else {
131+
otel_warn!(
132+
name: "logger_provider_already_shutdown"
133+
);
127134
Err(LogError::Other("logger provider already shut down".into()))
128135
}
129136
}

opentelemetry-sdk/src/logs/log_processor.rs

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ use opentelemetry::logs::Severity;
1414
use opentelemetry::{
1515
global,
1616
logs::{LogError, LogResult},
17-
InstrumentationLibrary,
17+
otel_error, otel_warn, InstrumentationLibrary,
1818
};
19+
1920
use std::sync::atomic::AtomicBool;
2021
use std::{cmp::min, env, sync::Mutex};
2122
use std::{
@@ -98,16 +99,12 @@ impl LogProcessor for SimpleLogProcessor {
9899
fn emit(&self, record: &mut LogRecord, instrumentation: &InstrumentationLibrary) {
99100
// noop after shutdown
100101
if self.is_shutdown.load(std::sync::atomic::Ordering::Relaxed) {
102+
otel_warn!(
103+
name: "simple_log_processor_emit_after_shutdown"
104+
);
101105
return;
102106
}
103107

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-
111108
let result = self
112109
.exporter
113110
.lock()
@@ -117,6 +114,10 @@ impl LogProcessor for SimpleLogProcessor {
117114
futures_executor::block_on(exporter.export(LogBatch::new(log_tuple)))
118115
});
119116
if let Err(err) = result {
117+
otel_error!(
118+
name: "simple_log_processor_emit_error",
119+
error = format!("{:?}", err)
120+
);
120121
global::handle_error(err);
121122
}
122123
}
@@ -132,6 +133,9 @@ impl LogProcessor for SimpleLogProcessor {
132133
exporter.shutdown();
133134
Ok(())
134135
} else {
136+
otel_error!(
137+
name: "simple_log_processor_shutdown_error"
138+
);
135139
Err(LogError::Other(
136140
"simple logprocessor mutex poison during shutdown".into(),
137141
))
@@ -167,6 +171,10 @@ impl<R: RuntimeChannel> LogProcessor for BatchLogProcessor<R> {
167171
)));
168172

169173
if let Err(err) = result {
174+
otel_error!(
175+
name: "batch_log_processor_emit_error",
176+
error = format!("{:?}", err)
177+
);
170178
global::handle_error(LogError::Other(err.into()));
171179
}
172180
}
@@ -224,13 +232,6 @@ impl<R: RuntimeChannel> BatchLogProcessor<R> {
224232
// Log has finished, add to buffer of pending logs.
225233
BatchMessage::ExportLog(log) => {
226234
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-
);
233-
234235
if logs.len() == config.max_export_batch_size {
235236
let result = export_with_timeout(
236237
config.max_export_timeout,
@@ -241,6 +242,10 @@ impl<R: RuntimeChannel> BatchLogProcessor<R> {
241242
.await;
242243

243244
if let Err(err) = result {
245+
otel_error!(
246+
name: "batch_log_processor_export_error",
247+
error = format!("{:?}", err)
248+
);
244249
global::handle_error(err);
245250
}
246251
}
@@ -261,8 +266,18 @@ impl<R: RuntimeChannel> BatchLogProcessor<R> {
261266
"failed to send flush result: {:?}",
262267
result
263268
)));
269+
otel_error!(
270+
name: "batch_log_processor_flush_error",
271+
error = format!("{:?}", result),
272+
message = "Failed to send flush result"
273+
);
264274
}
265275
} else if let Err(err) = result {
276+
otel_error!(
277+
name: "batch_log_processor_flush_error",
278+
error = format!("{:?}", err),
279+
message = "Flush failed"
280+
);
266281
global::handle_error(err);
267282
}
268283
}
@@ -279,6 +294,11 @@ impl<R: RuntimeChannel> BatchLogProcessor<R> {
279294
exporter.shutdown();
280295

281296
if let Err(result) = ch.send(result) {
297+
otel_error!(
298+
name: "batch_log_processor_shutdown_error",
299+
error = format!("{:?}", result),
300+
message = "Failed to send shutdown result"
301+
);
282302
global::handle_error(LogError::from(format!(
283303
"failed to send batch processor shutdown result: {:?}",
284304
result
@@ -295,7 +315,6 @@ impl<R: RuntimeChannel> BatchLogProcessor<R> {
295315
}
296316
}
297317
}));
298-
299318
// Return batch processor with link to worker
300319
BatchLogProcessor { message_sender }
301320
}
@@ -338,7 +357,13 @@ where
338357
pin_mut!(timeout);
339358
match future::select(export, timeout).await {
340359
Either::Left((export_res, _)) => export_res,
341-
Either::Right((_, _)) => ExportResult::Err(LogError::ExportTimedOut(time_out)),
360+
Either::Right((_, _)) => {
361+
otel_error!(
362+
name: "export_with_timeout_timeout",
363+
timeout_duration = time_out.as_millis()
364+
);
365+
ExportResult::Err(LogError::ExportTimedOut(time_out))
366+
}
342367
}
343368
}
344369

opentelemetry-sdk/src/metrics/internal/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub(crate) use aggregate::{AggregateBuilder, ComputeAggregation, Measure};
1717
pub(crate) use exponential_histogram::{EXPO_MAX_SCALE, EXPO_MIN_SCALE};
1818
use once_cell::sync::Lazy;
1919
use opentelemetry::metrics::MetricsError;
20-
use opentelemetry::{global, KeyValue};
20+
use opentelemetry::{global, otel_warn, KeyValue};
2121

2222
use crate::metrics::AttributeSet;
2323

@@ -147,6 +147,9 @@ impl<AU: AtomicallyUpdate<T>, T: Number, O: Operation> ValueMap<AU, T, O> {
147147
O::update_tracker(&new_tracker, measurement, index);
148148
trackers.insert(STREAM_OVERFLOW_ATTRIBUTES.clone(), Arc::new(new_tracker));
149149
global::handle_error(MetricsError::Other("Warning: Maximum data points for metric stream exceeded. Entry added to overflow. Subsequent overflows to same metric until next collect will not be logged.".into()));
150+
otel_warn!( name: "ValueMap.measure",
151+
message = "Maximum data points for metric stream exceeded. Entry added to overflow. Subsequent overflows to same metric until next collect will not be logged."
152+
);
150153
}
151154
}
152155
}

0 commit comments

Comments
 (0)