diff --git a/packages/nextjs/test/integration/test/server/tracing200.js b/packages/nextjs/test/integration/test/server/tracing200.js index a9055540c3f3..a8df030f9468 100644 --- a/packages/nextjs/test/integration/test/server/tracing200.js +++ b/packages/nextjs/test/integration/test/server/tracing200.js @@ -18,6 +18,8 @@ module.exports = async ({ url: urlBase, argv }) => { transaction: 'GET /api/users', transaction_info: { source: 'route', + changes: [], + propagations: 0, }, type: 'transaction', request: { diff --git a/packages/nextjs/test/integration/test/server/tracing500.js b/packages/nextjs/test/integration/test/server/tracing500.js index 8267a55e0cac..1e5ed467a83d 100644 --- a/packages/nextjs/test/integration/test/server/tracing500.js +++ b/packages/nextjs/test/integration/test/server/tracing500.js @@ -17,6 +17,8 @@ module.exports = async ({ url: urlBase, argv }) => { transaction: 'GET /api/broken', transaction_info: { source: 'route', + changes: [], + propagations: 0, }, type: 'transaction', request: { diff --git a/packages/nextjs/test/integration/test/server/tracingHttp.js b/packages/nextjs/test/integration/test/server/tracingHttp.js index 5825d4ce4d37..29ab66cc46ea 100644 --- a/packages/nextjs/test/integration/test/server/tracingHttp.js +++ b/packages/nextjs/test/integration/test/server/tracingHttp.js @@ -31,6 +31,8 @@ module.exports = async ({ url: urlBase, argv }) => { transaction: 'GET /api/http', transaction_info: { source: 'route', + changes: [], + propagations: 0, }, type: 'transaction', request: { diff --git a/packages/nextjs/test/integration/test/server/tracingServerGetInitialProps.js b/packages/nextjs/test/integration/test/server/tracingServerGetInitialProps.js index 368ccb26a952..ecde33f049c1 100644 --- a/packages/nextjs/test/integration/test/server/tracingServerGetInitialProps.js +++ b/packages/nextjs/test/integration/test/server/tracingServerGetInitialProps.js @@ -16,6 +16,8 @@ module.exports = async ({ url: urlBase, argv }) => { transaction: '/[id]/withInitialProps', transaction_info: { source: 'route', + changes: [], + propagations: 0, }, type: 'transaction', request: { diff --git a/packages/nextjs/test/integration/test/server/tracingServerGetServerSideProps.js b/packages/nextjs/test/integration/test/server/tracingServerGetServerSideProps.js index 8f195d337168..42edeb6842bf 100644 --- a/packages/nextjs/test/integration/test/server/tracingServerGetServerSideProps.js +++ b/packages/nextjs/test/integration/test/server/tracingServerGetServerSideProps.js @@ -16,6 +16,8 @@ module.exports = async ({ url: urlBase, argv }) => { transaction: '/[id]/withServerSideProps', transaction_info: { source: 'route', + changes: [], + propagations: 0, }, type: 'transaction', request: { diff --git a/packages/node-integration-tests/suites/express/tracing/test.ts b/packages/node-integration-tests/suites/express/tracing/test.ts index b97ce2991053..f924e904dd09 100644 --- a/packages/node-integration-tests/suites/express/tracing/test.ts +++ b/packages/node-integration-tests/suites/express/tracing/test.ts @@ -38,6 +38,8 @@ test('should set a correct transaction name for routes specified in RegEx', asyn transaction: 'GET /\\/test\\/regex/', transaction_info: { source: 'route', + changes: [], + propagations: 0, }, contexts: { trace: { @@ -66,6 +68,8 @@ test.each([['array1'], ['array5']])( transaction: 'GET /test/array1,/\\/test\\/array[2-9]', transaction_info: { source: 'route', + changes: [], + propagations: 0, }, contexts: { trace: { @@ -102,6 +106,8 @@ test.each([ transaction: 'GET /test/arr/:id,/\\/test\\/arr[0-9]*\\/required(path)?(\\/optionalPath)?\\/(lastParam)?', transaction_info: { source: 'route', + changes: [], + propagations: 0, }, contexts: { trace: { diff --git a/packages/remix/test/integration/test/server/loader.test.ts b/packages/remix/test/integration/test/server/loader.test.ts index 78ecc2a67c01..f15c9ab70c53 100644 --- a/packages/remix/test/integration/test/server/loader.test.ts +++ b/packages/remix/test/integration/test/server/loader.test.ts @@ -55,6 +55,8 @@ describe.each(['builtin', 'express'])('Remix API Loaders with adapter = %s', ada transaction: 'routes/loader-json-response/$id', transaction_info: { source: 'route', + changes: [], + propagations: 0, }, spans: [ { diff --git a/packages/tracing/src/transaction.ts b/packages/tracing/src/transaction.ts index 2b509763743d..87e68fb6dc3e 100644 --- a/packages/tracing/src/transaction.ts +++ b/packages/tracing/src/transaction.ts @@ -45,6 +45,8 @@ export class Transaction extends SpanClass implements TransactionInterface { this.metadata = { ...transactionContext.metadata, spanMetadata: {}, + changes: [], + propagations: 0, }; this._trimEnd = transactionContext.trimEnd; @@ -156,6 +158,8 @@ export class Transaction extends SpanClass implements TransactionInterface { ...(metadata.source && { transaction_info: { source: metadata.source, + changes: metadata.changes, + propagations: metadata.propagations, }, }), }; diff --git a/packages/tracing/test/span.test.ts b/packages/tracing/test/span.test.ts index 7bb53faca235..a59c295edbe8 100644 --- a/packages/tracing/test/span.test.ts +++ b/packages/tracing/test/span.test.ts @@ -503,6 +503,8 @@ describe('Span', () => { expect.not.objectContaining({ transaction_info: { source: expect.any(String), + changes: [], + propagations: 0, }, }), ); @@ -522,6 +524,8 @@ describe('Span', () => { expect.objectContaining({ transaction_info: { source: 'url', + changes: [], + propagations: 0, }, }), ); diff --git a/packages/types/src/event.ts b/packages/types/src/event.ts index 0d3897734956..2b35df3901b8 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,8 @@ export interface Event { sdkProcessingMetadata?: { [key: string]: any }; transaction_info?: { source: TransactionSource; + changes: TransactionNameChange[]; + 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..2c083611b03a 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 */ + changes: TransactionNameChange[]; + + /** The total number of propagations that happened */ + propagations: number; } /** @@ -169,3 +175,20 @@ 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 { + /** + * Unix timestamp when the name was changed. Same type as the start and + * end timestamps of a transaction and span. + */ + timestamp: number; + + /** New source applied for transaction name change */ + source: TransactionSource; + + /** Number of propagations since start of transaction */ + propagations: number; +}