1
1
use crate :: metrics:: { self , Meter , MeterProvider } ;
2
2
use crate :: KeyValue ;
3
- use core:: fmt;
4
3
use once_cell:: sync:: Lazy ;
5
- use std:: {
6
- borrow:: Cow ,
7
- sync:: { Arc , RwLock } ,
8
- } ;
4
+ use std:: sync:: { Arc , RwLock } ;
9
5
10
- /// The global `MeterProvider` singleton.
11
- static GLOBAL_METER_PROVIDER : Lazy < RwLock < GlobalMeterProvider > > = Lazy :: new ( || {
12
- RwLock :: new ( GlobalMeterProvider :: new (
13
- metrics:: noop:: NoopMeterProvider :: new ( ) ,
14
- ) )
15
- } ) ;
16
-
17
- /// Allows a specific [MeterProvider] to be used generically by the
18
- /// [GlobalMeterProvider] by mirroring the interface and boxing the return types.
19
- trait ObjectSafeMeterProvider {
20
- /// Creates a versioned named meter instance that is a trait object through the underlying
21
- /// [MeterProvider].
22
- fn versioned_meter_cow (
23
- & self ,
24
- name : Cow < ' static , str > ,
25
- version : Option < Cow < ' static , str > > ,
26
- schema_url : Option < Cow < ' static , str > > ,
27
- attributes : Option < Vec < KeyValue > > ,
28
- ) -> Meter ;
29
- }
30
-
31
- impl < P > ObjectSafeMeterProvider for P
32
- where
33
- P : MeterProvider ,
34
- {
35
- /// Return a versioned boxed tracer
36
- fn versioned_meter_cow (
37
- & self ,
38
- name : Cow < ' static , str > ,
39
- version : Option < Cow < ' static , str > > ,
40
- schema_url : Option < Cow < ' static , str > > ,
41
- attributes : Option < Vec < KeyValue > > ,
42
- ) -> Meter {
43
- self . versioned_meter ( name, version, schema_url, attributes)
44
- }
45
- }
6
+ type GlobalMeterProvider = Arc < dyn MeterProvider + Send + Sync > ;
46
7
47
- /// Represents the globally configured [`MeterProvider`] instance for this
48
- /// application.
49
- #[ derive( Clone ) ]
50
- pub struct GlobalMeterProvider {
51
- provider : Arc < dyn ObjectSafeMeterProvider + Send + Sync > ,
52
- }
53
-
54
- impl fmt:: Debug for GlobalMeterProvider {
55
- fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
56
- f. debug_struct ( "GlobalMeterProvider" ) . finish ( )
57
- }
58
- }
59
-
60
- impl MeterProvider for GlobalMeterProvider {
61
- fn versioned_meter (
62
- & self ,
63
- name : impl Into < Cow < ' static , str > > ,
64
- version : Option < impl Into < Cow < ' static , str > > > ,
65
- schema_url : Option < impl Into < Cow < ' static , str > > > ,
66
- attributes : Option < Vec < KeyValue > > ,
67
- ) -> Meter {
68
- self . provider . versioned_meter_cow (
69
- name. into ( ) ,
70
- version. map ( Into :: into) ,
71
- schema_url. map ( Into :: into) ,
72
- attributes,
73
- )
74
- }
75
- }
76
-
77
- impl GlobalMeterProvider {
78
- /// Create a new global meter provider
79
- fn new < P > ( provider : P ) -> Self
80
- where
81
- P : MeterProvider + Send + Sync + ' static ,
82
- {
83
- GlobalMeterProvider {
84
- provider : Arc :: new ( provider) ,
85
- }
86
- }
87
- }
8
+ /// The global `MeterProvider` singleton.
9
+ static GLOBAL_METER_PROVIDER : Lazy < RwLock < GlobalMeterProvider > > =
10
+ Lazy :: new ( || RwLock :: new ( Arc :: new ( metrics:: noop:: NoopMeterProvider :: new ( ) ) ) ) ;
88
11
89
12
/// Sets the given [`MeterProvider`] instance as the current global meter
90
13
/// provider.
@@ -95,25 +18,24 @@ where
95
18
let mut global_provider = GLOBAL_METER_PROVIDER
96
19
. write ( )
97
20
. expect ( "GLOBAL_METER_PROVIDER RwLock poisoned" ) ;
98
- * global_provider = GlobalMeterProvider :: new ( new_provider) ;
21
+ * global_provider = Arc :: new ( new_provider) ;
99
22
}
100
23
101
- /// Returns an instance of the currently configured global [`MeterProvider`]
102
- /// through [`GlobalMeterProvider`].
24
+ /// Returns an instance of the currently configured global [`MeterProvider`].
103
25
pub fn meter_provider ( ) -> GlobalMeterProvider {
104
26
GLOBAL_METER_PROVIDER
105
27
. read ( )
106
28
. expect ( "GLOBAL_METER_PROVIDER RwLock poisoned" )
107
29
. clone ( )
108
30
}
109
31
110
- /// Creates a named [`Meter`] via the configured [`GlobalMeterProvider `].
32
+ /// Creates a named [`Meter`] via the currently configured global [`MeterProvider `].
111
33
///
112
34
/// If the name is an empty string, the provider will use a default name.
113
35
///
114
36
/// This is a more convenient way of expressing `global::meter_provider().meter(name)`.
115
- pub fn meter ( name : impl Into < Cow < ' static , str > > ) -> Meter {
116
- meter_provider ( ) . meter ( name. into ( ) )
37
+ pub fn meter ( name : & ' static str ) -> Meter {
38
+ meter_provider ( ) . meter ( name)
117
39
}
118
40
119
41
/// Creates a [`Meter`] with the name, version and schema url.
@@ -138,15 +60,10 @@ pub fn meter(name: impl Into<Cow<'static, str>>) -> Meter {
138
60
/// );
139
61
/// ```
140
62
pub fn meter_with_version (
141
- name : impl Into < Cow < ' static , str > > ,
142
- version : Option < impl Into < Cow < ' static , str > > > ,
143
- schema_url : Option < impl Into < Cow < ' static , str > > > ,
63
+ name : & ' static str ,
64
+ version : Option < & ' static str > ,
65
+ schema_url : Option < & ' static str > ,
144
66
attributes : Option < Vec < KeyValue > > ,
145
67
) -> Meter {
146
- meter_provider ( ) . versioned_meter (
147
- name. into ( ) ,
148
- version. map ( Into :: into) ,
149
- schema_url. map ( Into :: into) ,
150
- attributes,
151
- )
68
+ meter_provider ( ) . versioned_meter ( name, version, schema_url, attributes)
152
69
}
0 commit comments