@grafana/faro-web-tracing
Version:
Faro web tracing implementation.
58 lines • 3.17 kB
JavaScript
import { ESpanKind } from '@opentelemetry/otlp-transformer/build/src/trace/internal-types';
import { faro, unknownString } from '@grafana/faro-core';
const DURATION_NS_KEY = 'duration_ns';
export function sendFaroEvents(resourceSpans = []) {
var _a, _b;
for (const resourceSpan of resourceSpans) {
const { scopeSpans } = resourceSpan;
for (const scopeSpan of scopeSpans) {
const { scope, spans = [] } = scopeSpan;
for (const span of spans) {
if (span.kind !== ESpanKind.SPAN_KIND_CLIENT) {
continue;
}
const spanContext = {
traceId: span.traceId.toString(),
spanId: span.spanId.toString(),
};
const faroEventAttributes = {};
for (const attribute of span.attributes) {
faroEventAttributes[attribute.key] = String(Object.values(attribute.value)[0]);
}
// Add span duration in nanoseconds
if (!Number.isNaN(span.endTimeUnixNano) && !Number.isNaN(span.startTimeUnixNano)) {
faroEventAttributes[DURATION_NS_KEY] = String(Number(span.endTimeUnixNano) - Number(span.startTimeUnixNano));
}
const index = ((_a = scope === null || scope === void 0 ? void 0 : scope.name) !== null && _a !== void 0 ? _a : '').indexOf('-');
let eventName = unknownString;
if (scope === null || scope === void 0 ? void 0 : scope.name) {
if (index === -1) {
eventName = (_b = scope.name.split('/')[1]) !== null && _b !== void 0 ? _b : scope.name;
}
if (index > -1) {
eventName = scope === null || scope === void 0 ? void 0 : scope.name.substring(index + 1);
}
}
faro.api.pushEvent(`faro.tracing.${eventName}`, faroEventAttributes, undefined, {
spanContext,
// Convert nanoseconds to milliseconds
timestampOverwriteMs: Number(span.endTimeUnixNano) / 1000000,
customPayloadTransformer: (payload) => {
var _a, _b;
if (faroEventAttributes['faro.action.user.name'] != null &&
faroEventAttributes['faro.action.user.parentId'] != null) {
payload.action = {
name: faroEventAttributes['faro.action.user.name'],
parentId: faroEventAttributes['faro.action.user.parentId'],
};
(_a = payload.attributes) === null || _a === void 0 ? true : delete _a['faro.action.user.name'];
(_b = payload.attributes) === null || _b === void 0 ? true : delete _b['faro.action.user.parentId'];
}
return payload;
},
});
}
}
}
}
//# sourceMappingURL=faroTraceExporter.utils.js.map