Skip to content

Commit 471306f

Browse files
feat(exporter-zipkin): per-span service name (#1789)
Co-authored-by: Daniel Dyla <[email protected]>
1 parent fd0d35d commit 471306f

File tree

2 files changed

+182
-1
lines changed

2 files changed

+182
-1
lines changed

packages/opentelemetry-exporter-zipkin/src/zipkin.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,11 @@ export class ZipkinExporter implements SpanExporter {
109109
const zipkinSpans = spans.map(span =>
110110
toZipkinSpan(
111111
span,
112-
serviceName,
112+
String(
113+
span.attributes[SERVICE_RESOURCE.NAME] ||
114+
span.resource.attributes[SERVICE_RESOURCE.NAME] ||
115+
serviceName
116+
),
113117
this._statusCodeTagName,
114118
this._statusDescriptionTagName
115119
)

packages/opentelemetry-exporter-zipkin/test/node/zipkin.test.ts

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,183 @@ describe('Zipkin Exporter - node', () => {
482482
});
483483
});
484484
});
485+
486+
it('should set serviceName per-span if resource has one', () => {
487+
const resource_service_name = 'resource_service_name';
488+
const resource_service_name_prime = 'resource_service_name_prime';
489+
490+
let requestBody: zipkinTypes.Span[];
491+
const scope = nock('http://localhost:9411')
492+
.post('/api/v2/spans', body => {
493+
requestBody = body;
494+
return true;
495+
})
496+
.replyWithError(new Error('My Socket Error'));
497+
498+
const parentSpanId = '5c1c63257de34c67';
499+
const startTime = 1566156729709;
500+
const duration = 2000;
501+
502+
const span1: ReadableSpan = {
503+
name: 'my-span',
504+
kind: api.SpanKind.INTERNAL,
505+
parentSpanId,
506+
spanContext: {
507+
traceId: 'd4cda95b652f4a1592b449d5929fda1b',
508+
spanId: '6e0c63257de34c92',
509+
traceFlags: TraceFlags.NONE,
510+
},
511+
startTime: [startTime, 0],
512+
endTime: [startTime + duration, 0],
513+
ended: true,
514+
duration: [duration, 0],
515+
status: {
516+
code: api.StatusCode.OK,
517+
},
518+
attributes: {
519+
key1: 'value1',
520+
key2: 'value2',
521+
},
522+
links: [],
523+
events: [
524+
{
525+
name: 'my-event',
526+
time: [startTime + 10, 0],
527+
attributes: { key3: 'value3' },
528+
},
529+
],
530+
resource: new Resource({
531+
[SERVICE_RESOURCE.NAME]: resource_service_name,
532+
}),
533+
instrumentationLibrary: { name: 'default', version: '0.0.1' },
534+
};
535+
const span2: ReadableSpan = {
536+
name: 'my-span',
537+
kind: api.SpanKind.SERVER,
538+
spanContext: {
539+
traceId: 'd4cda95b652f4a1592b449d5929fda1b',
540+
spanId: '6e0c63257de34c92',
541+
traceFlags: TraceFlags.NONE,
542+
},
543+
startTime: [startTime, 0],
544+
endTime: [startTime + duration, 0],
545+
ended: true,
546+
duration: [duration, 0],
547+
status: {
548+
code: api.StatusCode.OK,
549+
},
550+
attributes: {},
551+
links: [],
552+
events: [],
553+
resource: new Resource({
554+
[SERVICE_RESOURCE.NAME]: resource_service_name_prime,
555+
}),
556+
instrumentationLibrary: { name: 'default', version: '0.0.1' },
557+
};
558+
559+
const exporter = new ZipkinExporter({});
560+
561+
exporter.export([span1, span2], (result: ExportResult) => {
562+
requestBody;
563+
scope.done();
564+
assert.equal(
565+
requestBody[0].localEndpoint.serviceName,
566+
resource_service_name
567+
);
568+
assert.equal(
569+
requestBody[1].localEndpoint.serviceName,
570+
resource_service_name_prime
571+
);
572+
});
573+
});
574+
575+
it('should set serviceName per-span if span has attribute', () => {
576+
const span_service_name = 'span_service_name';
577+
const span_service_name_prime = 'span_service_name_prime';
578+
579+
let requestBody: any;
580+
const scope = nock('http://localhost:9411')
581+
.post('/api/v2/spans', body => {
582+
requestBody = body;
583+
return true;
584+
})
585+
.replyWithError(new Error('My Socket Error'));
586+
587+
const parentSpanId = '5c1c63257de34c67';
588+
const startTime = 1566156729709;
589+
const duration = 2000;
590+
591+
const span1: ReadableSpan = {
592+
name: 'my-span',
593+
kind: api.SpanKind.INTERNAL,
594+
parentSpanId,
595+
spanContext: {
596+
traceId: 'd4cda95b652f4a1592b449d5929fda1b',
597+
spanId: '6e0c63257de34c92',
598+
traceFlags: TraceFlags.NONE,
599+
},
600+
startTime: [startTime, 0],
601+
endTime: [startTime + duration, 0],
602+
ended: true,
603+
duration: [duration, 0],
604+
status: {
605+
code: api.StatusCode.OK,
606+
},
607+
attributes: {
608+
key1: 'value1',
609+
key2: 'value2',
610+
[SERVICE_RESOURCE.NAME]: span_service_name,
611+
},
612+
links: [],
613+
events: [
614+
{
615+
name: 'my-event',
616+
time: [startTime + 10, 0],
617+
attributes: { key3: 'value3' },
618+
},
619+
],
620+
resource: Resource.empty(),
621+
instrumentationLibrary: { name: 'default', version: '0.0.1' },
622+
};
623+
const span2: ReadableSpan = {
624+
name: 'my-span',
625+
kind: api.SpanKind.SERVER,
626+
spanContext: {
627+
traceId: 'd4cda95b652f4a1592b449d5929fda1b',
628+
spanId: '6e0c63257de34c92',
629+
traceFlags: TraceFlags.NONE,
630+
},
631+
startTime: [startTime, 0],
632+
endTime: [startTime + duration, 0],
633+
ended: true,
634+
duration: [duration, 0],
635+
status: {
636+
code: api.StatusCode.OK,
637+
},
638+
attributes: {
639+
[SERVICE_RESOURCE.NAME]: span_service_name_prime,
640+
},
641+
links: [],
642+
events: [],
643+
resource: Resource.empty(),
644+
instrumentationLibrary: { name: 'default', version: '0.0.1' },
645+
};
646+
647+
const exporter = new ZipkinExporter({});
648+
649+
exporter.export([span1, span2], (result: ExportResult) => {
650+
requestBody;
651+
scope.done();
652+
assert.equal(
653+
requestBody[0].localEndpoint.serviceName,
654+
span_service_name
655+
);
656+
assert.equal(
657+
requestBody[1].localEndpoint.serviceName,
658+
span_service_name_prime
659+
);
660+
});
661+
});
485662
});
486663

487664
describe('shutdown', () => {

0 commit comments

Comments
 (0)