Skip to content

Align SDK with resource detection spec #1063

@aabmass

Description

@aabmass

Resource detection has been merged into the spec. The SDK should be aligned with the spec. This may already be the case.

Is your feature request related to a problem?
No

Describe the solution you'd like
The resource detection spec is flexible and doesn't prescribe anything. Currently, we have this code:

class ResourceDetector(abc.ABC):
def __init__(self, raise_on_error=False):
self.raise_on_error = raise_on_error
@abc.abstractmethod
def detect(self) -> "Resource":
raise NotImplementedError()
class OTELResourceDetector(ResourceDetector):
# pylint: disable=no-self-use
def detect(self) -> "Resource":
env_resources_items = os.environ.get("OTEL_RESOURCE_ATTRIBUTES")
env_resource_map = {}
if env_resources_items:
env_resource_map = {
key.strip(): value.strip()
for key, value in (
item.split("=") for item in env_resources_items.split(",")
)
}
return Resource(env_resource_map)
def get_aggregated_resources(
detectors: typing.List["ResourceDetector"],
initial_resource: typing.Optional[Resource] = None,
timeout=5,
) -> "Resource":
""" Retrieves resources from detectors in the order that they were passed
:param detectors: List of resources in order of priority
:param initial_resource: Static resource. This has highest priority
:param timeout: Number of seconds to wait for each detector to return
:return:
"""
final_resource = initial_resource or _EMPTY_RESOURCE
detectors = [OTELResourceDetector()] + detectors
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
futures = [executor.submit(detector.detect) for detector in detectors]
for detector_ind, future in enumerate(futures):
detector = detectors[detector_ind]
try:
detected_resources = future.result(timeout=timeout)
# pylint: disable=broad-except
except Exception as ex:
if detector.raise_on_error:
raise ex
logger.warning(
"Exception %s in detector %s, ignoring", ex, detector
)
detected_resources = _EMPTY_RESOURCE
finally:
final_resource = final_resource.merge(detected_resources)
return final_resource

We could:

  • Leave everything as it is. The spec doesn't say we need a ResourceDetector interface or get_aggregated_resources() nor does it say it shouldn't be there.
  • Remove the ResourceDetector interface and get_aggregated_resources()
  • Replace the ResourceDetector interface with a Callable[[bool], Resource] function param, since the spec only says

    Resource detector packages MUST provide a method that returns a resource.

Thoughts?

Metadata

Metadata

Assignees

Labels

release:required-for-gaTo be resolved before GA releasesdkAffects the SDK package.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions