@grafana/faro-transport-otlp-http
Version:
Faro transport which converts the Faro data model to the Otlp data model.
197 lines • 13 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getLogTransforms = getLogTransforms;
exports.getTraceTransforms = getTraceTransforms;
var semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
var faro_core_1 = require("@grafana/faro-core");
var semconv_1 = require("../../semconv");
var attribute_1 = require("../attribute");
function getLogTransforms(internalLogger, customOtlpTransform) {
function toResourceLog(transportItem) {
var resource = toResource(transportItem);
return {
resource: resource,
scopeLogs: [toScopeLog(transportItem)],
};
}
function toScopeLog(transportItem) {
return {
scope: {
name: '@grafana/faro-web-sdk',
version: faro_core_1.VERSION,
},
logRecords: [toLogRecord(transportItem)],
};
}
function toLogRecord(transportItem) {
var type = transportItem.type;
switch (type) {
case faro_core_1.TransportItemType.LOG:
return toLogLogRecord(transportItem);
case faro_core_1.TransportItemType.EXCEPTION:
return toErrorLogRecord(transportItem);
case faro_core_1.TransportItemType.EVENT:
return toEventLogRecord(transportItem);
case faro_core_1.TransportItemType.MEASUREMENT:
return toMeasurementLogRecord(transportItem);
default:
internalLogger === null || internalLogger === void 0 ? void 0 : internalLogger.error("Unknown TransportItemType: ".concat(type));
return {};
}
}
function toLogLogRecord(transportItem) {
var _a, _b;
var meta = transportItem.meta, payload = transportItem.payload;
var timeUnixNano = toTimeUnixNano(payload.timestamp);
var body = (0, attribute_1.toAttributeValue)(payload.message);
function getSeverityProperties(logLevel) {
switch (logLevel) {
case faro_core_1.LogLevel.TRACE:
return { severityNumber: 1, severityText: 'TRACE' };
case faro_core_1.LogLevel.DEBUG:
return { severityNumber: 5, severityText: 'DEBUG' };
case faro_core_1.LogLevel.INFO:
return { severityNumber: 9, severityText: 'INFO' };
case faro_core_1.LogLevel.LOG:
return { severityNumber: 10, severityText: 'INFO2' };
case faro_core_1.LogLevel.WARN:
return { severityNumber: 13, severityText: 'WARN' };
case faro_core_1.LogLevel.ERROR:
return { severityNumber: 17, severityText: 'ERROR' };
}
}
return __assign(__assign({ timeUnixNano: timeUnixNano }, getSeverityProperties(payload.level)), { body: body, attributes: __spreadArray(__spreadArray([], getCommonLogAttributes(meta), true), [(0, attribute_1.toAttribute)('faro.log.context', payload.context)], false).filter(attribute_1.isAttribute), traceId: (_a = payload.trace) === null || _a === void 0 ? void 0 : _a.trace_id, spanId: (_b = payload.trace) === null || _b === void 0 ? void 0 : _b.span_id });
}
function toEventLogRecord(transportItem) {
var _a, _b;
var meta = transportItem.meta, payload = transportItem.payload;
var timeUnixNano = toTimeUnixNano(payload.timestamp);
var body = (0, attribute_1.toAttributeValue)(payload.name);
return {
timeUnixNano: timeUnixNano,
body: body,
attributes: __spreadArray(__spreadArray([], getCommonLogAttributes(meta), true), [
(0, attribute_1.toAttribute)('event.name', payload.name), // This is a semantic attribute. But event.name constant is currently missing in sematic-conventions npm package
(0, attribute_1.toAttribute)('event.domain', payload.domain), // This is a semantic attribute. But event.domain constant is currently missing in sematic-conventions npm package
(0, attribute_1.toAttribute)('event.attributes', payload.attributes),
], false).filter(attribute_1.isAttribute),
traceId: (_a = payload.trace) === null || _a === void 0 ? void 0 : _a.trace_id,
spanId: (_b = payload.trace) === null || _b === void 0 ? void 0 : _b.span_id,
};
}
function toErrorLogRecord(transportItem) {
var _a, _b;
var meta = transportItem.meta, payload = transportItem.payload;
var timeUnixNano = toTimeUnixNano(payload.timestamp);
var body = getCustomLogBody(transportItem, customOtlpTransform === null || customOtlpTransform === void 0 ? void 0 : customOtlpTransform.createErrorLogBody);
return __assign(__assign({ timeUnixNano: timeUnixNano }, (body ? { body: body } : {})), { attributes: __spreadArray(__spreadArray([], getCommonLogAttributes(meta), true), [
(0, attribute_1.toAttribute)(semantic_conventions_1.ATTR_EXCEPTION_TYPE, payload.type),
(0, attribute_1.toAttribute)(semantic_conventions_1.ATTR_EXCEPTION_MESSAGE, payload.value),
// toAttribute(SemanticAttributes.EXCEPTION_STACKTRACE, undefined),
(0, attribute_1.toAttribute)('faro.error.stacktrace', payload.stacktrace),
(0, attribute_1.toAttribute)('faro.error.context', payload.context),
], false).filter(attribute_1.isAttribute), traceId: (_a = payload.trace) === null || _a === void 0 ? void 0 : _a.trace_id, spanId: (_b = payload.trace) === null || _b === void 0 ? void 0 : _b.span_id });
}
function toMeasurementLogRecord(transportItem) {
var _a, _b;
var meta = transportItem.meta, payload = transportItem.payload;
var timeUnixNano = toTimeUnixNano(payload.timestamp);
var _c = Object.entries(payload.values).flat(), measurementName = _c[0], measurementValue = _c[1];
var body = getCustomLogBody(transportItem, customOtlpTransform === null || customOtlpTransform === void 0 ? void 0 : customOtlpTransform.createMeasurementLogBody);
return __assign(__assign({ timeUnixNano: timeUnixNano }, (body ? { body: body } : {})), { attributes: __spreadArray(__spreadArray([], getCommonLogAttributes(meta), true), [
(0, attribute_1.toAttribute)('measurement.type', payload.type),
(0, attribute_1.toAttribute)('measurement.name', measurementName),
(0, attribute_1.toAttribute)('measurement.value', measurementValue),
(0, attribute_1.toAttribute)('faro.measurement.context', payload.context),
], false).filter(attribute_1.isAttribute), traceId: (_a = payload.trace) === null || _a === void 0 ? void 0 : _a.trace_id, spanId: (_b = payload.trace) === null || _b === void 0 ? void 0 : _b.span_id });
}
function getCommonLogAttributes(meta) {
var view = meta.view, page = meta.page, session = meta.session, user = meta.user;
return [
(0, attribute_1.toAttribute)('view.name', view === null || view === void 0 ? void 0 : view.name),
(0, attribute_1.toAttribute)(semantic_conventions_1.ATTR_URL_FULL, page === null || page === void 0 ? void 0 : page.url),
(0, attribute_1.toAttribute)('page.id', page === null || page === void 0 ? void 0 : page.id),
(0, attribute_1.toAttribute)('page.attributes', page === null || page === void 0 ? void 0 : page.attributes),
(0, attribute_1.toAttribute)(semconv_1.ATTR_SESSION_ID, session === null || session === void 0 ? void 0 : session.id),
(0, attribute_1.toAttribute)('session.attributes', session === null || session === void 0 ? void 0 : session.attributes),
(0, attribute_1.toAttribute)(semconv_1.ATTR_USER_ID, user === null || user === void 0 ? void 0 : user.id),
(0, attribute_1.toAttribute)(semconv_1.ATTR_USER_NAME, user === null || user === void 0 ? void 0 : user.username),
(0, attribute_1.toAttribute)(semconv_1.ATTR_USER_EMAIL, user === null || user === void 0 ? void 0 : user.email),
(0, attribute_1.toAttribute)(semconv_1.ATTR_USER_FULL_NAME, user === null || user === void 0 ? void 0 : user.fullName),
(0, attribute_1.toAttribute)(semconv_1.ATTR_USER_ROLES, user === null || user === void 0 ? void 0 : user.roles),
(0, attribute_1.toAttribute)(semconv_1.ATTR_USER_HASH, user === null || user === void 0 ? void 0 : user.hash),
(0, attribute_1.toAttribute)(semconv_1.ATTR_USER_ATTRIBUTES, user === null || user === void 0 ? void 0 : user.attributes),
].filter(attribute_1.isAttribute);
}
function toTimeUnixNano(timestamp) {
return Date.parse(timestamp) * 1e6;
}
return {
toResourceLog: toResourceLog,
toScopeLog: toScopeLog,
toLogRecord: toLogRecord,
};
}
function getTraceTransforms(_internalLogger) {
function toResourceSpan(transportItem) {
var _a, _b;
var resource = toResource(transportItem);
var scopeSpans = (_b = (_a = transportItem.payload.resourceSpans) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.scopeSpans;
return {
resource: resource,
scopeSpans: scopeSpans !== null && scopeSpans !== void 0 ? scopeSpans : [],
};
}
return {
toResourceSpan: toResourceSpan,
};
}
function toResource(transportItem) {
var _a = transportItem.meta, browser = _a.browser, sdk = _a.sdk, app = _a.app;
return {
attributes: [
(0, attribute_1.toAttribute)(semconv_1.ATTR_BROWSER_MOBILE, browser === null || browser === void 0 ? void 0 : browser.mobile),
(0, attribute_1.toAttribute)(semantic_conventions_1.ATTR_USER_AGENT_ORIGINAL, browser === null || browser === void 0 ? void 0 : browser.userAgent),
(0, attribute_1.toAttribute)(semconv_1.ATTR_BROWSER_LANGUAGE, browser === null || browser === void 0 ? void 0 : browser.language),
(0, attribute_1.toAttribute)(semconv_1.ATTR_BROWSER_BRANDS, browser === null || browser === void 0 ? void 0 : browser.brands),
(0, attribute_1.toAttribute)(semconv_1.ATTR_BROWSER_PLATFORM, browser === null || browser === void 0 ? void 0 : browser.os),
(0, attribute_1.toAttribute)('browser.name', browser === null || browser === void 0 ? void 0 : browser.name),
(0, attribute_1.toAttribute)('browser.version', browser === null || browser === void 0 ? void 0 : browser.version),
(0, attribute_1.toAttribute)('browser.screen_width', browser === null || browser === void 0 ? void 0 : browser.viewportWidth),
(0, attribute_1.toAttribute)('browser.screen_height', browser === null || browser === void 0 ? void 0 : browser.viewportHeight),
(0, attribute_1.toAttribute)(semantic_conventions_1.ATTR_TELEMETRY_SDK_NAME, sdk === null || sdk === void 0 ? void 0 : sdk.name),
(0, attribute_1.toAttribute)(semantic_conventions_1.ATTR_TELEMETRY_SDK_VERSION, sdk === null || sdk === void 0 ? void 0 : sdk.version),
Boolean(sdk) ? (0, attribute_1.toAttribute)(semantic_conventions_1.ATTR_TELEMETRY_SDK_LANGUAGE, semantic_conventions_1.TELEMETRY_SDK_LANGUAGE_VALUE_WEBJS) : undefined,
(0, attribute_1.toAttribute)(semantic_conventions_1.ATTR_SERVICE_NAME, app === null || app === void 0 ? void 0 : app.name),
(0, attribute_1.toAttribute)(semantic_conventions_1.ATTR_SERVICE_VERSION, app === null || app === void 0 ? void 0 : app.version),
(0, attribute_1.toAttribute)(semconv_1.ATTR_SERVICE_NAMESPACE, app === null || app === void 0 ? void 0 : app.namespace),
(0, attribute_1.toAttribute)(semconv_1.ATTR_DEPLOYMENT_ENVIRONMENT_NAME, app === null || app === void 0 ? void 0 : app.environment),
].filter(attribute_1.isAttribute),
};
}
function getCustomLogBody(transportItem, createCustomLogBody) {
return typeof createCustomLogBody === 'function'
? (0, attribute_1.toAttributeValue)(createCustomLogBody(transportItem))
: undefined;
}
//# sourceMappingURL=transform.js.map