@instana/core
Version:
Core library for Instana's Node.js packages
132 lines (114 loc) • 3.63 kB
JavaScript
/*
* (c) Copyright IBM Corp. 2026
*/
;
const ctx = require('../../common/context');
const { OTLP_SPAN_KINDS, INSTANA_SPAN_KINDS } = require('../mappers/constants');
const metaMapper = {
/**
* @param {import('../../../core').InstanaBaseSpan} span
* @returns {string | undefined}
*/
convertTraceId(span) {
if (span.t === undefined) return undefined;
if (!span.t) return '';
return String(span.t).padStart(32, '0');
},
/**
* @param {import('../../../core').InstanaBaseSpan} span
* @returns {string | undefined}
*/
convertSpanId(span) {
if (span.s === undefined) return undefined;
if (!span.s) return '';
return String(span.s).padStart(16, '0');
},
/**
* @param {import('../../../core').InstanaBaseSpan} span
* @returns {string | undefined}
*/
convertParentId(span) {
if (span.p === undefined) return undefined;
if (!span.p) return '';
return String(span.p).padStart(16, '0');
},
/**
* @param {import('../../../core').InstanaBaseSpan} span
* @returns {number | undefined}
*/
convertSpanKind(span) {
if (span.k === INSTANA_SPAN_KINDS.ENTRY) {
return OTLP_SPAN_KINDS.SERVER;
}
if (span.k === INSTANA_SPAN_KINDS.EXIT) {
return OTLP_SPAN_KINDS.CLIENT;
}
if (span.k === INSTANA_SPAN_KINDS.INTERMEDIATE) {
return OTLP_SPAN_KINDS.INTERNAL;
}
return OTLP_SPAN_KINDS.UNSPECIFIED;
},
/**
* @param {import('../../../core').InstanaBaseSpan} span
* @returns {string | undefined}
*/
convertStartTime(span) {
if (span.ts === undefined) return undefined;
return String(Number(span.ts) * 1000000);
},
/**
* @param {import('../../../core').InstanaBaseSpan} span
* @returns {string}
*/
generateEndTime(span) {
const startMs = span.ts !== undefined ? Number(span.ts) : 0;
const deltaMs = span.d !== undefined ? Number(span.d) : 0;
return String((startMs + deltaMs) * 1000000);
},
/**
* TODO: currently not supported in Instana and not added in the payload
* @returns {any[]}
*/
events() {
return [];
},
/**
* TODO: currently not supported in Instana and not added in the payload
* @returns {any[]}
*/
links() {
return [];
}
};
/**
* @typedef {Object} SpanMapper
* @property {function(import('../../../core').InstanaBaseSpan): string} spanName
* @property {function(import('../../../core').InstanaBaseSpan): { code: number, message?: string }} spanStatus
*/
/**
* @param {import('../../../core').InstanaBaseSpan} span
* @param {SpanMapper} mapper
* @returns {Record<string, any>}
*/
function extractSpanMetadata(span, mapper) {
const OTLP = /** @type {any} */ (ctx.semConv);
const metadataMappings = [
{ otlp: OTLP.metadata.TRACE_ID, value: metaMapper.convertTraceId(span) },
{ otlp: OTLP.metadata.SPAN_ID, value: metaMapper.convertSpanId(span) },
{ otlp: OTLP.metadata.PARENT_ID, value: metaMapper.convertParentId(span) },
{ otlp: OTLP.metadata.SPAN_KIND, value: metaMapper.convertSpanKind(span) },
{ otlp: OTLP.metadata.START_TIME_UNIX_NANO, value: metaMapper.convertStartTime(span) },
{ otlp: OTLP.metadata.END_TIME_UNIX_NANO, value: metaMapper.generateEndTime(span) },
{ otlp: OTLP.metadata.NAME, value: mapper.spanName(span) },
{ otlp: OTLP.metadata.STATUS, value: mapper.spanStatus(span) }
];
return metadataMappings.reduce((/** @type {Record<string, any>} */ acc, current) => {
if (current.value !== undefined) {
acc[current.otlp] = current.value;
}
return acc;
}, {});
}
module.exports = {
extractSpanMetadata
};