@instana/core
Version:
Core library for Instana's Node.js packages
85 lines (70 loc) • 1.86 kB
JavaScript
/*
* (c) Copyright IBM Corp. 2026
*/
;
const transformers = require('./transformers');
const mappers = require('./mappers');
const { isLogSpan } = require('./util');
const { INSTRUMENTATION_SCOPE } = transformers.resource;
/**
* @type {import("../../core").GenericLogger | undefined}
*/
let logger;
/**
* @param {import('../../config').InstanaConfig} config
*/
function init(config) {
logger = config?.logger;
}
/**
* @param {import('../../core').InstanaBaseSpan[]} spans
* @returns {Object} Payload matching { resourceSpans: [...] }
*/
function convert(spans) {
const otlpSpans = [];
let sampleResourceSpan = null;
// TODO: consider parallel processing of spans in later phase
for (let i = 0; i < spans.length; i++) {
const span = spans[i];
if (isLogSpan(span)) {
// TODO: Add log span converter
continue;
}
try {
const mapper = mappers.get(span);
const otlpSpan = {
...transformers.spanMetaData.extractSpanMetadata(span, mapper),
attributes: transformers.spanAttributes.extractSpanAttributes(span, mapper)
};
// All spans in the same process share the same resource
// Extract resource once from the first valid span
if (sampleResourceSpan === null) {
sampleResourceSpan = span;
}
otlpSpans.push(otlpSpan);
} catch (error) {
logger?.debug('Failed to convert span to OTLP format.', error);
}
}
if (otlpSpans.length === 0) {
return { resourceSpans: [] };
}
const resource = transformers.resource.extractResourceAttributes(sampleResourceSpan);
return {
resourceSpans: [
{
resource,
scopeSpans: [
{
scope: INSTRUMENTATION_SCOPE,
spans: otlpSpans
}
]
}
]
};
}
module.exports = {
init,
convert
};