Skip to content

Commit 60cb0f3

Browse files
committed
merge OTELResourceDetector result
1 parent 65ddc2d commit 60cb0f3

File tree

5 files changed

+47
-26
lines changed

5 files changed

+47
-26
lines changed

Diff for: opentelemetry-sdk/CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
([#1053](https://github.com/open-telemetry/opentelemetry-python/pull/1053))
1515
- Rename Resource labels to attributes
1616
([#1082](https://github.com/open-telemetry/opentelemetry-python/pull/1082))
17+
- Merge `OTELResourceDetector` result when creating resources
18+
([#1096](https://github.com/open-telemetry/opentelemetry-python/pull/1096))
1719

1820
## Version 0.12b0
1921

Diff for: opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py

+17-14
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,20 @@
3333
OPENTELEMETRY_SDK_VERSION = pkg_resources.get_distribution(
3434
"opentelemetry-sdk"
3535
).version
36+
OTEL_RESOURCE_ATTRIBUTES = "OTEL_RESOURCE_ATTRIBUTES"
3637

3738

3839
class Resource:
3940
def __init__(self, attributes: Attributes):
4041
self._attributes = attributes.copy()
4142

4243
@staticmethod
43-
def create(attributes: Attributes) -> "Resource":
44+
def create(attributes: typing.Optional[Attributes]) -> "Resource":
4445
if not attributes:
45-
return _DEFAULT_RESOURCE
46-
return _DEFAULT_RESOURCE.merge(Resource(attributes))
46+
resource = _DEFAULT_RESOURCE
47+
else:
48+
resource = _DEFAULT_RESOURCE.merge(Resource(attributes))
49+
return resource.merge(OTELResourceDetector().detect())
4750

4851
@staticmethod
4952
def create_empty() -> "Resource":
@@ -70,16 +73,6 @@ def __hash__(self):
7073
return hash(dumps(self._attributes, sort_keys=True))
7174

7275

73-
_EMPTY_RESOURCE = Resource({})
74-
_DEFAULT_RESOURCE = Resource(
75-
{
76-
TELEMETRY_SDK_LANGUAGE: "python",
77-
TELEMETRY_SDK_NAME: "opentelemetry",
78-
TELEMETRY_SDK_VERSION: OPENTELEMETRY_SDK_VERSION,
79-
}
80-
)
81-
82-
8376
class ResourceDetector(abc.ABC):
8477
def __init__(self, raise_on_error=False):
8578
self.raise_on_error = raise_on_error
@@ -92,7 +85,7 @@ def detect(self) -> "Resource":
9285
class OTELResourceDetector(ResourceDetector):
9386
# pylint: disable=no-self-use
9487
def detect(self) -> "Resource":
95-
env_resources_items = os.environ.get("OTEL_RESOURCE_ATTRIBUTES")
88+
env_resources_items = os.environ.get(OTEL_RESOURCE_ATTRIBUTES)
9689
env_resource_map = {}
9790
if env_resources_items:
9891
env_resource_map = {
@@ -104,6 +97,16 @@ def detect(self) -> "Resource":
10497
return Resource(env_resource_map)
10598

10699

100+
_EMPTY_RESOURCE = Resource({})
101+
_DEFAULT_RESOURCE = Resource(
102+
{
103+
TELEMETRY_SDK_LANGUAGE: "python",
104+
TELEMETRY_SDK_NAME: "opentelemetry",
105+
TELEMETRY_SDK_VERSION: OPENTELEMETRY_SDK_VERSION,
106+
}
107+
).merge(OTELResourceDetector().detect())
108+
109+
107110
def get_aggregated_resources(
108111
detectors: typing.List["ResourceDetector"],
109112
initial_resource: typing.Optional[Resource] = None,

Diff for: opentelemetry-sdk/tests/metrics/test_metrics.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def test_resource_empty(self):
4040
meter_provider = metrics.MeterProvider()
4141
meter = meter_provider.get_meter(__name__)
4242
# pylint: disable=protected-access
43-
self.assertIs(meter.resource, resources._DEFAULT_RESOURCE)
43+
self.assertEqual(meter.resource, resources._DEFAULT_RESOURCE)
4444

4545
def test_start_pipeline(self):
4646
exporter = mock.Mock()

Diff for: opentelemetry-sdk/tests/resources/test_resources.py

+26-10
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@
2222

2323

2424
class TestResources(unittest.TestCase):
25+
def setUp(self) -> None:
26+
os.environ[resources.OTEL_RESOURCE_ATTRIBUTES] = ""
27+
28+
def tearDown(self) -> None:
29+
os.environ.pop(resources.OTEL_RESOURCE_ATTRIBUTES)
30+
2531
def test_create(self):
2632
attributes = {
2733
"service": "ui",
@@ -44,14 +50,22 @@ def test_create(self):
4450
self.assertIsInstance(resource, resources.Resource)
4551
self.assertEqual(resource.attributes, expected_attributes)
4652

53+
os.environ[resources.OTEL_RESOURCE_ATTRIBUTES] = "key=value"
54+
resource = resources.Resource.create(attributes)
55+
self.assertIsInstance(resource, resources.Resource)
56+
expected_with_envar = expected_attributes.copy()
57+
expected_with_envar["key"] = "value"
58+
self.assertEqual(resource.attributes, expected_with_envar)
59+
os.environ[resources.OTEL_RESOURCE_ATTRIBUTES] = ""
60+
4761
resource = resources.Resource.create_empty()
48-
self.assertIs(resource, resources._EMPTY_RESOURCE)
62+
self.assertEqual(resource, resources._EMPTY_RESOURCE)
4963

5064
resource = resources.Resource.create(None)
51-
self.assertIs(resource, resources._DEFAULT_RESOURCE)
65+
self.assertEqual(resource, resources._DEFAULT_RESOURCE)
5266

5367
resource = resources.Resource.create({})
54-
self.assertIs(resource, resources._DEFAULT_RESOURCE)
68+
self.assertEqual(resource, resources._DEFAULT_RESOURCE)
5569

5670
def test_resource_merge(self):
5771
left = resources.Resource({"service": "ui"})
@@ -184,36 +198,38 @@ def test_resource_detector_raise_error(self):
184198

185199
class TestOTELResourceDetector(unittest.TestCase):
186200
def setUp(self) -> None:
187-
os.environ["OTEL_RESOURCE_ATTRIBUTES"] = ""
201+
os.environ[resources.OTEL_RESOURCE_ATTRIBUTES] = ""
188202

189203
def tearDown(self) -> None:
190-
os.environ.pop("OTEL_RESOURCE_ATTRIBUTES")
204+
os.environ.pop(resources.OTEL_RESOURCE_ATTRIBUTES)
191205

192206
def test_empty(self):
193207
detector = resources.OTELResourceDetector()
194-
os.environ["OTEL_RESOURCE_ATTRIBUTES"] = ""
208+
os.environ[resources.OTEL_RESOURCE_ATTRIBUTES] = ""
195209
self.assertEqual(detector.detect(), resources.Resource.create_empty())
196210

197211
def test_one(self):
198212
detector = resources.OTELResourceDetector()
199-
os.environ["OTEL_RESOURCE_ATTRIBUTES"] = "k=v"
213+
os.environ[resources.OTEL_RESOURCE_ATTRIBUTES] = "k=v"
200214
self.assertEqual(detector.detect(), resources.Resource({"k": "v"}))
201215

202216
def test_one_with_whitespace(self):
203217
detector = resources.OTELResourceDetector()
204-
os.environ["OTEL_RESOURCE_ATTRIBUTES"] = " k = v "
218+
os.environ[resources.OTEL_RESOURCE_ATTRIBUTES] = " k = v "
205219
self.assertEqual(detector.detect(), resources.Resource({"k": "v"}))
206220

207221
def test_multiple(self):
208222
detector = resources.OTELResourceDetector()
209-
os.environ["OTEL_RESOURCE_ATTRIBUTES"] = "k=v,k2=v2"
223+
os.environ[resources.OTEL_RESOURCE_ATTRIBUTES] = "k=v,k2=v2"
210224
self.assertEqual(
211225
detector.detect(), resources.Resource({"k": "v", "k2": "v2"})
212226
)
213227

214228
def test_multiple_with_whitespace(self):
215229
detector = resources.OTELResourceDetector()
216-
os.environ["OTEL_RESOURCE_ATTRIBUTES"] = " k = v , k2 = v2 "
230+
os.environ[
231+
resources.OTEL_RESOURCE_ATTRIBUTES
232+
] = " k = v , k2 = v2 "
217233
self.assertEqual(
218234
detector.detect(), resources.Resource({"k": "v", "k2": "v2"})
219235
)

Diff for: opentelemetry-sdk/tests/trace/test_trace.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ def test_default_span_resource(self):
396396
tracer = tracer_provider.get_tracer(__name__)
397397
span = tracer.start_span("root")
398398
# pylint: disable=protected-access
399-
self.assertIs(span.resource, resources._DEFAULT_RESOURCE)
399+
self.assertEqual(span.resource, resources._DEFAULT_RESOURCE)
400400

401401
def test_span_context_remote_flag(self):
402402
tracer = new_tracer()

0 commit comments

Comments
 (0)