Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
193 lines
5.3 KiB
Plaintext
193 lines
5.3 KiB
Plaintext
import { getGlobalScope } from '../currentScopes.js';
|
|
import { getDynamicSamplingContextFromSpan } from '../tracing/dynamicSamplingContext.js';
|
|
import { merge } from './merge.js';
|
|
import { spanToTraceContext, getRootSpan, spanToJSON } from './spanUtils.js';
|
|
|
|
/**
|
|
* Applies data from the scope to the event and runs all event processors on it.
|
|
*/
|
|
function applyScopeDataToEvent(event, data) {
|
|
const { fingerprint, span, breadcrumbs, sdkProcessingMetadata } = data;
|
|
|
|
// Apply general data
|
|
applyDataToEvent(event, data);
|
|
|
|
// We want to set the trace context for normal events only if there isn't already
|
|
// a trace context on the event. There is a product feature in place where we link
|
|
// errors with transaction and it relies on that.
|
|
if (span) {
|
|
applySpanToEvent(event, span);
|
|
}
|
|
|
|
applyFingerprintToEvent(event, fingerprint);
|
|
applyBreadcrumbsToEvent(event, breadcrumbs);
|
|
applySdkMetadataToEvent(event, sdkProcessingMetadata);
|
|
}
|
|
|
|
/** Merge data of two scopes together. */
|
|
function mergeScopeData(data, mergeData) {
|
|
const {
|
|
extra,
|
|
tags,
|
|
attributes,
|
|
user,
|
|
contexts,
|
|
level,
|
|
sdkProcessingMetadata,
|
|
breadcrumbs,
|
|
fingerprint,
|
|
eventProcessors,
|
|
attachments,
|
|
propagationContext,
|
|
transactionName,
|
|
span,
|
|
} = mergeData;
|
|
|
|
mergeAndOverwriteScopeData(data, 'extra', extra);
|
|
mergeAndOverwriteScopeData(data, 'tags', tags);
|
|
mergeAndOverwriteScopeData(data, 'attributes', attributes);
|
|
mergeAndOverwriteScopeData(data, 'user', user);
|
|
mergeAndOverwriteScopeData(data, 'contexts', contexts);
|
|
|
|
data.sdkProcessingMetadata = merge(data.sdkProcessingMetadata, sdkProcessingMetadata, 2);
|
|
|
|
if (level) {
|
|
data.level = level;
|
|
}
|
|
|
|
if (transactionName) {
|
|
data.transactionName = transactionName;
|
|
}
|
|
|
|
if (span) {
|
|
data.span = span;
|
|
}
|
|
|
|
if (breadcrumbs.length) {
|
|
data.breadcrumbs = [...data.breadcrumbs, ...breadcrumbs];
|
|
}
|
|
|
|
if (fingerprint.length) {
|
|
data.fingerprint = [...data.fingerprint, ...fingerprint];
|
|
}
|
|
|
|
if (eventProcessors.length) {
|
|
data.eventProcessors = [...data.eventProcessors, ...eventProcessors];
|
|
}
|
|
|
|
if (attachments.length) {
|
|
data.attachments = [...data.attachments, ...attachments];
|
|
}
|
|
|
|
data.propagationContext = { ...data.propagationContext, ...propagationContext };
|
|
}
|
|
|
|
/**
|
|
* Merges certain scope data. Undefined values will overwrite any existing values.
|
|
* Exported only for tests.
|
|
*/
|
|
function mergeAndOverwriteScopeData
|
|
|
|
(data, prop, mergeVal) {
|
|
data[prop] = merge(data[prop], mergeVal, 1);
|
|
}
|
|
|
|
/**
|
|
* Get the scope data for the current scope after merging with the
|
|
* global scope and isolation scope.
|
|
*
|
|
* @param currentScope - The current scope.
|
|
* @returns The scope data.
|
|
*/
|
|
function getCombinedScopeData(isolationScope, currentScope) {
|
|
const scopeData = getGlobalScope().getScopeData();
|
|
isolationScope && mergeScopeData(scopeData, isolationScope.getScopeData());
|
|
currentScope && mergeScopeData(scopeData, currentScope.getScopeData());
|
|
return scopeData;
|
|
}
|
|
|
|
function applyDataToEvent(event, data) {
|
|
const { extra, tags, user, contexts, level, transactionName } = data;
|
|
|
|
if (Object.keys(extra).length) {
|
|
event.extra = { ...extra, ...event.extra };
|
|
}
|
|
|
|
if (Object.keys(tags).length) {
|
|
event.tags = { ...tags, ...event.tags };
|
|
}
|
|
|
|
if (Object.keys(user).length) {
|
|
event.user = { ...user, ...event.user };
|
|
}
|
|
|
|
if (Object.keys(contexts).length) {
|
|
event.contexts = { ...contexts, ...event.contexts };
|
|
}
|
|
|
|
if (level) {
|
|
event.level = level;
|
|
}
|
|
|
|
// transaction events get their `transaction` from the root span name
|
|
if (transactionName && event.type !== 'transaction') {
|
|
event.transaction = transactionName;
|
|
}
|
|
}
|
|
|
|
function applyBreadcrumbsToEvent(event, breadcrumbs) {
|
|
const mergedBreadcrumbs = [...(event.breadcrumbs || []), ...breadcrumbs];
|
|
event.breadcrumbs = mergedBreadcrumbs.length ? mergedBreadcrumbs : undefined;
|
|
}
|
|
|
|
function applySdkMetadataToEvent(event, sdkProcessingMetadata) {
|
|
event.sdkProcessingMetadata = {
|
|
...event.sdkProcessingMetadata,
|
|
...sdkProcessingMetadata,
|
|
};
|
|
}
|
|
|
|
function applySpanToEvent(event, span) {
|
|
event.contexts = {
|
|
trace: spanToTraceContext(span),
|
|
...event.contexts,
|
|
};
|
|
|
|
event.sdkProcessingMetadata = {
|
|
dynamicSamplingContext: getDynamicSamplingContextFromSpan(span),
|
|
...event.sdkProcessingMetadata,
|
|
};
|
|
|
|
const rootSpan = getRootSpan(span);
|
|
const transactionName = spanToJSON(rootSpan).description;
|
|
if (transactionName && !event.transaction && event.type === 'transaction') {
|
|
event.transaction = transactionName;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Applies fingerprint from the scope to the event if there's one,
|
|
* uses message if there's one instead or get rid of empty fingerprint
|
|
*/
|
|
function applyFingerprintToEvent(event, fingerprint) {
|
|
// Make sure it's an array first and we actually have something in place
|
|
event.fingerprint = event.fingerprint
|
|
? Array.isArray(event.fingerprint)
|
|
? event.fingerprint
|
|
: [event.fingerprint]
|
|
: [];
|
|
|
|
// If we have something on the scope, then merge it with event
|
|
if (fingerprint) {
|
|
event.fingerprint = event.fingerprint.concat(fingerprint);
|
|
}
|
|
|
|
// If we have no data at all, remove empty array default
|
|
if (!event.fingerprint.length) {
|
|
delete event.fingerprint;
|
|
}
|
|
}
|
|
|
|
export { applyScopeDataToEvent, getCombinedScopeData, mergeAndOverwriteScopeData, mergeScopeData };
|
|
//# sourceMappingURL=scopeData.js.map
|