From 1d3c268e2d69ae148ffeaf3a7e891e29b877b919 Mon Sep 17 00:00:00 2001 From: sroda Date: Sun, 11 Jun 2023 09:01:51 +0300 Subject: [PATCH 1/3] Add unit to view instrument selection criteria --- .../src/opentelemetry/sdk/metrics/_internal/view.py | 7 +++++++ opentelemetry-sdk/tests/metrics/test_view.py | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py index b930c7a9660..82ebecbcdf4 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py @@ -85,6 +85,7 @@ def __init__( self, instrument_type: Optional[Type[Instrument]] = None, instrument_name: Optional[str] = None, + instrument_unit: Optional[str] = None, meter_name: Optional[str] = None, meter_version: Optional[str] = None, meter_schema_url: Optional[str] = None, @@ -96,6 +97,7 @@ def __init__( if ( instrument_type is instrument_name + is instrument_unit is meter_name is meter_version is meter_schema_url @@ -122,6 +124,7 @@ def __init__( self._name = name self._instrument_type = instrument_type self._instrument_name = instrument_name + self._instrument_unit = instrument_unit self._meter_name = meter_name self._meter_version = meter_version self._meter_schema_url = meter_schema_url @@ -143,6 +146,10 @@ def _match(self, instrument: Instrument) -> bool: if not fnmatch(instrument.name, self._instrument_name): return False + if self._instrument_unit is not None: + if not fnmatch(instrument.unit, self._instrument_unit): + return False + if self._meter_name is not None: if instrument.instrumentation_scope.name != self._meter_name: return False diff --git a/opentelemetry-sdk/tests/metrics/test_view.py b/opentelemetry-sdk/tests/metrics/test_view.py index 2d1fee490f7..00376a0068b 100644 --- a/opentelemetry-sdk/tests/metrics/test_view.py +++ b/opentelemetry-sdk/tests/metrics/test_view.py @@ -37,6 +37,15 @@ def test_instrument_name(self): View(instrument_name="instrument_name")._match(mock_instrument) ) + def test_instrument_unit(self): + + mock_instrument = Mock() + mock_instrument.configure_mock(**{"unit": "instrument_unit"}) + + self.assertTrue( + View(instrument_unit="instrument_unit")._match(mock_instrument) + ) + def test_meter_name(self): self.assertTrue( From 5dc8f4bd6fb3f59ee45fc4dcab4b1bd404154c7a Mon Sep 17 00:00:00 2001 From: sroda Date: Sun, 11 Jun 2023 11:00:25 +0300 Subject: [PATCH 2/3] Add an entry for changelog --- CHANGELOG.md | 3 +++ .../src/opentelemetry/sdk/metrics/_internal/view.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ce6fc42516..5d80dc65d76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased - Use BoundedAttributes instead of raw dict to extract attributes from LogRecord and Support dropped_attributes_count in LogRecord ([#3310](https://github.com/open-telemetry/opentelemetry-python/pull/3310)) +- Add unit to view instrument selection criteria + ([#3341](https://github.com/open-telemetry/opentelemetry-python/pull/3341)) + ## Version 1.18.0/0.39b0 (2023-05-04) - Select histogram aggregation with an environment variable diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py index 82ebecbcdf4..210713e7ab3 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py @@ -51,6 +51,9 @@ class View: card characters should not be used with this attribute if the view has also a ``name`` defined. + instrument_unit: This is an instrument matching attribute: the unit the + instrument must have to match the view. + meter_name: This is an instrument matching attribute: the name the instrument meter must have to match the view. From fe3c7844fc024c948d7dc50c69dd9c2aab0b0748 Mon Sep 17 00:00:00 2001 From: sroda Date: Mon, 12 Jun 2023 00:29:37 +0300 Subject: [PATCH 3/3] Fix after CR --- .../src/opentelemetry/sdk/metrics/_internal/view.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py index 210713e7ab3..28f7b4fe087 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py @@ -51,9 +51,6 @@ class View: card characters should not be used with this attribute if the view has also a ``name`` defined. - instrument_unit: This is an instrument matching attribute: the unit the - instrument must have to match the view. - meter_name: This is an instrument matching attribute: the name the instrument meter must have to match the view. @@ -79,6 +76,9 @@ class View: corresponding metrics stream. If `None` an instance of `DefaultAggregation` will be used. + instrument_unit: This is an instrument matching attribute: the unit the + instrument must have to match the view. + This class is not intended to be subclassed by the user. """ @@ -88,7 +88,6 @@ def __init__( self, instrument_type: Optional[Type[Instrument]] = None, instrument_name: Optional[str] = None, - instrument_unit: Optional[str] = None, meter_name: Optional[str] = None, meter_version: Optional[str] = None, meter_schema_url: Optional[str] = None, @@ -96,6 +95,7 @@ def __init__( description: Optional[str] = None, attribute_keys: Optional[Set[str]] = None, aggregation: Optional[Aggregation] = None, + instrument_unit: Optional[str] = None, ): if ( instrument_type