From 9d66aa5df185eaf9c793b2a21f203226459451c2 Mon Sep 17 00:00:00 2001 From: Michele Mancioppi Date: Wed, 4 May 2022 16:29:53 +0200 Subject: [PATCH 1/3] Implement 'process.runtime.*' attributes for resources Implement support for the the 'process.runtime.name', 'process.runtime.version' and 'process.runtime.description' through the 'opentelemetry.sdk.resources.ProcessResourceDetector' as specified in the resource semantic conventions for processes. --- CHANGELOG.md | 4 ++++ .../opentelemetry/sdk/resources/__init__.py | 22 +++++++++++++++++++ .../tests/resources/test_resources.py | 19 ++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fc3201cf8c2..8bfc60619de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#2653](https://github.com/open-telemetry/opentelemetry-python/pull/2653)) - Add variadic arguments to metric exporter/reader interfaces ([#2654](https://github.com/open-telemetry/opentelemetry-python/pull/2654)) +- Added a `opentelemetry.sdk.resources.ProcessResourceDetector` that adds the + 'process.runtime.{name,version,description}' resource attributes when used + with the `opentelemetry.sdk.resources.get_aggregated_resources` API + ([#2660](https://github.com/open-telemetry/opentelemetry-python/pull/2660)) - Move Metrics API behind internal package ([#2651](https://github.com/open-telemetry/opentelemetry-python/pull/2651)) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py index d32d9438293..ce0abd4c4d4 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py @@ -59,6 +59,7 @@ import concurrent.futures import logging import os +import sys import typing from json import dumps @@ -286,6 +287,27 @@ def detect(self) -> "Resource": return Resource(env_resource_map) +class ProcessResourceDetector(ResourceDetector): + # pylint: disable=no-self-use + def detect(self) -> "Resource": + _runtime_version = ".".join( + map( + str, + sys.version_info[:3] + if sys.version_info.releaselevel == "final" and not sys.version_info.serial + else sys.version_info + ) + ) + + return Resource( + { + PROCESS_RUNTIME_DESCRIPTION: sys.version, + PROCESS_RUNTIME_NAME: sys.implementation.name, + PROCESS_RUNTIME_VERSION: _runtime_version, + } + ) + + def get_aggregated_resources( detectors: typing.List["ResourceDetector"], initial_resource: typing.Optional[Resource] = None, diff --git a/opentelemetry-sdk/tests/resources/test_resources.py b/opentelemetry-sdk/tests/resources/test_resources.py index ae3e34f9f00..2d584981e62 100644 --- a/opentelemetry-sdk/tests/resources/test_resources.py +++ b/opentelemetry-sdk/tests/resources/test_resources.py @@ -516,3 +516,22 @@ def test_service_name_env_precedence(self): detector.detect(), resources.Resource({"service.name": "from-service-name"}), ) + + def test_process_detector(self): + initial_resource = resources.Resource({"foo": "bar"}) + aggregated_resource = resources.get_aggregated_resources( + [resources.ProcessResourceDetector()], initial_resource + ) + + self.assertIn( + resources.PROCESS_RUNTIME_NAME, + aggregated_resource.attributes.keys(), + ) + self.assertIn( + resources.PROCESS_RUNTIME_DESCRIPTION, + aggregated_resource.attributes.keys(), + ) + self.assertIn( + resources.PROCESS_RUNTIME_VERSION, + aggregated_resource.attributes.keys(), + ) From 4c5a6b4903e74e91cf3573898b828e09f39a65a2 Mon Sep 17 00:00:00 2001 From: Michele Mancioppi Date: Mon, 9 May 2022 17:47:05 +0200 Subject: [PATCH 2/3] Appease the linter --- opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py index ce0abd4c4d4..80cbe2747fa 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py @@ -294,7 +294,8 @@ def detect(self) -> "Resource": map( str, sys.version_info[:3] - if sys.version_info.releaselevel == "final" and not sys.version_info.serial + if sys.version_info.releaselevel == "final" + and not sys.version_info.serial else sys.version_info ) ) From f74043fc28fdfe81ad6e0acb64c682b379798d4d Mon Sep 17 00:00:00 2001 From: Michele Mancioppi Date: Mon, 9 May 2022 20:15:18 +0200 Subject: [PATCH 3/3] More linter appeasement --- opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py index 80cbe2747fa..d99f097b389 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py @@ -296,7 +296,7 @@ def detect(self) -> "Resource": sys.version_info[:3] if sys.version_info.releaselevel == "final" and not sys.version_info.serial - else sys.version_info + else sys.version_info, ) )