Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9ef6829

Browse files
authored
Refactor Meter and MeterProvider (open-telemetry#2296)
* Refactor Meter and MeterProvider Fixes open-telemetry#2292 * Remove synchronous instruments list * Undo changes to _time.py * Make lint pass * Remove unnecesary docstring * Remove _create_instrument * Add missing callback * Remove instrument creating methods from MeterProvider * Remove views and other attributes * Removed dataclass dependency * Add warning * Add export directory * Add missing callbacks
1 parent 8bbaf76 commit 9ef6829

File tree

7 files changed

+235
-292
lines changed

7 files changed

+235
-292
lines changed

opentelemetry-api/src/opentelemetry/util/_time.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
def _time_ns() -> int:
2929
return int(time() * 1e9)
3030

31-
3231
else:
3332
from time import time_ns
3433

opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py

Lines changed: 76 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,36 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
# pylint: disable=function-redefined,too-many-ancestors
16-
17-
from abc import ABC, abstractmethod
1815
from atexit import register, unregister
1916
from logging import getLogger
20-
from typing import Optional
17+
from threading import Lock
18+
from typing import Optional, Sequence
2119

2220
from opentelemetry._metrics import Meter as APIMeter
2321
from opentelemetry._metrics import MeterProvider as APIMeterProvider
2422
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+
)
2531
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 (
2637
Counter,
2738
Histogram,
2839
ObservableCounter,
2940
ObservableGauge,
3041
ObservableUpDownCounter,
3142
UpDownCounter,
3243
)
44+
from opentelemetry.sdk._metrics.metric_reader import MetricReader
3345
from opentelemetry.sdk.resources import Resource
3446
from opentelemetry.sdk.util.instrumentation import InstrumentationInfo
3547

@@ -46,95 +58,68 @@ def __init__(
4658
self._instrumentation_info = instrumentation_info
4759
self._meter_provider = meter_provider
4860

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)
5263

5364
def create_up_down_counter(
5465
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+
)
5870

5971
def create_observable_counter(
6072
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+
)
6477

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)
6882

6983
def create_observable_gauge(
7084
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+
)
7489

7590
def create_observable_up_down_counter(
7691
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+
)
8096

8197

8298
class MeterProvider(APIMeterProvider):
8399
"""See `opentelemetry._metrics.MeterProvider`."""
84100

85101
def __init__(
86102
self,
103+
metric_exporters: Sequence[MetricExporter] = (),
104+
metric_readers: Sequence[MetricReader] = (),
87105
resource: Resource = Resource.create({}),
88106
shutdown_on_exit: bool = True,
89107
):
90-
self._resource = resource
108+
self._lock = Lock()
91109
self._atexit_handler = None
92110

93111
if shutdown_on_exit:
94112
self._atexit_handler = register(self.shutdown)
95113

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
124115

125116
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)
130118

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
136120

137-
return result
121+
self._resource = resource
122+
self._shutdown = False
138123

139124
def force_flush(self) -> bool:
140125

@@ -161,56 +146,46 @@ def force_flush(self) -> bool:
161146

162147
return metric_reader_result and metric_exporter_result
163148

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
178151

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
182155

183-
@abstractmethod
184-
def collect(self):
185-
pass
156+
result = True
186157

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()
190160

161+
if not result:
162+
_logger.warning("A MetricReader failed to shutdown")
191163

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()
195166

196-
@abstractmethod
197-
def export(self):
198-
pass
167+
if not result:
168+
_logger.warning("A MetricExporter failed to shutdown")
199169

200-
def shutdown(self):
201-
# FIXME this will need a Once wrapper
202170
self._shutdown = True
203171

172+
if self._atexit_handler is not None:
173+
unregister(self._atexit_handler)
174+
self._atexit_handler = None
204175

205-
class View:
206-
pass
207-
176+
return result
208177

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:
212184

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)
213190

214-
class SDKMetricReader(MetricReader):
215-
def collect(self):
216-
pass
191+
return Meter(InstrumentationInfo(name, version, schema_url), self)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Copyright The OpenTelemetry Authors
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Copyright The OpenTelemetry Authors
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
16+
class MetricExporter:
17+
pass

0 commit comments

Comments
 (0)