From 68d6eba0527860253fc19e3e95cc2cf3da903ef7 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 8 Sep 2022 10:01:07 +0200 Subject: [PATCH 1/8] add interfaces for transaction name change --- packages/types/src/event.ts | 5 ++++- packages/types/src/index.ts | 1 + packages/types/src/transaction.ts | 20 ++++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/packages/types/src/event.ts b/packages/types/src/event.ts index 0d3897734956..7387c266fbbd 100644 --- a/packages/types/src/event.ts +++ b/packages/types/src/event.ts @@ -11,7 +11,7 @@ import { CaptureContext } from './scope'; import { SdkInfo } from './sdkinfo'; import { Severity, SeverityLevel } from './severity'; import { Span } from './span'; -import { TransactionSource } from './transaction'; +import { TransactionNameChange, TransactionSource } from './transaction'; import { User } from './user'; /** JSDoc */ @@ -49,6 +49,9 @@ export interface Event { sdkProcessingMetadata?: { [key: string]: any }; transaction_info?: { source: TransactionSource; + name_changes: TransactionNameChange[]; + // The total number of propagations that happened + num_propagations: number; }; } diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index c43bb34c8f8e..20718b53830f 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -73,6 +73,7 @@ export type { TransactionMetadata, TransactionSamplingMethod, TransactionSource, + TransactionNameChange, } from './transaction'; export type { DurationUnit, diff --git a/packages/types/src/transaction.ts b/packages/types/src/transaction.ts index d8029c2184cb..3dfc3631a7b0 100644 --- a/packages/types/src/transaction.ts +++ b/packages/types/src/transaction.ts @@ -150,6 +150,12 @@ export interface TransactionMetadata { /** Metadata for the transaction's spans, keyed by spanId */ spanMetadata: { [spanId: string]: { [key: string]: unknown } }; + + /** Metadata representing information about transaction name changes */ + nameChanges: TransactionNameChange[]; + + /** The total number of propagations that happened */ + numPropagations: number; } /** @@ -169,3 +175,17 @@ export type TransactionSource = | 'component' /** Name of a background task (e.g. a Celery task) */ | 'task'; + +/** + * Object representing metadata about when a transaction name was changed. + */ +export interface TransactionNameChange { + // new name + name: string; + // unix timestamp when the name was changed + timestamp: number; + // new source + source: TransactionSource; + // number of propagations since start of transaction. + propagations: number; +} From fead2467865568e3864ea8691e4179d3d7c714d8 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 8 Sep 2022 10:59:25 +0200 Subject: [PATCH 2/8] update transaction to record name changes --- packages/tracing/src/index.ts | 2 +- packages/tracing/src/transaction.ts | 34 +++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/packages/tracing/src/index.ts b/packages/tracing/src/index.ts index 14d80fb7b4cc..551280a2e8dd 100644 --- a/packages/tracing/src/index.ts +++ b/packages/tracing/src/index.ts @@ -27,7 +27,7 @@ export { BrowserTracing, BROWSER_TRACING_INTEGRATION_ID } from './browser'; export { Span, spanStatusfromHttpCode } from './span'; // eslint-disable-next-line deprecation/deprecation export { SpanStatus } from './spanstatus'; -export { Transaction } from './transaction'; +export { Transaction, generateTransactionNameChange } from './transaction'; export { instrumentOutgoingRequests, defaultRequestInstrumentationOptions } from './browser'; export { IdleTransaction } from './idletransaction'; export { startIdleTransaction } from './hubextensions'; diff --git a/packages/tracing/src/transaction.ts b/packages/tracing/src/transaction.ts index 2b509763743d..5975f4194343 100644 --- a/packages/tracing/src/transaction.ts +++ b/packages/tracing/src/transaction.ts @@ -8,8 +8,17 @@ import { Transaction as TransactionInterface, TransactionContext, TransactionMetadata, + TransactionNameChange, + TransactionSource, } from '@sentry/types'; -import { createBaggage, dropUndefinedKeys, getSentryBaggageItems, isBaggageMutable, logger } from '@sentry/utils'; +import { + createBaggage, + dropUndefinedKeys, + getSentryBaggageItems, + isBaggageMutable, + logger, + timestampWithMs, +} from '@sentry/utils'; import { Span as SpanClass, SpanRecorder } from './span'; @@ -45,6 +54,8 @@ export class Transaction extends SpanClass implements TransactionInterface { this.metadata = { ...transactionContext.metadata, spanMetadata: {}, + nameChanges: [], + numPropagations: 0, }; this._trimEnd = transactionContext.trimEnd; @@ -61,7 +72,9 @@ export class Transaction extends SpanClass implements TransactionInterface { /** Setter for `name` property, which also sets `source` */ public set name(newName: string) { this._name = newName; - this.metadata.source = 'custom'; + const source = 'custom'; + this.metadata.source = source; + this.metadata.nameChanges.push(generateTransactionNameChange(newName, source, this.metadata.numPropagations)); } /** @@ -70,6 +83,7 @@ export class Transaction extends SpanClass implements TransactionInterface { public setName(name: string, source: TransactionMetadata['source'] = 'custom'): void { this.name = name; this.metadata.source = source; + this.metadata.nameChanges.push(generateTransactionNameChange(name, source, this.metadata.numPropagations)); } /** @@ -156,6 +170,8 @@ export class Transaction extends SpanClass implements TransactionInterface { ...(metadata.source && { transaction_info: { source: metadata.source, + name_changes: metadata.nameChanges, + num_propagations: metadata.numPropagations, }, }), }; @@ -273,3 +289,17 @@ export class Transaction extends SpanClass implements TransactionInterface { ); } } + +/** Generate objects representing a transaction name change */ +export function generateTransactionNameChange( + name: string, + source: TransactionSource, + propagations: number, +): TransactionNameChange { + return { + name, + source, + timestamp: timestampWithMs(), + propagations, + }; +} From 76af3e3daf370a0140d5227f84417050ca600622 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 8 Sep 2022 10:59:37 +0200 Subject: [PATCH 3/8] record propagations in the browser --- packages/tracing/src/browser/request.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/tracing/src/browser/request.ts b/packages/tracing/src/browser/request.ts index ae67d5b6ae19..c3972d54eee9 100644 --- a/packages/tracing/src/browser/request.ts +++ b/packages/tracing/src/browser/request.ts @@ -199,6 +199,7 @@ export function fetchCallback( // eslint-disable-next-line @typescript-eslint/no-explicit-any const options = (handlerData.args[1] = (handlerData.args[1] as { [key: string]: any }) || {}); options.headers = addTracingHeaders(request, activeTransaction.getBaggage(), span, options); + activeTransaction.metadata.numPropagations += 1; } } @@ -304,6 +305,7 @@ export function xhrCallback( BAGGAGE_HEADER_NAME, mergeAndSerializeBaggage(activeTransaction.getBaggage(), headerBaggageString), ); + activeTransaction.metadata.numPropagations += 1; } catch (_) { // Error: InvalidStateError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED. } From d16a3530285f77d82add78a5ae76b1a572b3997b Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 8 Sep 2022 10:59:58 +0200 Subject: [PATCH 4/8] record propagations in node --- packages/node/src/integrations/http.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/node/src/integrations/http.ts b/packages/node/src/integrations/http.ts index 9edd5d8c3d34..c39650550cd7 100644 --- a/packages/node/src/integrations/http.ts +++ b/packages/node/src/integrations/http.ts @@ -185,6 +185,11 @@ function _createWrappedRequestMethodFactory( addRequestBreadcrumb('response', requestUrl, req, res); } if (tracingEnabled && span) { + const transaction = span.transaction; + if (transaction) { + transaction.metadata.numPropagations += 1; + } + if (res.statusCode) { span.setHttpStatus(res.statusCode); } From 8c00b71a97ce03076e019abdd6f0ebec4d6d26d7 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 8 Sep 2022 11:00:00 +0200 Subject: [PATCH 5/8] record name changes in event processing --- packages/core/src/baseclient.ts | 24 ++++++++++++++++++++++++ packages/hub/src/scope.ts | 1 + 2 files changed, 25 insertions(+) diff --git a/packages/core/src/baseclient.ts b/packages/core/src/baseclient.ts index 6d246106048c..47c225174e8c 100644 --- a/packages/core/src/baseclient.ts +++ b/packages/core/src/baseclient.ts @@ -35,6 +35,7 @@ import { SyncPromise, truncate, uuid4, + timestampInSeconds, } from '@sentry/utils'; import { getEnvelopeEndpointWithUrlEncodedAuth } from './api'; @@ -653,6 +654,29 @@ export abstract class BaseClient implements Client { throw new SentryError('`beforeSend` returned `null`, will not send event.', 'log'); } + const transactionInfo = processedEvent.transaction_info; + if ( + processedEvent.type === 'transaction' && + transactionInfo && + processedEvent.transaction && + processedEvent.transaction !== event.transaction + ) { + const source = 'custom'; + event.transaction_info = { + ...transactionInfo, + source, + name_changes: [ + ...transactionInfo.name_changes, + { + name: processedEvent.transaction, + source, + timestamp: timestampInSeconds(), + propagations: transactionInfo.num_propagations, + }, + ], + }; + } + const session = scope && scope.getSession(); if (!isTransaction && session) { this._updateSessionFromEvent(session, processedEvent); diff --git a/packages/hub/src/scope.ts b/packages/hub/src/scope.ts index 4f72afa34a61..65a75f2ccbd5 100644 --- a/packages/hub/src/scope.ts +++ b/packages/hub/src/scope.ts @@ -29,6 +29,7 @@ import { isThenable, logger, SyncPromise, + timestampWithMs, } from '@sentry/utils'; import { updateSession } from './session'; From 3ef0b80739218140e45e8ecfb13e63412800227d Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 8 Sep 2022 16:05:08 +0200 Subject: [PATCH 6/8] remove name from transaction change interface --- packages/tracing/src/transaction.ts | 11 +++-------- packages/types/src/transaction.ts | 2 -- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/packages/tracing/src/transaction.ts b/packages/tracing/src/transaction.ts index 5975f4194343..5a98cbdb8b62 100644 --- a/packages/tracing/src/transaction.ts +++ b/packages/tracing/src/transaction.ts @@ -74,7 +74,7 @@ export class Transaction extends SpanClass implements TransactionInterface { this._name = newName; const source = 'custom'; this.metadata.source = source; - this.metadata.nameChanges.push(generateTransactionNameChange(newName, source, this.metadata.numPropagations)); + this.metadata.nameChanges.push(generateTransactionNameChange(source, this.metadata.numPropagations)); } /** @@ -83,7 +83,7 @@ export class Transaction extends SpanClass implements TransactionInterface { public setName(name: string, source: TransactionMetadata['source'] = 'custom'): void { this.name = name; this.metadata.source = source; - this.metadata.nameChanges.push(generateTransactionNameChange(name, source, this.metadata.numPropagations)); + this.metadata.nameChanges.push(generateTransactionNameChange(source, this.metadata.numPropagations)); } /** @@ -291,13 +291,8 @@ export class Transaction extends SpanClass implements TransactionInterface { } /** Generate objects representing a transaction name change */ -export function generateTransactionNameChange( - name: string, - source: TransactionSource, - propagations: number, -): TransactionNameChange { +export function generateTransactionNameChange(source: TransactionSource, propagations: number): TransactionNameChange { return { - name, source, timestamp: timestampWithMs(), propagations, diff --git a/packages/types/src/transaction.ts b/packages/types/src/transaction.ts index 3dfc3631a7b0..7004394211da 100644 --- a/packages/types/src/transaction.ts +++ b/packages/types/src/transaction.ts @@ -180,8 +180,6 @@ export type TransactionSource = * Object representing metadata about when a transaction name was changed. */ export interface TransactionNameChange { - // new name - name: string; // unix timestamp when the name was changed timestamp: number; // new source From e9ccebda36ffde69f08b1edbddd6ad786db5eca3 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 8 Sep 2022 16:06:37 +0200 Subject: [PATCH 7/8] rename from numPropagations -> propagations --- packages/core/src/baseclient.ts | 2 +- packages/node/src/integrations/http.ts | 2 +- packages/tracing/src/browser/request.ts | 4 ++-- packages/tracing/src/transaction.ts | 8 ++++---- packages/types/src/event.ts | 2 +- packages/types/src/transaction.ts | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/core/src/baseclient.ts b/packages/core/src/baseclient.ts index 47c225174e8c..9a3413e51c9b 100644 --- a/packages/core/src/baseclient.ts +++ b/packages/core/src/baseclient.ts @@ -671,7 +671,7 @@ export abstract class BaseClient implements Client { name: processedEvent.transaction, source, timestamp: timestampInSeconds(), - propagations: transactionInfo.num_propagations, + propagations: transactionInfo.propagations, }, ], }; diff --git a/packages/node/src/integrations/http.ts b/packages/node/src/integrations/http.ts index c39650550cd7..d2a81170d692 100644 --- a/packages/node/src/integrations/http.ts +++ b/packages/node/src/integrations/http.ts @@ -187,7 +187,7 @@ function _createWrappedRequestMethodFactory( if (tracingEnabled && span) { const transaction = span.transaction; if (transaction) { - transaction.metadata.numPropagations += 1; + transaction.metadata.propagations += 1; } if (res.statusCode) { diff --git a/packages/tracing/src/browser/request.ts b/packages/tracing/src/browser/request.ts index c3972d54eee9..31322c9c1daf 100644 --- a/packages/tracing/src/browser/request.ts +++ b/packages/tracing/src/browser/request.ts @@ -199,7 +199,7 @@ export function fetchCallback( // eslint-disable-next-line @typescript-eslint/no-explicit-any const options = (handlerData.args[1] = (handlerData.args[1] as { [key: string]: any }) || {}); options.headers = addTracingHeaders(request, activeTransaction.getBaggage(), span, options); - activeTransaction.metadata.numPropagations += 1; + activeTransaction.metadata.propagations += 1; } } @@ -305,7 +305,7 @@ export function xhrCallback( BAGGAGE_HEADER_NAME, mergeAndSerializeBaggage(activeTransaction.getBaggage(), headerBaggageString), ); - activeTransaction.metadata.numPropagations += 1; + activeTransaction.metadata.propagations += 1; } catch (_) { // Error: InvalidStateError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED. } diff --git a/packages/tracing/src/transaction.ts b/packages/tracing/src/transaction.ts index 5a98cbdb8b62..19cc9466fd8d 100644 --- a/packages/tracing/src/transaction.ts +++ b/packages/tracing/src/transaction.ts @@ -55,7 +55,7 @@ export class Transaction extends SpanClass implements TransactionInterface { ...transactionContext.metadata, spanMetadata: {}, nameChanges: [], - numPropagations: 0, + propagations: 0, }; this._trimEnd = transactionContext.trimEnd; @@ -74,7 +74,7 @@ export class Transaction extends SpanClass implements TransactionInterface { this._name = newName; const source = 'custom'; this.metadata.source = source; - this.metadata.nameChanges.push(generateTransactionNameChange(source, this.metadata.numPropagations)); + this.metadata.nameChanges.push(generateTransactionNameChange(source, this.metadata.propagations)); } /** @@ -83,7 +83,7 @@ export class Transaction extends SpanClass implements TransactionInterface { public setName(name: string, source: TransactionMetadata['source'] = 'custom'): void { this.name = name; this.metadata.source = source; - this.metadata.nameChanges.push(generateTransactionNameChange(source, this.metadata.numPropagations)); + this.metadata.nameChanges.push(generateTransactionNameChange(source, this.metadata.propagations)); } /** @@ -171,7 +171,7 @@ export class Transaction extends SpanClass implements TransactionInterface { transaction_info: { source: metadata.source, name_changes: metadata.nameChanges, - num_propagations: metadata.numPropagations, + propagations: metadata.propagations, }, }), }; diff --git a/packages/types/src/event.ts b/packages/types/src/event.ts index 7387c266fbbd..65a315c42456 100644 --- a/packages/types/src/event.ts +++ b/packages/types/src/event.ts @@ -51,7 +51,7 @@ export interface Event { source: TransactionSource; name_changes: TransactionNameChange[]; // The total number of propagations that happened - num_propagations: number; + propagations: number; }; } diff --git a/packages/types/src/transaction.ts b/packages/types/src/transaction.ts index 7004394211da..bc3da939387a 100644 --- a/packages/types/src/transaction.ts +++ b/packages/types/src/transaction.ts @@ -155,7 +155,7 @@ export interface TransactionMetadata { nameChanges: TransactionNameChange[]; /** The total number of propagations that happened */ - numPropagations: number; + propagations: number; } /** From 01782057b4943b78790f42cb68f670622a0d5b4d Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Thu, 8 Sep 2022 16:11:54 +0200 Subject: [PATCH 8/8] lint --- packages/hub/src/scope.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/hub/src/scope.ts b/packages/hub/src/scope.ts index 65a75f2ccbd5..4f72afa34a61 100644 --- a/packages/hub/src/scope.ts +++ b/packages/hub/src/scope.ts @@ -29,7 +29,6 @@ import { isThenable, logger, SyncPromise, - timestampWithMs, } from '@sentry/utils'; import { updateSession } from './session';