From f8b865c3f0c333353c56e9561be57bca925bd808 Mon Sep 17 00:00:00 2001 From: Riccardo Magliocchetti Date: Mon, 23 Dec 2024 16:35:52 +0100 Subject: [PATCH 1/4] opentelemetry-sdk: clarify Resource.create usage After #3181 ResourceDetector instances cannot call Resource.create otherwise when using auto-instrumentation you'll go into an infinite loop trying to load resource detectors. --- .../src/opentelemetry/sdk/resources/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py index a52573ac1c9..4f6e432e2cf 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py @@ -23,7 +23,8 @@ these attributes can be included in the Resource.* Resource objects are created with `Resource.create`, which accepts attributes -(key-values). Resources should NOT be created via constructor, and working with +(key-values). Resources should NOT be created via constructor yet ResourceDetector +instance can't use `Resource.create` to avoid infinite loops. Working with `Resource` objects should only be done via the Resource API methods. Resource attributes can also be passed at process invocation in the :envvar:`OTEL_RESOURCE_ATTRIBUTES` environment variable. You should register @@ -175,6 +176,8 @@ def create( ) -> "Resource": """Creates a new `Resource` from attributes. + This is supposed to be called by the SDK and not by ResourceDetector instances. + Args: attributes: Optional zero or more key-value pairs. schema_url: Optional URL pointing to the schema From 2c75e8e1ecee2855a070e93255daef7e809c50b5 Mon Sep 17 00:00:00 2001 From: Riccardo Magliocchetti Date: Mon, 23 Dec 2024 17:32:33 +0100 Subject: [PATCH 2/4] Update opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py Co-authored-by: Aaron Abbott --- opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py index 4f6e432e2cf..dd22ad3c437 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py @@ -23,8 +23,8 @@ these attributes can be included in the Resource.* Resource objects are created with `Resource.create`, which accepts attributes -(key-values). Resources should NOT be created via constructor yet ResourceDetector -instance can't use `Resource.create` to avoid infinite loops. Working with +(key-values). Resources should NOT be created via constructor except by `ResourceDetector` +instances which can't use `Resource.create` to avoid infinite loops. Working with `Resource` objects should only be done via the Resource API methods. Resource attributes can also be passed at process invocation in the :envvar:`OTEL_RESOURCE_ATTRIBUTES` environment variable. You should register From ba82816a48ee1b9fda13b4eff8bc38f1ba471026 Mon Sep 17 00:00:00 2001 From: Riccardo Magliocchetti Date: Mon, 23 Dec 2024 17:32:44 +0100 Subject: [PATCH 3/4] Update opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py Co-authored-by: Aaron Abbott --- 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 dd22ad3c437..e34c393c533 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py @@ -176,7 +176,7 @@ def create( ) -> "Resource": """Creates a new `Resource` from attributes. - This is supposed to be called by the SDK and not by ResourceDetector instances. + This is supposed to be called by the SDK and not by `ResourceDetector` instances. Args: attributes: Optional zero or more key-value pairs. From 56cc06b3ffb1555a76066f00d0e95d12aa166506 Mon Sep 17 00:00:00 2001 From: Riccardo Magliocchetti Date: Mon, 23 Dec 2024 17:37:13 +0100 Subject: [PATCH 4/4] More precise instructions --- 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 e34c393c533..2f95652de77 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py @@ -176,7 +176,7 @@ def create( ) -> "Resource": """Creates a new `Resource` from attributes. - This is supposed to be called by the SDK and not by `ResourceDetector` instances. + `ResourceDetector` instances should not call this method. Args: attributes: Optional zero or more key-value pairs. @@ -319,6 +319,7 @@ def __init__(self, raise_on_error: bool = False) -> None: @abc.abstractmethod def detect(self) -> "Resource": + """Don't call `Resource.create` here to avoid an infinite loop, instead instantiate `Resource` directly""" raise NotImplementedError()