From 0639e97c832f2317c477afcdbc1223910e6270dd Mon Sep 17 00:00:00 2001 From: Edward Gou Date: Fri, 16 Feb 2024 16:53:45 -0500 Subject: [PATCH 1/7] Adds exclusive time and measurements to spans --- packages/core/src/semanticAttributes.ts | 5 +++++ packages/core/src/tracing/span.ts | 13 ++++++++++++- packages/types/src/span.ts | 9 ++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/packages/core/src/semanticAttributes.ts b/packages/core/src/semanticAttributes.ts index afd0d123090f..2cb2c59f473c 100644 --- a/packages/core/src/semanticAttributes.ts +++ b/packages/core/src/semanticAttributes.ts @@ -19,3 +19,8 @@ export const SEMANTIC_ATTRIBUTE_SENTRY_OP = 'sentry.op'; * Use this attribute to represent the origin of a span. */ export const SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN = 'sentry.origin'; + +/** + * Use this attribute to represent measurements of a span. + */ +export const SEMANTIC_ATTRIBUTE_MEASUREMENTS = 'measurements'; diff --git a/packages/core/src/tracing/span.ts b/packages/core/src/tracing/span.ts index 1c178fc05fbe..c6af15524c10 100644 --- a/packages/core/src/tracing/span.ts +++ b/packages/core/src/tracing/span.ts @@ -1,6 +1,7 @@ /* eslint-disable max-lines */ import type { Instrumenter, + Measurements, Primitive, Span as SpanInterface, SpanAttributeValue, @@ -17,7 +18,11 @@ import { dropUndefinedKeys, logger, timestampInSeconds, uuid4 } from '@sentry/ut import { DEBUG_BUILD } from '../debug-build'; import { getMetricSummaryJsonForSpan } from '../metrics/metric-summary'; -import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../semanticAttributes'; +import { + SEMANTIC_ATTRIBUTE_MEASUREMENTS, + SEMANTIC_ATTRIBUTE_SENTRY_OP, + SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, +} from '../semanticAttributes'; import { getRootSpan } from '../utils/getRootSpan'; import { TRACE_FLAG_NONE, @@ -115,6 +120,7 @@ export class Span implements SpanInterface { protected _endTime?: number; /** Internal keeper of the status */ protected _status?: SpanStatusType | string; + protected _exclusiveTime?: number; private _logMessage?: string; @@ -159,6 +165,9 @@ export class Span implements SpanInterface { if (spanContext.endTimestamp) { this._endTime = spanContext.endTimestamp; } + if (spanContext.exclusiveTime) { + this._exclusiveTime = spanContext.exclusiveTime; + } } // This rule conflicts with another eslint rule :( @@ -626,6 +635,8 @@ export class Span implements SpanInterface { trace_id: this._traceId, origin: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] as SpanOrigin | undefined, _metrics_summary: getMetricSummaryJsonForSpan(this), + exclusive_time: this._exclusiveTime, + measurements: this._attributes[SEMANTIC_ATTRIBUTE_MEASUREMENTS] as Measurements | undefined, }); } diff --git a/packages/types/src/span.ts b/packages/types/src/span.ts index 6aa6ea1113f6..84fe450e483c 100644 --- a/packages/types/src/span.ts +++ b/packages/types/src/span.ts @@ -1,5 +1,6 @@ import type { TraceContext } from './context'; import type { Instrumenter } from './instrumenter'; +import type { Measurements } from './measurement'; import type { Primitive } from './misc'; import type { HrTime } from './opentelemetry'; import type { Transaction } from './transaction'; @@ -21,7 +22,8 @@ export type SpanAttributeValue = | boolean | Array | Array - | Array; + | Array + | Measurements; export type SpanAttributes = Partial<{ 'sentry.origin': string; @@ -178,6 +180,11 @@ export interface SpanContext { * The origin of the span, giving context about what created the span. */ origin?: SpanOrigin; + + /** + * Exclusive time in milliseconds. + */ + exclusiveTime?: number; } /** Span holding trace_id, span_id */ From f7d70a07f3d8c25b54aaeefafb2d767760baec5b Mon Sep 17 00:00:00 2001 From: Edward Gou Date: Tue, 20 Feb 2024 10:42:36 -0500 Subject: [PATCH 2/7] measurements no longer an invalid type --- packages/core/test/lib/tracing/span.test.ts | 3 --- packages/types/src/span.ts | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/core/test/lib/tracing/span.test.ts b/packages/core/test/lib/tracing/span.test.ts index b3c08987d4b2..a233ebb06cc0 100644 --- a/packages/core/test/lib/tracing/span.test.ts +++ b/packages/core/test/lib/tracing/span.test.ts @@ -105,9 +105,6 @@ describe('span', () => { it('disallows invalid attribute types', () => { const span = new Span(); - /** @ts-expect-error this is invalid */ - span.setAttribute('str', {}); - /** @ts-expect-error this is invalid */ span.setAttribute('str', null); diff --git a/packages/types/src/span.ts b/packages/types/src/span.ts index 84fe450e483c..1e33a135bb6b 100644 --- a/packages/types/src/span.ts +++ b/packages/types/src/span.ts @@ -30,6 +30,7 @@ export type SpanAttributes = Partial<{ 'sentry.op': string; 'sentry.source': string; 'sentry.sample_rate': number; + measurements: Measurements; }> & Record; From 2b495f10a97417ee8138cf6f00188d9807a387bd Mon Sep 17 00:00:00 2001 From: Edward Gou Date: Wed, 21 Feb 2024 14:24:42 -0500 Subject: [PATCH 3/7] remove exclusiveTime as a field from spans --- packages/core/src/tracing/span.ts | 5 ----- packages/types/src/span.ts | 5 ----- 2 files changed, 10 deletions(-) diff --git a/packages/core/src/tracing/span.ts b/packages/core/src/tracing/span.ts index dc9ae19faffd..ca2c1f06cb57 100644 --- a/packages/core/src/tracing/span.ts +++ b/packages/core/src/tracing/span.ts @@ -120,7 +120,6 @@ export class Span implements SpanInterface { protected _endTime?: number | undefined; /** Internal keeper of the status */ protected _status?: SpanStatusType | string | undefined; - protected _exclusiveTime?: number; private _logMessage?: string; @@ -165,9 +164,6 @@ export class Span implements SpanInterface { if (spanContext.endTimestamp) { this._endTime = spanContext.endTimestamp; } - if (spanContext.exclusiveTime) { - this._exclusiveTime = spanContext.exclusiveTime; - } } // This rule conflicts with another eslint rule :( @@ -635,7 +631,6 @@ export class Span implements SpanInterface { trace_id: this._traceId, origin: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] as SpanOrigin | undefined, _metrics_summary: getMetricSummaryJsonForSpan(this), - exclusive_time: this._exclusiveTime, measurements: this._attributes[SEMANTIC_ATTRIBUTE_MEASUREMENTS] as Measurements | undefined, }); } diff --git a/packages/types/src/span.ts b/packages/types/src/span.ts index 5f60e3308959..0357d7f3be30 100644 --- a/packages/types/src/span.ts +++ b/packages/types/src/span.ts @@ -181,11 +181,6 @@ export interface SpanContext { * The origin of the span, giving context about what created the span. */ origin?: SpanOrigin | undefined; - - /** - * Exclusive time in milliseconds. - */ - exclusiveTime?: number; } /** Span holding trace_id, span_id */ From 7a019ea94799961cc6ac7282ce925a86e61f6dfd Mon Sep 17 00:00:00 2001 From: Edward Gou Date: Wed, 28 Feb 2024 11:28:38 -0500 Subject: [PATCH 4/7] Revert "remove exclusiveTime as a field from spans" This reverts commit 2b495f10a97417ee8138cf6f00188d9807a387bd. --- packages/core/src/tracing/span.ts | 5 +++++ packages/types/src/span.ts | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/packages/core/src/tracing/span.ts b/packages/core/src/tracing/span.ts index ca2c1f06cb57..dc9ae19faffd 100644 --- a/packages/core/src/tracing/span.ts +++ b/packages/core/src/tracing/span.ts @@ -120,6 +120,7 @@ export class Span implements SpanInterface { protected _endTime?: number | undefined; /** Internal keeper of the status */ protected _status?: SpanStatusType | string | undefined; + protected _exclusiveTime?: number; private _logMessage?: string; @@ -164,6 +165,9 @@ export class Span implements SpanInterface { if (spanContext.endTimestamp) { this._endTime = spanContext.endTimestamp; } + if (spanContext.exclusiveTime) { + this._exclusiveTime = spanContext.exclusiveTime; + } } // This rule conflicts with another eslint rule :( @@ -631,6 +635,7 @@ export class Span implements SpanInterface { trace_id: this._traceId, origin: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] as SpanOrigin | undefined, _metrics_summary: getMetricSummaryJsonForSpan(this), + exclusive_time: this._exclusiveTime, measurements: this._attributes[SEMANTIC_ATTRIBUTE_MEASUREMENTS] as Measurements | undefined, }); } diff --git a/packages/types/src/span.ts b/packages/types/src/span.ts index 0357d7f3be30..5f60e3308959 100644 --- a/packages/types/src/span.ts +++ b/packages/types/src/span.ts @@ -181,6 +181,11 @@ export interface SpanContext { * The origin of the span, giving context about what created the span. */ origin?: SpanOrigin | undefined; + + /** + * Exclusive time in milliseconds. + */ + exclusiveTime?: number; } /** Span holding trace_id, span_id */ From 3eff09f531d805339793dee47a5d218428437ce6 Mon Sep 17 00:00:00 2001 From: Edward Gou Date: Thu, 29 Feb 2024 10:55:56 -0500 Subject: [PATCH 5/7] measurements in span --- packages/core/src/semanticAttributes.ts | 5 ----- packages/core/src/tracing/span.ts | 11 +++++------ packages/core/src/tracing/transaction.ts | 4 ---- packages/types/src/span.ts | 5 +++++ 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/packages/core/src/semanticAttributes.ts b/packages/core/src/semanticAttributes.ts index 2cb2c59f473c..afd0d123090f 100644 --- a/packages/core/src/semanticAttributes.ts +++ b/packages/core/src/semanticAttributes.ts @@ -19,8 +19,3 @@ export const SEMANTIC_ATTRIBUTE_SENTRY_OP = 'sentry.op'; * Use this attribute to represent the origin of a span. */ export const SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN = 'sentry.origin'; - -/** - * Use this attribute to represent measurements of a span. - */ -export const SEMANTIC_ATTRIBUTE_MEASUREMENTS = 'measurements'; diff --git a/packages/core/src/tracing/span.ts b/packages/core/src/tracing/span.ts index dc9ae19faffd..6937f5502804 100644 --- a/packages/core/src/tracing/span.ts +++ b/packages/core/src/tracing/span.ts @@ -18,11 +18,7 @@ import { dropUndefinedKeys, logger, timestampInSeconds, uuid4 } from '@sentry/ut import { DEBUG_BUILD } from '../debug-build'; import { getMetricSummaryJsonForSpan } from '../metrics/metric-summary'; -import { - SEMANTIC_ATTRIBUTE_MEASUREMENTS, - SEMANTIC_ATTRIBUTE_SENTRY_OP, - SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, -} from '../semanticAttributes'; +import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../semanticAttributes'; import { getRootSpan } from '../utils/getRootSpan'; import { TRACE_FLAG_NONE, @@ -122,6 +118,8 @@ export class Span implements SpanInterface { protected _status?: SpanStatusType | string | undefined; protected _exclusiveTime?: number; + protected _measurements: Measurements; + private _logMessage?: string; /** @@ -168,6 +166,7 @@ export class Span implements SpanInterface { if (spanContext.exclusiveTime) { this._exclusiveTime = spanContext.exclusiveTime; } + this._measurements = spanContext.measurements ? { ...spanContext.measurements } : {}; } // This rule conflicts with another eslint rule :( @@ -636,7 +635,7 @@ export class Span implements SpanInterface { origin: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] as SpanOrigin | undefined, _metrics_summary: getMetricSummaryJsonForSpan(this), exclusive_time: this._exclusiveTime, - measurements: this._attributes[SEMANTIC_ATTRIBUTE_MEASUREMENTS] as Measurements | undefined, + measurements: Object.keys(this._measurements).length > 0 ? this._measurements : undefined, }); } diff --git a/packages/core/src/tracing/transaction.ts b/packages/core/src/tracing/transaction.ts index 8f82c9b03d95..905aaf6c5040 100644 --- a/packages/core/src/tracing/transaction.ts +++ b/packages/core/src/tracing/transaction.ts @@ -3,7 +3,6 @@ import type { Contexts, DynamicSamplingContext, MeasurementUnit, - Measurements, SpanTimeInput, Transaction as TransactionInterface, TransactionContext, @@ -31,8 +30,6 @@ export class Transaction extends SpanClass implements TransactionInterface { protected _name: string; - private _measurements: Measurements; - private _contexts: Contexts; private _trimEnd?: boolean | undefined; @@ -53,7 +50,6 @@ export class Transaction extends SpanClass implements TransactionInterface { */ public constructor(transactionContext: TransactionContext, hub?: Hub) { super(transactionContext); - this._measurements = {}; this._contexts = {}; // eslint-disable-next-line deprecation/deprecation diff --git a/packages/types/src/span.ts b/packages/types/src/span.ts index 5f60e3308959..0ce44c3a1c07 100644 --- a/packages/types/src/span.ts +++ b/packages/types/src/span.ts @@ -186,6 +186,11 @@ export interface SpanContext { * Exclusive time in milliseconds. */ exclusiveTime?: number; + + /** + * Measurements of the Span. + */ + measurements?: Measurements; } /** Span holding trace_id, span_id */ From 1ed43e34f20caabf32f734b8823fe899627de0ab Mon Sep 17 00:00:00 2001 From: Edward Gou Date: Thu, 29 Feb 2024 11:04:54 -0500 Subject: [PATCH 6/7] update type --- packages/types/src/span.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/types/src/span.ts b/packages/types/src/span.ts index 0ce44c3a1c07..4b803b73464f 100644 --- a/packages/types/src/span.ts +++ b/packages/types/src/span.ts @@ -22,15 +22,13 @@ export type SpanAttributeValue = | boolean | Array | Array - | Array - | Measurements; + | Array; export type SpanAttributes = Partial<{ 'sentry.origin': string; 'sentry.op': string; 'sentry.source': string; 'sentry.sample_rate': number; - measurements: Measurements; }> & Record; From 7156838ab68e047ff1db0bbe6b7614e3f4099fa9 Mon Sep 17 00:00:00 2001 From: Edward Gou Date: Thu, 29 Feb 2024 11:09:34 -0500 Subject: [PATCH 7/7] unchange test --- packages/core/test/lib/tracing/span.test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/core/test/lib/tracing/span.test.ts b/packages/core/test/lib/tracing/span.test.ts index a233ebb06cc0..b3c08987d4b2 100644 --- a/packages/core/test/lib/tracing/span.test.ts +++ b/packages/core/test/lib/tracing/span.test.ts @@ -105,6 +105,9 @@ describe('span', () => { it('disallows invalid attribute types', () => { const span = new Span(); + /** @ts-expect-error this is invalid */ + span.setAttribute('str', {}); + /** @ts-expect-error this is invalid */ span.setAttribute('str', null);