12
12
# See the License for the specific language governing permissions and
13
13
# limitations under the License.
14
14
15
- # pylint: disable=function-redefined,too-many-ancestors
16
-
17
- from abc import ABC , abstractmethod
18
15
from atexit import register , unregister
19
16
from logging import getLogger
20
- from typing import Optional
17
+ from threading import Lock
18
+ from typing import Optional , Sequence
21
19
22
20
from opentelemetry ._metrics import Meter as APIMeter
23
21
from opentelemetry ._metrics import MeterProvider as APIMeterProvider
24
22
from opentelemetry ._metrics import _DefaultMeter
23
+ from opentelemetry ._metrics .instrument import Counter as APICounter
24
+ from opentelemetry ._metrics .instrument import Histogram as APIHistogram
25
+ from opentelemetry ._metrics .instrument import (
26
+ ObservableCounter as APIObservableCounter ,
27
+ )
28
+ from opentelemetry ._metrics .instrument import (
29
+ ObservableGauge as APIObservableGauge ,
30
+ )
25
31
from opentelemetry ._metrics .instrument import (
32
+ ObservableUpDownCounter as APIObservableUpDownCounter ,
33
+ )
34
+ from opentelemetry ._metrics .instrument import UpDownCounter as APIUpDownCounter
35
+ from opentelemetry .sdk ._metrics .export .metric_exporter import MetricExporter
36
+ from opentelemetry .sdk ._metrics .instrument import (
26
37
Counter ,
27
38
Histogram ,
28
39
ObservableCounter ,
29
40
ObservableGauge ,
30
41
ObservableUpDownCounter ,
31
42
UpDownCounter ,
32
43
)
44
+ from opentelemetry .sdk ._metrics .metric_reader import MetricReader
33
45
from opentelemetry .sdk .resources import Resource
34
46
from opentelemetry .sdk .util .instrumentation import InstrumentationInfo
35
47
@@ -46,95 +58,68 @@ def __init__(
46
58
self ._instrumentation_info = instrumentation_info
47
59
self ._meter_provider = meter_provider
48
60
49
- def create_counter (self , name , unit = None , description = None ) -> Counter :
50
- # FIXME implement this method
51
- pass
61
+ def create_counter (self , name , unit = None , description = None ) -> APICounter :
62
+ return Counter (self ._instrumentation_info , name , unit , description )
52
63
53
64
def create_up_down_counter (
54
65
self , name , unit = None , description = None
55
- ) -> UpDownCounter :
56
- # FIXME implement this method
57
- pass
66
+ ) -> APIUpDownCounter :
67
+ return UpDownCounter (
68
+ self ._instrumentation_info , name , unit , description
69
+ )
58
70
59
71
def create_observable_counter (
60
72
self , name , callback , unit = None , description = None
61
- ) -> ObservableCounter :
62
- # FIXME implement this method
63
- pass
73
+ ) -> APIObservableCounter :
74
+ return ObservableCounter (
75
+ self ._instrumentation_info , name , callback , unit , description
76
+ )
64
77
65
- def create_histogram (self , name , unit = None , description = None ) -> Histogram :
66
- # FIXME implement this method
67
- pass
78
+ def create_histogram (
79
+ self , name , unit = None , description = None
80
+ ) -> APIHistogram :
81
+ return Histogram (self ._instrumentation_info , name , unit , description )
68
82
69
83
def create_observable_gauge (
70
84
self , name , callback , unit = None , description = None
71
- ) -> ObservableGauge :
72
- # FIXME implement this method
73
- pass
85
+ ) -> APIObservableGauge :
86
+ return ObservableGauge (
87
+ self ._instrumentation_info , name , callback , unit , description
88
+ )
74
89
75
90
def create_observable_up_down_counter (
76
91
self , name , callback , unit = None , description = None
77
- ) -> ObservableUpDownCounter :
78
- # FIXME implement this method
79
- pass
92
+ ) -> APIObservableUpDownCounter :
93
+ return ObservableUpDownCounter (
94
+ self ._instrumentation_info , name , callback , unit , description
95
+ )
80
96
81
97
82
98
class MeterProvider (APIMeterProvider ):
83
99
"""See `opentelemetry._metrics.MeterProvider`."""
84
100
85
101
def __init__ (
86
102
self ,
103
+ metric_exporters : Sequence [MetricExporter ] = (),
104
+ metric_readers : Sequence [MetricReader ] = (),
87
105
resource : Resource = Resource .create ({}),
88
106
shutdown_on_exit : bool = True ,
89
107
):
90
- self ._resource = resource
108
+ self ._lock = Lock ()
91
109
self ._atexit_handler = None
92
110
93
111
if shutdown_on_exit :
94
112
self ._atexit_handler = register (self .shutdown )
95
113
96
- self ._metric_readers = []
97
- self ._metric_exporters = []
98
- self ._views = []
99
- self ._shutdown = False
100
-
101
- def get_meter (
102
- self ,
103
- name : str ,
104
- version : Optional [str ] = None ,
105
- schema_url : Optional [str ] = None ,
106
- ) -> Meter :
107
-
108
- if self ._shutdown :
109
- _logger .warning (
110
- "A shutdown `MeterProvider` can not provide a `Meter`"
111
- )
112
- return _DefaultMeter (name , version = version , schema_url = schema_url )
113
-
114
- return Meter (InstrumentationInfo (name , version , schema_url ), self )
115
-
116
- def shutdown (self ):
117
- # FIXME implement a timeout
118
-
119
- if self ._shutdown :
120
- _logger .warning ("shutdown can only be called once" )
121
- return False
122
-
123
- result = True
114
+ self ._metric_readers = metric_readers
124
115
125
116
for metric_reader in self ._metric_readers :
126
- result = result and metric_reader .shutdown ()
127
-
128
- for metric_exporter in self ._metric_exporters :
129
- result = result and metric_exporter .shutdown ()
117
+ metric_reader ._register_meter_provider (self )
130
118
131
- self ._shutdown = True
132
-
133
- if self ._atexit_handler is not None :
134
- unregister (self ._atexit_handler )
135
- self ._atexit_handler = None
119
+ self ._metric_exporters = metric_exporters
136
120
137
- return result
121
+ self ._resource = resource
122
+ self ._shutdown = False
138
123
139
124
def force_flush (self ) -> bool :
140
125
@@ -161,56 +146,46 @@ def force_flush(self) -> bool:
161
146
162
147
return metric_reader_result and metric_exporter_result
163
148
164
- def register_metric_reader (self , metric_reader : "MetricReader" ) -> None :
165
- # FIXME protect this method against race conditions
166
- self ._metric_readers .append (metric_reader )
167
-
168
- def register_metric_exporter (
169
- self , metric_exporter : "MetricExporter"
170
- ) -> None :
171
- # FIXME protect this method against race conditions
172
- self ._metric_exporters .append (metric_exporter )
173
-
174
- def register_view (self , view : "View" ) -> None :
175
- # FIXME protect this method against race conditions
176
- self ._views .append (view )
177
-
149
+ def shutdown (self ):
150
+ # FIXME implement a timeout
178
151
179
- class MetricReader ( ABC ) :
180
- def __init__ ( self ):
181
- self . _shutdown = False
152
+ if self . _shutdown :
153
+ _logger . warning ( "shutdown can only be called once" )
154
+ return False
182
155
183
- @abstractmethod
184
- def collect (self ):
185
- pass
156
+ result = True
186
157
187
- def shutdown (self ):
188
- # FIXME this will need a Once wrapper
189
- self ._shutdown = True
158
+ for metric_reader in self ._metric_readers :
159
+ result = result and metric_reader .shutdown ()
190
160
161
+ if not result :
162
+ _logger .warning ("A MetricReader failed to shutdown" )
191
163
192
- class MetricExporter (ABC ):
193
- def __init__ (self ):
194
- self ._shutdown = False
164
+ for metric_exporter in self ._metric_exporters :
165
+ result = result and metric_exporter .shutdown ()
195
166
196
- @abstractmethod
197
- def export (self ):
198
- pass
167
+ if not result :
168
+ _logger .warning ("A MetricExporter failed to shutdown" )
199
169
200
- def shutdown (self ):
201
- # FIXME this will need a Once wrapper
202
170
self ._shutdown = True
203
171
172
+ if self ._atexit_handler is not None :
173
+ unregister (self ._atexit_handler )
174
+ self ._atexit_handler = None
204
175
205
- class View :
206
- pass
207
-
176
+ return result
208
177
209
- class ConsoleMetricExporter (MetricExporter ):
210
- def export (self ):
211
- pass
178
+ def get_meter (
179
+ self ,
180
+ name : str ,
181
+ version : Optional [str ] = None ,
182
+ schema_url : Optional [str ] = None ,
183
+ ) -> Meter :
212
184
185
+ if self ._shutdown :
186
+ _logger .warning (
187
+ "A shutdown `MeterProvider` can not provide a `Meter`"
188
+ )
189
+ return _DefaultMeter (name , version = version , schema_url = schema_url )
213
190
214
- class SDKMetricReader (MetricReader ):
215
- def collect (self ):
216
- pass
191
+ return Meter (InstrumentationInfo (name , version , schema_url ), self )
0 commit comments