Skip to content

Commit

Permalink
Fix open-telemetry#3695: add attributes to get_meter fn and Instrumen…
Browse files Browse the repository at this point in the history
…tationScope
  • Loading branch information
vivek378521 committed Jul 2, 2024
1 parent 38d2587 commit 34da3d5
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -518,6 +518,7 @@ def get_meter(
name: str,
version: Optional[str] = None,
schema_url: Optional[str] = None,
attributes: Optional[dict] = None,
) -> Meter:

if self._disabled:
Expand All @@ -534,7 +535,7 @@ def get_meter(
_logger.warning("Meter name cannot be None or empty.")
return NoOpMeter(name, version=version, schema_url=schema_url)

info = InstrumentationScope(name, version, schema_url)
info = InstrumentationScope(name, version, schema_url, attributes)
with self._meter_lock:
if not self._meters.get(info):
# FIXME #2558 pass SDKConfig object to meter so that the meter
Expand Down
27 changes: 23 additions & 4 deletions opentelemetry-sdk/src/opentelemetry/sdk/util/instrumentation.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,42 +82,56 @@ class InstrumentationScope:
properties.
"""

__slots__ = ("_name", "_version", "_schema_url")
__slots__ = ("_name", "_version", "_schema_url", "_attributes")

def __init__(
self,
name: str,
version: Optional[str] = None,
schema_url: Optional[str] = None,
attributes: Optional[dict] = None,
) -> None:
self._name = name
self._version = version
if schema_url is None:
schema_url = ""
self._schema_url = schema_url
self._attributes = attributes

def __repr__(self) -> str:
return f"{type(self).__name__}({self._name}, {self._version}, {self._schema_url})"
return f"{type(self).__name__}({self._name}, {self._version}, {self._schema_url}, {self._attributes})"

def __hash__(self) -> int:
return hash((self._name, self._version, self._schema_url))

def __eq__(self, value: object) -> bool:
if not isinstance(value, InstrumentationScope):
return NotImplemented
return (self._name, self._version, self._schema_url) == (
return (
self._name,
self._version,
self._schema_url,
self._attributes,
) == (
value._name,
value._version,
value._schema_url,
value._attributes,
)

def __lt__(self, value: object) -> bool:
if not isinstance(value, InstrumentationScope):
return NotImplemented
return (self._name, self._version, self._schema_url) < (
return (
self._name,
self._version,
self._schema_url,
self._attributes,
) < (
value._name,
value._version,
value._schema_url,
value._attributes,
)

@property
Expand All @@ -132,12 +146,17 @@ def version(self) -> Optional[str]:
def name(self) -> str:
return self._name

@property
def attributes(self) -> Optional[dict]:
return self._attributes

def to_json(self, indent=4) -> str:
return dumps(
{
"name": self._name,
"version": self._version,
"schema_url": self._schema_url,
"attributes": self._attributes,
},
indent=indent,
)
25 changes: 25 additions & 0 deletions opentelemetry-sdk/tests/metrics/test_metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,11 +126,36 @@ def test_get_meter(self):
"name",
version="version",
schema_url="schema_url",
attributes={"key": "value"},
)

self.assertEqual(meter._instrumentation_scope.name, "name")
self.assertEqual(meter._instrumentation_scope.version, "version")
self.assertEqual(meter._instrumentation_scope.schema_url, "schema_url")
self.assertEqual(
meter._instrumentation_scope.attributes, {"key": "value"}
)

def test_get_meter_attributes(self):
"""
`MeterProvider.get_meter` arguments are used to create an
`InstrumentationScope` object on the created `Meter`.
"""

meter = MeterProvider().get_meter(
"name",
version="version",
schema_url="schema_url",
attributes={"key": "value", "key2": 5, "key3": "value3"},
)

self.assertEqual(meter._instrumentation_scope.name, "name")
self.assertEqual(meter._instrumentation_scope.version, "version")
self.assertEqual(meter._instrumentation_scope.schema_url, "schema_url")
self.assertEqual(
meter._instrumentation_scope.attributes,
{"key": "value", "key2": 5, "key3": "value3"},
)

def test_get_meter_empty(self):
"""
Expand Down
4 changes: 2 additions & 2 deletions opentelemetry-sdk/tests/metrics/test_point.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ def setUpClass(cls):
metrics=[cls.metric_0, cls.metric_1, cls.metric_2],
schema_url="schema_url_0",
)
cls.scope_metrics_0_str = f'{{"scope": {{"name": "name_0", "version": "version_0", "schema_url": "schema_url_0"}}, "metrics": [{cls.metric_0_str}, {cls.metric_1_str}, {cls.metric_2_str}], "schema_url": "schema_url_0"}}'
cls.scope_metrics_0_str = f'{{"scope": {{"name": "name_0", "version": "version_0", "schema_url": "schema_url_0", "attributes": null}}, "metrics": [{cls.metric_0_str}, {cls.metric_1_str}, {cls.metric_2_str}], "schema_url": "schema_url_0"}}'

cls.scope_metrics_1 = ScopeMetrics(
scope=InstrumentationScope(
Expand All @@ -189,7 +189,7 @@ def setUpClass(cls):
metrics=[cls.metric_0, cls.metric_1, cls.metric_2],
schema_url="schema_url_1",
)
cls.scope_metrics_1_str = f'{{"scope": {{"name": "name_1", "version": "version_1", "schema_url": "schema_url_1"}}, "metrics": [{cls.metric_0_str}, {cls.metric_1_str}, {cls.metric_2_str}], "schema_url": "schema_url_1"}}'
cls.scope_metrics_1_str = f'{{"scope": {{"name": "name_1", "version": "version_1", "schema_url": "schema_url_1", "attributes": null}}, "metrics": [{cls.metric_0_str}, {cls.metric_1_str}, {cls.metric_2_str}], "schema_url": "schema_url_1"}}'

cls.resource_metrics_0 = ResourceMetrics(
resource=Resource(
Expand Down

0 comments on commit 34da3d5

Please sign in to comment.