86 lines
3.4 KiB
JavaScript
86 lines
3.4 KiB
JavaScript
/*
|
|
* Copyright The OpenTelemetry Authors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* https://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
import * as api from '@opentelemetry/api';
|
|
import { hrTimeToMicroseconds } from '@opentelemetry/core';
|
|
import * as zipkinTypes from './types';
|
|
const ZIPKIN_SPAN_KIND_MAPPING = {
|
|
[api.SpanKind.CLIENT]: zipkinTypes.SpanKind.CLIENT,
|
|
[api.SpanKind.SERVER]: zipkinTypes.SpanKind.SERVER,
|
|
[api.SpanKind.CONSUMER]: zipkinTypes.SpanKind.CONSUMER,
|
|
[api.SpanKind.PRODUCER]: zipkinTypes.SpanKind.PRODUCER,
|
|
// When absent, the span is local.
|
|
[api.SpanKind.INTERNAL]: undefined,
|
|
};
|
|
export const defaultStatusCodeTagName = 'otel.status_code';
|
|
export const defaultStatusErrorTagName = 'error';
|
|
/**
|
|
* Translate OpenTelemetry ReadableSpan to ZipkinSpan format
|
|
* @param span Span to be translated
|
|
*/
|
|
export function toZipkinSpan(span, serviceName, statusCodeTagName, statusErrorTagName) {
|
|
const zipkinSpan = {
|
|
traceId: span.spanContext().traceId,
|
|
parentId: span.parentSpanId,
|
|
name: span.name,
|
|
id: span.spanContext().spanId,
|
|
kind: ZIPKIN_SPAN_KIND_MAPPING[span.kind],
|
|
timestamp: hrTimeToMicroseconds(span.startTime),
|
|
duration: Math.round(hrTimeToMicroseconds(span.duration)),
|
|
localEndpoint: { serviceName },
|
|
tags: _toZipkinTags(span, statusCodeTagName, statusErrorTagName),
|
|
annotations: span.events.length
|
|
? _toZipkinAnnotations(span.events)
|
|
: undefined,
|
|
};
|
|
return zipkinSpan;
|
|
}
|
|
/** Converts OpenTelemetry Span properties to Zipkin Tags format. */
|
|
export function _toZipkinTags({ attributes, resource, status, droppedAttributesCount, droppedEventsCount, droppedLinksCount, }, statusCodeTagName, statusErrorTagName) {
|
|
const tags = {};
|
|
for (const key of Object.keys(attributes)) {
|
|
tags[key] = String(attributes[key]);
|
|
}
|
|
if (status.code !== api.SpanStatusCode.UNSET) {
|
|
tags[statusCodeTagName] = String(api.SpanStatusCode[status.code]);
|
|
}
|
|
if (status.code === api.SpanStatusCode.ERROR && status.message) {
|
|
tags[statusErrorTagName] = status.message;
|
|
}
|
|
/* Add droppedAttributesCount as a tag */
|
|
if (droppedAttributesCount) {
|
|
tags['otel.dropped_attributes_count'] = String(droppedAttributesCount);
|
|
}
|
|
/* Add droppedEventsCount as a tag */
|
|
if (droppedEventsCount) {
|
|
tags['otel.dropped_events_count'] = String(droppedEventsCount);
|
|
}
|
|
/* Add droppedLinksCount as a tag */
|
|
if (droppedLinksCount) {
|
|
tags['otel.dropped_links_count'] = String(droppedLinksCount);
|
|
}
|
|
Object.keys(resource.attributes).forEach(name => (tags[name] = String(resource.attributes[name])));
|
|
return tags;
|
|
}
|
|
/**
|
|
* Converts OpenTelemetry Events to Zipkin Annotations format.
|
|
*/
|
|
export function _toZipkinAnnotations(events) {
|
|
return events.map(event => ({
|
|
timestamp: Math.round(hrTimeToMicroseconds(event.time)),
|
|
value: event.name,
|
|
}));
|
|
}
|
|
//# sourceMappingURL=transform.js.map
|