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

Skip to content

Commit 75a1311

Browse files
authored
metrics api/sdk: Move "config" out from Meter into MeterProvider (open-telemetry#751)
1 parent c42749a commit 75a1311

File tree

7 files changed

+39
-45
lines changed

7 files changed

+39
-45
lines changed

docs/examples/basic_meter/basic_metrics.py

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -30,33 +30,17 @@
3030

3131
stateful = True
3232

33-
34-
def usage(argv):
35-
print("usage:")
36-
print("{} [mode]".format(argv[0]))
37-
print("mode: stateful (default) or stateless")
38-
39-
40-
if len(sys.argv) >= 2:
41-
batcher_mode = sys.argv[1]
42-
if batcher_mode not in ("stateful", "stateless"):
43-
print("bad mode specified.")
44-
usage(sys.argv)
45-
sys.exit(1)
46-
stateful = batcher_mode == "stateful"
47-
4833
print(
4934
"Starting example, values will be printed to the console every 5 seconds."
5035
)
5136

52-
37+
# Stateful determines whether how metrics are collected: if true, metrics
38+
# accumulate over the process lifetime. If false, metrics are reset at the
39+
# beginning of each collection interval.
40+
metrics.set_meter_provider(MeterProvider(stateful))
5341
# The Meter is responsible for creating and recording metrics. Each meter has a
54-
# unique name, which we set as the module's name here. The second argument
55-
# determines whether how metrics are collected: if true, metrics accumulate
56-
# over the process lifetime. If false, metrics are reset at the beginning of
57-
# each collection interval.
58-
metrics.set_meter_provider(MeterProvider())
59-
meter = metrics.get_meter(__name__, batcher_mode == "stateful")
42+
# unique name, which we set as the module's name here.
43+
meter = metrics.get_meter(__name__)
6044

6145
# Exporter to export metrics to the console
6246
exporter = ConsoleMetricsExporter()

docs/examples/basic_meter/observer.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424
from opentelemetry.sdk.metrics.export.batcher import UngroupedBatcher
2525
from opentelemetry.sdk.metrics.export.controller import PushController
2626

27-
# Configure a stateful batcher
28-
batcher = UngroupedBatcher(stateful=True)
2927
metrics.set_meter_provider(MeterProvider())
3028
meter = metrics.get_meter(__name__)
3129
exporter = ConsoleMetricsExporter()

opentelemetry-api/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## Unreleased
44

5+
- Move stateful from Meter to MeterProvider
6+
([#751](https://github.com/open-telemetry/opentelemetry-python/pull/751))
57
- Rename Measure to ValueRecorder in metrics
68
([#761](https://github.com/open-telemetry/opentelemetry-python/pull/761))
79

opentelemetry-api/src/opentelemetry/metrics/__init__.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
"""
3030
import abc
3131
from logging import getLogger
32-
from typing import Callable, Dict, Sequence, Tuple, Type, TypeVar
32+
from typing import Callable, Dict, Optional, Sequence, Tuple, Type, TypeVar
3333

3434
from opentelemetry.util import _load_provider
3535

@@ -195,7 +195,6 @@ class MeterProvider(abc.ABC):
195195
def get_meter(
196196
self,
197197
instrumenting_module_name: str,
198-
stateful: bool = True,
199198
instrumenting_library_version: str = "",
200199
) -> "Meter":
201200
"""Returns a `Meter` for use by the given instrumentation library.
@@ -212,12 +211,6 @@ def get_meter(
212211
E.g., instead of ``"requests"``, use
213212
``"opentelemetry.ext.requests"``.
214213
215-
stateful: True/False to indicate whether the meter will be
216-
stateful. True indicates the meter computes checkpoints
217-
from over the process lifetime. False indicates the meter
218-
computes checkpoints which describe the updates of a single
219-
collection period (deltas).
220-
221214
instrumenting_library_version: Optional. The version string of the
222215
instrumenting library. Usually this should be the same as
223216
``pkg_resources.get_distribution(instrumenting_library_name).version``.
@@ -233,7 +226,6 @@ class DefaultMeterProvider(MeterProvider):
233226
def get_meter(
234227
self,
235228
instrumenting_module_name: str,
236-
stateful: bool = True,
237229
instrumenting_library_version: str = "",
238230
) -> "Meter":
239231
# pylint:disable=no-self-use,unused-argument
@@ -376,15 +368,19 @@ def unregister_observer(self, observer: "Observer") -> None:
376368

377369
def get_meter(
378370
instrumenting_module_name: str,
379-
stateful: bool = True,
380371
instrumenting_library_version: str = "",
372+
meter_provider: Optional[MeterProvider] = None,
381373
) -> "Meter":
382374
"""Returns a `Meter` for use by the given instrumentation library.
383375
This function is a convenience wrapper for
384376
opentelemetry.metrics.get_meter_provider().get_meter
377+
378+
If meter_provider is omitted the current configured one is used.
385379
"""
386-
return get_meter_provider().get_meter(
387-
instrumenting_module_name, stateful, instrumenting_library_version
380+
if meter_provider is None:
381+
meter_provider = get_meter_provider()
382+
return meter_provider.get_meter(
383+
instrumenting_module_name, instrumenting_library_version
388384
)
389385

390386

opentelemetry-sdk/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## Unreleased
44

5+
- Move stateful & resource from Meter to MeterProvider
6+
([#751](https://github.com/open-telemetry/opentelemetry-python/pull/751))
57
- Rename Measure to ValueRecorder in metrics
68
([#761](https://github.com/open-telemetry/opentelemetry-python/pull/761))
79

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

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -270,22 +270,21 @@ class Meter(metrics_api.Meter):
270270
"""See `opentelemetry.metrics.Meter`.
271271
272272
Args:
273+
source: The `MeterProvider` that created this meter.
273274
instrumentation_info: The `InstrumentationInfo` for this meter.
274-
stateful: Indicates whether the meter is stateful.
275275
"""
276276

277277
def __init__(
278278
self,
279+
source: "MeterProvider",
279280
instrumentation_info: "InstrumentationInfo",
280-
stateful: bool,
281-
resource: Resource = Resource.create_empty(),
282281
):
283282
self.instrumentation_info = instrumentation_info
283+
self.batcher = UngroupedBatcher(source.stateful)
284+
self.resource = source.resource
284285
self.metrics = set()
285286
self.observers = set()
286-
self.batcher = UngroupedBatcher(stateful)
287287
self.observers_lock = threading.Lock()
288-
self.resource = resource
289288

290289
def collect(self) -> None:
291290
"""Collects all the metrics created with this `Meter` for export.
@@ -398,21 +397,29 @@ def unregister_observer(self, observer: "Observer") -> None:
398397

399398

400399
class MeterProvider(metrics_api.MeterProvider):
401-
def __init__(self, resource: Resource = Resource.create_empty()):
400+
"""See `opentelemetry.metrics.MeterProvider`.
401+
402+
Args:
403+
stateful: Indicates whether meters created are going to be stateful
404+
resource: Resource for this MeterProvider
405+
"""
406+
407+
def __init__(
408+
self, stateful=True, resource: Resource = Resource.create_empty(),
409+
):
410+
self.stateful = stateful
402411
self.resource = resource
403412

404413
def get_meter(
405414
self,
406415
instrumenting_module_name: str,
407-
stateful=True,
408416
instrumenting_library_version: str = "",
409417
) -> "metrics_api.Meter":
410418
if not instrumenting_module_name: # Reject empty strings too.
411419
raise ValueError("get_meter called with missing module name.")
412420
return Meter(
421+
self,
413422
InstrumentationInfo(
414423
instrumenting_module_name, instrumenting_library_version
415424
),
416-
stateful=stateful,
417-
resource=self.resource,
418425
)

opentelemetry-sdk/tests/metrics/test_metrics.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@
2121

2222

2323
class TestMeterProvider(unittest.TestCase):
24+
def test_stateful(self):
25+
meter_provider = metrics.MeterProvider(stateful=False)
26+
meter = meter_provider.get_meter(__name__)
27+
self.assertIs(meter.batcher.stateful, False)
28+
2429
def test_resource(self):
2530
resource = resources.Resource.create({})
2631
meter_provider = metrics.MeterProvider(resource=resource)

0 commit comments

Comments
 (0)