From b5d824c3e33487a43e7e3584b7079c7f742d9795 Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Tue, 25 Jan 2022 18:04:24 -0600 Subject: [PATCH 01/15] Add check for duplicate instrument names Fixes #2142 --- .../src/opentelemetry/_metrics/__init__.py | 15 +++- opentelemetry-api/tests/metrics/test_meter.py | 78 +++++++++++++++++++ .../opentelemetry/sdk/_metrics/__init__.py | 14 ++++ .../tests/metrics/test_metrics.py | 6 +- 4 files changed, 107 insertions(+), 6 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py index a2f430c5f7d..108df2c2b3b 100644 --- a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py @@ -132,7 +132,11 @@ def version(self): def schema_url(self): return self._schema_url - # FIXME check that the instrument name has not been used already + def _check_instrument_name(self, name): + if name in self._instrument_names: + raise Exception(f"Instrument name {name} has been used already") + + self._instrument_names.add(name) @abstractmethod def create_counter(self, name, unit="", description="") -> Counter: @@ -144,6 +148,7 @@ def create_counter(self, name, unit="", description="") -> Counter: example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ + self._check_instrument_name(name) @abstractmethod def create_up_down_counter( @@ -157,6 +162,7 @@ def create_up_down_counter( example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ + self._check_instrument_name(name) @abstractmethod def create_observable_counter( @@ -240,6 +246,7 @@ def cpu_time_callback(states_to_include: set[str]) -> Iterable[Iterable[Measurem example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ + self._check_instrument_name(name) @abstractmethod def create_histogram(self, name, unit="", description="") -> Histogram: @@ -251,6 +258,7 @@ def create_histogram(self, name, unit="", description="") -> Histogram: example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ + self._check_instrument_name(name) @abstractmethod def create_observable_gauge( @@ -268,13 +276,13 @@ def create_observable_gauge( example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ + self._check_instrument_name(name) @abstractmethod def create_observable_up_down_counter( self, name, callback, unit="", description="" ) -> ObservableUpDownCounter: - """Creates an `ObservableUpDownCounter` instrument - + """ Args: name: The name of the instrument to be created callback: A callback that returns an iterable of @@ -285,6 +293,7 @@ def create_observable_up_down_counter( example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ + self._check_instrument_name(name) class _ProxyMeter(Meter): diff --git a/opentelemetry-api/tests/metrics/test_meter.py b/opentelemetry-api/tests/metrics/test_meter.py index 6834df31f87..1477e0e98d7 100644 --- a/opentelemetry-api/tests/metrics/test_meter.py +++ b/opentelemetry-api/tests/metrics/test_meter.py @@ -14,8 +14,17 @@ # type: ignore from unittest import TestCase +from unittest.mock import Mock from opentelemetry._metrics import Meter +from opentelemetry._metrics.instrument import ( + Counter, + Histogram, + ObservableCounter, + ObservableGauge, + ObservableUpDownCounter, + UpDownCounter, +) # FIXME Test that the meter methods can be called concurrently safely. @@ -53,6 +62,75 @@ def create_observable_up_down_counter( class TestMeter(TestCase): + def test_repeated_instrument_names(self): + class TestMeter(Meter): + def create_counter(self, name, unit="", description="") -> Counter: + super().create_counter( + name, unit=unit, description=description + ) + + def create_up_down_counter( + self, name, unit="", description="" + ) -> UpDownCounter: + super().create_up_down_counter( + name, unit=unit, description=description + ) + + def create_observable_counter( + self, name, callback, unit="", description="" + ) -> ObservableCounter: + super().create_observable_up_down_counter( + name, callback, unit=unit, description=description + ) + + def create_histogram( + self, name, unit="", description="" + ) -> Histogram: + super().create_histogram( + name, unit=unit, description=description + ) + + def create_observable_gauge( + self, name, callback, unit="", description="" + ) -> ObservableGauge: + super().create_observable_gauge( + name, callback, unit=unit, description=description + ) + + def create_observable_up_down_counter( + self, name, callback, unit="", description="" + ) -> ObservableUpDownCounter: + super().create_observable_up_down_counter( + name, callback, unit=unit, description=description + ) + + try: + test_meter = TestMeter("name") + + test_meter.create_counter("counter") + test_meter.create_up_down_counter("up_down_counter") + test_meter.create_observable_counter("observable_counter", Mock()) + test_meter.create_histogram("histogram") + test_meter.create_observable_gauge("observable_gauge", Mock()) + test_meter.create_observable_up_down_counter( + "observable_up_down_counter", Mock() + ) + except Exception as error: + self.fail(f"Unexpected exception raised {error}") + + for instrument_name in [ + "counter", + "up_down_counter", + "observable_counter", + "histogram", + "observable_gauge", + "observable_up_down_counter", + ]: + with self.assertRaises(Exception): + getattr(test_meter, f"create_{instrument_name}")( + instrument_name + ) + def test_create_counter(self): """ Test that the meter provides a function to create a new Counter diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py index 8a87bb1fa2c..3fef289b7b3 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py @@ -65,6 +65,7 @@ def __init__( self._measurement_consumer = measurement_consumer def create_counter(self, name, unit=None, description=None) -> APICounter: + super().create_counter(name, unit=unit, description=description) return Counter( name, self._instrumentation_info, @@ -76,6 +77,9 @@ def create_counter(self, name, unit=None, description=None) -> APICounter: def create_up_down_counter( self, name, unit=None, description=None ) -> APIUpDownCounter: + super().create_up_down_counter( + name, unit=unit, description=description + ) return UpDownCounter( name, self._instrumentation_info, @@ -87,6 +91,9 @@ def create_up_down_counter( def create_observable_counter( self, name, callback, unit=None, description=None ) -> APIObservableCounter: + super().create_observable_counter( + name, callback, unit=unit, description=description + ) instrument = ObservableCounter( name, @@ -104,6 +111,7 @@ def create_observable_counter( def create_histogram( self, name, unit=None, description=None ) -> APIHistogram: + super().create_histogram(name, unit=unit, description=description) return Histogram( name, self._instrumentation_info, @@ -115,6 +123,9 @@ def create_histogram( def create_observable_gauge( self, name, callback, unit=None, description=None ) -> APIObservableGauge: + super().create_observable_gauge( + name, callback, unit=unit, description=description + ) instrument = ObservableGauge( name, @@ -132,6 +143,9 @@ def create_observable_gauge( def create_observable_up_down_counter( self, name, callback, unit=None, description=None ) -> APIObservableUpDownCounter: + super().create_observable_up_down_counter( + name, callback, unit=unit, description=description + ) instrument = ObservableUpDownCounter( name, diff --git a/opentelemetry-sdk/tests/metrics/test_metrics.py b/opentelemetry-sdk/tests/metrics/test_metrics.py index 07d9894c969..8d5f23c6204 100644 --- a/opentelemetry-sdk/tests/metrics/test_metrics.py +++ b/opentelemetry-sdk/tests/metrics/test_metrics.py @@ -243,17 +243,17 @@ def test_register_asynchronous_instrument( meter_provider._measurement_consumer.register_asynchronous_instrument.assert_called_with( meter_provider.get_meter("name").create_observable_counter( - "name", Mock() + "name0", Mock() ) ) meter_provider._measurement_consumer.register_asynchronous_instrument.assert_called_with( meter_provider.get_meter("name").create_observable_up_down_counter( - "name", Mock() + "name1", Mock() ) ) meter_provider._measurement_consumer.register_asynchronous_instrument.assert_called_with( meter_provider.get_meter("name").create_observable_gauge( - "name", Mock() + "name2", Mock() ) ) From ceb8cacb4057a9a813f548991fc72beff5b4599d Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Thu, 27 Jan 2022 15:02:00 -0600 Subject: [PATCH 02/15] Add repeated instrument names for SDK as well --- .../tests/metrics/test_metrics.py | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/opentelemetry-sdk/tests/metrics/test_metrics.py b/opentelemetry-sdk/tests/metrics/test_metrics.py index 8d5f23c6204..d539338d060 100644 --- a/opentelemetry-sdk/tests/metrics/test_metrics.py +++ b/opentelemetry-sdk/tests/metrics/test_metrics.py @@ -298,6 +298,32 @@ class TestMeter(TestCase): def setUp(self): self.meter = Meter(Mock(), Mock()) + def test_repeated_instrument_names(self): + try: + self.meter.create_counter("counter") + self.meter.create_up_down_counter("up_down_counter") + self.meter.create_observable_counter("observable_counter", Mock()) + self.meter.create_histogram("histogram") + self.meter.create_observable_gauge("observable_gauge", Mock()) + self.meter.create_observable_up_down_counter( + "observable_up_down_counter", Mock() + ) + except Exception as error: + self.fail(f"Unexpected exception raised {error}") + + for instrument_name in [ + "counter", + "up_down_counter", + "observable_counter", + "histogram", + "observable_gauge", + "observable_up_down_counter", + ]: + with self.assertRaises(Exception): + getattr(self.meter, f"create_{instrument_name}")( + instrument_name + ) + def test_create_counter(self): counter = self.meter.create_counter( "name", unit="unit", description="description" From dc696481a5d54bb488564cb59ed2a74006b0097e Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Fri, 28 Jan 2022 12:37:40 -0600 Subject: [PATCH 03/15] Update opentelemetry-api/src/opentelemetry/_metrics/__init__.py Co-authored-by: Srikanth Chekuri --- opentelemetry-api/src/opentelemetry/_metrics/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py index 108df2c2b3b..d2e4202c7e6 100644 --- a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py @@ -133,7 +133,7 @@ def schema_url(self): return self._schema_url def _check_instrument_name(self, name): - if name in self._instrument_names: + if name.strip().lower() in self._instrument_names: raise Exception(f"Instrument name {name} has been used already") self._instrument_names.add(name) From dd17c98ddf893197c2b3289b87e1a9d28f9ac1f8 Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Fri, 28 Jan 2022 12:41:17 -0600 Subject: [PATCH 04/15] Add instrument names lock --- opentelemetry-api/src/opentelemetry/_metrics/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py index d2e4202c7e6..44178095b42 100644 --- a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py @@ -119,6 +119,7 @@ def __init__(self, name, version=None, schema_url=None): self._version = version self._schema_url = schema_url self._instrument_names = set() + self._instrument_names_lock = Lock() @property def name(self): @@ -136,7 +137,8 @@ def _check_instrument_name(self, name): if name.strip().lower() in self._instrument_names: raise Exception(f"Instrument name {name} has been used already") - self._instrument_names.add(name) + with self._instrument_names_lock: + self._instrument_names.add(name) @abstractmethod def create_counter(self, name, unit="", description="") -> Counter: From 1f5d32c9d1d3043cdf19eb5d2cb0f5ff42a02c2b Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Wed, 23 Feb 2022 16:17:24 -0600 Subject: [PATCH 05/15] Replace raised exception for a warning --- .../src/opentelemetry/_metrics/__init__.py | 33 +++++++++++-------- opentelemetry-api/tests/metrics/test_meter.py | 14 ++++++-- .../opentelemetry/sdk/_metrics/__init__.py | 14 ++++---- .../tests/metrics/test_metrics.py | 13 ++++++-- 4 files changed, 47 insertions(+), 27 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py index 44178095b42..079172bc296 100644 --- a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py @@ -26,7 +26,7 @@ from logging import getLogger from os import environ from threading import Lock -from typing import List, Optional, cast +from typing import List, Optional, Set, cast from opentelemetry._metrics.instrument import ( Counter, @@ -118,7 +118,7 @@ def __init__(self, name, version=None, schema_url=None): self._name = name self._version = version self._schema_url = schema_url - self._instrument_names = set() + self._instrument_ids: Set[str] = set() self._instrument_names_lock = Lock() @property @@ -133,12 +133,17 @@ def version(self): def schema_url(self): return self._schema_url - def _check_instrument_name(self, name): - if name.strip().lower() in self._instrument_names: - raise Exception(f"Instrument name {name} has been used already") + def _check_instrument_name(self, name, type_, unit, description): - with self._instrument_names_lock: - self._instrument_names.add(name) + instrument_id = "".join( + [name.strip().lower(), str(type_), unit, description] + ) + + if instrument_id in self._instrument_ids: + _logger.warning("Instrument name %s has been used already", name) + else: + + self._instrument_ids.add(instrument_id) @abstractmethod def create_counter(self, name, unit="", description="") -> Counter: @@ -150,7 +155,7 @@ def create_counter(self, name, unit="", description="") -> Counter: example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ - self._check_instrument_name(name) + self._check_instrument_name(name, Counter, unit, description) @abstractmethod def create_up_down_counter( @@ -164,7 +169,7 @@ def create_up_down_counter( example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ - self._check_instrument_name(name) + self._check_instrument_name(name, UpDownCounter, unit, description) @abstractmethod def create_observable_counter( @@ -248,7 +253,7 @@ def cpu_time_callback(states_to_include: set[str]) -> Iterable[Iterable[Measurem example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ - self._check_instrument_name(name) + self._check_instrument_name(name, ObservableCounter, unit, description) @abstractmethod def create_histogram(self, name, unit="", description="") -> Histogram: @@ -260,7 +265,7 @@ def create_histogram(self, name, unit="", description="") -> Histogram: example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ - self._check_instrument_name(name) + self._check_instrument_name(name, Histogram, unit, description) @abstractmethod def create_observable_gauge( @@ -278,7 +283,7 @@ def create_observable_gauge( example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ - self._check_instrument_name(name) + self._check_instrument_name(name, ObservableGauge, unit, description) @abstractmethod def create_observable_up_down_counter( @@ -295,7 +300,9 @@ def create_observable_up_down_counter( example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ - self._check_instrument_name(name) + self._check_instrument_name( + name, ObservableUpDownCounter, unit, description + ) class _ProxyMeter(Meter): diff --git a/opentelemetry-api/tests/metrics/test_meter.py b/opentelemetry-api/tests/metrics/test_meter.py index 1477e0e98d7..5253890bdf0 100644 --- a/opentelemetry-api/tests/metrics/test_meter.py +++ b/opentelemetry-api/tests/metrics/test_meter.py @@ -13,6 +13,7 @@ # limitations under the License. # type: ignore +from logging import WARNING from unittest import TestCase from unittest.mock import Mock @@ -121,14 +122,21 @@ def create_observable_up_down_counter( for instrument_name in [ "counter", "up_down_counter", - "observable_counter", "histogram", + ]: + with self.assertLogs(level=WARNING): + getattr(test_meter, f"create_{instrument_name}")( + instrument_name + ) + + for instrument_name in [ + "observable_counter", "observable_gauge", "observable_up_down_counter", ]: - with self.assertRaises(Exception): + with self.assertLogs(level=WARNING): getattr(test_meter, f"create_{instrument_name}")( - instrument_name + instrument_name, Mock() ) def test_create_counter(self): diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py index 3fef289b7b3..591a85b02fa 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py @@ -64,7 +64,7 @@ def __init__( self._instrumentation_info = instrumentation_info self._measurement_consumer = measurement_consumer - def create_counter(self, name, unit=None, description=None) -> APICounter: + def create_counter(self, name, unit="", description="") -> APICounter: super().create_counter(name, unit=unit, description=description) return Counter( name, @@ -75,7 +75,7 @@ def create_counter(self, name, unit=None, description=None) -> APICounter: ) def create_up_down_counter( - self, name, unit=None, description=None + self, name, unit="", description="" ) -> APIUpDownCounter: super().create_up_down_counter( name, unit=unit, description=description @@ -89,7 +89,7 @@ def create_up_down_counter( ) def create_observable_counter( - self, name, callback, unit=None, description=None + self, name, callback, unit="", description="" ) -> APIObservableCounter: super().create_observable_counter( name, callback, unit=unit, description=description @@ -108,9 +108,7 @@ def create_observable_counter( return instrument - def create_histogram( - self, name, unit=None, description=None - ) -> APIHistogram: + def create_histogram(self, name, unit="", description="") -> APIHistogram: super().create_histogram(name, unit=unit, description=description) return Histogram( name, @@ -121,7 +119,7 @@ def create_histogram( ) def create_observable_gauge( - self, name, callback, unit=None, description=None + self, name, callback, unit="", description="" ) -> APIObservableGauge: super().create_observable_gauge( name, callback, unit=unit, description=description @@ -141,7 +139,7 @@ def create_observable_gauge( return instrument def create_observable_up_down_counter( - self, name, callback, unit=None, description=None + self, name, callback, unit="", description="" ) -> APIObservableUpDownCounter: super().create_observable_up_down_counter( name, callback, unit=unit, description=description diff --git a/opentelemetry-sdk/tests/metrics/test_metrics.py b/opentelemetry-sdk/tests/metrics/test_metrics.py index d539338d060..d33002c9211 100644 --- a/opentelemetry-sdk/tests/metrics/test_metrics.py +++ b/opentelemetry-sdk/tests/metrics/test_metrics.py @@ -314,14 +314,21 @@ def test_repeated_instrument_names(self): for instrument_name in [ "counter", "up_down_counter", - "observable_counter", "histogram", + ]: + with self.assertLogs(level=WARNING): + getattr(self.meter, f"create_{instrument_name}")( + instrument_name + ) + + for instrument_name in [ + "observable_counter", "observable_gauge", "observable_up_down_counter", ]: - with self.assertRaises(Exception): + with self.assertLogs(level=WARNING): getattr(self.meter, f"create_{instrument_name}")( - instrument_name + instrument_name, Mock() ) def test_create_counter(self): From 679a69e5af9959f73c0a90687ae21d4cc3d586f1 Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Thu, 3 Mar 2022 18:01:02 -0600 Subject: [PATCH 06/15] Added some fiexes --- .../src/opentelemetry/_metrics/__init__.py | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py index 079172bc296..f32277eb187 100644 --- a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py @@ -119,7 +119,7 @@ def __init__(self, name, version=None, schema_url=None): self._version = version self._schema_url = schema_url self._instrument_ids: Set[str] = set() - self._instrument_names_lock = Lock() + self._instrument_ids_lock = Lock() @property def name(self): @@ -133,17 +133,20 @@ def version(self): def schema_url(self): return self._schema_url - def _check_instrument_name(self, name, type_, unit, description): + def _check_instrument_id(self, name, type_, unit, description): instrument_id = "".join( [name.strip().lower(), str(type_), unit, description] ) if instrument_id in self._instrument_ids: - _logger.warning("Instrument name %s has been used already", name) + _logger.warning( + "Instrument id %s has been used already", instrument_id + ) else: - self._instrument_ids.add(instrument_id) + with self._instrument_ids_lock: + self._instrument_ids.add(instrument_id) @abstractmethod def create_counter(self, name, unit="", description="") -> Counter: @@ -155,7 +158,7 @@ def create_counter(self, name, unit="", description="") -> Counter: example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ - self._check_instrument_name(name, Counter, unit, description) + self._check_instrument_id(name, Counter, unit, description) @abstractmethod def create_up_down_counter( @@ -169,7 +172,7 @@ def create_up_down_counter( example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ - self._check_instrument_name(name, UpDownCounter, unit, description) + self._check_instrument_id(name, UpDownCounter, unit, description) @abstractmethod def create_observable_counter( @@ -253,7 +256,7 @@ def cpu_time_callback(states_to_include: set[str]) -> Iterable[Iterable[Measurem example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ - self._check_instrument_name(name, ObservableCounter, unit, description) + self._check_instrument_id(name, ObservableCounter, unit, description) @abstractmethod def create_histogram(self, name, unit="", description="") -> Histogram: @@ -265,7 +268,7 @@ def create_histogram(self, name, unit="", description="") -> Histogram: example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ - self._check_instrument_name(name, Histogram, unit, description) + self._check_instrument_id(name, Histogram, unit, description) @abstractmethod def create_observable_gauge( @@ -283,7 +286,7 @@ def create_observable_gauge( example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ - self._check_instrument_name(name, ObservableGauge, unit, description) + self._check_instrument_id(name, ObservableGauge, unit, description) @abstractmethod def create_observable_up_down_counter( @@ -300,7 +303,7 @@ def create_observable_up_down_counter( example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ - self._check_instrument_name( + self._check_instrument_id( name, ObservableUpDownCounter, unit, description ) From 5fb77ed8820fcf5fedb0d52015fad509ac1c042f Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Mon, 7 Mar 2022 13:44:36 -0600 Subject: [PATCH 07/15] Add double check --- opentelemetry-api/src/opentelemetry/_metrics/__init__.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py index f32277eb187..15d0b7056a5 100644 --- a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py @@ -146,7 +146,12 @@ def _check_instrument_id(self, name, type_, unit, description): else: with self._instrument_ids_lock: - self._instrument_ids.add(instrument_id) + if instrument_id in self._instrument_ids: + _logger.warning( + "Instrument id %s has been used already", instrument_id + ) + else: + self._instrument_ids.add(instrument_id) @abstractmethod def create_counter(self, name, unit="", description="") -> Counter: From 92b62dcc5b018d1f544d801d9bea5b5636b96c12 Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Mon, 7 Mar 2022 16:16:59 -0600 Subject: [PATCH 08/15] Add type annotations --- opentelemetry-api/src/opentelemetry/_metrics/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py index 15d0b7056a5..314b145062d 100644 --- a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py @@ -133,7 +133,9 @@ def version(self): def schema_url(self): return self._schema_url - def _check_instrument_id(self, name, type_, unit, description): + def _check_instrument_id( + self, name: str, type_: type, unit: str, description: str + ) -> None: instrument_id = "".join( [name.strip().lower(), str(type_), unit, description] From 723f5a1d589739e3a6b915dafe4aae7f10cf0381 Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Mon, 7 Mar 2022 16:44:05 -0600 Subject: [PATCH 09/15] Update opentelemetry-api/src/opentelemetry/_metrics/__init__.py Co-authored-by: Srikanth Chekuri --- opentelemetry-api/src/opentelemetry/_metrics/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py index 314b145062d..efaae91e4fe 100644 --- a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py @@ -137,8 +137,8 @@ def _check_instrument_id( self, name: str, type_: type, unit: str, description: str ) -> None: - instrument_id = "".join( - [name.strip().lower(), str(type_), unit, description] + instrument_id = ",".join( + [name.strip().lower(), type_.__name__, unit, description] ) if instrument_id in self._instrument_ids: From de5185160a75bd94aa257dcfe389ac508b416d4d Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Fri, 25 Mar 2022 15:13:50 -0600 Subject: [PATCH 10/15] Move check invocation to SDK --- .../src/opentelemetry/_metrics/__init__.py | 8 ------- .../opentelemetry/sdk/_metrics/__init__.py | 21 +++++++------------ 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py index efaae91e4fe..8ed6b11305e 100644 --- a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py @@ -165,7 +165,6 @@ def create_counter(self, name, unit="", description="") -> Counter: example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ - self._check_instrument_id(name, Counter, unit, description) @abstractmethod def create_up_down_counter( @@ -179,7 +178,6 @@ def create_up_down_counter( example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ - self._check_instrument_id(name, UpDownCounter, unit, description) @abstractmethod def create_observable_counter( @@ -263,7 +261,6 @@ def cpu_time_callback(states_to_include: set[str]) -> Iterable[Iterable[Measurem example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ - self._check_instrument_id(name, ObservableCounter, unit, description) @abstractmethod def create_histogram(self, name, unit="", description="") -> Histogram: @@ -275,7 +272,6 @@ def create_histogram(self, name, unit="", description="") -> Histogram: example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ - self._check_instrument_id(name, Histogram, unit, description) @abstractmethod def create_observable_gauge( @@ -293,7 +289,6 @@ def create_observable_gauge( example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ - self._check_instrument_id(name, ObservableGauge, unit, description) @abstractmethod def create_observable_up_down_counter( @@ -310,9 +305,6 @@ def create_observable_up_down_counter( example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ - self._check_instrument_id( - name, ObservableUpDownCounter, unit, description - ) class _ProxyMeter(Meter): diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py index 591a85b02fa..3afa85c1179 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py @@ -65,7 +65,7 @@ def __init__( self._measurement_consumer = measurement_consumer def create_counter(self, name, unit="", description="") -> APICounter: - super().create_counter(name, unit=unit, description=description) + self._check_instrument_id(name, Counter, unit, description) return Counter( name, self._instrumentation_info, @@ -77,9 +77,7 @@ def create_counter(self, name, unit="", description="") -> APICounter: def create_up_down_counter( self, name, unit="", description="" ) -> APIUpDownCounter: - super().create_up_down_counter( - name, unit=unit, description=description - ) + self._check_instrument_id(name, UpDownCounter, unit, description) return UpDownCounter( name, self._instrumentation_info, @@ -91,10 +89,7 @@ def create_up_down_counter( def create_observable_counter( self, name, callback, unit="", description="" ) -> APIObservableCounter: - super().create_observable_counter( - name, callback, unit=unit, description=description - ) - + self._check_instrument_id(name, ObservableCounter, unit, description) instrument = ObservableCounter( name, self._instrumentation_info, @@ -109,7 +104,7 @@ def create_observable_counter( return instrument def create_histogram(self, name, unit="", description="") -> APIHistogram: - super().create_histogram(name, unit=unit, description=description) + self._check_instrument_id(name, Histogram, unit, description) return Histogram( name, self._instrumentation_info, @@ -121,9 +116,7 @@ def create_histogram(self, name, unit="", description="") -> APIHistogram: def create_observable_gauge( self, name, callback, unit="", description="" ) -> APIObservableGauge: - super().create_observable_gauge( - name, callback, unit=unit, description=description - ) + self._check_instrument_id(name, ObservableGauge, unit, description) instrument = ObservableGauge( name, @@ -141,8 +134,8 @@ def create_observable_gauge( def create_observable_up_down_counter( self, name, callback, unit="", description="" ) -> APIObservableUpDownCounter: - super().create_observable_up_down_counter( - name, callback, unit=unit, description=description + self._check_instrument_id( + name, ObservableUpDownCounter, unit, description ) instrument = ObservableUpDownCounter( From 1e9d61572ad93d37d493d111853c9915d9557e91 Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Fri, 25 Mar 2022 15:33:32 -0600 Subject: [PATCH 11/15] Fix lint --- opentelemetry-api/tests/metrics/test_meter.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/opentelemetry-api/tests/metrics/test_meter.py b/opentelemetry-api/tests/metrics/test_meter.py index 5253890bdf0..092bd62cc81 100644 --- a/opentelemetry-api/tests/metrics/test_meter.py +++ b/opentelemetry-api/tests/metrics/test_meter.py @@ -66,6 +66,7 @@ class TestMeter(TestCase): def test_repeated_instrument_names(self): class TestMeter(Meter): def create_counter(self, name, unit="", description="") -> Counter: + self._check_instrument_id(name, Counter, unit, description) super().create_counter( name, unit=unit, description=description ) @@ -73,6 +74,9 @@ def create_counter(self, name, unit="", description="") -> Counter: def create_up_down_counter( self, name, unit="", description="" ) -> UpDownCounter: + self._check_instrument_id( + name, UpDownCounter, unit, description + ) super().create_up_down_counter( name, unit=unit, description=description ) @@ -80,6 +84,9 @@ def create_up_down_counter( def create_observable_counter( self, name, callback, unit="", description="" ) -> ObservableCounter: + self._check_instrument_id( + name, ObservableCounter, unit, description + ) super().create_observable_up_down_counter( name, callback, unit=unit, description=description ) @@ -87,6 +94,7 @@ def create_observable_counter( def create_histogram( self, name, unit="", description="" ) -> Histogram: + self._check_instrument_id(name, Histogram, unit, description) super().create_histogram( name, unit=unit, description=description ) @@ -94,6 +102,9 @@ def create_histogram( def create_observable_gauge( self, name, callback, unit="", description="" ) -> ObservableGauge: + self._check_instrument_id( + name, ObservableGauge, unit, description + ) super().create_observable_gauge( name, callback, unit=unit, description=description ) @@ -101,6 +112,9 @@ def create_observable_gauge( def create_observable_up_down_counter( self, name, callback, unit="", description="" ) -> ObservableUpDownCounter: + self._check_instrument_id( + name, ObservableUpDownCounter, unit, description + ) super().create_observable_up_down_counter( name, callback, unit=unit, description=description ) From eadbd18fde7b296430449bf829acb484159890ff Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Tue, 12 Apr 2022 14:31:22 -0600 Subject: [PATCH 12/15] Separate instrument checking from warning logging --- .../src/opentelemetry/_metrics/__init__.py | 90 ++++++++++++++++--- opentelemetry-api/tests/metrics/test_meter.py | 66 +------------- .../opentelemetry/sdk/_metrics/__init__.py | 86 ++++++++++++++++-- 3 files changed, 158 insertions(+), 84 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py index 8ed6b11305e..f879a70f75e 100644 --- a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py @@ -135,25 +135,25 @@ def schema_url(self): def _check_instrument_id( self, name: str, type_: type, unit: str, description: str - ) -> None: + ) -> bool: + """ + Check if an instrument with the same name, type, unit and description + has been registered already. + """ + + result = False instrument_id = ",".join( [name.strip().lower(), type_.__name__, unit, description] ) - if instrument_id in self._instrument_ids: - _logger.warning( - "Instrument id %s has been used already", instrument_id - ) - else: + with self._instrument_ids_lock: + if instrument_id in self._instrument_ids: + result = True + else: + self._instrument_ids.add(instrument_id) - with self._instrument_ids_lock: - if instrument_id in self._instrument_ids: - _logger.warning( - "Instrument id %s has been used already", instrument_id - ) - else: - self._instrument_ids.add(instrument_id) + return result @abstractmethod def create_counter(self, name, unit="", description="") -> Counter: @@ -421,6 +421,15 @@ class NoOpMeter(Meter): def create_counter(self, name, unit="", description="") -> Counter: """Returns a no-op Counter.""" super().create_counter(name, unit=unit, description=description) + if self._check_instrument_id(name, DefaultCounter, unit, description): + _logger.warning( + "An instrument with name %s, type %s, unit %s and " + "description %s has been created already.", + name, + DefaultCounter.__name__, + unit, + description, + ) return DefaultCounter(name, unit=unit, description=description) def create_up_down_counter( @@ -430,6 +439,17 @@ def create_up_down_counter( super().create_up_down_counter( name, unit=unit, description=description ) + if self._check_instrument_id( + name, DefaultUpDownCounter, unit, description + ): + _logger.warning( + "An instrument with name %s, type %s, unit %s and " + "description %s has been created already.", + name, + DefaultUpDownCounter.__name__, + unit, + description, + ) return DefaultUpDownCounter(name, unit=unit, description=description) def create_observable_counter( @@ -439,6 +459,17 @@ def create_observable_counter( super().create_observable_counter( name, callback, unit=unit, description=description ) + if self._check_instrument_id( + name, DefaultObservableCounter, unit, description + ): + _logger.warning( + "An instrument with name %s, type %s, unit %s and " + "description %s has been created already.", + name, + DefaultObservableCounter.__name__, + unit, + description, + ) return DefaultObservableCounter( name, callback, @@ -449,6 +480,17 @@ def create_observable_counter( def create_histogram(self, name, unit="", description="") -> Histogram: """Returns a no-op Histogram.""" super().create_histogram(name, unit=unit, description=description) + if self._check_instrument_id( + name, DefaultHistogram, unit, description + ): + _logger.warning( + "An instrument with name %s, type %s, unit %s and " + "description %s has been created already.", + name, + DefaultHistogram.__name__, + unit, + description, + ) return DefaultHistogram(name, unit=unit, description=description) def create_observable_gauge( @@ -458,6 +500,17 @@ def create_observable_gauge( super().create_observable_gauge( name, callback, unit=unit, description=description ) + if self._check_instrument_id( + name, DefaultObservableGauge, unit, description + ): + _logger.warning( + "An instrument with name %s, type %s, unit %s and " + "description %s has been created already.", + name, + DefaultObservableGauge.__name__, + unit, + description, + ) return DefaultObservableGauge( name, callback, @@ -472,6 +525,17 @@ def create_observable_up_down_counter( super().create_observable_up_down_counter( name, callback, unit=unit, description=description ) + if self._check_instrument_id( + name, DefaultObservableUpDownCounter, unit, description + ): + _logger.warning( + "An instrument with name %s, type %s, unit %s and " + "description %s has been created already.", + name, + DefaultObservableUpDownCounter.__name__, + unit, + description, + ) return DefaultObservableUpDownCounter( name, callback, diff --git a/opentelemetry-api/tests/metrics/test_meter.py b/opentelemetry-api/tests/metrics/test_meter.py index 092bd62cc81..3b7f702dfba 100644 --- a/opentelemetry-api/tests/metrics/test_meter.py +++ b/opentelemetry-api/tests/metrics/test_meter.py @@ -17,15 +17,7 @@ from unittest import TestCase from unittest.mock import Mock -from opentelemetry._metrics import Meter -from opentelemetry._metrics.instrument import ( - Counter, - Histogram, - ObservableCounter, - ObservableGauge, - ObservableUpDownCounter, - UpDownCounter, -) +from opentelemetry._metrics import Meter, NoOpMeter # FIXME Test that the meter methods can be called concurrently safely. @@ -64,63 +56,9 @@ def create_observable_up_down_counter( class TestMeter(TestCase): def test_repeated_instrument_names(self): - class TestMeter(Meter): - def create_counter(self, name, unit="", description="") -> Counter: - self._check_instrument_id(name, Counter, unit, description) - super().create_counter( - name, unit=unit, description=description - ) - - def create_up_down_counter( - self, name, unit="", description="" - ) -> UpDownCounter: - self._check_instrument_id( - name, UpDownCounter, unit, description - ) - super().create_up_down_counter( - name, unit=unit, description=description - ) - - def create_observable_counter( - self, name, callback, unit="", description="" - ) -> ObservableCounter: - self._check_instrument_id( - name, ObservableCounter, unit, description - ) - super().create_observable_up_down_counter( - name, callback, unit=unit, description=description - ) - - def create_histogram( - self, name, unit="", description="" - ) -> Histogram: - self._check_instrument_id(name, Histogram, unit, description) - super().create_histogram( - name, unit=unit, description=description - ) - - def create_observable_gauge( - self, name, callback, unit="", description="" - ) -> ObservableGauge: - self._check_instrument_id( - name, ObservableGauge, unit, description - ) - super().create_observable_gauge( - name, callback, unit=unit, description=description - ) - - def create_observable_up_down_counter( - self, name, callback, unit="", description="" - ) -> ObservableUpDownCounter: - self._check_instrument_id( - name, ObservableUpDownCounter, unit, description - ) - super().create_observable_up_down_counter( - name, callback, unit=unit, description=description - ) try: - test_meter = TestMeter("name") + test_meter = NoOpMeter("name") test_meter.create_counter("counter") test_meter.create_up_down_counter("up_down_counter") diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py index 3afa85c1179..33a2bfbb7a9 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py @@ -65,7 +65,19 @@ def __init__( self._measurement_consumer = measurement_consumer def create_counter(self, name, unit="", description="") -> APICounter: - self._check_instrument_id(name, Counter, unit, description) + if self._check_instrument_id(name, Counter, unit, description): + # FIXME #2558 go through all views here and check if this + # instrument registration conflict can be fixed. If it can be, do + # not log the following warning. + _logger.warning( + "An instrument with name %s, type %s, unit %s and " + "description %s has been created already.", + name, + Counter.__name__, + unit, + description, + ) + return Counter( name, self._instrumentation_info, @@ -77,7 +89,19 @@ def create_counter(self, name, unit="", description="") -> APICounter: def create_up_down_counter( self, name, unit="", description="" ) -> APIUpDownCounter: - self._check_instrument_id(name, UpDownCounter, unit, description) + if self._check_instrument_id(name, UpDownCounter, unit, description): + # FIXME #2558 go through all views here and check if this + # instrument registration conflict can be fixed. If it can be, do + # not log the following warning. + _logger.warning( + "An instrument with name %s, type %s, unit %s and " + "description %s has been created already.", + name, + UpDownCounter.__name__, + unit, + description, + ) + return UpDownCounter( name, self._instrumentation_info, @@ -89,7 +113,20 @@ def create_up_down_counter( def create_observable_counter( self, name, callback, unit="", description="" ) -> APIObservableCounter: - self._check_instrument_id(name, ObservableCounter, unit, description) + if self._check_instrument_id( + name, ObservableCounter, unit, description + ): + # FIXME #2558 go through all views here and check if this + # instrument registration conflict can be fixed. If it can be, do + # not log the following warning. + _logger.warning( + "An instrument with name %s, type %s, unit %s and " + "description %s has been created already.", + name, + ObservableCounter.__name__, + unit, + description, + ) instrument = ObservableCounter( name, self._instrumentation_info, @@ -104,7 +141,18 @@ def create_observable_counter( return instrument def create_histogram(self, name, unit="", description="") -> APIHistogram: - self._check_instrument_id(name, Histogram, unit, description) + if self._check_instrument_id(name, Histogram, unit, description): + # FIXME #2558 go through all views here and check if this + # instrument registration conflict can be fixed. If it can be, do + # not log the following warning. + _logger.warning( + "An instrument with name %s, type %s, unit %s and " + "description %s has been created already.", + name, + Histogram.__name__, + unit, + description, + ) return Histogram( name, self._instrumentation_info, @@ -116,7 +164,18 @@ def create_histogram(self, name, unit="", description="") -> APIHistogram: def create_observable_gauge( self, name, callback, unit="", description="" ) -> APIObservableGauge: - self._check_instrument_id(name, ObservableGauge, unit, description) + if self._check_instrument_id(name, ObservableGauge, unit, description): + # FIXME #2558 go through all views here and check if this + # instrument registration conflict can be fixed. If it can be, do + # not log the following warning. + _logger.warning( + "An instrument with name %s, type %s, unit %s and " + "description %s has been created already.", + name, + ObservableGauge.__name__, + unit, + description, + ) instrument = ObservableGauge( name, @@ -134,9 +193,20 @@ def create_observable_gauge( def create_observable_up_down_counter( self, name, callback, unit="", description="" ) -> APIObservableUpDownCounter: - self._check_instrument_id( + if self._check_instrument_id( name, ObservableUpDownCounter, unit, description - ) + ): + # FIXME #2558 go through all views here and check if this + # instrument registration conflict can be fixed. If it can be, do + # not log the following warning. + _logger.warning( + "An instrument with name %s, type %s, unit %s and " + "description %s has been created already.", + name, + ObservableUpDownCounter.__name__, + unit, + description, + ) instrument = ObservableUpDownCounter( name, @@ -285,6 +355,8 @@ def get_meter( info = InstrumentationInfo(name, version, schema_url) with self._meter_lock: if not self._meters.get(info): + # FIXME #2558 pass SDKConfig object to meter so that the meter + # has access to views. self._meters[info] = Meter( info, self._measurement_consumer, From 006457646d21bde4d997c28191911051b616038d Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Tue, 12 Apr 2022 15:04:09 -0600 Subject: [PATCH 13/15] Use consistent class --- .../src/opentelemetry/_metrics/__init__.py | 12 ++++++------ .../src/opentelemetry/sdk/_metrics/__init__.py | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py index f879a70f75e..410c6ca6b17 100644 --- a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py @@ -426,7 +426,7 @@ def create_counter(self, name, unit="", description="") -> Counter: "An instrument with name %s, type %s, unit %s and " "description %s has been created already.", name, - DefaultCounter.__name__, + Counter.__name__, unit, description, ) @@ -446,7 +446,7 @@ def create_up_down_counter( "An instrument with name %s, type %s, unit %s and " "description %s has been created already.", name, - DefaultUpDownCounter.__name__, + UpDownCounter.__name__, unit, description, ) @@ -466,7 +466,7 @@ def create_observable_counter( "An instrument with name %s, type %s, unit %s and " "description %s has been created already.", name, - DefaultObservableCounter.__name__, + ObservableCounter.__name__, unit, description, ) @@ -487,7 +487,7 @@ def create_histogram(self, name, unit="", description="") -> Histogram: "An instrument with name %s, type %s, unit %s and " "description %s has been created already.", name, - DefaultHistogram.__name__, + Histogram.__name__, unit, description, ) @@ -507,7 +507,7 @@ def create_observable_gauge( "An instrument with name %s, type %s, unit %s and " "description %s has been created already.", name, - DefaultObservableGauge.__name__, + ObservableGauge.__name__, unit, description, ) @@ -532,7 +532,7 @@ def create_observable_up_down_counter( "An instrument with name %s, type %s, unit %s and " "description %s has been created already.", name, - DefaultObservableUpDownCounter.__name__, + ObservableUpDownCounter.__name__, unit, description, ) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py index 33a2bfbb7a9..fc71a15cf7b 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/__init__.py @@ -73,7 +73,7 @@ def create_counter(self, name, unit="", description="") -> APICounter: "An instrument with name %s, type %s, unit %s and " "description %s has been created already.", name, - Counter.__name__, + APICounter.__name__, unit, description, ) @@ -97,7 +97,7 @@ def create_up_down_counter( "An instrument with name %s, type %s, unit %s and " "description %s has been created already.", name, - UpDownCounter.__name__, + APIUpDownCounter.__name__, unit, description, ) @@ -123,7 +123,7 @@ def create_observable_counter( "An instrument with name %s, type %s, unit %s and " "description %s has been created already.", name, - ObservableCounter.__name__, + APIObservableCounter.__name__, unit, description, ) @@ -149,7 +149,7 @@ def create_histogram(self, name, unit="", description="") -> APIHistogram: "An instrument with name %s, type %s, unit %s and " "description %s has been created already.", name, - Histogram.__name__, + APIHistogram.__name__, unit, description, ) @@ -172,7 +172,7 @@ def create_observable_gauge( "An instrument with name %s, type %s, unit %s and " "description %s has been created already.", name, - ObservableGauge.__name__, + APIObservableGauge.__name__, unit, description, ) @@ -203,7 +203,7 @@ def create_observable_up_down_counter( "An instrument with name %s, type %s, unit %s and " "description %s has been created already.", name, - ObservableUpDownCounter.__name__, + APIObservableUpDownCounter.__name__, unit, description, ) From 4b6d26e2776787e45c930d53fecc9895510a3003 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Tue, 12 Apr 2022 11:07:21 -0700 Subject: [PATCH 14/15] Fix typo in example (#2597) --- opentelemetry-api/src/opentelemetry/propagate/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/propagate/__init__.py b/opentelemetry-api/src/opentelemetry/propagate/__init__.py index 2963ee6c2e5..5493c5f0882 100644 --- a/opentelemetry-api/src/opentelemetry/propagate/__init__.py +++ b/opentelemetry-api/src/opentelemetry/propagate/__init__.py @@ -34,10 +34,10 @@ import flask import requests - from opentelemetry import propagators + from opentelemetry import propagate - PROPAGATOR = propagators.get_global_textmap() + PROPAGATOR = propagate.get_global_textmap() def get_header_from_flask_request(request, key): From 5a63698e71b77a5d37e997ca7fb81b8cae65df70 Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Tue, 12 Apr 2022 15:13:20 -0600 Subject: [PATCH 15/15] Fix docs --- opentelemetry-api/src/opentelemetry/_metrics/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py index 410c6ca6b17..b3a2ee5563c 100644 --- a/opentelemetry-api/src/opentelemetry/_metrics/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_metrics/__init__.py @@ -294,7 +294,8 @@ def create_observable_gauge( def create_observable_up_down_counter( self, name, callback, unit="", description="" ) -> ObservableUpDownCounter: - """ + """Creates an `ObservableUpDownCounter` instrument + Args: name: The name of the instrument to be created callback: A callback that returns an iterable of