@sentry/core
Version:
Base implementation for all Sentry JavaScript SDKs
1 lines • 20.3 kB
Source Map (JSON)
{"version":3,"file":"span.js","sources":["../../../src/tracing/span.ts"],"sourcesContent":["/* eslint-disable max-lines */\nimport type {\n Instrumenter,\n Primitive,\n Span as SpanInterface,\n SpanContext,\n TraceContext,\n Transaction,\n} from '@sentry/types';\nimport { dropUndefinedKeys, logger, timestampWithMs, uuid4 } from '@sentry/utils';\n\n/**\n * Keeps track of finished spans for a given transaction\n * @internal\n * @hideconstructor\n * @hidden\n */\nexport class SpanRecorder {\n public spans: Span[] = [];\n\n private readonly _maxlen: number;\n\n public constructor(maxlen: number = 1000) {\n this._maxlen = maxlen;\n }\n\n /**\n * This is just so that we don't run out of memory while recording a lot\n * of spans. At some point we just stop and flush out the start of the\n * trace tree (i.e.the first n spans with the smallest\n * start_timestamp).\n */\n public add(span: Span): void {\n if (this.spans.length > this._maxlen) {\n span.spanRecorder = undefined;\n } else {\n this.spans.push(span);\n }\n }\n}\n\n/**\n * Span contains all data about a span\n */\nexport class Span implements SpanInterface {\n /**\n * @inheritDoc\n */\n public traceId: string = uuid4();\n\n /**\n * @inheritDoc\n */\n public spanId: string = uuid4().substring(16);\n\n /**\n * @inheritDoc\n */\n public parentSpanId?: string;\n\n /**\n * Internal keeper of the status\n */\n public status?: SpanStatusType | string;\n\n /**\n * @inheritDoc\n */\n public sampled?: boolean;\n\n /**\n * Timestamp in seconds when the span was created.\n */\n public startTimestamp: number = timestampWithMs();\n\n /**\n * Timestamp in seconds when the span ended.\n */\n public endTimestamp?: number;\n\n /**\n * @inheritDoc\n */\n public op?: string;\n\n /**\n * @inheritDoc\n */\n public description?: string;\n\n /**\n * @inheritDoc\n */\n public tags: { [key: string]: Primitive } = {};\n\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public data: { [key: string]: any } = {};\n\n /**\n * List of spans that were finalized\n */\n public spanRecorder?: SpanRecorder;\n\n /**\n * @inheritDoc\n */\n public transaction?: Transaction;\n\n /**\n * The instrumenter that created this span.\n */\n public instrumenter: Instrumenter = 'sentry';\n\n /**\n * You should never call the constructor manually, always use `Sentry.startTransaction()`\n * or call `startChild()` on an existing span.\n * @internal\n * @hideconstructor\n * @hidden\n */\n public constructor(spanContext?: SpanContext) {\n if (!spanContext) {\n return this;\n }\n if (spanContext.traceId) {\n this.traceId = spanContext.traceId;\n }\n if (spanContext.spanId) {\n this.spanId = spanContext.spanId;\n }\n if (spanContext.parentSpanId) {\n this.parentSpanId = spanContext.parentSpanId;\n }\n // We want to include booleans as well here\n if ('sampled' in spanContext) {\n this.sampled = spanContext.sampled;\n }\n if (spanContext.op) {\n this.op = spanContext.op;\n }\n if (spanContext.description) {\n this.description = spanContext.description;\n }\n if (spanContext.data) {\n this.data = spanContext.data;\n }\n if (spanContext.tags) {\n this.tags = spanContext.tags;\n }\n if (spanContext.status) {\n this.status = spanContext.status;\n }\n if (spanContext.startTimestamp) {\n this.startTimestamp = spanContext.startTimestamp;\n }\n if (spanContext.endTimestamp) {\n this.endTimestamp = spanContext.endTimestamp;\n }\n if (spanContext.instrumenter) {\n this.instrumenter = spanContext.instrumenter;\n }\n }\n\n /**\n * @inheritDoc\n */\n public startChild(\n spanContext?: Pick<SpanContext, Exclude<keyof SpanContext, 'sampled' | 'traceId' | 'parentSpanId'>>,\n ): Span {\n const childSpan = new Span({\n ...spanContext,\n parentSpanId: this.spanId,\n sampled: this.sampled,\n traceId: this.traceId,\n });\n\n childSpan.spanRecorder = this.spanRecorder;\n if (childSpan.spanRecorder) {\n childSpan.spanRecorder.add(childSpan);\n }\n\n childSpan.transaction = this.transaction;\n\n if (__DEBUG_BUILD__ && childSpan.transaction) {\n const opStr = (spanContext && spanContext.op) || '< unknown op >';\n const nameStr = childSpan.transaction.name || '< unknown name >';\n const idStr = childSpan.transaction.spanId;\n\n const logMessage = `[Tracing] Starting '${opStr}' span on transaction '${nameStr}' (${idStr}).`;\n childSpan.transaction.metadata.spanMetadata[childSpan.spanId] = { logMessage };\n logger.log(logMessage);\n }\n\n return childSpan;\n }\n\n /**\n * @inheritDoc\n */\n public setTag(key: string, value: Primitive): this {\n this.tags = { ...this.tags, [key]: value };\n return this;\n }\n\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n public setData(key: string, value: any): this {\n this.data = { ...this.data, [key]: value };\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setStatus(value: SpanStatusType): this {\n this.status = value;\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public setHttpStatus(httpStatus: number): this {\n this.setTag('http.status_code', String(httpStatus));\n const spanStatus = spanStatusfromHttpCode(httpStatus);\n if (spanStatus !== 'unknown_error') {\n this.setStatus(spanStatus);\n }\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public isSuccess(): boolean {\n return this.status === 'ok';\n }\n\n /**\n * @inheritDoc\n */\n public finish(endTimestamp?: number): void {\n if (\n __DEBUG_BUILD__ &&\n // Don't call this for transactions\n this.transaction &&\n this.transaction.spanId !== this.spanId\n ) {\n const { logMessage } = this.transaction.metadata.spanMetadata[this.spanId];\n if (logMessage) {\n logger.log((logMessage as string).replace('Starting', 'Finishing'));\n }\n }\n\n this.endTimestamp = typeof endTimestamp === 'number' ? endTimestamp : timestampWithMs();\n }\n\n /**\n * @inheritDoc\n */\n public toTraceparent(): string {\n let sampledString = '';\n if (this.sampled !== undefined) {\n sampledString = this.sampled ? '-1' : '-0';\n }\n return `${this.traceId}-${this.spanId}${sampledString}`;\n }\n\n /**\n * @inheritDoc\n */\n public toContext(): SpanContext {\n return dropUndefinedKeys({\n data: this.data,\n description: this.description,\n endTimestamp: this.endTimestamp,\n op: this.op,\n parentSpanId: this.parentSpanId,\n sampled: this.sampled,\n spanId: this.spanId,\n startTimestamp: this.startTimestamp,\n status: this.status,\n tags: this.tags,\n traceId: this.traceId,\n });\n }\n\n /**\n * @inheritDoc\n */\n public updateWithContext(spanContext: SpanContext): this {\n this.data = spanContext.data || {};\n this.description = spanContext.description;\n this.endTimestamp = spanContext.endTimestamp;\n this.op = spanContext.op;\n this.parentSpanId = spanContext.parentSpanId;\n this.sampled = spanContext.sampled;\n this.spanId = spanContext.spanId || this.spanId;\n this.startTimestamp = spanContext.startTimestamp || this.startTimestamp;\n this.status = spanContext.status;\n this.tags = spanContext.tags || {};\n this.traceId = spanContext.traceId || this.traceId;\n\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public getTraceContext(): TraceContext {\n return dropUndefinedKeys({\n data: Object.keys(this.data).length > 0 ? this.data : undefined,\n description: this.description,\n op: this.op,\n parent_span_id: this.parentSpanId,\n span_id: this.spanId,\n status: this.status,\n tags: Object.keys(this.tags).length > 0 ? this.tags : undefined,\n trace_id: this.traceId,\n });\n }\n\n /**\n * @inheritDoc\n */\n public toJSON(): {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data?: { [key: string]: any };\n description?: string;\n op?: string;\n parent_span_id?: string;\n span_id: string;\n start_timestamp: number;\n status?: string;\n tags?: { [key: string]: Primitive };\n timestamp?: number;\n trace_id: string;\n } {\n return dropUndefinedKeys({\n data: Object.keys(this.data).length > 0 ? this.data : undefined,\n description: this.description,\n op: this.op,\n parent_span_id: this.parentSpanId,\n span_id: this.spanId,\n start_timestamp: this.startTimestamp,\n status: this.status,\n tags: Object.keys(this.tags).length > 0 ? this.tags : undefined,\n timestamp: this.endTimestamp,\n trace_id: this.traceId,\n });\n }\n}\n\nexport type SpanStatusType =\n /** The operation completed successfully. */\n | 'ok'\n /** Deadline expired before operation could complete. */\n | 'deadline_exceeded'\n /** 401 Unauthorized (actually does mean unauthenticated according to RFC 7235) */\n | 'unauthenticated'\n /** 403 Forbidden */\n | 'permission_denied'\n /** 404 Not Found. Some requested entity (file or directory) was not found. */\n | 'not_found'\n /** 429 Too Many Requests */\n | 'resource_exhausted'\n /** Client specified an invalid argument. 4xx. */\n | 'invalid_argument'\n /** 501 Not Implemented */\n | 'unimplemented'\n /** 503 Service Unavailable */\n | 'unavailable'\n /** Other/generic 5xx. */\n | 'internal_error'\n /** Unknown. Any non-standard HTTP status code. */\n | 'unknown_error'\n /** The operation was cancelled (typically by the user). */\n | 'cancelled'\n /** Already exists (409) */\n | 'already_exists'\n /** Operation was rejected because the system is not in a state required for the operation's */\n | 'failed_precondition'\n /** The operation was aborted, typically due to a concurrency issue. */\n | 'aborted'\n /** Operation was attempted past the valid range. */\n | 'out_of_range'\n /** Unrecoverable data loss or corruption */\n | 'data_loss';\n\n/**\n * Converts a HTTP status code into a {@link SpanStatusType}.\n *\n * @param httpStatus The HTTP response status code.\n * @returns The span status or unknown_error.\n */\nexport function spanStatusfromHttpCode(httpStatus: number): SpanStatusType {\n if (httpStatus < 400 && httpStatus >= 100) {\n return 'ok';\n }\n\n if (httpStatus >= 400 && httpStatus < 500) {\n switch (httpStatus) {\n case 401:\n return 'unauthenticated';\n case 403:\n return 'permission_denied';\n case 404:\n return 'not_found';\n case 409:\n return 'already_exists';\n case 413:\n return 'failed_precondition';\n case 429:\n return 'resource_exhausted';\n default:\n return 'invalid_argument';\n }\n }\n\n if (httpStatus >= 500 && httpStatus < 600) {\n switch (httpStatus) {\n case 501:\n return 'unimplemented';\n case 503:\n return 'unavailable';\n case 504:\n return 'deadline_exceeded';\n default:\n return 'internal_error';\n }\n }\n\n return 'unknown_error';\n}\n"],"names":[],"mappings":"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"}