Skip to content

Commit a5f17b4

Browse files
committed
rearrange to reduce time inside lock to minimal
1 parent a4a2fdd commit a5f17b4

File tree

2 files changed

+14
-23
lines changed

2 files changed

+14
-23
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use super::{
1212
precomputed_sum::PrecomputedSum, sum::Sum, Number,
1313
};
1414

15-
pub(crate) 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 {

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

+13-22
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,10 @@ where
7272
{
7373
fn new(config: A::InitConfig) -> Self {
7474
ValueMap {
75-
trackers: RwLock::new(HashMap::with_capacity(
76-
1 + STREAM_CARDINALITY_LIMIT as usize,
77-
)),
75+
trackers: RwLock::new(HashMap::with_capacity(1 + STREAM_CARDINALITY_LIMIT)),
7876
// TODO: For cumulative, this is not required, so avoid this
7977
// pre-allocation.
80-
trackers_for_collect: RwLock::new(HashMap::with_capacity(
81-
1 + STREAM_CARDINALITY_LIMIT as usize,
82-
)),
78+
trackers_for_collect: RwLock::new(HashMap::with_capacity(1 + STREAM_CARDINALITY_LIMIT)),
8379
has_no_attribute_value: AtomicBool::new(false),
8480
no_attribute_tracker: A::create(&config),
8581
count: AtomicUsize::new(0),
@@ -182,28 +178,23 @@ where
182178
));
183179
}
184180

185-
let mut trackers = if let Ok(mut trackers_guard) = self.trackers.write() {
186-
if let Ok(mut trackers_for_collect_guard) = self.trackers_for_collect.write() {
187-
swap(
188-
trackers_guard.deref_mut(),
189-
trackers_for_collect_guard.deref_mut(),
190-
);
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());
191184
self.count.store(0, Ordering::SeqCst);
192-
trackers_for_collect_guard
193185
} else {
194-
otel_warn!(name: "MeterProvider.InternalError", message = "Metric collection failed. Report this issue in OpenTelemetry repo.", details ="ValueMap trackers for collect lock poisoned");
186+
otel_warn!(name: "MeterProvider.InternalError", message = "Metric collection failed. Report this issue in OpenTelemetry repo.", details ="ValueMap trackers lock poisoned");
195187
return;
196188
}
197-
} else {
198-
otel_warn!(name: "MeterProvider.InternalError", message = "Metric collection failed. Report this issue in OpenTelemetry repo.", details ="ValueMap trackers lock poisoned");
199-
return;
200-
};
201189

202-
let mut seen = HashSet::new();
203-
for (attrs, tracker) in trackers.drain() {
204-
if seen.insert(Arc::as_ptr(&tracker)) {
205-
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+
}
206195
}
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");
207198
}
208199
}
209200
}

0 commit comments

Comments
 (0)