Skip to content

Commit 01632d2

Browse files
author
alrex
authored
Merge branch 'master' into issue_1542_allow_jaeger_propagation_to_work_without_contexts
2 parents 4d638d8 + 9077ce3 commit 01632d2

File tree

6 files changed

+154
-36
lines changed

6 files changed

+154
-36
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
66

77
## [Unreleased](https://github.com/open-telemetry/opentelemetry-python/compare/v0.17b0...HEAD)
88

9+
=======
910
### Added
1011
- Added `end_on_exit` argument to `start_as_current_span`
1112
([#1519](https://github.com/open-telemetry/opentelemetry-python/pull/1519)])
1213
- Add `Span.set_attributes` method to set multiple values with one call
1314
([#1520](https://github.com/open-telemetry/opentelemetry-python/pull/1520))
15+
- Make sure Resources follow semantic conventions
16+
([#1480](https://github.com/open-telemetry/opentelemetry-python/pull/1480))
1417

1518
## [0.17b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.17b0) - 2021-01-20
1619

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ For information about contributing to OpenTelemetry Python, see [CONTRIBUTING.md
109109

110110
We meet weekly on Thursdays at 9AM PST. The meeting is subject to change depending on contributors' availability. Check the [OpenTelemetry community calendar](https://calendar.google.com/calendar/embed?src=google.com_b79e3e90j7bbsa2n2p5an5lf60%40group.calendar.google.com) for specific dates.
111111

112-
Meetings take place via [Zoom video conference](https://zoom.us/j/6729396170).
112+
Meetings take place via [Zoom video conference](https://zoom.us/j/6729396170). The passcode is _77777_.
113113

114114
Meeting notes are available as a public [Google doc](https://docs.google.com/document/d/1CIMGoIOZ-c3-igzbd6_Pnxx1SjAkjwqoYSUWxPY8XIs/edit). For edit access, get in touch on [Gitter](https://gitter.im/open-telemetry/opentelemetry-python).
115115

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

+66-2
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,62 @@
9191
logger = logging.getLogger(__name__)
9292

9393

94-
TELEMETRY_SDK_LANGUAGE = "telemetry.sdk.language"
94+
CLOUD_PROVIDER = "cloud.provider"
95+
CLOUD_ACCOUNT_ID = "cloud.account.id"
96+
CLOUD_REGION = "cloud.region"
97+
CLOUD_ZONE = "cloud.zone"
98+
CONTAINER_NAME = "container.name"
99+
CONTAINER_ID = "container.id"
100+
CONTAINER_IMAGE_NAME = "container.image.name"
101+
CONTAINER_IMAGE_TAG = "container.image.tag"
102+
DEPLOYMENT_ENVIRONMENT = "deployment.environment"
103+
FAAS_NAME = "faas.name"
104+
FAAS_ID = "faas.id"
105+
FAAS_VERSION = "faas.version"
106+
FAAS_INSTANCE = "faas.instance"
107+
HOST_NAME = "host.name"
108+
HOST_TYPE = "host.type"
109+
HOST_IMAGE_NAME = "host.image.name"
110+
HOST_IMAGE_ID = "host.image.id"
111+
HOST_IMAGE_VERSION = "host.image.version"
112+
KUBERNETES_CLUSTER_NAME = "k8s.cluster.name"
113+
KUBERNETES_NAMESPACE_NAME = "k8s.namespace.name"
114+
KUBERNETES_POD_UID = "k8s.pod.uid"
115+
KUBERNETES_POD_NAME = "k8s.pod.name"
116+
KUBERNETES_CONTAINER_NAME = "k8s.container.name"
117+
KUBERNETES_REPLICA_SET_UID = "k8s.replicaset.uid"
118+
KUBERNETES_REPLICA_SET_NAME = "k8s.replicaset.name"
119+
KUBERNETES_DEPLOYMENT_UID = "k8s.deployment.uid"
120+
KUBERNETES_DEPLOYMENT_NAME = "k8s.deployment.name"
121+
KUBERNETES_STATEFUL_SET_UID = "k8s.statefulset.uid"
122+
KUBERNETES_STATEFUL_SET_NAME = "k8s.statefulset.name"
123+
KUBERNETES_DAEMON_SET_UID = "k8s.daemonset.uid"
124+
KUBERNETES_DAEMON_SET_NAME = "k8s.daemonset.name"
125+
KUBERNETES_JOB_UID = "k8s.job.uid"
126+
KUBERNETES_JOB_NAME = "k8s.job.name"
127+
KUBERNETES_CRON_JOB_UID = "k8s.cronjob.uid"
128+
KUBERNETES_CRON_JOB_NAME = "k8s.cronjob.name"
129+
OS_TYPE = "os.type"
130+
OS_DESCRIPTION = "os.description"
131+
PROCESS_PID = "process.pid"
132+
PROCESS_EXECUTABLE_NAME = "process.executable.name"
133+
PROCESS_EXECUTABLE_PATH = "process.executable.path"
134+
PROCESS_COMMAND = "process.command"
135+
PROCESS_COMMAND_LINE = "process.command_line"
136+
PROCESS_COMMAND_ARGS = "process.command_args"
137+
PROCESS_OWNER = "process.owner"
138+
PROCESS_RUNTIME_NAME = "process.runtime.name"
139+
PROCESS_RUNTIME_VERSION = "process.runtime.version"
140+
PROCESS_RUNTIME_DESCRIPTION = "process.runtime.description"
141+
SERVICE_NAME = "service.name"
142+
SERVICE_NAMESPACE = "service.namespace"
143+
SERVICE_INSTANCE_ID = "service.instance.id"
144+
SERVICE_VERSION = "service.version"
95145
TELEMETRY_SDK_NAME = "telemetry.sdk.name"
96146
TELEMETRY_SDK_VERSION = "telemetry.sdk.version"
147+
TELEMETRY_AUTO_VERSION = "telemetry.auto.version"
148+
TELEMETRY_SDK_LANGUAGE = "telemetry.sdk.language"
149+
97150

98151
OPENTELEMETRY_SDK_VERSION = pkg_resources.get_distribution(
99152
"opentelemetry-sdk"
@@ -111,7 +164,18 @@ def create(attributes: typing.Optional[Attributes] = None) -> "Resource":
111164
resource = _DEFAULT_RESOURCE
112165
else:
113166
resource = _DEFAULT_RESOURCE.merge(Resource(attributes))
114-
return resource.merge(OTELResourceDetector().detect())
167+
resource = resource.merge(OTELResourceDetector().detect())
168+
if not resource.attributes.get(SERVICE_NAME, None):
169+
default_service_name = "unknown_service"
170+
process_executable_name = resource.attributes.get(
171+
PROCESS_EXECUTABLE_NAME, None
172+
)
173+
if process_executable_name:
174+
default_service_name += ":" + process_executable_name
175+
resource = resource.merge(
176+
Resource({SERVICE_NAME: default_service_name})
177+
)
178+
return resource
115179

116180
@staticmethod
117181
def create_empty() -> "Resource":

opentelemetry-sdk/tests/metrics/test_metrics.py

+35-13
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,37 @@ def test_stateful(self):
3030
meter = meter_provider.get_meter(__name__)
3131
self.assertIs(meter.processor.stateful, False)
3232

33-
def test_resource(self):
34-
resource = resources.Resource.create({})
33+
def test_resource_empty(self):
34+
resource = resources.Resource.create_empty()
3535
meter_provider = metrics.MeterProvider(resource=resource)
3636
self.assertIs(meter_provider.resource, resource)
3737

38-
def test_resource_empty(self):
38+
def test_resources(self):
3939
meter_provider = metrics.MeterProvider()
4040
# pylint: disable=protected-access
41-
self.assertEqual(meter_provider.resource, resources._DEFAULT_RESOURCE)
41+
self.assertIsInstance(meter_provider.resource, resources.Resource)
42+
self.assertEqual(
43+
meter_provider.resource.attributes.get(resources.SERVICE_NAME),
44+
"unknown_service",
45+
)
46+
self.assertEqual(
47+
meter_provider.resource.attributes.get(
48+
resources.TELEMETRY_SDK_LANGUAGE
49+
),
50+
"python",
51+
)
52+
self.assertEqual(
53+
meter_provider.resource.attributes.get(
54+
resources.TELEMETRY_SDK_NAME
55+
),
56+
"opentelemetry",
57+
)
58+
self.assertEqual(
59+
meter_provider.resource.attributes.get(
60+
resources.TELEMETRY_SDK_VERSION
61+
),
62+
resources.OPENTELEMETRY_SDK_VERSION,
63+
)
4264

4365
def test_start_pipeline(self):
4466
exporter = Mock()
@@ -74,7 +96,7 @@ def test_collect_metrics(self):
7496
meter = metrics.MeterProvider().get_meter(__name__)
7597
processor_mock = Mock()
7698
meter.processor = processor_mock
77-
counter = meter.create_counter("name", "desc", "unit", float,)
99+
counter = meter.create_counter("name", "desc", "unit", float)
78100
labels = {"key1": "value1"}
79101
meter.register_view(View(counter, SumAggregator))
80102
counter.add(1.0, labels)
@@ -155,7 +177,7 @@ def test_create_counter(self):
155177
resource = Mock(spec=resources.Resource)
156178
meter_provider = metrics.MeterProvider(resource=resource)
157179
meter = meter_provider.get_meter(__name__)
158-
counter = meter.create_counter("name", "desc", "unit", int,)
180+
counter = meter.create_counter("name", "desc", "unit", int)
159181
self.assertIsInstance(counter, metrics.Counter)
160182
self.assertEqual(counter.value_type, int)
161183
self.assertEqual(counter.name, "name")
@@ -166,14 +188,14 @@ def test_instrument_same_name_error(self):
166188
resource = Mock(spec=resources.Resource)
167189
meter_provider = metrics.MeterProvider(resource=resource)
168190
meter = meter_provider.get_meter(__name__)
169-
counter = meter.create_counter("name", "desc", "unit", int,)
191+
counter = meter.create_counter("name", "desc", "unit", int)
170192
self.assertIsInstance(counter, metrics.Counter)
171193
self.assertEqual(counter.value_type, int)
172194
self.assertEqual(counter.name, "name")
173195
self.assertIs(meter_provider.resource, resource)
174196
self.assertEqual(counter.meter, meter)
175197
with self.assertRaises(ValueError) as ctx:
176-
_ = meter.create_counter("naME", "desc", "unit", int,)
198+
_ = meter.create_counter("naME", "desc", "unit", int)
177199
self.assertTrue(
178200
"Multiple instruments can't be registered by the same name: (name)"
179201
in str(ctx.exception)
@@ -182,7 +204,7 @@ def test_instrument_same_name_error(self):
182204
def test_create_updowncounter(self):
183205
meter = metrics.MeterProvider().get_meter(__name__)
184206
updowncounter = meter.create_updowncounter(
185-
"name", "desc", "unit", float,
207+
"name", "desc", "unit", float
186208
)
187209
self.assertIsInstance(updowncounter, metrics.UpDownCounter)
188210
self.assertEqual(updowncounter.value_type, float)
@@ -191,7 +213,7 @@ def test_create_updowncounter(self):
191213
def test_create_valuerecorder(self):
192214
meter = metrics.MeterProvider().get_meter(__name__)
193215
valuerecorder = meter.create_valuerecorder(
194-
"name", "desc", "unit", float,
216+
"name", "desc", "unit", float
195217
)
196218
self.assertIsInstance(valuerecorder, metrics.ValueRecorder)
197219
self.assertEqual(valuerecorder.value_type, float)
@@ -204,7 +226,7 @@ def test_register_sumobserver(self):
204226
callback = Mock()
205227

206228
observer = meter.register_sumobserver(
207-
callback, "name", "desc", "unit", int,
229+
callback, "name", "desc", "unit", int
208230
)
209231

210232
self.assertIsInstance(observer, metrics.SumObserver)
@@ -224,7 +246,7 @@ def test_register_updownsumobserver(self):
224246
callback = Mock()
225247

226248
observer = meter.register_updownsumobserver(
227-
callback, "name", "desc", "unit", int,
249+
callback, "name", "desc", "unit", int
228250
)
229251

230252
self.assertIsInstance(observer, metrics.UpDownSumObserver)
@@ -244,7 +266,7 @@ def test_register_valueobserver(self):
244266
callback = Mock()
245267

246268
observer = meter.register_valueobserver(
247-
callback, "name", "desc", "unit", int,
269+
callback, "name", "desc", "unit", int
248270
)
249271

250272
self.assertIsInstance(observer, metrics.ValueObserver)

opentelemetry-sdk/tests/resources/test_resources.py

+24-3
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def test_create(self):
4444
resources.TELEMETRY_SDK_NAME: "opentelemetry",
4545
resources.TELEMETRY_SDK_LANGUAGE: "python",
4646
resources.TELEMETRY_SDK_VERSION: resources.OPENTELEMETRY_SDK_VERSION,
47+
resources.SERVICE_NAME: "unknown_service",
4748
}
4849

4950
resource = resources.Resource.create(attributes)
@@ -62,10 +63,20 @@ def test_create(self):
6263
self.assertEqual(resource, resources._EMPTY_RESOURCE)
6364

6465
resource = resources.Resource.create(None)
65-
self.assertEqual(resource, resources._DEFAULT_RESOURCE)
66+
self.assertEqual(
67+
resource,
68+
resources._DEFAULT_RESOURCE.merge(
69+
resources.Resource({resources.SERVICE_NAME: "unknown_service"})
70+
),
71+
)
6672

6773
resource = resources.Resource.create({})
68-
self.assertEqual(resource, resources._DEFAULT_RESOURCE)
74+
self.assertEqual(
75+
resource,
76+
resources._DEFAULT_RESOURCE.merge(
77+
resources.Resource({resources.SERVICE_NAME: "unknown_service"})
78+
),
79+
)
6980

7081
def test_resource_merge(self):
7182
left = resources.Resource({"service": "ui"})
@@ -103,6 +114,7 @@ def test_immutability(self):
103114
resources.TELEMETRY_SDK_NAME: "opentelemetry",
104115
resources.TELEMETRY_SDK_LANGUAGE: "python",
105116
resources.TELEMETRY_SDK_VERSION: resources.OPENTELEMETRY_SDK_VERSION,
117+
resources.SERVICE_NAME: "unknown_service",
106118
}
107119

108120
attributes_copy = attributes.copy()
@@ -117,6 +129,15 @@ def test_immutability(self):
117129
attributes["cost"] = 999.91
118130
self.assertEqual(resource.attributes, attributes_copy)
119131

132+
def test_service_name_using_process_name(self):
133+
resource = resources.Resource.create(
134+
{resources.PROCESS_EXECUTABLE_NAME: "test"}
135+
)
136+
self.assertEqual(
137+
resource.attributes.get(resources.SERVICE_NAME),
138+
"unknown_service:test",
139+
)
140+
120141
def test_aggregated_resources_no_detectors(self):
121142
aggregated_resources = resources.get_aggregated_resources([])
122143
self.assertEqual(
@@ -192,7 +213,7 @@ def test_resource_detector_raise_error(self):
192213
resource_detector.detect.side_effect = Exception()
193214
resource_detector.raise_on_error = True
194215
self.assertRaises(
195-
Exception, resources.get_aggregated_resources, [resource_detector],
216+
Exception, resources.get_aggregated_resources, [resource_detector]
196217
)
197218

198219

opentelemetry-sdk/tests/trace/test_trace.py

+25-17
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,23 @@ def test_default_span_resource(self):
505505
tracer = tracer_provider.get_tracer(__name__)
506506
span = tracer.start_span("root")
507507
# pylint: disable=protected-access
508-
self.assertEqual(span.resource, resources._DEFAULT_RESOURCE)
508+
self.assertIsInstance(span.resource, resources.Resource)
509+
self.assertEqual(
510+
span.resource.attributes.get(resources.SERVICE_NAME),
511+
"unknown_service",
512+
)
513+
self.assertEqual(
514+
span.resource.attributes.get(resources.TELEMETRY_SDK_LANGUAGE),
515+
"python",
516+
)
517+
self.assertEqual(
518+
span.resource.attributes.get(resources.TELEMETRY_SDK_NAME),
519+
"opentelemetry",
520+
)
521+
self.assertEqual(
522+
span.resource.attributes.get(resources.TELEMETRY_SDK_VERSION),
523+
resources.OPENTELEMETRY_SDK_VERSION,
524+
)
509525

510526
def test_span_context_remote_flag(self):
511527
tracer = new_tracer()
@@ -835,7 +851,7 @@ def test_start_span(self):
835851
)
836852
span.set_status(new_status)
837853
self.assertIs(
838-
span.status.status_code, trace_api.status.StatusCode.ERROR,
854+
span.status.status_code, trace_api.status.StatusCode.ERROR
839855
)
840856
self.assertIs(span.status.description, "Test description")
841857

@@ -930,7 +946,7 @@ def error_status_test(context):
930946
with self.assertRaises(AssertionError):
931947
with context as root:
932948
root.set_status(
933-
trace_api.status.Status(StatusCode.OK, "OK",)
949+
trace_api.status.Status(StatusCode.OK, "OK")
934950
)
935951
raise AssertionError("unknown")
936952

@@ -987,11 +1003,9 @@ def test_record_exception_with_attributes(self):
9871003
"RuntimeError: error",
9881004
exception_event.attributes["exception.stacktrace"],
9891005
)
990-
self.assertIn(
991-
"has_additional_attributes", exception_event.attributes,
992-
)
1006+
self.assertIn("has_additional_attributes", exception_event.attributes)
9931007
self.assertEqual(
994-
True, exception_event.attributes["has_additional_attributes"],
1008+
True, exception_event.attributes["has_additional_attributes"]
9951009
)
9961010

9971011
def test_record_exception_escaped(self):
@@ -1035,9 +1049,7 @@ def test_record_exception_with_timestamp(self):
10351049
"RuntimeError: error",
10361050
exception_event.attributes["exception.stacktrace"],
10371051
)
1038-
self.assertEqual(
1039-
1604238587112021089, exception_event.timestamp,
1040-
)
1052+
self.assertEqual(1604238587112021089, exception_event.timestamp)
10411053

10421054
def test_record_exception_with_attributes_and_timestamp(self):
10431055
span = trace._Span("name", mock.Mock(spec=trace_api.SpanContext))
@@ -1059,15 +1071,11 @@ def test_record_exception_with_attributes_and_timestamp(self):
10591071
"RuntimeError: error",
10601072
exception_event.attributes["exception.stacktrace"],
10611073
)
1062-
self.assertIn(
1063-
"has_additional_attributes", exception_event.attributes,
1064-
)
1065-
self.assertEqual(
1066-
True, exception_event.attributes["has_additional_attributes"],
1067-
)
1074+
self.assertIn("has_additional_attributes", exception_event.attributes)
10681075
self.assertEqual(
1069-
1604238587112021089, exception_event.timestamp,
1076+
True, exception_event.attributes["has_additional_attributes"]
10701077
)
1078+
self.assertEqual(1604238587112021089, exception_event.timestamp)
10711079

10721080
def test_record_exception_context_manager(self):
10731081
try:

0 commit comments

Comments
 (0)