1
1
use core:: fmt;
2
2
use std:: {
3
3
borrow:: Cow ,
4
+ collections:: HashMap ,
4
5
sync:: {
5
6
atomic:: { AtomicBool , Ordering } ,
6
- Arc ,
7
+ Arc , Mutex ,
7
8
} ,
8
9
} ;
9
10
10
11
use opentelemetry:: {
11
- metrics:: {
12
- noop:: NoopMeterCore , InstrumentProvider , Meter , MeterProvider , MetricsError , Result ,
13
- } ,
12
+ metrics:: { noop:: NoopMeterCore , Meter , MeterProvider , MetricsError , Result } ,
14
13
KeyValue ,
15
14
} ;
16
15
@@ -28,6 +27,7 @@ use super::{meter::SdkMeter, pipeline::Pipelines, reader::MetricReader, view::Vi
28
27
#[ derive( Clone , Debug ) ]
29
28
pub struct SdkMeterProvider {
30
29
pipes : Arc < Pipelines > ,
30
+ meters : Arc < Mutex < HashMap < Scope , Arc < SdkMeter > > > > ,
31
31
is_shutdown : Arc < AtomicBool > ,
32
32
}
33
33
@@ -123,15 +123,23 @@ impl MeterProvider for SdkMeterProvider {
123
123
schema_url : Option < impl Into < Cow < ' static , str > > > ,
124
124
attributes : Option < Vec < KeyValue > > ,
125
125
) -> 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) ;
133
131
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
+ }
135
143
}
136
144
}
137
145
@@ -186,6 +194,7 @@ impl MeterProviderBuilder {
186
194
self . readers ,
187
195
self . views ,
188
196
) ) ,
197
+ meters : Default :: default ( ) ,
189
198
is_shutdown : Arc :: new ( AtomicBool :: new ( false ) ) ,
190
199
}
191
200
}
0 commit comments