Files
klz-cables.com/.pnpm-store/v10/files/19/286fb302c918fa34ff41b813ae3a5d54be9dd5e6961ef8a4c0bf86e19c16a1c28265abcd966b1f9926e564f3ae9083d9aa468cd1cee00e3e3c52c613e92d0e
Marc Mintel 5397309103
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
fix(products): fix breadcrumbs and product filtering (backport from main)
2026-02-24 16:04:21 +01:00

1 line
24 KiB
Plaintext

{"version":3,"file":"httpServerSpansIntegration.js","sources":["../../../../src/integrations/http/httpServerSpansIntegration.ts"],"sourcesContent":["import { errorMonitor } from 'node:events';\nimport type { ClientRequest, IncomingHttpHeaders, IncomingMessage, ServerResponse } from 'node:http';\nimport { context, SpanKind, trace } from '@opentelemetry/api';\nimport type { RPCMetadata } from '@opentelemetry/core';\nimport { getRPCMetadata, isTracingSuppressed, RPCType, setRPCMetadata } from '@opentelemetry/core';\nimport {\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n SEMATTRS_HTTP_STATUS_CODE,\n SEMATTRS_NET_HOST_IP,\n SEMATTRS_NET_HOST_PORT,\n SEMATTRS_NET_PEER_IP,\n} from '@opentelemetry/semantic-conventions';\nimport type { Event, Integration, IntegrationFn, Span, SpanAttributes, SpanStatus } from '@sentry/core';\nimport {\n debug,\n getIsolationScope,\n getSpanStatusFromHttpCode,\n httpHeadersToSpanAttributes,\n parseStringToURLObject,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SPAN_STATUS_ERROR,\n stripUrlQueryAndFragment,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../../debug-build';\nimport type { NodeClient } from '../../sdk/client';\nimport { addStartSpanCallback } from './httpServerIntegration';\n\nconst INTEGRATION_NAME = 'Http.ServerSpans';\n\n// Tree-shakable guard to remove all code related to tracing\ndeclare const __SENTRY_TRACING__: boolean;\n\nexport interface HttpServerSpansIntegrationOptions {\n /**\n * Do not capture spans for incoming HTTP requests to URLs where the given callback returns `true`.\n * Spans will be non recording if tracing is disabled.\n *\n * The `urlPath` param consists of the URL path and query string (if any) of the incoming request.\n * For example: `'/users/details?id=123'`\n *\n * The `request` param contains the original {@type IncomingMessage} object of the incoming request.\n * You can use it to filter on additional properties like method, headers, etc.\n */\n ignoreIncomingRequests?: (urlPath: string, request: IncomingMessage) => boolean;\n\n /**\n * Whether to automatically ignore common static asset requests like favicon.ico, robots.txt, etc.\n * This helps reduce noise in your transactions.\n *\n * @default `true`\n */\n ignoreStaticAssets?: boolean;\n\n /**\n * Do not capture spans for incoming HTTP requests with the given status codes.\n * By default, spans with some 3xx and 4xx status codes are ignored (see @default).\n * Expects an array of status codes or a range of status codes, e.g. [[300,399], 404] would ignore 3xx and 404 status codes.\n *\n * @default `[[401, 404], [301, 303], [305, 399]]`\n */\n ignoreStatusCodes?: (number | [number, number])[];\n\n /**\n * @deprecated This is deprecated in favor of `incomingRequestSpanHook`.\n */\n instrumentation?: {\n requestHook?: (span: Span, req: ClientRequest | IncomingMessage) => void;\n responseHook?: (span: Span, response: IncomingMessage | ServerResponse) => void;\n applyCustomAttributesOnSpan?: (\n span: Span,\n request: ClientRequest | IncomingMessage,\n response: IncomingMessage | ServerResponse,\n ) => void;\n };\n\n /**\n * A hook that can be used to mutate the span for incoming requests.\n * This is triggered after the span is created, but before it is recorded.\n */\n onSpanCreated?: (span: Span, request: IncomingMessage, response: ServerResponse) => void;\n}\n\nconst _httpServerSpansIntegration = ((options: HttpServerSpansIntegrationOptions = {}) => {\n const ignoreStaticAssets = options.ignoreStaticAssets ?? true;\n const ignoreIncomingRequests = options.ignoreIncomingRequests;\n const ignoreStatusCodes = options.ignoreStatusCodes ?? [\n [401, 404],\n // 300 and 304 are possibly valid status codes we do not want to filter\n [301, 303],\n [305, 399],\n ];\n\n const { onSpanCreated } = options;\n // eslint-disable-next-line deprecation/deprecation\n const { requestHook, responseHook, applyCustomAttributesOnSpan } = options.instrumentation ?? {};\n\n return {\n name: INTEGRATION_NAME,\n setup(client: NodeClient) {\n // If no tracing, we can just skip everything here\n if (typeof __SENTRY_TRACING__ !== 'undefined' && !__SENTRY_TRACING__) {\n return;\n }\n\n client.on('httpServerRequest', (_request, _response, normalizedRequest) => {\n // Type-casting this here because we do not want to put the node types into core\n const request = _request as IncomingMessage;\n const response = _response as ServerResponse;\n\n const startSpan = (next: () => boolean): boolean => {\n if (\n shouldIgnoreSpansForIncomingRequest(request, {\n ignoreStaticAssets,\n ignoreIncomingRequests,\n })\n ) {\n DEBUG_BUILD && debug.log(INTEGRATION_NAME, 'Skipping span creation for incoming request', request.url);\n return next();\n }\n\n const fullUrl = normalizedRequest.url || request.url || '/';\n const urlObj = parseStringToURLObject(fullUrl);\n\n const headers = request.headers;\n const userAgent = headers['user-agent'];\n const ips = headers['x-forwarded-for'];\n const httpVersion = request.httpVersion;\n const host = headers.host;\n const hostname = host?.replace(/^(.*)(:[0-9]{1,5})/, '$1') || 'localhost';\n\n const tracer = client.tracer;\n const scheme = fullUrl.startsWith('https') ? 'https' : 'http';\n\n const method = normalizedRequest.method || request.method?.toUpperCase() || 'GET';\n const httpTargetWithoutQueryFragment = urlObj ? urlObj.pathname : stripUrlQueryAndFragment(fullUrl);\n const bestEffortTransactionName = `${method} ${httpTargetWithoutQueryFragment}`;\n\n // We use the plain tracer.startSpan here so we can pass the span kind\n const span = tracer.startSpan(bestEffortTransactionName, {\n kind: SpanKind.SERVER,\n attributes: {\n // Sentry specific attributes\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'http.server',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.otel.http',\n 'sentry.http.prefetch': isKnownPrefetchRequest(request) || undefined,\n // Old Semantic Conventions attributes - added for compatibility with what `@opentelemetry/instrumentation-http` output before\n 'http.url': fullUrl,\n 'http.method': normalizedRequest.method,\n 'http.target': urlObj ? `${urlObj.pathname}${urlObj.search}` : httpTargetWithoutQueryFragment,\n 'http.host': host,\n 'net.host.name': hostname,\n 'http.client_ip': typeof ips === 'string' ? ips.split(',')[0] : undefined,\n 'http.user_agent': userAgent,\n 'http.scheme': scheme,\n 'http.flavor': httpVersion,\n 'net.transport': httpVersion?.toUpperCase() === 'QUIC' ? 'ip_udp' : 'ip_tcp',\n ...getRequestContentLengthAttribute(request),\n ...httpHeadersToSpanAttributes(\n normalizedRequest.headers || {},\n client.getOptions().sendDefaultPii ?? false,\n ),\n },\n });\n\n // TODO v11: Remove the following three hooks, only onSpanCreated should remain\n requestHook?.(span, request);\n responseHook?.(span, response);\n applyCustomAttributesOnSpan?.(span, request, response);\n onSpanCreated?.(span, request, response);\n\n const rpcMetadata: RPCMetadata = {\n type: RPCType.HTTP,\n span,\n };\n\n return context.with(setRPCMetadata(trace.setSpan(context.active(), span), rpcMetadata), () => {\n context.bind(context.active(), request);\n context.bind(context.active(), response);\n\n // Ensure we only end the span once\n // E.g. error can be emitted before close is emitted\n let isEnded = false;\n function endSpan(status: SpanStatus): void {\n if (isEnded) {\n return;\n }\n\n isEnded = true;\n\n const newAttributes = getIncomingRequestAttributesOnResponse(request, response);\n span.setAttributes(newAttributes);\n span.setStatus(status);\n span.end();\n\n // Update the transaction name if the route has changed\n const route = newAttributes['http.route'];\n if (route) {\n getIsolationScope().setTransactionName(`${request.method?.toUpperCase() || 'GET'} ${route}`);\n }\n }\n\n response.on('close', () => {\n endSpan(getSpanStatusFromHttpCode(response.statusCode));\n });\n response.on(errorMonitor, () => {\n const httpStatus = getSpanStatusFromHttpCode(response.statusCode);\n // Ensure we def. have an error status here\n endSpan(httpStatus.code === SPAN_STATUS_ERROR ? httpStatus : { code: SPAN_STATUS_ERROR });\n });\n\n return next();\n });\n };\n\n addStartSpanCallback(request, startSpan);\n });\n },\n processEvent(event) {\n // Drop transaction if it has a status code that should be ignored\n if (event.type === 'transaction') {\n const statusCode = event.contexts?.trace?.data?.['http.response.status_code'];\n if (typeof statusCode === 'number') {\n const shouldDrop = shouldFilterStatusCode(statusCode, ignoreStatusCodes);\n if (shouldDrop) {\n DEBUG_BUILD && debug.log('Dropping transaction due to status code', statusCode);\n return null;\n }\n }\n }\n\n return event;\n },\n afterAllSetup(client) {\n if (!DEBUG_BUILD) {\n return;\n }\n\n if (client.getIntegrationByName('Http')) {\n debug.warn(\n 'It seems that you have manually added `httpServerSpansIntergation` while `httpIntegration` is also present. Make sure to remove `httpIntegration` when adding `httpServerSpansIntegration`.',\n );\n }\n\n if (!client.getIntegrationByName('Http.Server')) {\n debug.error(\n 'It seems that you have manually added `httpServerSpansIntergation` without adding `httpServerIntegration`. This is a requiement for spans to be created - please add the `httpServerIntegration` integration.',\n );\n }\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * This integration emits spans for incoming requests handled via the node `http` module.\n * It requires the `httpServerIntegration` to be present.\n */\nexport const httpServerSpansIntegration = _httpServerSpansIntegration as (\n options?: HttpServerSpansIntegrationOptions,\n) => Integration & {\n name: 'HttpServerSpans';\n setup: (client: NodeClient) => void;\n processEvent: (event: Event) => Event | null;\n};\n\nfunction isKnownPrefetchRequest(req: IncomingMessage): boolean {\n // Currently only handles Next.js prefetch requests but may check other frameworks in the future.\n return req.headers['next-router-prefetch'] === '1';\n}\n\n/**\n * Check if a request is for a common static asset that should be ignored by default.\n *\n * Only exported for tests.\n */\nexport function isStaticAssetRequest(urlPath: string): boolean {\n const path = stripUrlQueryAndFragment(urlPath);\n // Common static file extensions\n if (path.match(/\\.(ico|png|jpg|jpeg|gif|svg|css|js|woff|woff2|ttf|eot|webp|avif)$/)) {\n return true;\n }\n\n // Common metadata files\n if (path.match(/^\\/(robots\\.txt|sitemap\\.xml|manifest\\.json|browserconfig\\.xml)$/)) {\n return true;\n }\n\n return false;\n}\n\nfunction shouldIgnoreSpansForIncomingRequest(\n request: IncomingMessage,\n {\n ignoreStaticAssets,\n ignoreIncomingRequests,\n }: {\n ignoreStaticAssets?: boolean;\n ignoreIncomingRequests?: (urlPath: string, request: IncomingMessage) => boolean;\n },\n): boolean {\n if (isTracingSuppressed(context.active())) {\n return true;\n }\n\n // request.url is the only property that holds any information about the url\n // it only consists of the URL path and query string (if any)\n const urlPath = request.url;\n\n const method = request.method?.toUpperCase();\n // We do not capture OPTIONS/HEAD requests as spans\n if (method === 'OPTIONS' || method === 'HEAD' || !urlPath) {\n return true;\n }\n\n // Default static asset filtering\n if (ignoreStaticAssets && method === 'GET' && isStaticAssetRequest(urlPath)) {\n return true;\n }\n\n if (ignoreIncomingRequests?.(urlPath, request)) {\n return true;\n }\n\n return false;\n}\n\nfunction getRequestContentLengthAttribute(request: IncomingMessage): SpanAttributes {\n const length = getContentLength(request.headers);\n if (length == null) {\n return {};\n }\n\n if (isCompressed(request.headers)) {\n return {\n ['http.request_content_length']: length,\n };\n } else {\n return {\n ['http.request_content_length_uncompressed']: length,\n };\n }\n}\n\nfunction getContentLength(headers: IncomingHttpHeaders): number | null {\n const contentLengthHeader = headers['content-length'];\n if (contentLengthHeader === undefined) return null;\n\n const contentLength = parseInt(contentLengthHeader, 10);\n if (isNaN(contentLength)) return null;\n\n return contentLength;\n}\n\nfunction isCompressed(headers: IncomingHttpHeaders): boolean {\n const encoding = headers['content-encoding'];\n\n return !!encoding && encoding !== 'identity';\n}\n\nfunction getIncomingRequestAttributesOnResponse(request: IncomingMessage, response: ServerResponse): SpanAttributes {\n // take socket from the request,\n // since it may be detached from the response object in keep-alive mode\n const { socket } = request;\n const { statusCode, statusMessage } = response;\n\n const newAttributes: SpanAttributes = {\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: statusCode,\n // eslint-disable-next-line deprecation/deprecation\n [SEMATTRS_HTTP_STATUS_CODE]: statusCode,\n 'http.status_text': statusMessage?.toUpperCase(),\n };\n\n const rpcMetadata = getRPCMetadata(context.active());\n if (socket) {\n const { localAddress, localPort, remoteAddress, remotePort } = socket;\n // eslint-disable-next-line deprecation/deprecation\n newAttributes[SEMATTRS_NET_HOST_IP] = localAddress;\n // eslint-disable-next-line deprecation/deprecation\n newAttributes[SEMATTRS_NET_HOST_PORT] = localPort;\n // eslint-disable-next-line deprecation/deprecation\n newAttributes[SEMATTRS_NET_PEER_IP] = remoteAddress;\n newAttributes['net.peer.port'] = remotePort;\n }\n // eslint-disable-next-line deprecation/deprecation\n newAttributes[SEMATTRS_HTTP_STATUS_CODE] = statusCode;\n newAttributes['http.status_text'] = (statusMessage || '').toUpperCase();\n\n if (rpcMetadata?.type === RPCType.HTTP && rpcMetadata.route !== undefined) {\n const routeName = rpcMetadata.route;\n newAttributes[ATTR_HTTP_ROUTE] = routeName;\n }\n\n return newAttributes;\n}\n\n/**\n * If the given status code should be filtered for the given list of status codes/ranges.\n */\nfunction shouldFilterStatusCode(statusCode: number, dropForStatusCodes: (number | [number, number])[]): boolean {\n return dropForStatusCodes.some(code => {\n if (typeof code === 'number') {\n return code === statusCode;\n }\n\n const [min, max] = code;\n return statusCode >= min && statusCode <= max;\n });\n}\n"],"names":["DEBUG_BUILD","debug","parseStringToURLObject","stripUrlQueryAndFragment","SpanKind","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","httpHeadersToSpanAttributes","RPCType","context","setRPCMetadata","trace","getIsolationScope","getSpanStatusFromHttpCode","errorMonitor","SPAN_STATUS_ERROR","addStartSpanCallback","isTracingSuppressed","ATTR_HTTP_RESPONSE_STATUS_CODE","SEMATTRS_HTTP_STATUS_CODE","getRPCMetadata","SEMATTRS_NET_HOST_IP","SEMATTRS_NET_HOST_PORT","SEMATTRS_NET_PEER_IP","ATTR_HTTP_ROUTE"],"mappings":"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"}