Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Metrics SDK] Reduce the scope of write lock #2489

Closed
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 31 additions & 9 deletions opentelemetry-sdk/src/metrics/internal/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,25 +125,47 @@

// Recheck both the provided and sorted orders after acquiring the write lock
// in case another thread has pushed an update in the meantime.
if let Some(tracker) = trackers.get(attributes) {
let tracker = trackers.get(attributes);
if let Some(tracker) = tracker {
let tracker = tracker.clone();
drop(trackers); // Drop the write lock before updating the tracker

Check warning on line 131 in opentelemetry-sdk/src/metrics/internal/mod.rs

View check run for this annotation

Codecov / codecov/patch

opentelemetry-sdk/src/metrics/internal/mod.rs#L130-L131

Added lines #L130 - L131 were not covered by tests
tracker.update(value);
} else if let Some(tracker) = trackers.get(sorted_attrs.as_slice()) {
return;

Check warning on line 133 in opentelemetry-sdk/src/metrics/internal/mod.rs

View check run for this annotation

Codecov / codecov/patch

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

Added line #L133 was not covered by tests
}

let tracker = trackers.get(sorted_attrs.as_slice());
if let Some(tracker) = tracker {
let tracker = tracker.clone();
drop(trackers); // Drop the write lock before updating the tracker

Check warning on line 139 in opentelemetry-sdk/src/metrics/internal/mod.rs

View check run for this annotation

Codecov / codecov/patch

opentelemetry-sdk/src/metrics/internal/mod.rs#L138-L139

Added lines #L138 - L139 were not covered by tests
tracker.update(value);
} else if is_under_cardinality_limit(self.count.load(Ordering::SeqCst)) {
return;

Check warning on line 141 in opentelemetry-sdk/src/metrics/internal/mod.rs

View check run for this annotation

Codecov / codecov/patch

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

Added line #L141 was not covered by tests
}

if is_under_cardinality_limit(self.count.load(Ordering::SeqCst)) {
let new_tracker = Arc::new(A::create(&self.config));
new_tracker.update(value);

// Insert tracker with the attributes in the provided and sorted orders
trackers.insert(attributes.to_vec(), new_tracker.clone());
trackers.insert(sorted_attrs, new_tracker);
trackers.insert(sorted_attrs, new_tracker.clone());

self.count.fetch_add(1, Ordering::SeqCst);
} else if let Some(overflow_value) = trackers.get(stream_overflow_attributes().as_slice()) {
overflow_value.update(value);

drop(trackers); // Drop the write lock before updating the tracker

new_tracker.update(value);
return;
}

let overflow_tracker = trackers.get(stream_overflow_attributes().as_slice());
if let Some(overflow_tracker) = overflow_tracker {
let overflow_tracker = overflow_tracker.clone();
drop(trackers); // Drop the write lock before updating the tracker
overflow_tracker.update(value);
} else {
let new_tracker = A::create(&self.config);
let new_tracker = Arc::new(A::create(&self.config));
trackers.insert(stream_overflow_attributes().clone(), new_tracker.clone());
drop(trackers); // Drop the write lock before updating the tracker
new_tracker.update(value);
trackers.insert(stream_overflow_attributes().clone(), Arc::new(new_tracker));
otel_warn!( name: "ValueMap.measure",
message = "Maximum data points for metric stream exceeded. Entry added to overflow. Subsequent overflows to same metric until next collect will not be logged."
);
Expand Down
Loading