Skip to content

Commit 1cecaea

Browse files
authored
Add few internal logs for Metrics sdks (#2350)
1 parent 91370d2 commit 1cecaea

File tree

4 files changed

+50
-12
lines changed

4 files changed

+50
-12
lines changed

examples/self-diagnostics/src/main.rs

+13-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use opentelemetry::global;
22
use opentelemetry::KeyValue;
33
use opentelemetry_sdk::metrics::PeriodicReader;
4+
use opentelemetry_sdk::Resource;
45
use std::error::Error;
56
use tracing::info;
67
use tracing_subscriber::fmt;
@@ -13,6 +14,10 @@ fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider {
1314
let reader = PeriodicReader::builder(exporter, opentelemetry_sdk::runtime::Tokio).build();
1415

1516
let provider = opentelemetry_sdk::metrics::SdkMeterProvider::builder()
17+
.with_resource(Resource::new([KeyValue::new(
18+
"service.name",
19+
"self-diagnostics-example",
20+
)]))
1621
.with_reader(reader)
1722
.build();
1823

@@ -26,7 +31,7 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
2631
// OpenTelemetry uses `tracing` crate for its internal logging. Unless a
2732
// tracing subscriber is set, the logs will be discarded. In this example,
2833
// we configure a `tracing` subscriber to:
29-
// 1. Print logs of level INFO or higher to stdout using tracing's fmt layer.
34+
// 1. Print logs of level DEBUG or higher to stdout using tracing's fmt layer.
3035
// 2. Filter logs from OpenTelemetry's dependencies (like tonic, hyper,
3136
// reqwest etc. which are commonly used by the OTLP exporter) to only print
3237
// ERROR-level logs. This filtering helps reduce repetitive log messages
@@ -39,7 +44,7 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
3944
// Hence, one may use "add_directive("opentelemetry=off".parse().unwrap())"
4045
// to turn off all logs from OpenTelemetry.
4146

42-
let filter = EnvFilter::new("info")
47+
let filter = EnvFilter::new("debug")
4348
.add_directive("hyper=error".parse().unwrap())
4449
.add_directive("tonic=error".parse().unwrap())
4550
.add_directive("h2=error".parse().unwrap())
@@ -54,11 +59,14 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
5459
info!("Starting self-diagnostics example");
5560

5661
let meter = global::meter("example");
57-
// Create a counter using an invalid name to trigger
58-
// internal log about the same.
59-
let counter = meter.u64_counter("my_counter with_space").build();
62+
let counter = meter.u64_counter("my_counter").build();
6063
counter.add(10, &[KeyValue::new("key", "value")]);
6164

65+
let _observable_counter = meter
66+
.u64_observable_counter("my_observable_counter")
67+
.with_callback(|observer| observer.observe(10, &[KeyValue::new("key", "value")]))
68+
.build();
69+
6270
meter_provider.shutdown()?;
6371
info!("Shutdown complete. Bye!");
6472
Ok(())

opentelemetry-sdk/src/metrics/meter_provider.rs

+28-7
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,10 @@ impl MeterProvider for SdkMeterProvider {
174174

175175
fn meter_with_scope(&self, scope: InstrumentationScope) -> Meter {
176176
if self.inner.is_shutdown.load(Ordering::Relaxed) {
177+
otel_debug!(
178+
name: "MeterProvider.NoOpMeterReturned",
179+
meter_name = scope.name(),
180+
);
177181
return Meter::new(Arc::new(NoopMeter::new()));
178182
}
179183

@@ -182,14 +186,26 @@ impl MeterProvider for SdkMeterProvider {
182186
};
183187

184188
if let Ok(mut meters) = self.inner.meters.lock() {
185-
let meter = meters
186-
.entry(scope)
187-
.or_insert_with_key(|scope| {
188-
Arc::new(SdkMeter::new(scope.clone(), self.inner.pipes.clone()))
189-
})
190-
.clone();
191-
Meter::new(meter)
189+
if let Some(existing_meter) = meters.get(&scope) {
190+
otel_debug!(
191+
name: "MeterProvider.ExistingMeterReturned",
192+
meter_name = scope.name(),
193+
);
194+
Meter::new(existing_meter.clone())
195+
} else {
196+
let new_meter = Arc::new(SdkMeter::new(scope.clone(), self.inner.pipes.clone()));
197+
meters.insert(scope.clone(), new_meter.clone());
198+
otel_debug!(
199+
name: "MeterProvider.NewMeterCreated",
200+
meter_name = scope.name(),
201+
);
202+
Meter::new(new_meter)
203+
}
192204
} else {
205+
otel_debug!(
206+
name: "MeterProvider.NoOpMeterReturned",
207+
meter_name = scope.name(),
208+
);
193209
Meter::new(Arc::new(NoopMeter::new()))
194210
}
195211
}
@@ -242,6 +258,11 @@ impl MeterProviderBuilder {
242258
/// Construct a new [MeterProvider] with this configuration.
243259
244260
pub fn build(self) -> SdkMeterProvider {
261+
otel_debug!(
262+
name: "MeterProvider.Building",
263+
builder = format!("{:?}", &self),
264+
);
265+
245266
let meter_provider = SdkMeterProvider {
246267
inner: Arc::new(SdkMeterProviderInner {
247268
pipes: Arc::new(Pipelines::new(

opentelemetry-sdk/src/metrics/periodic_reader.rs

+1
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ where
132132
name: "PeriodicReader.BuildCompleted",
133133
message = "Periodic reader built.",
134134
interval_in_secs = self.interval.as_secs(),
135+
temporality = format!("{:?}", self.exporter.temporality()),
135136
);
136137

137138
PeriodicReader {

opentelemetry-sdk/src/metrics/pipeline.rs

+8
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ impl Pipeline {
7272
/// unique values.
7373
fn add_sync(&self, scope: InstrumentationScope, i_sync: InstrumentSync) {
7474
let _ = self.inner.lock().map(|mut inner| {
75+
otel_debug!(
76+
name : "InstrumentCreated",
77+
instrument_name = i_sync.name.as_ref(),
78+
);
7579
inner.aggregations.entry(scope).or_default().push(i_sync);
7680
});
7781
}
@@ -99,6 +103,10 @@ impl SdkProducer for Pipeline {
99103
/// Returns aggregated metrics from a single collection.
100104
fn produce(&self, rm: &mut ResourceMetrics) -> MetricResult<()> {
101105
let inner = self.inner.lock()?;
106+
otel_debug!(
107+
name: "MeterProviderInvokingObservableCallbacks",
108+
count = inner.callbacks.len(),
109+
);
102110
for cb in &inner.callbacks {
103111
// TODO consider parallel callbacks.
104112
cb();

0 commit comments

Comments
 (0)