Skip to content

Commit 9e713cb

Browse files
authored
Merge branch 'main' into deprecate-logger-methods
2 parents 3cb260e + c9388e4 commit 9e713cb

File tree

6 files changed

+33
-19
lines changed

6 files changed

+33
-19
lines changed

README.md

+6-2
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 |

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

+2-2
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

+24-12
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 once_cell::sync::Lazy;
@@ -51,6 +51,11 @@ where
5151
{
5252
/// Trackers store the values associated with different attribute sets.
5353
trackers: RwLock<HashMap<Vec<KeyValue>, Arc<A>>>,
54+
55+
/// Used by collect exclusively. The data type must match the one used in
56+
/// `trackers` to allow mem::swap.
57+
trackers_for_collect: RwLock<HashMap<Vec<KeyValue>, Arc<A>>>,
58+
5459
/// Number of different attribute set stored in the `trackers` map.
5560
count: AtomicUsize,
5661
/// Indicates whether a value with no attributes has been stored.
@@ -67,7 +72,10 @@ where
6772
{
6873
fn new(config: A::InitConfig) -> Self {
6974
ValueMap {
70-
trackers: RwLock::new(HashMap::new()),
75+
trackers: RwLock::new(HashMap::with_capacity(1 + STREAM_CARDINALITY_LIMIT)),
76+
// TODO: For cumulative, this is not required, so avoid this
77+
// pre-allocation.
78+
trackers_for_collect: RwLock::new(HashMap::with_capacity(1 + STREAM_CARDINALITY_LIMIT)),
7179
has_no_attribute_value: AtomicBool::new(false),
7280
no_attribute_tracker: A::create(&config),
7381
count: AtomicUsize::new(0),
@@ -170,19 +178,23 @@ where
170178
));
171179
}
172180

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

181-
let mut seen = HashSet::new();
182-
for (attrs, tracker) in trackers.into_iter() {
183-
if seen.insert(Arc::as_ptr(&tracker)) {
184-
dest.push(map_fn(attrs, tracker.clone_and_reset(&self.config)));
190+
let mut seen = HashSet::new();
191+
for (attrs, tracker) in trackers_collect.drain() {
192+
if seen.insert(Arc::as_ptr(&tracker)) {
193+
dest.push(map_fn(attrs, tracker.clone_and_reset(&self.config)));
194+
}
185195
}
196+
} else {
197+
otel_warn!(name: "MeterProvider.InternalError", message = "Metric collection failed. Report this issue in OpenTelemetry repo.", details ="ValueMap trackers for collect lock poisoned");
186198
}
187199
}
188200
}

opentelemetry-semantic-conventions/scripts/templates/registry/rust/metric.rs.j2

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
//! .u64_histogram(semconv::metric::HTTP_SERVER_REQUEST_DURATION)
2727
//! .with_unit("By")
2828
//! .with_description("Duration of HTTP server requests.")
29-
//! .init();
29+
//! .build();
3030
//! ```
3131

3232
{% for root_ns in ctx %}

opentelemetry-semantic-conventions/scripts/templates/registry/rust/resource.rs.j2

-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
//! let _tracer = TracerProvider::builder()
2323
//! .with_config(config().with_resource(Resource::new(vec![
2424
//! KeyValue::new(semconv::resource::SERVICE_NAME, "my-service"),
25-
//! KeyValue::new(semconv::resource::SERVICE_NAMESPACE, "my-namespace"),
2625
//! ])))
2726
//! .build();
2827
//! ```

opentelemetry-semantic-conventions/src/resource.rs

-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
//! let _tracer = TracerProvider::builder()
2222
//! .with_config(config().with_resource(Resource::new(vec![
2323
//! KeyValue::new(semconv::resource::SERVICE_NAME, "my-service"),
24-
//! KeyValue::new(semconv::resource::SERVICE_NAMESPACE, "my-namespace"),
2524
//! ])))
2625
//! .build();
2726
//! ```

0 commit comments

Comments
 (0)