17
17
import os
18
18
import unittest
19
19
import uuid
20
+ from logging import ERROR
20
21
from unittest import mock
21
22
22
23
from opentelemetry .sdk import resources
@@ -51,6 +52,14 @@ def test_create(self):
51
52
resource = resources .Resource .create (attributes )
52
53
self .assertIsInstance (resource , resources .Resource )
53
54
self .assertEqual (resource .attributes , expected_attributes )
55
+ self .assertEqual (resource .schema_url , "" )
56
+
57
+ schema_url = "https://opentelemetry.io/schemas/1.3.0"
58
+
59
+ resource = resources .Resource .create (attributes , schema_url )
60
+ self .assertIsInstance (resource , resources .Resource )
61
+ self .assertEqual (resource .attributes , expected_attributes )
62
+ self .assertEqual (resource .schema_url , schema_url )
54
63
55
64
os .environ [resources .OTEL_RESOURCE_ATTRIBUTES ] = "key=value"
56
65
resource = resources .Resource .create (attributes )
@@ -67,17 +76,45 @@ def test_create(self):
67
76
self .assertEqual (
68
77
resource ,
69
78
resources ._DEFAULT_RESOURCE .merge (
70
- resources .Resource ({resources .SERVICE_NAME : "unknown_service" })
79
+ resources .Resource (
80
+ {resources .SERVICE_NAME : "unknown_service" }, ""
81
+ )
71
82
),
72
83
)
84
+ self .assertEqual (resource .schema_url , "" )
85
+
86
+ resource = resources .Resource .create (None , None )
87
+ self .assertEqual (
88
+ resource ,
89
+ resources ._DEFAULT_RESOURCE .merge (
90
+ resources .Resource (
91
+ {resources .SERVICE_NAME : "unknown_service" }, ""
92
+ )
93
+ ),
94
+ )
95
+ self .assertEqual (resource .schema_url , "" )
73
96
74
97
resource = resources .Resource .create ({})
75
98
self .assertEqual (
76
99
resource ,
77
100
resources ._DEFAULT_RESOURCE .merge (
78
- resources .Resource ({resources .SERVICE_NAME : "unknown_service" })
101
+ resources .Resource (
102
+ {resources .SERVICE_NAME : "unknown_service" }, ""
103
+ )
104
+ ),
105
+ )
106
+ self .assertEqual (resource .schema_url , "" )
107
+
108
+ resource = resources .Resource .create ({}, None )
109
+ self .assertEqual (
110
+ resource ,
111
+ resources ._DEFAULT_RESOURCE .merge (
112
+ resources .Resource (
113
+ {resources .SERVICE_NAME : "unknown_service" }, ""
114
+ )
79
115
),
80
116
)
117
+ self .assertEqual (resource .schema_url , "" )
81
118
82
119
def test_resource_merge (self ):
83
120
left = resources .Resource ({"service" : "ui" })
@@ -86,6 +123,33 @@ def test_resource_merge(self):
86
123
left .merge (right ),
87
124
resources .Resource ({"service" : "ui" , "host" : "service-host" }),
88
125
)
126
+ schema_urls = (
127
+ "https://opentelemetry.io/schemas/1.2.0" ,
128
+ "https://opentelemetry.io/schemas/1.3.0" ,
129
+ )
130
+
131
+ left = resources .Resource .create ({}, None )
132
+ right = resources .Resource .create ({}, None )
133
+ self .assertEqual (left .merge (right ).schema_url , "" )
134
+
135
+ left = resources .Resource .create ({}, None )
136
+ right = resources .Resource .create ({}, schema_urls [0 ])
137
+ self .assertEqual (left .merge (right ).schema_url , schema_urls [0 ])
138
+
139
+ left = resources .Resource .create ({}, schema_urls [0 ])
140
+ right = resources .Resource .create ({}, None )
141
+ self .assertEqual (left .merge (right ).schema_url , schema_urls [0 ])
142
+
143
+ left = resources .Resource .create ({}, schema_urls [0 ])
144
+ right = resources .Resource .create ({}, schema_urls [0 ])
145
+ self .assertEqual (left .merge (right ).schema_url , schema_urls [0 ])
146
+
147
+ left = resources .Resource .create ({}, schema_urls [0 ])
148
+ right = resources .Resource .create ({}, schema_urls [1 ])
149
+ with self .assertLogs (level = ERROR ) as log_entry :
150
+ self .assertEqual (left .merge (right ), left )
151
+ self .assertIn (schema_urls [0 ], log_entry .output [0 ])
152
+ self .assertIn (schema_urls [1 ], log_entry .output [0 ])
89
153
90
154
def test_resource_merge_empty_string (self ):
91
155
"""Verify Resource.merge behavior with the empty string.
@@ -130,6 +194,11 @@ def test_immutability(self):
130
194
attributes ["cost" ] = 999.91
131
195
self .assertEqual (resource .attributes , attributes_copy )
132
196
197
+ with self .assertRaises (AttributeError ):
198
+ resource .schema_url = "bug"
199
+
200
+ self .assertEqual (resource .schema_url , "" )
201
+
133
202
def test_service_name_using_process_name (self ):
134
203
resource = resources .Resource .create (
135
204
{resources .PROCESS_EXECUTABLE_NAME : "test" }
@@ -220,6 +289,76 @@ def test_aggregated_resources_multiple_detectors(self):
220
289
),
221
290
)
222
291
292
+ def test_aggregated_resources_different_schema_urls (self ):
293
+ resource_detector1 = mock .Mock (spec = resources .ResourceDetector )
294
+ resource_detector1 .detect .return_value = resources .Resource (
295
+ {"key1" : "value1" }, ""
296
+ )
297
+ resource_detector2 = mock .Mock (spec = resources .ResourceDetector )
298
+ resource_detector2 .detect .return_value = resources .Resource (
299
+ {"key2" : "value2" , "key3" : "value3" }, "url1"
300
+ )
301
+ resource_detector3 = mock .Mock (spec = resources .ResourceDetector )
302
+ resource_detector3 .detect .return_value = resources .Resource (
303
+ {
304
+ "key2" : "try_to_overwrite_existing_value" ,
305
+ "key3" : "try_to_overwrite_existing_value" ,
306
+ "key4" : "value4" ,
307
+ },
308
+ "url2" ,
309
+ )
310
+ resource_detector4 = mock .Mock (spec = resources .ResourceDetector )
311
+ resource_detector4 .detect .return_value = resources .Resource (
312
+ {
313
+ "key2" : "try_to_overwrite_existing_value" ,
314
+ "key3" : "try_to_overwrite_existing_value" ,
315
+ "key4" : "value4" ,
316
+ },
317
+ "url1" ,
318
+ )
319
+ self .assertEqual (
320
+ resources .get_aggregated_resources (
321
+ [resource_detector1 , resource_detector2 ]
322
+ ),
323
+ resources .Resource (
324
+ {"key1" : "value1" , "key2" : "value2" , "key3" : "value3" },
325
+ "url1" ,
326
+ ),
327
+ )
328
+ with self .assertLogs (level = ERROR ) as log_entry :
329
+ self .assertEqual (
330
+ resources .get_aggregated_resources (
331
+ [resource_detector2 , resource_detector3 ]
332
+ ),
333
+ resources .Resource (
334
+ {"key2" : "value2" , "key3" : "value3" }, "url1"
335
+ ),
336
+ )
337
+ self .assertIn ("url1" , log_entry .output [0 ])
338
+ self .assertIn ("url2" , log_entry .output [0 ])
339
+ with self .assertLogs (level = ERROR ):
340
+ self .assertEqual (
341
+ resources .get_aggregated_resources (
342
+ [
343
+ resource_detector2 ,
344
+ resource_detector3 ,
345
+ resource_detector4 ,
346
+ resource_detector1 ,
347
+ ]
348
+ ),
349
+ resources .Resource (
350
+ {
351
+ "key1" : "value1" ,
352
+ "key2" : "try_to_overwrite_existing_value" ,
353
+ "key3" : "try_to_overwrite_existing_value" ,
354
+ "key4" : "value4" ,
355
+ },
356
+ "url1" ,
357
+ ),
358
+ )
359
+ self .assertIn ("url1" , log_entry .output [0 ])
360
+ self .assertIn ("url2" , log_entry .output [0 ])
361
+
223
362
def test_resource_detector_ignore_error (self ):
224
363
resource_detector = mock .Mock (spec = resources .ResourceDetector )
225
364
resource_detector .detect .side_effect = Exception ()
0 commit comments