Skip to content

Commit 7bb97d5

Browse files
authored
Return consistent Meter for a given MeterProvider (#1351)
1 parent a74ecd1 commit 7bb97d5

File tree

2 files changed

+22
-12
lines changed

2 files changed

+22
-12
lines changed

opentelemetry-sdk/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
### Fixed
2626

2727
- Fix metric export corruption if gauges have not received a last value. (#1363)
28+
- Return consistent `Meter` for a given scope from `MeterProvider`. (#1351)
2829

2930
## v0.21.0
3031

opentelemetry-sdk/src/metrics/meter_provider.rs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
use core::fmt;
22
use std::{
33
borrow::Cow,
4+
collections::HashMap,
45
sync::{
56
atomic::{AtomicBool, Ordering},
6-
Arc,
7+
Arc, Mutex,
78
},
89
};
910

1011
use opentelemetry::{
11-
metrics::{
12-
noop::NoopMeterCore, InstrumentProvider, Meter, MeterProvider, MetricsError, Result,
13-
},
12+
metrics::{noop::NoopMeterCore, Meter, MeterProvider, MetricsError, Result},
1413
KeyValue,
1514
};
1615

@@ -28,6 +27,7 @@ use super::{meter::SdkMeter, pipeline::Pipelines, reader::MetricReader, view::Vi
2827
#[derive(Clone, Debug)]
2928
pub struct SdkMeterProvider {
3029
pipes: Arc<Pipelines>,
30+
meters: Arc<Mutex<HashMap<Scope, Arc<SdkMeter>>>>,
3131
is_shutdown: Arc<AtomicBool>,
3232
}
3333

@@ -123,15 +123,23 @@ impl MeterProvider for SdkMeterProvider {
123123
schema_url: Option<impl Into<Cow<'static, str>>>,
124124
attributes: Option<Vec<KeyValue>>,
125125
) -> Meter {
126-
let inst_provider: Arc<dyn InstrumentProvider + Send + Sync> =
127-
if !self.is_shutdown.load(Ordering::Relaxed) {
128-
let scope = Scope::new(name, version, schema_url, attributes);
129-
Arc::new(SdkMeter::new(scope, self.pipes.clone()))
130-
} else {
131-
Arc::new(NoopMeterCore::new())
132-
};
126+
if self.is_shutdown.load(Ordering::Relaxed) {
127+
return Meter::new(Arc::new(NoopMeterCore::new()));
128+
}
129+
130+
let scope = Scope::new(name, version, schema_url, attributes);
133131

134-
Meter::new(inst_provider)
132+
if let Ok(mut meters) = self.meters.lock() {
133+
let meter = meters
134+
.entry(scope)
135+
.or_insert_with_key(|scope| {
136+
Arc::new(SdkMeter::new(scope.clone(), self.pipes.clone()))
137+
})
138+
.clone();
139+
Meter::new(meter)
140+
} else {
141+
Meter::new(Arc::new(NoopMeterCore::new()))
142+
}
135143
}
136144
}
137145

@@ -186,6 +194,7 @@ impl MeterProviderBuilder {
186194
self.readers,
187195
self.views,
188196
)),
197+
meters: Default::default(),
189198
is_shutdown: Arc::new(AtomicBool::new(false)),
190199
}
191200
}

0 commit comments

Comments
 (0)