Skip to content

Commit cc9853d

Browse files
committed
Fix overwritting of the service.instance.id which has been populated from the user provided values from the resource detectors
1 parent ab22674 commit cc9853d

2 files changed

Lines changed: 57 additions & 2 deletions

File tree

opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,12 @@ def get_aggregated_resources(
638638
detected_resource: Resource = _EMPTY_RESOURCE
639639
try:
640640
detected_resource = future.result(timeout=timeout)
641+
642+
if (
643+
isinstance(detector, ServiceInstanceIdResourceDetector)
644+
and SERVICE_INSTANCE_ID in detectors_merged_resource.attributes
645+
):
646+
continue
641647
except concurrent.futures.TimeoutError as ex:
642648
if detector.raise_on_error:
643649
raise ex
@@ -651,8 +657,7 @@ def get_aggregated_resources(
651657
if detector.raise_on_error:
652658
raise ex
653659
logger.warning("Exception %s in detector %s, ignoring", ex, detector)
654-
finally:
655-
detectors_merged_resource = detectors_merged_resource.merge(detected_resource)
660+
detectors_merged_resource = detectors_merged_resource.merge(detected_resource)
656661
finally:
657662
executor.shutdown(wait=False, cancel_futures=True)
658663

opentelemetry-sdk/tests/resources/test_resources.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,6 +1036,56 @@ def tearDown(self) -> None:
10361036
def test_is_process_dependent(self):
10371037
self.assertTrue(ServiceInstanceIdResourceDetector().is_process_dependent())
10381038

1039+
def test_aggregation_preserves_instance_id_from_previous_detector(self):
1040+
resource_detector = Mock(spec=ResourceDetector)
1041+
resource_detector.detect.return_value = Resource({SERVICE_INSTANCE_ID: "service-instance-id"})
1042+
subsequent_detector = Mock(spec=ResourceDetector)
1043+
subsequent_detector.detect.return_value = Resource({"key": "value"})
1044+
1045+
resource = get_aggregated_resources(
1046+
[
1047+
resource_detector,
1048+
ServiceInstanceIdResourceDetector(),
1049+
subsequent_detector,
1050+
],
1051+
initial_resource=Resource.get_empty(),
1052+
)
1053+
1054+
self.assertEqual(
1055+
resource.attributes,
1056+
{SERVICE_INSTANCE_ID: "service-instance-id", "key": "value"},
1057+
)
1058+
1059+
def test_aggregation_preserves_instance_id_from_initial_resource(self):
1060+
resource = get_aggregated_resources(
1061+
[ServiceInstanceIdResourceDetector()],
1062+
initial_resource=Resource({SERVICE_INSTANCE_ID: "user-provided-instance-id"}),
1063+
)
1064+
1065+
self.assertEqual(resource.attributes[SERVICE_INSTANCE_ID], "user-provided-instance-id")
1066+
1067+
@patch.dict(
1068+
environ,
1069+
{OTEL_RESOURCE_ATTRIBUTES: "service.instance.id=environment-instance-id"},
1070+
clear=True,
1071+
)
1072+
def test_aggregation_preserves_instance_id_from_environment(self):
1073+
resource = get_aggregated_resources(
1074+
[OTELResourceDetector(), ServiceInstanceIdResourceDetector()],
1075+
initial_resource=Resource.get_empty(),
1076+
)
1077+
1078+
self.assertEqual(resource.attributes[SERVICE_INSTANCE_ID], "environment-instance-id")
1079+
1080+
def test_aggregation_generates_instance_id_when_missing(self):
1081+
resource = get_aggregated_resources(
1082+
[ServiceInstanceIdResourceDetector()],
1083+
initial_resource=Resource({"key": "value"}),
1084+
)
1085+
1086+
self.assertEqual(uuid.UUID(resource.attributes[SERVICE_INSTANCE_ID]).version, 4)
1087+
self.assertEqual(resource.attributes["key"], "value")
1088+
10391089
def test_detect_value_is_valid_uuid4(self):
10401090
_resources_module._service_instance_id = None
10411091
_resources_module._service_instance_id_pid = None

0 commit comments

Comments
 (0)