Skip to content

Commit 1471d7b

Browse files
authored
Merge branch 'main' into otel-sdk-remove-oncecell
2 parents fbf75b5 + 1cecaea commit 1471d7b

File tree

10 files changed

+103
-39
lines changed

10 files changed

+103
-39
lines changed

README.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,19 @@ observability tools.
2424

2525
## Project Status
2626

27+
The table below summarizes the overall status of each component. Some components
28+
include unstable features, which are documented in their respective crate
29+
documentation.
30+
2731
| Signal/Component | Overall Status |
2832
| -------------------- | ------------------ |
2933
| Logs-API | RC* |
3034
| Logs-SDK | Beta |
3135
| Logs-OTLP Exporter | Beta |
3236
| Logs-Appender-Tracing | Beta |
3337
| Metrics-API | RC |
34-
| Metrics-SDK | Beta |
35-
| Metrics-OTLP Exporter | Beta |
38+
| Metrics-SDK | Beta |
39+
| Metrics-OTLP Exporter | Beta |
3640
| Traces-API | Beta |
3741
| Traces-SDK | Beta |
3842
| Traces-OTLP Exporter | Beta |

examples/self-diagnostics/src/main.rs

Lines changed: 13 additions & 5 deletions
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/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@
2525
- Bug fix: Empty Logger names are retained as-is instead of replacing with
2626
"rust.opentelemetry.io/sdk/logger"
2727
[#2316](https://github.com/open-telemetry/opentelemetry-rust/pull/2316)
28+
29+
- `Logger::provider`: This method is deprecated as of version `0.27.1`. To be removed in `0.28.0`.
30+
- `Logger::instrumentation_scope`: This method is deprecated as of version `0.27.1`. To be removed in `0.28.0`
31+
Migration Guidance:
32+
- These methods are intended for log appenders. Keep the clone of the provider handle, instead of depending on above methods.
33+
2834

2935
## 0.27.0
3036

opentelemetry-sdk/src/logs/log_emitter.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,19 @@ impl Logger {
242242
Logger { scope, provider }
243243
}
244244

245+
#[deprecated(
246+
since = "0.27.1",
247+
note = "This method was intended for appender developers, but has no defined use-case in typical workflows. It is deprecated and will be removed in the next major release."
248+
)]
245249
/// LoggerProvider associated with this logger.
246250
pub fn provider(&self) -> &LoggerProvider {
247251
&self.provider
248252
}
249253

254+
#[deprecated(
255+
since = "0.27.1",
256+
note = "This method was intended for appender developers, but has no defined use-case in typical workflows. It is deprecated and will be removed in the next major release."
257+
)]
250258
/// Instrumentation scope of this logger.
251259
pub fn instrumentation_scope(&self) -> &InstrumentationScope {
252260
&self.scope
@@ -262,7 +270,7 @@ impl opentelemetry::logs::Logger for Logger {
262270

263271
/// Emit a `LogRecord`.
264272
fn emit(&self, mut record: Self::LogRecord) {
265-
let provider = self.provider();
273+
let provider = &self.provider;
266274
let processors = provider.log_processors();
267275

268276
//let mut log_record = record;
@@ -281,22 +289,17 @@ impl opentelemetry::logs::Logger for Logger {
281289
}
282290

283291
for p in processors {
284-
p.emit(&mut record, self.instrumentation_scope());
292+
p.emit(&mut record, &self.scope);
285293
}
286294
}
287295

288296
#[cfg(feature = "spec_unstable_logs_enabled")]
289297
fn event_enabled(&self, level: Severity, target: &str) -> bool {
290-
let provider = self.provider();
298+
let provider = &self.provider;
291299

292300
let mut enabled = false;
293301
for processor in provider.log_processors() {
294-
enabled = enabled
295-
|| processor.event_enabled(
296-
level,
297-
target,
298-
self.instrumentation_scope().name().as_ref(),
299-
);
302+
enabled = enabled || processor.event_enabled(level, target, self.scope.name().as_ref());
300303
}
301304
enabled
302305
}
@@ -729,14 +732,14 @@ mod tests {
729732
emitted_logs[0].clone().record.body,
730733
Some(AnyValue::String("Testing empty logger name".into()))
731734
);
732-
assert_eq!(logger.instrumentation_scope().name(), "");
735+
assert_eq!(logger.scope.name(), "");
733736

734737
// Assert the second log created through the scope
735738
assert_eq!(
736739
emitted_logs[1].clone().record.body,
737740
Some(AnyValue::String("Testing empty logger scope name".into()))
738741
);
739-
assert_eq!(scoped_logger.instrumentation_scope().name(), "");
742+
assert_eq!(scoped_logger.scope.name(), "");
740743
}
741744

742745
#[derive(Debug)]

opentelemetry-sdk/src/logs/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ mod tests {
108108
}
109109

110110
#[test]
111+
#[allow(deprecated)]
111112
fn logger_attributes() {
112113
let provider = LoggerProvider::builder().build();
113114
let scope = InstrumentationScope::builder("test_logger")

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ use super::{
1212
precomputed_sum::PrecomputedSum, sum::Sum, Number,
1313
};
1414

15-
const STREAM_CARDINALITY_LIMIT: u32 = 2000;
15+
pub(crate) const STREAM_CARDINALITY_LIMIT: usize = 2000;
1616

1717
/// Checks whether aggregator has hit cardinality limit for metric streams
1818
pub(crate) fn is_under_cardinality_limit(size: usize) -> bool {
19-
size < STREAM_CARDINALITY_LIMIT as usize
19+
size < STREAM_CARDINALITY_LIMIT
2020
}
2121

2222
/// Receives measurements to be aggregated.

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

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ mod sum;
77

88
use core::fmt;
99
use std::collections::{HashMap, HashSet};
10-
use std::mem::take;
10+
use std::mem::swap;
1111
use std::ops::{Add, AddAssign, DerefMut, Sub};
1212
use std::sync::atomic::{AtomicBool, AtomicI64, AtomicU64, AtomicUsize, Ordering};
1313
use std::sync::{Arc, RwLock};
1414

15-
use aggregate::is_under_cardinality_limit;
15+
use aggregate::{is_under_cardinality_limit, STREAM_CARDINALITY_LIMIT};
1616
pub(crate) use aggregate::{AggregateBuilder, ComputeAggregation, Measure};
1717
pub(crate) use exponential_histogram::{EXPO_MAX_SCALE, EXPO_MIN_SCALE};
1818
use opentelemetry::{otel_warn, KeyValue};
@@ -56,6 +56,11 @@ where
5656
{
5757
/// Trackers store the values associated with different attribute sets.
5858
trackers: RwLock<HashMap<Vec<KeyValue>, Arc<A>>>,
59+
60+
/// Used by collect exclusively. The data type must match the one used in
61+
/// `trackers` to allow mem::swap.
62+
trackers_for_collect: RwLock<HashMap<Vec<KeyValue>, Arc<A>>>,
63+
5964
/// Number of different attribute set stored in the `trackers` map.
6065
count: AtomicUsize,
6166
/// Indicates whether a value with no attributes has been stored.
@@ -72,7 +77,10 @@ where
7277
{
7378
fn new(config: A::InitConfig) -> Self {
7479
ValueMap {
75-
trackers: RwLock::new(HashMap::new()),
80+
trackers: RwLock::new(HashMap::with_capacity(1 + STREAM_CARDINALITY_LIMIT)),
81+
// TODO: For cumulative, this is not required, so avoid this
82+
// pre-allocation.
83+
trackers_for_collect: RwLock::new(HashMap::with_capacity(1 + STREAM_CARDINALITY_LIMIT)),
7684
has_no_attribute_value: AtomicBool::new(false),
7785
no_attribute_tracker: A::create(&config),
7886
count: AtomicUsize::new(0),
@@ -175,19 +183,23 @@ where
175183
));
176184
}
177185

178-
let trackers = match self.trackers.write() {
179-
Ok(mut trackers) => {
186+
if let Ok(mut trackers_collect) = self.trackers_for_collect.write() {
187+
if let Ok(mut trackers_current) = self.trackers.write() {
188+
swap(trackers_collect.deref_mut(), trackers_current.deref_mut());
180189
self.count.store(0, Ordering::SeqCst);
181-
take(trackers.deref_mut())
190+
} else {
191+
otel_warn!(name: "MeterProvider.InternalError", message = "Metric collection failed. Report this issue in OpenTelemetry repo.", details ="ValueMap trackers lock poisoned");
192+
return;
182193
}
183-
Err(_) => todo!(),
184-
};
185194

186-
let mut seen = HashSet::new();
187-
for (attrs, tracker) in trackers.into_iter() {
188-
if seen.insert(Arc::as_ptr(&tracker)) {
189-
dest.push(map_fn(attrs, tracker.clone_and_reset(&self.config)));
195+
let mut seen = HashSet::new();
196+
for (attrs, tracker) in trackers_collect.drain() {
197+
if seen.insert(Arc::as_ptr(&tracker)) {
198+
dest.push(map_fn(attrs, tracker.clone_and_reset(&self.config)));
199+
}
190200
}
201+
} else {
202+
otel_warn!(name: "MeterProvider.InternalError", message = "Metric collection failed. Report this issue in OpenTelemetry repo.", details ="ValueMap trackers for collect lock poisoned");
191203
}
192204
}
193205
}

opentelemetry-sdk/src/metrics/meter_provider.rs

Lines changed: 28 additions & 7 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 8 additions & 0 deletions
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)