Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 75c7371

Browse files
authored
Zipkin exporter to get service_name from span instead of global tracer_provider (open-telemetry#1696)
1 parent 3e2bf0e commit 75c7371

File tree

4 files changed

+57
-7
lines changed

4 files changed

+57
-7
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
5454
([#1671](https://github.com/open-telemetry/opentelemetry-python/pull/1671))
5555
- Initial documentation for environment variables
5656
([#1680](https://github.com/open-telemetry/opentelemetry-python/pull/1680))
57+
- Change Zipkin exporter to obtain service.name from span
58+
([#1696](https://github.com/open-telemetry/opentelemetry-python/pull/1696))
5759

5860
### Removed
5961
- Removed unused `get_hexadecimal_trace_id` and `get_hexadecimal_span_id` methods.

exporter/opentelemetry-exporter-zipkin/src/opentelemetry/exporter/zipkin/__init__.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,19 @@
7171

7272
import requests
7373

74-
from opentelemetry.exporter.zipkin.encoder import Encoder, Protocol
74+
from opentelemetry.exporter.zipkin.encoder import (
75+
DEFAULT_MAX_TAG_VALUE_LENGTH,
76+
Encoder,
77+
Protocol,
78+
)
7579
from opentelemetry.exporter.zipkin.encoder.v1.json import JsonV1Encoder
7680
from opentelemetry.exporter.zipkin.encoder.v2.json import JsonV2Encoder
7781
from opentelemetry.exporter.zipkin.encoder.v2.protobuf import ProtobufEncoder
7882
from opentelemetry.exporter.zipkin.node_endpoint import IpInput, NodeEndpoint
7983
from opentelemetry.sdk.environment_variables import (
8084
OTEL_EXPORTER_ZIPKIN_ENDPOINT,
8185
)
86+
from opentelemetry.sdk.resources import SERVICE_NAME
8287
from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult
8388
from opentelemetry.trace import Span
8489

@@ -116,6 +121,15 @@ def __init__(
116121
self.encoder = ProtobufEncoder(max_tag_value_length)
117122

118123
def export(self, spans: Sequence[Span]) -> SpanExportResult:
124+
# Populate service_name from first span
125+
# We restrict any SpanProcessor to be only associated with a single
126+
# TracerProvider, so it is safe to assume that all Spans in a single
127+
# batch all originate from one TracerProvider (and in turn have all
128+
# the same service.name)
129+
if spans:
130+
service_name = spans[0].resource.attributes.get(SERVICE_NAME)
131+
if service_name:
132+
self.local_node.service_name = service_name
119133
result = requests.post(
120134
url=self.endpoint,
121135
data=self.encoder.serialize(spans, self.local_node),

exporter/opentelemetry-exporter-zipkin/src/opentelemetry/exporter/zipkin/encoder/__init__.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -144,20 +144,26 @@ def _extract_tags_from_dict(
144144
logger.warning("Could not serialize tag %s", attribute_key)
145145
continue
146146

147-
if self.max_tag_value_length > 0:
147+
if (
148+
self.max_tag_value_length is not None
149+
and self.max_tag_value_length > 0
150+
):
148151
value = value[: self.max_tag_value_length]
149152
tags[attribute_key] = value
150153
return tags
151154

152155
def _extract_tag_value_string_from_sequence(self, sequence: Sequence):
153-
if self.max_tag_value_length == 1:
156+
if self.max_tag_value_length and self.max_tag_value_length == 1:
154157
return None
155158

156159
tag_value_elements = []
157160
running_string_length = (
158161
2 # accounts for array brackets in output string
159162
)
160-
defined_max_tag_value_length = self.max_tag_value_length > 0
163+
defined_max_tag_value_length = (
164+
self.max_tag_value_length is not None
165+
and self.max_tag_value_length > 0
166+
)
161167

162168
for element in sequence:
163169
if isinstance(element, bool):
@@ -214,7 +220,11 @@ def _extract_annotations_from_events(
214220
for event in events:
215221
attrs = {}
216222
for key, value in event.attributes.items():
217-
if isinstance(value, str) and self.max_tag_value_length > 0:
223+
if (
224+
isinstance(value, str)
225+
and self.max_tag_value_length is not None
226+
and self.max_tag_value_length > 0
227+
):
218228
value = value[: self.max_tag_value_length]
219229
attrs[key] = value
220230

exporter/opentelemetry-exporter-zipkin/tests/test_zipkin_exporter.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
OTEL_EXPORTER_ZIPKIN_ENDPOINT,
2727
)
2828
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
29-
from opentelemetry.sdk.trace import TracerProvider
29+
from opentelemetry.sdk.trace import TracerProvider, _Span
3030
from opentelemetry.sdk.trace.export import SpanExportResult
3131

3232
TEST_SERVICE_NAME = "test_service"
@@ -122,13 +122,37 @@ def test_constructor_all_params_and_env_vars(self):
122122
self.assertEqual(exporter.local_node.port, local_node_port)
123123

124124
@patch("requests.post")
125-
def test_invalid_response(self, mock_post):
125+
def test_export_success(self, mock_post):
126+
mock_post.return_value = MockResponse(200)
127+
spans = []
128+
exporter = ZipkinExporter(Protocol.V2_PROTOBUF)
129+
status = exporter.export(spans)
130+
self.assertEqual(SpanExportResult.SUCCESS, status)
131+
132+
@patch("requests.post")
133+
def test_export_invalid_response(self, mock_post):
126134
mock_post.return_value = MockResponse(404)
127135
spans = []
128136
exporter = ZipkinExporter(Protocol.V2_PROTOBUF)
129137
status = exporter.export(spans)
130138
self.assertEqual(SpanExportResult.FAILURE, status)
131139

140+
@patch("requests.post")
141+
def test_export_span_service_name(self, mock_post):
142+
mock_post.return_value = MockResponse(200)
143+
resource = Resource.create({SERVICE_NAME: "test"})
144+
context = trace.SpanContext(
145+
trace_id=0x000000000000000000000000DEADBEEF,
146+
span_id=0x00000000DEADBEF0,
147+
is_remote=False,
148+
)
149+
span = _Span("test_span", context=context, resource=resource)
150+
span.start()
151+
span.end()
152+
exporter = ZipkinExporter(Protocol.V2_PROTOBUF)
153+
exporter.export([span])
154+
self.assertEqual(exporter.local_node.service_name, "test")
155+
132156

133157
class TestZipkinNodeEndpoint(unittest.TestCase):
134158
def test_constructor_default(self):

0 commit comments

Comments
 (0)