From 689a4d8cbdb9a286a20bad34e2e3e8c146db57da Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Fri, 24 Jun 2022 14:10:53 -0400 Subject: [PATCH] ref(types): Add type for measurement unit Folks gave some feedback that we should be explicit about the units we support. Let's add TypeScript types for these so we don't add any runtime logic, but it should have helpful autocomplete for users. --- packages/tracing/src/browser/metrics/index.ts | 2 +- packages/tracing/src/transaction.ts | 3 +- packages/types/src/event.ts | 2 +- packages/types/src/index.ts | 9 +++- packages/types/src/measurement.ts | 43 +++++++++++++++++++ packages/types/src/transaction.ts | 5 +-- 6 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 packages/types/src/measurement.ts diff --git a/packages/tracing/src/browser/metrics/index.ts b/packages/tracing/src/browser/metrics/index.ts index 3e011c19d823..a48eb381c213 100644 --- a/packages/tracing/src/browser/metrics/index.ts +++ b/packages/tracing/src/browser/metrics/index.ts @@ -50,7 +50,7 @@ function _trackCLS(): void { } __DEBUG_BUILD__ && logger.log('[Measurements] Adding CLS'); - _measurements['cls'] = { value: metric.value, unit: 'none' }; + _measurements['cls'] = { value: metric.value, unit: '' }; _clsEntry = entry as LayoutShift; }); } diff --git a/packages/tracing/src/transaction.ts b/packages/tracing/src/transaction.ts index 50b29fbf4a61..87e0e5a413a0 100644 --- a/packages/tracing/src/transaction.ts +++ b/packages/tracing/src/transaction.ts @@ -4,6 +4,7 @@ import { BaggageObj, Event, Measurements, + MeasurementUnit, Transaction as TransactionInterface, TransactionContext, TransactionMetadata, @@ -77,7 +78,7 @@ export class Transaction extends SpanClass implements TransactionInterface { /** * @inheritDoc */ - public setMeasurement(name: string, value: number, unit: string = ''): void { + public setMeasurement(name: string, value: number, unit: MeasurementUnit = ''): void { this._measurements[name] = { value, unit }; } diff --git a/packages/types/src/event.ts b/packages/types/src/event.ts index c769feee65ff..14056d9d7b07 100644 --- a/packages/types/src/event.ts +++ b/packages/types/src/event.ts @@ -4,13 +4,13 @@ import { Contexts } from './context'; import { DebugMeta } from './debugMeta'; import { Exception } from './exception'; import { Extras } from './extra'; +import { Measurements } from './measurement'; import { Primitive } from './misc'; import { Request } from './request'; import { CaptureContext } from './scope'; import { SdkInfo } from './sdkinfo'; import { Severity, SeverityLevel } from './severity'; import { Span } from './span'; -import { Measurements } from './transaction'; import { User } from './user'; /** JSDoc */ diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 8bbb5853e529..0bf2caaebe6b 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -65,7 +65,6 @@ export type { Stacktrace, StackParser, StackLineParser, StackLineParserFn } from export type { TextEncoderInternal } from './textencoder'; export type { CustomSamplingContext, - Measurements, SamplingContext, TraceparentData, Transaction, @@ -73,6 +72,14 @@ export type { TransactionMetadata, TransactionSamplingMethod, } from './transaction'; +export type { + DurationUnit, + InformationUnit, + FractionUnit, + MeasurementUnit, + NoneUnit, + Measurements, +} from './measurement'; export type { Thread } from './thread'; export type { Transport, diff --git a/packages/types/src/measurement.ts b/packages/types/src/measurement.ts new file mode 100644 index 000000000000..8aea675d5254 --- /dev/null +++ b/packages/types/src/measurement.ts @@ -0,0 +1,43 @@ +// Based on https://getsentry.github.io/relay/relay_metrics/enum.MetricUnit.html +// For more details, see measurement key in https://develop.sentry.dev/sdk/event-payloads/transaction/ + +/** + * A time duration. + */ +export type DurationUnit = 'nanosecond' | 'microsecond' | 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week'; + +/** + * Size of information derived from bytes. + */ +export type InformationUnit = + | 'bit' + | 'byte' + | 'kilobyte' + | 'kibibyte' + | 'megabyte' + | 'mebibyte' + | 'gigabyte' + | 'terabyte' + | 'tebibyte' + | 'petabyte' + | 'exabyte' + | 'exbibyte'; + +/** + * Fractions such as percentages. + */ +export type FractionUnit = 'ratio' | 'percent'; + +/** + * Untyped value without a unit. + */ +export type NoneUnit = '' | 'none'; + +// See https://github.com/microsoft/TypeScript/issues/29729#issuecomment-1082546550 +// Needed to make sure auto-complete will work for the string union type while still +// allowing for arbitrary strings as custom units (user-defined units without builtin conversion or default). +type LiteralUnion = T | Omit; + +export type MeasurementUnit = LiteralUnion; + +export type Measurements = Record; diff --git a/packages/types/src/transaction.ts b/packages/types/src/transaction.ts index 1209e4b374d7..a596f720f713 100644 --- a/packages/types/src/transaction.ts +++ b/packages/types/src/transaction.ts @@ -1,4 +1,5 @@ import { Baggage } from './baggage'; +import { MeasurementUnit } from './measurement'; import { ExtractedNodeRequestData, Primitive, WorkerLocation } from './misc'; import { Span, SpanContext } from './span'; /** @@ -80,7 +81,7 @@ export interface Transaction extends TransactionContext, Span { * @param value Value of the measurement * @param unit Unit of the measurement. (Defaults to an empty string) */ - setMeasurement(name: string, value: number, unit: string): void; + setMeasurement(name: string, value: number, unit: MeasurementUnit): void; /** Returns the current transaction properties as a `TransactionContext` */ toContext(): TransactionContext; @@ -127,8 +128,6 @@ export interface SamplingContext extends CustomSamplingContext { request?: ExtractedNodeRequestData; } -export type Measurements = Record; - export type TransactionSamplingMethod = 'explicitly_set' | 'client_sampler' | 'client_rate' | 'inheritance'; export interface TransactionMetadata {