@sentry/node 10.54.0 → 10.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/integrations/node-fetch/vendored/undici.js +2 -3
- package/build/cjs/integrations/node-fetch/vendored/undici.js.map +1 -1
- package/build/cjs/integrations/tracing/InstrumentationNodeModuleFile.js +15 -0
- package/build/cjs/integrations/tracing/InstrumentationNodeModuleFile.js.map +1 -0
- package/build/cjs/integrations/tracing/amqplib/vendored/amqplib.js +9 -9
- package/build/cjs/integrations/tracing/amqplib/vendored/amqplib.js.map +1 -1
- package/build/cjs/integrations/tracing/amqplib/vendored/utils.js.map +1 -1
- package/build/cjs/integrations/tracing/anthropic-ai/index.js.map +1 -1
- package/build/cjs/integrations/tracing/connect/vendored/instrumentation.js +3 -5
- package/build/cjs/integrations/tracing/connect/vendored/instrumentation.js.map +1 -1
- package/build/cjs/integrations/tracing/express.js +3 -5
- package/build/cjs/integrations/tracing/express.js.map +1 -1
- package/build/cjs/integrations/tracing/fastify/v3/instrumentation.js +10 -11
- package/build/cjs/integrations/tracing/fastify/v3/instrumentation.js.map +1 -1
- package/build/cjs/integrations/tracing/fastify/vendored/instrumentation.js +3 -4
- package/build/cjs/integrations/tracing/fastify/vendored/instrumentation.js.map +1 -1
- package/build/cjs/integrations/tracing/firebase/otel/patches/firestore.js +2 -1
- package/build/cjs/integrations/tracing/firebase/otel/patches/firestore.js.map +1 -1
- package/build/cjs/integrations/tracing/firebase/otel/patches/functions.js +2 -1
- package/build/cjs/integrations/tracing/firebase/otel/patches/functions.js.map +1 -1
- package/build/cjs/integrations/tracing/google-genai/instrumentation.js +2 -1
- package/build/cjs/integrations/tracing/google-genai/instrumentation.js.map +1 -1
- package/build/cjs/integrations/tracing/graphql/vendored/instrumentation.js +4 -3
- package/build/cjs/integrations/tracing/graphql/vendored/instrumentation.js.map +1 -1
- package/build/cjs/integrations/tracing/hapi/vendored/instrumentation.js +2 -5
- package/build/cjs/integrations/tracing/hapi/vendored/instrumentation.js.map +1 -1
- package/build/cjs/integrations/tracing/hono/index.js.map +1 -1
- package/build/cjs/integrations/tracing/knex/vendored/instrumentation.js +3 -2
- package/build/cjs/integrations/tracing/knex/vendored/instrumentation.js.map +1 -1
- package/build/cjs/integrations/tracing/koa/vendored/instrumentation.js +3 -4
- package/build/cjs/integrations/tracing/koa/vendored/instrumentation.js.map +1 -1
- package/build/cjs/integrations/tracing/langchain/instrumentation.js +3 -2
- package/build/cjs/integrations/tracing/langchain/instrumentation.js.map +1 -1
- package/build/cjs/integrations/tracing/langgraph/index.js.map +1 -1
- package/build/cjs/integrations/tracing/langgraph/instrumentation.js +7 -5
- package/build/cjs/integrations/tracing/langgraph/instrumentation.js.map +1 -1
- package/build/cjs/integrations/tracing/mongo/vendored/instrumentation.js +7 -6
- package/build/cjs/integrations/tracing/mongo/vendored/instrumentation.js.map +1 -1
- package/build/cjs/integrations/tracing/mysql2/vendored/instrumentation.js +3 -2
- package/build/cjs/integrations/tracing/mysql2/vendored/instrumentation.js.map +1 -1
- package/build/cjs/integrations/tracing/openai/index.js.map +1 -1
- package/build/cjs/integrations/tracing/postgres/vendored/instrumentation.js +5 -5
- package/build/cjs/integrations/tracing/postgres/vendored/instrumentation.js.map +1 -1
- package/build/cjs/integrations/tracing/postgresjs.js +2 -1
- package/build/cjs/integrations/tracing/postgresjs.js.map +1 -1
- package/build/cjs/integrations/tracing/redis/index.js +3 -2
- package/build/cjs/integrations/tracing/redis/index.js.map +1 -1
- package/build/cjs/integrations/tracing/redis/vendored/ioredis-instrumentation.js +1 -1
- package/build/cjs/integrations/tracing/redis/vendored/ioredis-instrumentation.js.map +1 -1
- package/build/cjs/integrations/tracing/redis/vendored/redis-instrumentation.js +4 -3
- package/build/cjs/integrations/tracing/redis/vendored/redis-instrumentation.js.map +1 -1
- package/build/cjs/integrations/tracing/vercelai/instrumentation.js +6 -5
- package/build/cjs/integrations/tracing/vercelai/instrumentation.js.map +1 -1
- package/build/cjs/utils/setHttpServerSpanRouteAttribute.js +21 -0
- package/build/cjs/utils/setHttpServerSpanRouteAttribute.js.map +1 -0
- package/build/esm/integrations/node-fetch/vendored/undici.js +3 -4
- package/build/esm/integrations/node-fetch/vendored/undici.js.map +1 -1
- package/build/esm/integrations/tracing/InstrumentationNodeModuleFile.js +13 -0
- package/build/esm/integrations/tracing/InstrumentationNodeModuleFile.js.map +1 -0
- package/build/esm/integrations/tracing/amqplib/vendored/amqplib.js +7 -7
- package/build/esm/integrations/tracing/amqplib/vendored/amqplib.js.map +1 -1
- package/build/esm/integrations/tracing/amqplib/vendored/utils.js.map +1 -1
- package/build/esm/integrations/tracing/anthropic-ai/index.js.map +1 -1
- package/build/esm/integrations/tracing/connect/vendored/instrumentation.js +3 -5
- package/build/esm/integrations/tracing/connect/vendored/instrumentation.js.map +1 -1
- package/build/esm/integrations/tracing/express.js +3 -5
- package/build/esm/integrations/tracing/express.js.map +1 -1
- package/build/esm/integrations/tracing/fastify/v3/instrumentation.js +3 -4
- package/build/esm/integrations/tracing/fastify/v3/instrumentation.js.map +1 -1
- package/build/esm/integrations/tracing/fastify/vendored/instrumentation.js +3 -4
- package/build/esm/integrations/tracing/fastify/vendored/instrumentation.js.map +1 -1
- package/build/esm/integrations/tracing/firebase/otel/patches/firestore.js +2 -1
- package/build/esm/integrations/tracing/firebase/otel/patches/firestore.js.map +1 -1
- package/build/esm/integrations/tracing/firebase/otel/patches/functions.js +2 -1
- package/build/esm/integrations/tracing/firebase/otel/patches/functions.js.map +1 -1
- package/build/esm/integrations/tracing/google-genai/instrumentation.js +2 -1
- package/build/esm/integrations/tracing/google-genai/instrumentation.js.map +1 -1
- package/build/esm/integrations/tracing/graphql/vendored/instrumentation.js +2 -1
- package/build/esm/integrations/tracing/graphql/vendored/instrumentation.js.map +1 -1
- package/build/esm/integrations/tracing/hapi/vendored/instrumentation.js +2 -5
- package/build/esm/integrations/tracing/hapi/vendored/instrumentation.js.map +1 -1
- package/build/esm/integrations/tracing/hono/index.js.map +1 -1
- package/build/esm/integrations/tracing/knex/vendored/instrumentation.js +2 -1
- package/build/esm/integrations/tracing/knex/vendored/instrumentation.js.map +1 -1
- package/build/esm/integrations/tracing/koa/vendored/instrumentation.js +3 -4
- package/build/esm/integrations/tracing/koa/vendored/instrumentation.js.map +1 -1
- package/build/esm/integrations/tracing/langchain/instrumentation.js +2 -1
- package/build/esm/integrations/tracing/langchain/instrumentation.js.map +1 -1
- package/build/esm/integrations/tracing/langgraph/index.js.map +1 -1
- package/build/esm/integrations/tracing/langgraph/instrumentation.js +5 -3
- package/build/esm/integrations/tracing/langgraph/instrumentation.js.map +1 -1
- package/build/esm/integrations/tracing/mongo/vendored/instrumentation.js +2 -1
- package/build/esm/integrations/tracing/mongo/vendored/instrumentation.js.map +1 -1
- package/build/esm/integrations/tracing/mysql2/vendored/instrumentation.js +2 -1
- package/build/esm/integrations/tracing/mysql2/vendored/instrumentation.js.map +1 -1
- package/build/esm/integrations/tracing/openai/index.js.map +1 -1
- package/build/esm/integrations/tracing/postgres/vendored/instrumentation.js +5 -5
- package/build/esm/integrations/tracing/postgres/vendored/instrumentation.js.map +1 -1
- package/build/esm/integrations/tracing/postgresjs.js +2 -1
- package/build/esm/integrations/tracing/postgresjs.js.map +1 -1
- package/build/esm/integrations/tracing/redis/index.js +3 -2
- package/build/esm/integrations/tracing/redis/index.js.map +1 -1
- package/build/esm/integrations/tracing/redis/vendored/ioredis-instrumentation.js +1 -1
- package/build/esm/integrations/tracing/redis/vendored/ioredis-instrumentation.js.map +1 -1
- package/build/esm/integrations/tracing/redis/vendored/redis-instrumentation.js +2 -1
- package/build/esm/integrations/tracing/redis/vendored/redis-instrumentation.js.map +1 -1
- package/build/esm/integrations/tracing/vercelai/instrumentation.js +6 -5
- package/build/esm/integrations/tracing/vercelai/instrumentation.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/utils/setHttpServerSpanRouteAttribute.js +19 -0
- package/build/esm/utils/setHttpServerSpanRouteAttribute.js.map +1 -0
- package/build/types/integrations/node-fetch/vendored/undici.d.ts.map +1 -1
- package/build/types/integrations/tracing/InstrumentationNodeModuleFile.d.ts +9 -0
- package/build/types/integrations/tracing/InstrumentationNodeModuleFile.d.ts.map +1 -0
- package/build/types/integrations/tracing/amqplib/vendored/amqplib.d.ts.map +1 -1
- package/build/types/integrations/tracing/amqplib/vendored/utils.d.ts +2 -2
- package/build/types/integrations/tracing/amqplib/vendored/utils.d.ts.map +1 -1
- package/build/types/integrations/tracing/anthropic-ai/index.d.ts +7 -7
- package/build/types/integrations/tracing/connect/vendored/instrumentation.d.ts.map +1 -1
- package/build/types/integrations/tracing/express.d.ts.map +1 -1
- package/build/types/integrations/tracing/fastify/v3/instrumentation.d.ts.map +1 -1
- package/build/types/integrations/tracing/fastify/vendored/instrumentation.d.ts.map +1 -1
- package/build/types/integrations/tracing/firebase/otel/patches/firestore.d.ts.map +1 -1
- package/build/types/integrations/tracing/firebase/otel/patches/functions.d.ts.map +1 -1
- package/build/types/integrations/tracing/google-genai/instrumentation.d.ts.map +1 -1
- package/build/types/integrations/tracing/graphql/vendored/instrumentation.d.ts.map +1 -1
- package/build/types/integrations/tracing/hapi/vendored/instrumentation.d.ts.map +1 -1
- package/build/types/integrations/tracing/hono/index.d.ts +6 -0
- package/build/types/integrations/tracing/hono/index.d.ts.map +1 -1
- package/build/types/integrations/tracing/knex/vendored/instrumentation.d.ts.map +1 -1
- package/build/types/integrations/tracing/koa/vendored/instrumentation.d.ts.map +1 -1
- package/build/types/integrations/tracing/langchain/instrumentation.d.ts.map +1 -1
- package/build/types/integrations/tracing/langgraph/index.d.ts +7 -7
- package/build/types/integrations/tracing/langgraph/instrumentation.d.ts.map +1 -1
- package/build/types/integrations/tracing/mongo/vendored/instrumentation.d.ts.map +1 -1
- package/build/types/integrations/tracing/mysql2/vendored/instrumentation.d.ts.map +1 -1
- package/build/types/integrations/tracing/openai/index.d.ts +7 -7
- package/build/types/integrations/tracing/postgres/vendored/instrumentation.d.ts.map +1 -1
- package/build/types/integrations/tracing/postgresjs.d.ts.map +1 -1
- package/build/types/integrations/tracing/redis/index.d.ts +4 -1
- package/build/types/integrations/tracing/redis/index.d.ts.map +1 -1
- package/build/types/integrations/tracing/redis/vendored/redis-instrumentation.d.ts.map +1 -1
- package/build/types/integrations/tracing/vercelai/instrumentation.d.ts +2 -2
- package/build/types/integrations/tracing/vercelai/instrumentation.d.ts.map +1 -1
- package/build/types/integrations/tracing/vercelai/types.d.ts +6 -4
- package/build/types/integrations/tracing/vercelai/types.d.ts.map +1 -1
- package/build/types/utils/setHttpServerSpanRouteAttribute.d.ts +9 -0
- package/build/types/utils/setHttpServerSpanRouteAttribute.d.ts.map +1 -0
- package/build/types-ts3.8/integrations/tracing/InstrumentationNodeModuleFile.d.ts +9 -0
- package/build/types-ts3.8/integrations/tracing/amqplib/vendored/utils.d.ts +2 -2
- package/build/types-ts3.8/integrations/tracing/anthropic-ai/index.d.ts +7 -7
- package/build/types-ts3.8/integrations/tracing/hono/index.d.ts +6 -0
- package/build/types-ts3.8/integrations/tracing/langgraph/index.d.ts +7 -7
- package/build/types-ts3.8/integrations/tracing/openai/index.d.ts +7 -7
- package/build/types-ts3.8/integrations/tracing/redis/index.d.ts +4 -1
- package/build/types-ts3.8/integrations/tracing/vercelai/instrumentation.d.ts +2 -2
- package/build/types-ts3.8/integrations/tracing/vercelai/types.d.ts +6 -4
- package/build/types-ts3.8/utils/setHttpServerSpanRouteAttribute.d.ts +9 -0
- package/package.json +5 -4
- package/build/cjs/integrations/tracing/redis/redis-dc-subscriber.js +0 -151
- package/build/cjs/integrations/tracing/redis/redis-dc-subscriber.js.map +0 -1
- package/build/esm/integrations/tracing/redis/redis-dc-subscriber.js +0 -149
- package/build/esm/integrations/tracing/redis/redis-dc-subscriber.js.map +0 -1
- package/build/types/integrations/tracing/redis/redis-dc-subscriber.d.ts +0 -17
- package/build/types/integrations/tracing/redis/redis-dc-subscriber.d.ts.map +0 -1
- package/build/types-ts3.8/integrations/tracing/redis/redis-dc-subscriber.d.ts +0 -17
|
@@ -4,7 +4,6 @@ const diagch = require('diagnostics_channel');
|
|
|
4
4
|
const url = require('url');
|
|
5
5
|
const instrumentation = require('@opentelemetry/instrumentation');
|
|
6
6
|
const api = require('@opentelemetry/api');
|
|
7
|
-
const core$1 = require('@opentelemetry/core');
|
|
8
7
|
const semanticConventions = require('@opentelemetry/semantic-conventions');
|
|
9
8
|
const core = require('@sentry/core');
|
|
10
9
|
|
|
@@ -110,7 +109,7 @@ class UndiciInstrumentation extends instrumentation.InstrumentationBase {
|
|
|
110
109
|
if (shouldIgnoreReq) {
|
|
111
110
|
return;
|
|
112
111
|
}
|
|
113
|
-
const startTime = core
|
|
112
|
+
const startTime = core.timestampInSeconds();
|
|
114
113
|
let requestUrl;
|
|
115
114
|
try {
|
|
116
115
|
requestUrl = new url.URL(request.path, request.origin);
|
|
@@ -312,7 +311,7 @@ class UndiciInstrumentation extends instrumentation.InstrumentationBase {
|
|
|
312
311
|
metricsAttributes[key] = attributes[key];
|
|
313
312
|
}
|
|
314
313
|
});
|
|
315
|
-
const durationSeconds = core
|
|
314
|
+
const durationSeconds = core.timestampInSeconds() - startTime;
|
|
316
315
|
this._httpClientDurationHistogram.record(durationSeconds, metricsAttributes);
|
|
317
316
|
}
|
|
318
317
|
getRequestMethod(original) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"undici.js","sources":["../../../../../src/integrations/node-fetch/vendored/undici.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/ed97091c9890dd18e52759f2ea98e9d7593b3ae4/packages/instrumentation-undici\n * - Upstream version: @opentelemetry/instrumentation-undici@0.24.0\n * - Tracking issue: https://github.com/getsentry/sentry-javascript/issues/20165\n * - Minor TypeScript strictness adjustments for this repository's compiler settings\n */\n/* eslint-disable -- vendored @opentelemetry/instrumentation-undici (#20165) */\n\nimport * as diagch from 'diagnostics_channel';\nimport { URL } from 'url';\n\nimport { InstrumentationBase, safeExecuteInTheMiddle } from '@opentelemetry/instrumentation';\nimport type { Attributes, Histogram, HrTime, Span } from '@opentelemetry/api';\nimport {\n context,\n INVALID_SPAN_CONTEXT,\n propagation,\n SpanKind,\n SpanStatusCode,\n trace,\n ValueType,\n} from '@opentelemetry/api';\nimport { hrTime, hrTimeDuration, hrTimeToMilliseconds } from '@opentelemetry/core';\nimport {\n ATTR_ERROR_TYPE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_REQUEST_METHOD_ORIGINAL,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_NETWORK_PEER_ADDRESS,\n ATTR_NETWORK_PEER_PORT,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_URL_FULL,\n ATTR_URL_PATH,\n ATTR_URL_QUERY,\n ATTR_URL_SCHEME,\n ATTR_USER_AGENT_ORIGINAL,\n METRIC_HTTP_CLIENT_REQUEST_DURATION,\n} from '@opentelemetry/semantic-conventions';\n\nimport type {\n ListenerRecord,\n RequestHeadersMessage,\n RequestMessage,\n RequestTrailersMessage,\n ResponseHeadersMessage,\n} from './internal-types';\nimport type { UndiciInstrumentationConfig, UndiciRequest } from './types';\n\nimport { SDK_VERSION } from '@sentry/core';\n\ninterface InstrumentationRecord {\n span: Span;\n attributes: Attributes;\n startTime: HrTime;\n}\n\nconst PACKAGE_NAME = '@sentry/instrumentation-undici';\n\n// A combination of https://github.com/elastic/apm-agent-nodejs and\n// https://github.com/gadget-inc/opentelemetry-instrumentations/blob/main/packages/opentelemetry-instrumentation-undici/src/index.ts\nexport class UndiciInstrumentation extends InstrumentationBase<UndiciInstrumentationConfig> {\n // Keep ref to avoid https://github.com/nodejs/node/issues/42170 bug and for\n // unsubscribing.\n declare private _channelSubs: Array<ListenerRecord>;\n private _recordFromReq = new WeakMap<UndiciRequest, InstrumentationRecord>();\n\n declare private _httpClientDurationHistogram: Histogram;\n\n constructor(config: UndiciInstrumentationConfig = {}) {\n super(PACKAGE_NAME, SDK_VERSION, config);\n }\n\n // No need to instrument files/modules\n protected override init() {\n return undefined;\n }\n\n override disable(): void {\n super.disable();\n this._channelSubs.forEach(sub => sub.unsubscribe());\n this._channelSubs.length = 0;\n }\n\n override enable(): void {\n // \"enabled\" handling is currently a bit messy with InstrumentationBase.\n // If constructed with `{enabled: false}`, this `.enable()` is still called,\n // and `this.getConfig().enabled !== this.isEnabled()`, creating confusion.\n //\n // For now, this class will setup for instrumenting if `.enable()` is\n // called, but use `this.getConfig().enabled` to determine if\n // instrumentation should be generated. This covers the more likely common\n // case of config being given a construction time, rather than later via\n // `instance.enable()`, `.disable()`, or `.setConfig()` calls.\n super.enable();\n\n // This method is called by the super-class constructor before ours is\n // called. So we need to ensure the property is initalized.\n this._channelSubs = this._channelSubs || [];\n\n // Avoid to duplicate subscriptions\n if (this._channelSubs.length > 0) {\n return;\n }\n\n this.subscribeToChannel('undici:request:create', this.onRequestCreated.bind(this));\n this.subscribeToChannel('undici:client:sendHeaders', this.onRequestHeaders.bind(this));\n this.subscribeToChannel('undici:request:headers', this.onResponseHeaders.bind(this));\n this.subscribeToChannel('undici:request:trailers', this.onDone.bind(this));\n this.subscribeToChannel('undici:request:error', this.onError.bind(this));\n }\n\n protected override _updateMetricInstruments() {\n this._httpClientDurationHistogram = this.meter.createHistogram(METRIC_HTTP_CLIENT_REQUEST_DURATION, {\n description: 'Measures the duration of outbound HTTP requests.',\n unit: 's',\n valueType: ValueType.DOUBLE,\n advice: {\n explicitBucketBoundaries: [0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10],\n },\n });\n }\n\n private subscribeToChannel(diagnosticChannel: string, onMessage: (message: any, name: string | symbol) => void) {\n // `diagnostics_channel` had a ref counting bug until v18.19.0.\n // https://github.com/nodejs/node/pull/47520\n const [major = 0, minor = 0] = process.version\n .replace('v', '')\n .split('.')\n .map(n => Number(n));\n const useNewSubscribe = major > 18 || (major === 18 && minor >= 19);\n\n let unsubscribe: () => void;\n if (useNewSubscribe) {\n diagch.subscribe?.(diagnosticChannel, onMessage);\n unsubscribe = () => diagch.unsubscribe?.(diagnosticChannel, onMessage);\n } else {\n const channel = diagch.channel(diagnosticChannel);\n channel.subscribe(onMessage);\n unsubscribe = () => channel.unsubscribe(onMessage);\n }\n\n this._channelSubs.push({\n name: diagnosticChannel,\n unsubscribe,\n });\n }\n\n private parseRequestHeaders(request: UndiciRequest) {\n const result = new Map<string, string | string[]>();\n\n if (Array.isArray(request.headers)) {\n // headers are an array [k1, v2, k2, v2] (undici v6+)\n // values could be string or a string[] for multiple values\n for (let i = 0; i < request.headers.length; i += 2) {\n const key = request.headers[i];\n const value = request.headers[i + 1];\n\n // Key should always be a string, but the types don't know that, and let's be safe\n if (typeof key === 'string' && value !== undefined) {\n result.set(key.toLowerCase(), value);\n }\n }\n } else if (typeof request.headers === 'string') {\n // headers are a raw string (undici v5)\n // headers could be repeated in several lines for multiple values\n const headers = request.headers.split('\\r\\n');\n for (const line of headers) {\n if (!line) {\n continue;\n }\n const colonIndex = line.indexOf(':');\n if (colonIndex === -1) {\n // Invalid header? Probably this can't happen, but again let's be safe.\n continue;\n }\n const key = line.substring(0, colonIndex).toLowerCase();\n const value = line.substring(colonIndex + 1).trim();\n const allValues = result.get(key);\n\n if (allValues && Array.isArray(allValues)) {\n allValues.push(value);\n } else if (allValues) {\n result.set(key, [allValues, value]);\n } else {\n result.set(key, value);\n }\n }\n }\n return result;\n }\n\n // This is the 1st message we receive for each request (fired after request creation). Here we will\n // create the span and populate some atttributes, then link the span to the request for further\n // span processing\n private onRequestCreated({ request }: RequestMessage): void {\n // Ignore if:\n // - instrumentation is disabled\n // - ignored by config\n // - method is 'CONNECT'\n const config = this.getConfig();\n const enabled = config.enabled !== false;\n const shouldIgnoreReq = safeExecuteInTheMiddle(\n () => !enabled || request.method === 'CONNECT' || config.ignoreRequestHook?.(request),\n e => e && this._diag.error('caught ignoreRequestHook error: ', e),\n true,\n );\n\n if (shouldIgnoreReq) {\n return;\n }\n\n const startTime = hrTime();\n let requestUrl;\n try {\n requestUrl = new URL(request.path, request.origin);\n } catch (err) {\n this._diag.warn('could not determine url.full:', err);\n // Skip instrumenting this request.\n return;\n }\n const urlScheme = requestUrl.protocol.replace(':', '');\n const requestMethod = this.getRequestMethod(request.method);\n const attributes: Attributes = {\n [ATTR_HTTP_REQUEST_METHOD]: requestMethod,\n [ATTR_HTTP_REQUEST_METHOD_ORIGINAL]: request.method,\n [ATTR_URL_FULL]: requestUrl.toString(),\n [ATTR_URL_PATH]: requestUrl.pathname,\n [ATTR_URL_QUERY]: requestUrl.search,\n [ATTR_URL_SCHEME]: urlScheme,\n };\n\n const schemePorts: Record<string, string> = { https: '443', http: '80' };\n const serverAddress = requestUrl.hostname;\n const serverPort = requestUrl.port || schemePorts[urlScheme];\n\n attributes[ATTR_SERVER_ADDRESS] = serverAddress;\n if (serverPort && !isNaN(Number(serverPort))) {\n attributes[ATTR_SERVER_PORT] = Number(serverPort);\n }\n\n // Get user agent from headers\n const headersMap = this.parseRequestHeaders(request);\n const userAgentValues = headersMap.get('user-agent');\n\n if (userAgentValues) {\n // NOTE: having multiple user agents is not expected so\n // we're going to take last one like `curl` does\n // ref: https://curl.se/docs/manpage.html#-A\n const userAgent = Array.isArray(userAgentValues) ? userAgentValues[userAgentValues.length - 1] : userAgentValues;\n attributes[ATTR_USER_AGENT_ORIGINAL] = userAgent;\n }\n\n // Get attributes from the hook if present\n const hookAttributes = safeExecuteInTheMiddle(\n () => config.startSpanHook?.(request),\n e => e && this._diag.error('caught startSpanHook error: ', e),\n true,\n );\n if (hookAttributes) {\n Object.entries(hookAttributes).forEach(([key, val]) => {\n attributes[key] = val;\n });\n }\n\n // Check if parent span is required via config and:\n // - if a parent is required but not present, we use a `NoopSpan` to still\n // propagate context without recording it.\n // - create a span otherwise\n const activeCtx = context.active();\n const currentSpan = trace.getSpan(activeCtx);\n let span: Span;\n\n if (config.requireParentforSpans && (!currentSpan || !trace.isSpanContextValid(currentSpan.spanContext()))) {\n span = trace.wrapSpanContext(INVALID_SPAN_CONTEXT);\n } else {\n span = this.tracer.startSpan(\n requestMethod === '_OTHER' ? 'HTTP' : requestMethod,\n {\n kind: SpanKind.CLIENT,\n attributes: attributes,\n },\n activeCtx,\n );\n }\n\n // Execute the request hook if defined\n safeExecuteInTheMiddle(\n () => config.requestHook?.(span, request),\n e => e && this._diag.error('caught requestHook error: ', e),\n true,\n );\n\n // Context propagation goes last so no hook can tamper\n // the propagation headers\n const requestContext = trace.setSpan(context.active(), span);\n const addedHeaders: Record<string, string> = {};\n propagation.inject(requestContext, addedHeaders);\n\n const headerEntries = Object.entries(addedHeaders);\n\n for (let i = 0; i < headerEntries.length; i++) {\n const pair = headerEntries[i];\n if (!pair) {\n continue;\n }\n const [k, v] = pair;\n\n if (typeof request.addHeader === 'function') {\n request.addHeader(k, v);\n } else if (typeof request.headers === 'string') {\n request.headers += `${k}: ${v}\\r\\n`;\n } else if (Array.isArray(request.headers)) {\n // undici@6.11.0 accidentally, briefly removed `request.addHeader()`.\n request.headers.push(k, v);\n }\n }\n this._recordFromReq.set(request, { span, attributes, startTime });\n }\n\n // This is the 2nd message we receive for each request. It is fired when connection with\n // the remote is established and about to send the first byte. Here we do have info about the\n // remote address and port so we can populate some `network.*` attributes into the span\n private onRequestHeaders({ request, socket }: RequestHeadersMessage): void {\n const record = this._recordFromReq.get(request);\n\n if (!record) {\n return;\n }\n\n const config = this.getConfig();\n const { span } = record;\n const { remoteAddress, remotePort } = socket;\n const spanAttributes: Attributes = {\n [ATTR_NETWORK_PEER_ADDRESS]: remoteAddress,\n [ATTR_NETWORK_PEER_PORT]: remotePort,\n };\n\n // After hooks have been processed (which may modify request headers)\n // we can collect the headers based on the configuration\n if (config.headersToSpanAttributes?.requestHeaders) {\n const headersToAttribs = new Set(config.headersToSpanAttributes.requestHeaders.map(n => n.toLowerCase()));\n const headersMap = this.parseRequestHeaders(request);\n\n for (const [name, value] of headersMap.entries()) {\n if (headersToAttribs.has(name)) {\n const attrValue = Array.isArray(value) ? value : [value];\n spanAttributes[`http.request.header.${name}`] = attrValue;\n }\n }\n }\n\n span.setAttributes(spanAttributes);\n }\n\n // This is the 3rd message we get for each request and it's fired when the server\n // headers are received, body may not be accessible yet.\n // From the response headers we can set the status and content length\n private onResponseHeaders({ request, response }: ResponseHeadersMessage): void {\n const record = this._recordFromReq.get(request);\n\n if (!record) {\n return;\n }\n\n const { span, attributes } = record;\n const spanAttributes: Attributes = {\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: response.statusCode,\n };\n\n const config = this.getConfig();\n\n // Execute the response hook if defined\n safeExecuteInTheMiddle(\n () => config.responseHook?.(span, { request, response }),\n e => e && this._diag.error('caught responseHook error: ', e),\n true,\n );\n\n if (config.headersToSpanAttributes?.responseHeaders) {\n const headersToAttribs = new Set();\n config.headersToSpanAttributes?.responseHeaders.forEach(name => headersToAttribs.add(name.toLowerCase()));\n\n for (let idx = 0; idx < response.headers.length; idx = idx + 2) {\n const nameBuf = response.headers[idx];\n const valueBuf = response.headers[idx + 1];\n if (nameBuf === undefined || valueBuf === undefined) {\n continue;\n }\n const name = nameBuf.toString().toLowerCase();\n const value = valueBuf;\n\n if (headersToAttribs.has(name)) {\n const attrName = `http.response.header.${name}`;\n if (!Object.prototype.hasOwnProperty.call(spanAttributes, attrName)) {\n spanAttributes[attrName] = [value.toString()];\n } else {\n (spanAttributes[attrName] as string[]).push(value.toString());\n }\n }\n }\n }\n\n span.setAttributes(spanAttributes);\n span.setStatus({\n code: response.statusCode >= 400 ? SpanStatusCode.ERROR : SpanStatusCode.UNSET,\n });\n record.attributes = Object.assign(attributes, spanAttributes);\n }\n\n // This is the last event we receive if the request went without any errors\n private onDone({ request }: RequestTrailersMessage): void {\n const record = this._recordFromReq.get(request);\n\n if (!record) {\n return;\n }\n\n const { span, attributes, startTime } = record;\n\n // End the span\n span.end();\n this._recordFromReq.delete(request);\n\n // Record metrics\n this.recordRequestDuration(attributes, startTime);\n }\n\n // This is the event we get when something is wrong in the request like\n // - invalid options when calling `fetch` global API or any undici method for request\n // - connectivity errors such as unreachable host\n // - requests aborted through an `AbortController.signal`\n // NOTE: server errors are considered valid responses and it's the lib consumer\n // who should deal with that.\n private onError({ request, error }: any): void {\n const record = this._recordFromReq.get(request);\n\n if (!record) {\n return;\n }\n\n const { span, attributes, startTime } = record;\n\n // NOTE: in `undici@6.3.0` when request aborted the error type changes from\n // a custom error (`RequestAbortedError`) to a built-in `DOMException` carrying\n // some differences:\n // - `code` is from DOMEXception (ABORT_ERR: 20)\n // - `message` changes\n // - stacktrace is smaller and contains node internal frames\n span.recordException(error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.end();\n this._recordFromReq.delete(request);\n\n // Record metrics (with the error)\n attributes[ATTR_ERROR_TYPE] = error.message;\n this.recordRequestDuration(attributes, startTime);\n }\n\n private recordRequestDuration(attributes: Attributes, startTime: HrTime) {\n // Time to record metrics\n const metricsAttributes: Attributes = {};\n // Get the attribs already in span attributes\n const keysToCopy = [\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_URL_SCHEME,\n ATTR_ERROR_TYPE,\n ];\n keysToCopy.forEach(key => {\n if (key in attributes) {\n metricsAttributes[key] = attributes[key];\n }\n });\n\n // Take the duration and record it\n const durationSeconds = hrTimeToMilliseconds(hrTimeDuration(startTime, hrTime())) / 1000;\n this._httpClientDurationHistogram.record(durationSeconds, metricsAttributes);\n }\n\n private getRequestMethod(original: string): string {\n const knownMethods = {\n CONNECT: true,\n OPTIONS: true,\n HEAD: true,\n GET: true,\n POST: true,\n PUT: true,\n PATCH: true,\n DELETE: true,\n TRACE: true,\n // QUERY from https://datatracker.ietf.org/doc/draft-ietf-httpbis-safe-method-w-body/\n QUERY: true,\n };\n\n if (original.toUpperCase() in knownMethods) {\n return original.toUpperCase();\n }\n\n return '_OTHER';\n }\n}\n"],"names":["InstrumentationBase","SDK_VERSION","METRIC_HTTP_CLIENT_REQUEST_DURATION","ValueType","safeExecuteInTheMiddle","hrTime","URL","ATTR_HTTP_REQUEST_METHOD","ATTR_HTTP_REQUEST_METHOD_ORIGINAL","ATTR_URL_FULL","ATTR_URL_PATH","ATTR_URL_QUERY","ATTR_URL_SCHEME","ATTR_SERVER_ADDRESS","ATTR_SERVER_PORT","ATTR_USER_AGENT_ORIGINAL","context","trace","INVALID_SPAN_CONTEXT","SpanKind","propagation","ATTR_NETWORK_PEER_ADDRESS","ATTR_NETWORK_PEER_PORT","ATTR_HTTP_RESPONSE_STATUS_CODE","SpanStatusCode","ATTR_ERROR_TYPE","hrTimeToMilliseconds","hrTimeDuration"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"undici.js","sources":["../../../../../src/integrations/node-fetch/vendored/undici.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/ed97091c9890dd18e52759f2ea98e9d7593b3ae4/packages/instrumentation-undici\n * - Upstream version: @opentelemetry/instrumentation-undici@0.24.0\n * - Tracking issue: https://github.com/getsentry/sentry-javascript/issues/20165\n * - Minor TypeScript strictness adjustments for this repository's compiler settings\n */\n/* eslint-disable -- vendored @opentelemetry/instrumentation-undici (#20165) */\n\nimport * as diagch from 'diagnostics_channel';\nimport { URL } from 'url';\n\nimport { InstrumentationBase, safeExecuteInTheMiddle } from '@opentelemetry/instrumentation';\nimport type { Attributes, Histogram, Span } from '@opentelemetry/api';\nimport {\n context,\n INVALID_SPAN_CONTEXT,\n propagation,\n SpanKind,\n SpanStatusCode,\n trace,\n ValueType,\n} from '@opentelemetry/api';\nimport {\n ATTR_ERROR_TYPE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_REQUEST_METHOD_ORIGINAL,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_NETWORK_PEER_ADDRESS,\n ATTR_NETWORK_PEER_PORT,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_URL_FULL,\n ATTR_URL_PATH,\n ATTR_URL_QUERY,\n ATTR_URL_SCHEME,\n ATTR_USER_AGENT_ORIGINAL,\n METRIC_HTTP_CLIENT_REQUEST_DURATION,\n} from '@opentelemetry/semantic-conventions';\n\nimport type {\n ListenerRecord,\n RequestHeadersMessage,\n RequestMessage,\n RequestTrailersMessage,\n ResponseHeadersMessage,\n} from './internal-types';\nimport type { UndiciInstrumentationConfig, UndiciRequest } from './types';\n\nimport { SDK_VERSION, timestampInSeconds } from '@sentry/core';\n\ninterface InstrumentationRecord {\n span: Span;\n attributes: Attributes;\n startTime: number;\n}\n\nconst PACKAGE_NAME = '@sentry/instrumentation-undici';\n\n// A combination of https://github.com/elastic/apm-agent-nodejs and\n// https://github.com/gadget-inc/opentelemetry-instrumentations/blob/main/packages/opentelemetry-instrumentation-undici/src/index.ts\nexport class UndiciInstrumentation extends InstrumentationBase<UndiciInstrumentationConfig> {\n // Keep ref to avoid https://github.com/nodejs/node/issues/42170 bug and for\n // unsubscribing.\n declare private _channelSubs: Array<ListenerRecord>;\n private _recordFromReq = new WeakMap<UndiciRequest, InstrumentationRecord>();\n\n declare private _httpClientDurationHistogram: Histogram;\n\n constructor(config: UndiciInstrumentationConfig = {}) {\n super(PACKAGE_NAME, SDK_VERSION, config);\n }\n\n // No need to instrument files/modules\n protected override init() {\n return undefined;\n }\n\n override disable(): void {\n super.disable();\n this._channelSubs.forEach(sub => sub.unsubscribe());\n this._channelSubs.length = 0;\n }\n\n override enable(): void {\n // \"enabled\" handling is currently a bit messy with InstrumentationBase.\n // If constructed with `{enabled: false}`, this `.enable()` is still called,\n // and `this.getConfig().enabled !== this.isEnabled()`, creating confusion.\n //\n // For now, this class will setup for instrumenting if `.enable()` is\n // called, but use `this.getConfig().enabled` to determine if\n // instrumentation should be generated. This covers the more likely common\n // case of config being given a construction time, rather than later via\n // `instance.enable()`, `.disable()`, or `.setConfig()` calls.\n super.enable();\n\n // This method is called by the super-class constructor before ours is\n // called. So we need to ensure the property is initalized.\n this._channelSubs = this._channelSubs || [];\n\n // Avoid to duplicate subscriptions\n if (this._channelSubs.length > 0) {\n return;\n }\n\n this.subscribeToChannel('undici:request:create', this.onRequestCreated.bind(this));\n this.subscribeToChannel('undici:client:sendHeaders', this.onRequestHeaders.bind(this));\n this.subscribeToChannel('undici:request:headers', this.onResponseHeaders.bind(this));\n this.subscribeToChannel('undici:request:trailers', this.onDone.bind(this));\n this.subscribeToChannel('undici:request:error', this.onError.bind(this));\n }\n\n protected override _updateMetricInstruments() {\n this._httpClientDurationHistogram = this.meter.createHistogram(METRIC_HTTP_CLIENT_REQUEST_DURATION, {\n description: 'Measures the duration of outbound HTTP requests.',\n unit: 's',\n valueType: ValueType.DOUBLE,\n advice: {\n explicitBucketBoundaries: [0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10],\n },\n });\n }\n\n private subscribeToChannel(diagnosticChannel: string, onMessage: (message: any, name: string | symbol) => void) {\n // `diagnostics_channel` had a ref counting bug until v18.19.0.\n // https://github.com/nodejs/node/pull/47520\n const [major = 0, minor = 0] = process.version\n .replace('v', '')\n .split('.')\n .map(n => Number(n));\n const useNewSubscribe = major > 18 || (major === 18 && minor >= 19);\n\n let unsubscribe: () => void;\n if (useNewSubscribe) {\n diagch.subscribe?.(diagnosticChannel, onMessage);\n unsubscribe = () => diagch.unsubscribe?.(diagnosticChannel, onMessage);\n } else {\n const channel = diagch.channel(diagnosticChannel);\n channel.subscribe(onMessage);\n unsubscribe = () => channel.unsubscribe(onMessage);\n }\n\n this._channelSubs.push({\n name: diagnosticChannel,\n unsubscribe,\n });\n }\n\n private parseRequestHeaders(request: UndiciRequest) {\n const result = new Map<string, string | string[]>();\n\n if (Array.isArray(request.headers)) {\n // headers are an array [k1, v2, k2, v2] (undici v6+)\n // values could be string or a string[] for multiple values\n for (let i = 0; i < request.headers.length; i += 2) {\n const key = request.headers[i];\n const value = request.headers[i + 1];\n\n // Key should always be a string, but the types don't know that, and let's be safe\n if (typeof key === 'string' && value !== undefined) {\n result.set(key.toLowerCase(), value);\n }\n }\n } else if (typeof request.headers === 'string') {\n // headers are a raw string (undici v5)\n // headers could be repeated in several lines for multiple values\n const headers = request.headers.split('\\r\\n');\n for (const line of headers) {\n if (!line) {\n continue;\n }\n const colonIndex = line.indexOf(':');\n if (colonIndex === -1) {\n // Invalid header? Probably this can't happen, but again let's be safe.\n continue;\n }\n const key = line.substring(0, colonIndex).toLowerCase();\n const value = line.substring(colonIndex + 1).trim();\n const allValues = result.get(key);\n\n if (allValues && Array.isArray(allValues)) {\n allValues.push(value);\n } else if (allValues) {\n result.set(key, [allValues, value]);\n } else {\n result.set(key, value);\n }\n }\n }\n return result;\n }\n\n // This is the 1st message we receive for each request (fired after request creation). Here we will\n // create the span and populate some atttributes, then link the span to the request for further\n // span processing\n private onRequestCreated({ request }: RequestMessage): void {\n // Ignore if:\n // - instrumentation is disabled\n // - ignored by config\n // - method is 'CONNECT'\n const config = this.getConfig();\n const enabled = config.enabled !== false;\n const shouldIgnoreReq = safeExecuteInTheMiddle(\n () => !enabled || request.method === 'CONNECT' || config.ignoreRequestHook?.(request),\n e => e && this._diag.error('caught ignoreRequestHook error: ', e),\n true,\n );\n\n if (shouldIgnoreReq) {\n return;\n }\n\n const startTime = timestampInSeconds();\n let requestUrl;\n try {\n requestUrl = new URL(request.path, request.origin);\n } catch (err) {\n this._diag.warn('could not determine url.full:', err);\n // Skip instrumenting this request.\n return;\n }\n const urlScheme = requestUrl.protocol.replace(':', '');\n const requestMethod = this.getRequestMethod(request.method);\n const attributes: Attributes = {\n [ATTR_HTTP_REQUEST_METHOD]: requestMethod,\n [ATTR_HTTP_REQUEST_METHOD_ORIGINAL]: request.method,\n [ATTR_URL_FULL]: requestUrl.toString(),\n [ATTR_URL_PATH]: requestUrl.pathname,\n [ATTR_URL_QUERY]: requestUrl.search,\n [ATTR_URL_SCHEME]: urlScheme,\n };\n\n const schemePorts: Record<string, string> = { https: '443', http: '80' };\n const serverAddress = requestUrl.hostname;\n const serverPort = requestUrl.port || schemePorts[urlScheme];\n\n attributes[ATTR_SERVER_ADDRESS] = serverAddress;\n if (serverPort && !isNaN(Number(serverPort))) {\n attributes[ATTR_SERVER_PORT] = Number(serverPort);\n }\n\n // Get user agent from headers\n const headersMap = this.parseRequestHeaders(request);\n const userAgentValues = headersMap.get('user-agent');\n\n if (userAgentValues) {\n // NOTE: having multiple user agents is not expected so\n // we're going to take last one like `curl` does\n // ref: https://curl.se/docs/manpage.html#-A\n const userAgent = Array.isArray(userAgentValues) ? userAgentValues[userAgentValues.length - 1] : userAgentValues;\n attributes[ATTR_USER_AGENT_ORIGINAL] = userAgent;\n }\n\n // Get attributes from the hook if present\n const hookAttributes = safeExecuteInTheMiddle(\n () => config.startSpanHook?.(request),\n e => e && this._diag.error('caught startSpanHook error: ', e),\n true,\n );\n if (hookAttributes) {\n Object.entries(hookAttributes).forEach(([key, val]) => {\n attributes[key] = val;\n });\n }\n\n // Check if parent span is required via config and:\n // - if a parent is required but not present, we use a `NoopSpan` to still\n // propagate context without recording it.\n // - create a span otherwise\n const activeCtx = context.active();\n const currentSpan = trace.getSpan(activeCtx);\n let span: Span;\n\n if (config.requireParentforSpans && (!currentSpan || !trace.isSpanContextValid(currentSpan.spanContext()))) {\n span = trace.wrapSpanContext(INVALID_SPAN_CONTEXT);\n } else {\n span = this.tracer.startSpan(\n requestMethod === '_OTHER' ? 'HTTP' : requestMethod,\n {\n kind: SpanKind.CLIENT,\n attributes: attributes,\n },\n activeCtx,\n );\n }\n\n // Execute the request hook if defined\n safeExecuteInTheMiddle(\n () => config.requestHook?.(span, request),\n e => e && this._diag.error('caught requestHook error: ', e),\n true,\n );\n\n // Context propagation goes last so no hook can tamper\n // the propagation headers\n const requestContext = trace.setSpan(context.active(), span);\n const addedHeaders: Record<string, string> = {};\n propagation.inject(requestContext, addedHeaders);\n\n const headerEntries = Object.entries(addedHeaders);\n\n for (let i = 0; i < headerEntries.length; i++) {\n const pair = headerEntries[i];\n if (!pair) {\n continue;\n }\n const [k, v] = pair;\n\n if (typeof request.addHeader === 'function') {\n request.addHeader(k, v);\n } else if (typeof request.headers === 'string') {\n request.headers += `${k}: ${v}\\r\\n`;\n } else if (Array.isArray(request.headers)) {\n // undici@6.11.0 accidentally, briefly removed `request.addHeader()`.\n request.headers.push(k, v);\n }\n }\n this._recordFromReq.set(request, { span, attributes, startTime });\n }\n\n // This is the 2nd message we receive for each request. It is fired when connection with\n // the remote is established and about to send the first byte. Here we do have info about the\n // remote address and port so we can populate some `network.*` attributes into the span\n private onRequestHeaders({ request, socket }: RequestHeadersMessage): void {\n const record = this._recordFromReq.get(request);\n\n if (!record) {\n return;\n }\n\n const config = this.getConfig();\n const { span } = record;\n const { remoteAddress, remotePort } = socket;\n const spanAttributes: Attributes = {\n [ATTR_NETWORK_PEER_ADDRESS]: remoteAddress,\n [ATTR_NETWORK_PEER_PORT]: remotePort,\n };\n\n // After hooks have been processed (which may modify request headers)\n // we can collect the headers based on the configuration\n if (config.headersToSpanAttributes?.requestHeaders) {\n const headersToAttribs = new Set(config.headersToSpanAttributes.requestHeaders.map(n => n.toLowerCase()));\n const headersMap = this.parseRequestHeaders(request);\n\n for (const [name, value] of headersMap.entries()) {\n if (headersToAttribs.has(name)) {\n const attrValue = Array.isArray(value) ? value : [value];\n spanAttributes[`http.request.header.${name}`] = attrValue;\n }\n }\n }\n\n span.setAttributes(spanAttributes);\n }\n\n // This is the 3rd message we get for each request and it's fired when the server\n // headers are received, body may not be accessible yet.\n // From the response headers we can set the status and content length\n private onResponseHeaders({ request, response }: ResponseHeadersMessage): void {\n const record = this._recordFromReq.get(request);\n\n if (!record) {\n return;\n }\n\n const { span, attributes } = record;\n const spanAttributes: Attributes = {\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: response.statusCode,\n };\n\n const config = this.getConfig();\n\n // Execute the response hook if defined\n safeExecuteInTheMiddle(\n () => config.responseHook?.(span, { request, response }),\n e => e && this._diag.error('caught responseHook error: ', e),\n true,\n );\n\n if (config.headersToSpanAttributes?.responseHeaders) {\n const headersToAttribs = new Set();\n config.headersToSpanAttributes?.responseHeaders.forEach(name => headersToAttribs.add(name.toLowerCase()));\n\n for (let idx = 0; idx < response.headers.length; idx = idx + 2) {\n const nameBuf = response.headers[idx];\n const valueBuf = response.headers[idx + 1];\n if (nameBuf === undefined || valueBuf === undefined) {\n continue;\n }\n const name = nameBuf.toString().toLowerCase();\n const value = valueBuf;\n\n if (headersToAttribs.has(name)) {\n const attrName = `http.response.header.${name}`;\n if (!Object.prototype.hasOwnProperty.call(spanAttributes, attrName)) {\n spanAttributes[attrName] = [value.toString()];\n } else {\n (spanAttributes[attrName] as string[]).push(value.toString());\n }\n }\n }\n }\n\n span.setAttributes(spanAttributes);\n span.setStatus({\n code: response.statusCode >= 400 ? SpanStatusCode.ERROR : SpanStatusCode.UNSET,\n });\n record.attributes = Object.assign(attributes, spanAttributes);\n }\n\n // This is the last event we receive if the request went without any errors\n private onDone({ request }: RequestTrailersMessage): void {\n const record = this._recordFromReq.get(request);\n\n if (!record) {\n return;\n }\n\n const { span, attributes, startTime } = record;\n\n // End the span\n span.end();\n this._recordFromReq.delete(request);\n\n // Record metrics\n this.recordRequestDuration(attributes, startTime);\n }\n\n // This is the event we get when something is wrong in the request like\n // - invalid options when calling `fetch` global API or any undici method for request\n // - connectivity errors such as unreachable host\n // - requests aborted through an `AbortController.signal`\n // NOTE: server errors are considered valid responses and it's the lib consumer\n // who should deal with that.\n private onError({ request, error }: any): void {\n const record = this._recordFromReq.get(request);\n\n if (!record) {\n return;\n }\n\n const { span, attributes, startTime } = record;\n\n // NOTE: in `undici@6.3.0` when request aborted the error type changes from\n // a custom error (`RequestAbortedError`) to a built-in `DOMException` carrying\n // some differences:\n // - `code` is from DOMEXception (ABORT_ERR: 20)\n // - `message` changes\n // - stacktrace is smaller and contains node internal frames\n span.recordException(error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.end();\n this._recordFromReq.delete(request);\n\n // Record metrics (with the error)\n attributes[ATTR_ERROR_TYPE] = error.message;\n this.recordRequestDuration(attributes, startTime);\n }\n\n private recordRequestDuration(attributes: Attributes, startTime: number) {\n // Time to record metrics\n const metricsAttributes: Attributes = {};\n // Get the attribs already in span attributes\n const keysToCopy = [\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_URL_SCHEME,\n ATTR_ERROR_TYPE,\n ];\n keysToCopy.forEach(key => {\n if (key in attributes) {\n metricsAttributes[key] = attributes[key];\n }\n });\n\n // Take the duration and record it\n const durationSeconds = timestampInSeconds() - startTime;\n this._httpClientDurationHistogram.record(durationSeconds, metricsAttributes);\n }\n\n private getRequestMethod(original: string): string {\n const knownMethods = {\n CONNECT: true,\n OPTIONS: true,\n HEAD: true,\n GET: true,\n POST: true,\n PUT: true,\n PATCH: true,\n DELETE: true,\n TRACE: true,\n // QUERY from https://datatracker.ietf.org/doc/draft-ietf-httpbis-safe-method-w-body/\n QUERY: true,\n };\n\n if (original.toUpperCase() in knownMethods) {\n return original.toUpperCase();\n }\n\n return '_OTHER';\n }\n}\n"],"names":["InstrumentationBase","SDK_VERSION","METRIC_HTTP_CLIENT_REQUEST_DURATION","ValueType","safeExecuteInTheMiddle","timestampInSeconds","URL","ATTR_HTTP_REQUEST_METHOD","ATTR_HTTP_REQUEST_METHOD_ORIGINAL","ATTR_URL_FULL","ATTR_URL_PATH","ATTR_URL_QUERY","ATTR_URL_SCHEME","ATTR_SERVER_ADDRESS","ATTR_SERVER_PORT","ATTR_USER_AGENT_ORIGINAL","context","trace","INVALID_SPAN_CONTEXT","SpanKind","propagation","ATTR_NETWORK_PEER_ADDRESS","ATTR_NETWORK_PEER_PORT","ATTR_HTTP_RESPONSE_STATUS_CODE","SpanStatusCode","ATTR_ERROR_TYPE"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
const path = require('path');
|
|
4
|
+
|
|
5
|
+
class InstrumentationNodeModuleFile {
|
|
6
|
+
constructor(name, supportedVersions, patch, unpatch) {
|
|
7
|
+
this.name = path.normalize(name);
|
|
8
|
+
this.supportedVersions = supportedVersions;
|
|
9
|
+
this.patch = patch;
|
|
10
|
+
this.unpatch = unpatch;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
exports.InstrumentationNodeModuleFile = InstrumentationNodeModuleFile;
|
|
15
|
+
//# sourceMappingURL=InstrumentationNodeModuleFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InstrumentationNodeModuleFile.js","sources":["../../../../src/integrations/tracing/InstrumentationNodeModuleFile.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * NOTICE from the Sentry authors:\n * - Vendored locally from @opentelemetry/instrumentation to work around a Bun\n * --bytecode bug (https://github.com/getsentry/sentry-javascript/issues/21256).\n * - The upstream class imports `normalize` via an indirect platform/index\n * re-export chain, which Bun's bytecode bundler renames and loses scope for.\n * - This copy imports `normalize` directly from 'path' to break that chain.\n */\n/* oxlint-disable */\n\nimport { normalize } from 'path';\nimport type { InstrumentationModuleFile } from '@opentelemetry/instrumentation';\n\nexport class InstrumentationNodeModuleFile implements InstrumentationModuleFile {\n public name: string;\n public supportedVersions: string[];\n public patch: (moduleExports: any, moduleVersion?: string) => any;\n public unpatch: (moduleExports?: any, moduleVersion?: string) => void;\n\n constructor(\n name: string,\n supportedVersions: string[],\n patch: (moduleExports: any, moduleVersion?: string) => any,\n unpatch: (moduleExports?: any, moduleVersion?: string) => void,\n ) {\n this.name = normalize(name);\n this.supportedVersions = supportedVersions;\n this.patch = patch;\n this.unpatch = unpatch;\n }\n}\n"],"names":["normalize"],"mappings":";;;;AA2BO,MAAM,6BAAA,CAAmE;AAAA,EAM9E,WAAA,CACE,IAAA,EACA,iBAAA,EACA,KAAA,EACA,OAAA,EACA;AACA,IAAA,IAAA,CAAK,IAAA,GAAOA,eAAU,IAAI,CAAA;AAC1B,IAAA,IAAA,CAAK,iBAAA,GAAoB,iBAAA;AACzB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AACF;;;;"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
|
|
3
3
|
const api = require('@opentelemetry/api');
|
|
4
|
-
const core
|
|
4
|
+
const core = require('@sentry/core');
|
|
5
5
|
const instrumentation = require('@opentelemetry/instrumentation');
|
|
6
|
+
const InstrumentationNodeModuleFile = require('../../InstrumentationNodeModuleFile.js');
|
|
6
7
|
const semconv = require('./semconv.js');
|
|
7
8
|
const semconvObsolete = require('./semconv-obsolete.js');
|
|
8
9
|
const types = require('./types.js');
|
|
9
10
|
const utils = require('./utils.js');
|
|
10
|
-
const core = require('@sentry/core');
|
|
11
11
|
|
|
12
12
|
const PACKAGE_NAME = "@sentry/instrumentation-amqplib";
|
|
13
13
|
const supportedVersions = [">=0.5.5 <2"];
|
|
@@ -24,19 +24,19 @@ class AmqplibInstrumentation extends instrumentation.InstrumentationBase {
|
|
|
24
24
|
super.setConfig({ ...types.DEFAULT_CONFIG, ...config });
|
|
25
25
|
}
|
|
26
26
|
init() {
|
|
27
|
-
const channelModelModuleFile = new
|
|
27
|
+
const channelModelModuleFile = new InstrumentationNodeModuleFile.InstrumentationNodeModuleFile(
|
|
28
28
|
"amqplib/lib/channel_model.js",
|
|
29
29
|
supportedVersions,
|
|
30
30
|
this.patchChannelModel.bind(this),
|
|
31
31
|
this.unpatchChannelModel.bind(this)
|
|
32
32
|
);
|
|
33
|
-
const callbackModelModuleFile = new
|
|
33
|
+
const callbackModelModuleFile = new InstrumentationNodeModuleFile.InstrumentationNodeModuleFile(
|
|
34
34
|
"amqplib/lib/callback_model.js",
|
|
35
35
|
supportedVersions,
|
|
36
36
|
this.patchChannelModel.bind(this),
|
|
37
37
|
this.unpatchChannelModel.bind(this)
|
|
38
38
|
);
|
|
39
|
-
const connectModuleFile = new
|
|
39
|
+
const connectModuleFile = new InstrumentationNodeModuleFile.InstrumentationNodeModuleFile(
|
|
40
40
|
"amqplib/lib/connect.js",
|
|
41
41
|
supportedVersions,
|
|
42
42
|
this.patchConnect.bind(this),
|
|
@@ -261,7 +261,7 @@ class AmqplibInstrumentation extends instrumentation.InstrumentationBase {
|
|
|
261
261
|
if (!options?.noAck) {
|
|
262
262
|
channel[utils.CHANNEL_SPANS_NOT_ENDED].push({
|
|
263
263
|
msg,
|
|
264
|
-
timeOfConsume: core
|
|
264
|
+
timeOfConsume: core.timestampInSeconds()
|
|
265
265
|
});
|
|
266
266
|
msg[utils.MESSAGE_STORED_SPAN] = span;
|
|
267
267
|
}
|
|
@@ -432,14 +432,14 @@ class AmqplibInstrumentation extends instrumentation.InstrumentationBase {
|
|
|
432
432
|
);
|
|
433
433
|
}
|
|
434
434
|
checkConsumeTimeoutOnChannel(channel) {
|
|
435
|
-
const currentTime = core
|
|
435
|
+
const currentTime = core.timestampInSeconds();
|
|
436
436
|
const spansNotEnded = channel[utils.CHANNEL_SPANS_NOT_ENDED] ?? [];
|
|
437
437
|
let i;
|
|
438
438
|
const { consumeTimeoutMs } = this.getConfig();
|
|
439
439
|
for (i = 0; i < spansNotEnded.length; i++) {
|
|
440
440
|
const currMessage = spansNotEnded[i];
|
|
441
|
-
const
|
|
442
|
-
if (
|
|
441
|
+
const timeFromConsumeMs = (currentTime - currMessage.timeOfConsume) * 1e3;
|
|
442
|
+
if (timeFromConsumeMs < consumeTimeoutMs) {
|
|
443
443
|
break;
|
|
444
444
|
}
|
|
445
445
|
this.endConsumerSpan(currMessage.msg, null, types.EndOperation.InstrumentationTimeout, true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"amqplib.js","sources":["../../../../../../src/integrations/tracing/amqplib/vendored/amqplib.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/15ef7506553f631ea4181391e0c5725a56f0d082/packages/instrumentation-amqplib\n * - Upstream version: @opentelemetry/instrumentation-amqplib@0.65.0\n */\n/* eslint-disable */\n\nimport {\n context,\n diag,\n propagation,\n trace,\n Span,\n SpanKind,\n SpanStatusCode,\n ROOT_CONTEXT,\n Link,\n Context,\n} from '@opentelemetry/api';\nimport { hrTime, hrTimeDuration, hrTimeToMilliseconds } from '@opentelemetry/core';\nimport {\n InstrumentationBase,\n InstrumentationNodeModuleDefinition,\n InstrumentationNodeModuleFile,\n isWrapped,\n safeExecuteInTheMiddle,\n SemconvStability,\n semconvStabilityFromStr,\n} from '@opentelemetry/instrumentation';\nimport { ATTR_MESSAGING_OPERATION } from './semconv';\nimport {\n ATTR_MESSAGING_DESTINATION,\n ATTR_MESSAGING_DESTINATION_KIND,\n ATTR_MESSAGING_RABBITMQ_ROUTING_KEY,\n MESSAGING_DESTINATION_KIND_VALUE_TOPIC,\n MESSAGING_OPERATION_VALUE_PROCESS,\n OLD_ATTR_MESSAGING_MESSAGE_ID,\n ATTR_MESSAGING_CONVERSATION_ID,\n} from './semconv-obsolete';\nimport type { Connection, Options, Replies } from './amqplib-types';\nimport { AmqplibInstrumentationConfig, DEFAULT_CONFIG, EndOperation, type ConsumeMessage, type Message } from './types';\nimport {\n CHANNEL_CONSUME_TIMEOUT_TIMER,\n CHANNEL_SPANS_NOT_ENDED,\n CONNECTION_ATTRIBUTES,\n getConnectionAttributesFromServer,\n getConnectionAttributesFromUrl,\n InstrumentationConnection,\n InstrumentationConsumeChannel,\n InstrumentationConsumeMessage,\n InstrumentationMessage,\n InstrumentationPublishChannel,\n isConfirmChannelTracing,\n markConfirmChannelTracing,\n MESSAGE_STORED_SPAN,\n normalizeExchange,\n unmarkConfirmChannelTracing,\n} from './utils';\n\nimport { SDK_VERSION } from '@sentry/core';\n\nconst PACKAGE_NAME = '@sentry/instrumentation-amqplib';\nconst supportedVersions = ['>=0.5.5 <2'];\n\nexport class AmqplibInstrumentation extends InstrumentationBase<AmqplibInstrumentationConfig> {\n private _netSemconvStability!: SemconvStability;\n\n constructor(config: AmqplibInstrumentationConfig = {}) {\n super(PACKAGE_NAME, SDK_VERSION, { ...DEFAULT_CONFIG, ...config });\n this._setSemconvStabilityFromEnv();\n }\n\n // Used for testing.\n private _setSemconvStabilityFromEnv() {\n this._netSemconvStability = semconvStabilityFromStr('http', process.env.OTEL_SEMCONV_STABILITY_OPT_IN);\n }\n\n override setConfig(config: AmqplibInstrumentationConfig = {}) {\n super.setConfig({ ...DEFAULT_CONFIG, ...config });\n }\n\n protected init() {\n const channelModelModuleFile = new InstrumentationNodeModuleFile(\n 'amqplib/lib/channel_model.js',\n supportedVersions,\n this.patchChannelModel.bind(this),\n this.unpatchChannelModel.bind(this),\n );\n\n const callbackModelModuleFile = new InstrumentationNodeModuleFile(\n 'amqplib/lib/callback_model.js',\n supportedVersions,\n this.patchChannelModel.bind(this),\n this.unpatchChannelModel.bind(this),\n );\n\n const connectModuleFile = new InstrumentationNodeModuleFile(\n 'amqplib/lib/connect.js',\n supportedVersions,\n this.patchConnect.bind(this),\n this.unpatchConnect.bind(this),\n );\n\n const module = new InstrumentationNodeModuleDefinition('amqplib', supportedVersions, undefined, undefined, [\n channelModelModuleFile,\n connectModuleFile,\n callbackModelModuleFile,\n ]);\n return module;\n }\n\n private patchConnect(moduleExports: any) {\n moduleExports = this.unpatchConnect(moduleExports);\n if (!isWrapped(moduleExports.connect)) {\n this._wrap(moduleExports, 'connect', this.getConnectPatch.bind(this));\n }\n return moduleExports;\n }\n\n private unpatchConnect(moduleExports: any) {\n if (isWrapped(moduleExports.connect)) {\n this._unwrap(moduleExports, 'connect');\n }\n return moduleExports;\n }\n\n private patchChannelModel(moduleExports: any, moduleVersion: string | undefined) {\n if (!isWrapped(moduleExports.Channel.prototype.publish)) {\n this._wrap(moduleExports.Channel.prototype, 'publish', this.getPublishPatch.bind(this, moduleVersion));\n }\n if (!isWrapped(moduleExports.Channel.prototype.consume)) {\n this._wrap(moduleExports.Channel.prototype, 'consume', this.getConsumePatch.bind(this, moduleVersion));\n }\n if (!isWrapped(moduleExports.Channel.prototype.ack)) {\n this._wrap(moduleExports.Channel.prototype, 'ack', this.getAckPatch.bind(this, false, EndOperation.Ack));\n }\n if (!isWrapped(moduleExports.Channel.prototype.nack)) {\n this._wrap(moduleExports.Channel.prototype, 'nack', this.getAckPatch.bind(this, true, EndOperation.Nack));\n }\n if (!isWrapped(moduleExports.Channel.prototype.reject)) {\n this._wrap(moduleExports.Channel.prototype, 'reject', this.getAckPatch.bind(this, true, EndOperation.Reject));\n }\n if (!isWrapped(moduleExports.Channel.prototype.ackAll)) {\n this._wrap(moduleExports.Channel.prototype, 'ackAll', this.getAckAllPatch.bind(this, false, EndOperation.AckAll));\n }\n if (!isWrapped(moduleExports.Channel.prototype.nackAll)) {\n this._wrap(\n moduleExports.Channel.prototype,\n 'nackAll',\n this.getAckAllPatch.bind(this, true, EndOperation.NackAll),\n );\n }\n if (!isWrapped(moduleExports.Channel.prototype.emit)) {\n this._wrap(moduleExports.Channel.prototype, 'emit', this.getChannelEmitPatch.bind(this));\n }\n if (!isWrapped(moduleExports.ConfirmChannel.prototype.publish)) {\n this._wrap(\n moduleExports.ConfirmChannel.prototype,\n 'publish',\n this.getConfirmedPublishPatch.bind(this, moduleVersion),\n );\n }\n return moduleExports;\n }\n\n private unpatchChannelModel(moduleExports: any) {\n if (isWrapped(moduleExports.Channel.prototype.publish)) {\n this._unwrap(moduleExports.Channel.prototype, 'publish');\n }\n if (isWrapped(moduleExports.Channel.prototype.consume)) {\n this._unwrap(moduleExports.Channel.prototype, 'consume');\n }\n if (isWrapped(moduleExports.Channel.prototype.ack)) {\n this._unwrap(moduleExports.Channel.prototype, 'ack');\n }\n if (isWrapped(moduleExports.Channel.prototype.nack)) {\n this._unwrap(moduleExports.Channel.prototype, 'nack');\n }\n if (isWrapped(moduleExports.Channel.prototype.reject)) {\n this._unwrap(moduleExports.Channel.prototype, 'reject');\n }\n if (isWrapped(moduleExports.Channel.prototype.ackAll)) {\n this._unwrap(moduleExports.Channel.prototype, 'ackAll');\n }\n if (isWrapped(moduleExports.Channel.prototype.nackAll)) {\n this._unwrap(moduleExports.Channel.prototype, 'nackAll');\n }\n if (isWrapped(moduleExports.Channel.prototype.emit)) {\n this._unwrap(moduleExports.Channel.prototype, 'emit');\n }\n if (isWrapped(moduleExports.ConfirmChannel.prototype.publish)) {\n this._unwrap(moduleExports.ConfirmChannel.prototype, 'publish');\n }\n return moduleExports;\n }\n\n private getConnectPatch(\n original: (\n url: string | Options.Connect,\n socketOptions: any,\n openCallback: (err: any, connection: Connection) => void,\n ) => Connection,\n ) {\n const self = this;\n return function patchedConnect(\n this: unknown,\n url: string | Options.Connect,\n socketOptions: any,\n openCallback: Function,\n ) {\n return original.call(\n this,\n url,\n socketOptions,\n function (this: unknown, err: any, conn: InstrumentationConnection) {\n if (err == null) {\n const urlAttributes = getConnectionAttributesFromUrl(url, self._netSemconvStability);\n const serverAttributes = getConnectionAttributesFromServer(conn);\n conn[CONNECTION_ATTRIBUTES] = {\n ...urlAttributes,\n ...serverAttributes,\n };\n }\n openCallback.apply(this, arguments);\n },\n );\n };\n }\n\n private getChannelEmitPatch(original: Function) {\n const self = this;\n return function emit(this: InstrumentationConsumeChannel, eventName: string) {\n if (eventName === 'close') {\n self.endAllSpansOnChannel(this, true, EndOperation.ChannelClosed, undefined);\n const activeTimer = this[CHANNEL_CONSUME_TIMEOUT_TIMER];\n if (activeTimer) {\n clearInterval(activeTimer);\n }\n this[CHANNEL_CONSUME_TIMEOUT_TIMER] = undefined;\n } else if (eventName === 'error') {\n self.endAllSpansOnChannel(this, true, EndOperation.ChannelError, undefined);\n }\n return original.apply(this, arguments);\n };\n }\n\n private getAckAllPatch(isRejected: boolean, endOperation: EndOperation, original: Function) {\n const self = this;\n return function ackAll(this: InstrumentationConsumeChannel, requeueOrEmpty?: boolean): void {\n self.endAllSpansOnChannel(this, isRejected, endOperation, requeueOrEmpty);\n return original.apply(this, arguments);\n };\n }\n\n private getAckPatch(isRejected: boolean, endOperation: EndOperation, original: Function) {\n const self = this;\n return function ack(\n this: InstrumentationConsumeChannel,\n message: Message,\n allUpToOrRequeue?: boolean,\n requeue?: boolean,\n ): void {\n const channel = this;\n // we use this patch in reject function as well, but it has different signature\n const requeueResolved = endOperation === EndOperation.Reject ? allUpToOrRequeue : requeue;\n\n const spansNotEnded: { msg: Message }[] = channel[CHANNEL_SPANS_NOT_ENDED] ?? [];\n const msgIndex = spansNotEnded.findIndex(msgDetails => msgDetails.msg === message);\n if (msgIndex < 0) {\n // should not happen in happy flow\n // but possible if user is calling the api function ack twice with same message\n self.endConsumerSpan(message, isRejected, endOperation, requeueResolved);\n } else if (endOperation !== EndOperation.Reject && allUpToOrRequeue) {\n for (let i = 0; i <= msgIndex; i++) {\n self.endConsumerSpan(spansNotEnded[i]!.msg, isRejected, endOperation, requeueResolved);\n }\n spansNotEnded.splice(0, msgIndex + 1);\n } else {\n self.endConsumerSpan(message, isRejected, endOperation, requeueResolved);\n spansNotEnded.splice(msgIndex, 1);\n }\n return original.apply(this, arguments);\n };\n }\n\n private getConsumePatch(moduleVersion: string | undefined, original: Function) {\n const self = this;\n return function consume(\n this: InstrumentationConsumeChannel,\n queue: string,\n onMessage: (msg: ConsumeMessage | null) => void,\n options?: Options.Consume,\n ): Promise<Replies.Consume> {\n const channel = this;\n if (!Object.prototype.hasOwnProperty.call(channel, CHANNEL_SPANS_NOT_ENDED)) {\n const { consumeTimeoutMs } = self.getConfig();\n if (consumeTimeoutMs) {\n const timer = setInterval(() => {\n self.checkConsumeTimeoutOnChannel(channel);\n }, consumeTimeoutMs);\n timer.unref();\n channel[CHANNEL_CONSUME_TIMEOUT_TIMER] = timer;\n }\n channel[CHANNEL_SPANS_NOT_ENDED] = [];\n }\n\n const patchedOnMessage = function (this: unknown, msg: InstrumentationConsumeMessage | null) {\n // msg is expected to be null for signaling consumer cancel notification\n // https://www.rabbitmq.com/consumer-cancel.html\n // in this case, we do not start a span, as this is not a real message.\n if (!msg) {\n return onMessage.call(this, msg);\n }\n\n const headers = msg.properties.headers ?? {};\n let parentContext: Context | undefined = propagation.extract(ROOT_CONTEXT, headers);\n const exchange = msg.fields?.exchange;\n let links: Link[] | undefined;\n if (self._config.useLinksForConsume) {\n const parentSpanContext = parentContext ? trace.getSpan(parentContext)?.spanContext() : undefined;\n parentContext = undefined;\n if (parentSpanContext) {\n links = [\n {\n context: parentSpanContext,\n },\n ];\n }\n }\n const span = self.tracer.startSpan(\n `${queue} process`,\n {\n kind: SpanKind.CONSUMER,\n attributes: {\n ...channel?.connection?.[CONNECTION_ATTRIBUTES],\n [ATTR_MESSAGING_DESTINATION]: exchange,\n [ATTR_MESSAGING_DESTINATION_KIND]: MESSAGING_DESTINATION_KIND_VALUE_TOPIC,\n [ATTR_MESSAGING_RABBITMQ_ROUTING_KEY]: msg.fields?.routingKey,\n [ATTR_MESSAGING_OPERATION]: MESSAGING_OPERATION_VALUE_PROCESS,\n [OLD_ATTR_MESSAGING_MESSAGE_ID]: msg?.properties.messageId,\n [ATTR_MESSAGING_CONVERSATION_ID]: msg?.properties.correlationId,\n },\n links,\n },\n parentContext,\n );\n\n const { consumeHook } = self.getConfig();\n if (consumeHook) {\n safeExecuteInTheMiddle(\n () => consumeHook(span, { moduleVersion, msg }),\n e => {\n if (e) {\n diag.error('amqplib instrumentation: consumerHook error', e);\n }\n },\n true,\n );\n }\n\n if (!options?.noAck) {\n // store the message on the channel so we can close the span on ackAll etc\n channel[CHANNEL_SPANS_NOT_ENDED]!.push({\n msg,\n timeOfConsume: hrTime(),\n });\n\n // store the span on the message, so we can end it when user call 'ack' on it\n msg[MESSAGE_STORED_SPAN] = span;\n }\n const setContext: Context = parentContext ? parentContext : ROOT_CONTEXT;\n context.with(trace.setSpan(setContext, span), () => {\n onMessage.call(this, msg);\n });\n\n if (options?.noAck) {\n self.callConsumeEndHook(span, msg, false, EndOperation.AutoAck);\n span.end();\n }\n };\n arguments[1] = patchedOnMessage;\n return original.apply(this, arguments);\n };\n }\n\n private getConfirmedPublishPatch(moduleVersion: string | undefined, original: Function) {\n const self = this;\n return function confirmedPublish(\n this: InstrumentationConsumeChannel,\n exchange: string,\n routingKey: string,\n content: Buffer,\n options?: Options.Publish,\n callback?: (err: any, ok: Replies.Empty) => void,\n ): boolean {\n const channel = this;\n const { span, modifiedOptions } = self.createPublishSpan(self, exchange, routingKey, channel, options);\n\n const { publishHook } = self.getConfig();\n if (publishHook) {\n safeExecuteInTheMiddle(\n () =>\n publishHook(span, {\n moduleVersion,\n exchange,\n routingKey,\n content,\n options: modifiedOptions,\n isConfirmChannel: true,\n }),\n e => {\n if (e) {\n diag.error('amqplib instrumentation: publishHook error', e);\n }\n },\n true,\n );\n }\n\n const patchedOnConfirm = function (this: unknown, err: any, ok: Replies.Empty) {\n try {\n callback?.call(this, err, ok);\n } finally {\n const { publishConfirmHook } = self.getConfig();\n if (publishConfirmHook) {\n safeExecuteInTheMiddle(\n () =>\n publishConfirmHook(span, {\n moduleVersion,\n exchange,\n routingKey,\n content,\n options,\n isConfirmChannel: true,\n confirmError: err,\n }),\n e => {\n if (e) {\n diag.error('amqplib instrumentation: publishConfirmHook error', e);\n }\n },\n true,\n );\n }\n\n if (err) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: \"message confirmation has been nack'ed\",\n });\n }\n span.end();\n }\n };\n\n // calling confirm channel publish function is storing the message in queue and registering the callback for broker confirm.\n // span ends in the patched callback.\n const markedContext = markConfirmChannelTracing(context.active());\n const argumentsCopy = [...arguments];\n argumentsCopy[3] = modifiedOptions;\n argumentsCopy[4] = context.bind(\n unmarkConfirmChannelTracing(trace.setSpan(markedContext, span)),\n patchedOnConfirm,\n );\n return context.with(markedContext, original.bind(this, ...argumentsCopy));\n };\n }\n\n private getPublishPatch(moduleVersion: string | undefined, original: Function) {\n const self = this;\n return function publish(\n this: InstrumentationPublishChannel,\n exchange: string,\n routingKey: string,\n content: Buffer,\n options?: Options.Publish,\n ): boolean {\n if (isConfirmChannelTracing(context.active())) {\n // work already done\n return original.apply(this, arguments);\n } else {\n const channel = this;\n const { span, modifiedOptions } = self.createPublishSpan(self, exchange, routingKey, channel, options);\n\n const { publishHook } = self.getConfig();\n if (publishHook) {\n safeExecuteInTheMiddle(\n () =>\n publishHook(span, {\n moduleVersion,\n exchange,\n routingKey,\n content,\n options: modifiedOptions,\n isConfirmChannel: false,\n }),\n e => {\n if (e) {\n diag.error('amqplib instrumentation: publishHook error', e);\n }\n },\n true,\n );\n }\n\n // calling normal channel publish function is only storing the message in queue.\n // it does not send it and waits for an ack, so the span duration is expected to be very short.\n const argumentsCopy = [...arguments];\n argumentsCopy[3] = modifiedOptions;\n const originalRes = original.apply(this, argumentsCopy as any);\n span.end();\n return originalRes;\n }\n };\n }\n\n private createPublishSpan(\n self: this,\n exchange: string,\n routingKey: string,\n channel: InstrumentationPublishChannel,\n options?: Options.Publish,\n ) {\n const normalizedExchange = normalizeExchange(exchange);\n\n const span = self.tracer.startSpan(`publish ${normalizedExchange}`, {\n kind: SpanKind.PRODUCER,\n attributes: {\n ...channel.connection[CONNECTION_ATTRIBUTES],\n [ATTR_MESSAGING_DESTINATION]: exchange,\n [ATTR_MESSAGING_DESTINATION_KIND]: MESSAGING_DESTINATION_KIND_VALUE_TOPIC,\n\n [ATTR_MESSAGING_RABBITMQ_ROUTING_KEY]: routingKey,\n [OLD_ATTR_MESSAGING_MESSAGE_ID]: options?.messageId,\n [ATTR_MESSAGING_CONVERSATION_ID]: options?.correlationId,\n },\n });\n const modifiedOptions = options ?? {};\n modifiedOptions.headers = modifiedOptions.headers ?? {};\n\n propagation.inject(trace.setSpan(context.active(), span), modifiedOptions.headers);\n\n return { span, modifiedOptions };\n }\n\n private endConsumerSpan(\n message: InstrumentationMessage,\n isRejected: boolean | null,\n operation: EndOperation,\n requeue: boolean | undefined,\n ) {\n const storedSpan: Span | undefined = message[MESSAGE_STORED_SPAN];\n if (!storedSpan) return;\n if (isRejected !== false) {\n storedSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message:\n operation !== EndOperation.ChannelClosed && operation !== EndOperation.ChannelError\n ? `${operation} called on message${\n requeue === true ? ' with requeue' : requeue === false ? ' without requeue' : ''\n }`\n : operation,\n });\n }\n this.callConsumeEndHook(storedSpan, message, isRejected, operation);\n storedSpan.end();\n message[MESSAGE_STORED_SPAN] = undefined;\n }\n\n private endAllSpansOnChannel(\n channel: InstrumentationConsumeChannel,\n isRejected: boolean,\n operation: EndOperation,\n requeue: boolean | undefined,\n ) {\n const spansNotEnded: { msg: Message }[] = channel[CHANNEL_SPANS_NOT_ENDED] ?? [];\n spansNotEnded.forEach(msgDetails => {\n this.endConsumerSpan(msgDetails.msg, isRejected, operation, requeue);\n });\n channel[CHANNEL_SPANS_NOT_ENDED] = [];\n }\n\n private callConsumeEndHook(\n span: Span,\n msg: InstrumentationMessage,\n rejected: boolean | null,\n endOperation: EndOperation,\n ) {\n const { consumeEndHook } = this.getConfig();\n if (!consumeEndHook) return;\n\n safeExecuteInTheMiddle(\n () => consumeEndHook(span, { msg, rejected, endOperation }),\n e => {\n if (e) {\n diag.error('amqplib instrumentation: consumerEndHook error', e);\n }\n },\n true,\n );\n }\n\n private checkConsumeTimeoutOnChannel(channel: InstrumentationConsumeChannel) {\n const currentTime = hrTime();\n const spansNotEnded = channel[CHANNEL_SPANS_NOT_ENDED] ?? [];\n let i: number;\n const { consumeTimeoutMs } = this.getConfig();\n for (i = 0; i < spansNotEnded.length; i++) {\n const currMessage = spansNotEnded[i]!;\n const timeFromConsume = hrTimeDuration(currMessage.timeOfConsume, currentTime);\n if (hrTimeToMilliseconds(timeFromConsume) < consumeTimeoutMs!) {\n break;\n }\n this.endConsumerSpan(currMessage.msg, null, EndOperation.InstrumentationTimeout, true);\n }\n spansNotEnded.splice(0, i);\n }\n}\n"],"names":["InstrumentationBase","SDK_VERSION","DEFAULT_CONFIG","semconvStabilityFromStr","InstrumentationNodeModuleFile","InstrumentationNodeModuleDefinition","isWrapped","EndOperation","getConnectionAttributesFromUrl","getConnectionAttributesFromServer","CONNECTION_ATTRIBUTES","CHANNEL_CONSUME_TIMEOUT_TIMER","CHANNEL_SPANS_NOT_ENDED","propagation","ROOT_CONTEXT","trace","SpanKind","ATTR_MESSAGING_DESTINATION","ATTR_MESSAGING_DESTINATION_KIND","MESSAGING_DESTINATION_KIND_VALUE_TOPIC","ATTR_MESSAGING_RABBITMQ_ROUTING_KEY","ATTR_MESSAGING_OPERATION","MESSAGING_OPERATION_VALUE_PROCESS","OLD_ATTR_MESSAGING_MESSAGE_ID","ATTR_MESSAGING_CONVERSATION_ID","safeExecuteInTheMiddle","diag","hrTime","MESSAGE_STORED_SPAN","context","SpanStatusCode","markConfirmChannelTracing","unmarkConfirmChannelTracing","isConfirmChannelTracing","normalizeExchange","hrTimeDuration","hrTimeToMilliseconds"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"amqplib.js","sources":["../../../../../../src/integrations/tracing/amqplib/vendored/amqplib.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/15ef7506553f631ea4181391e0c5725a56f0d082/packages/instrumentation-amqplib\n * - Upstream version: @opentelemetry/instrumentation-amqplib@0.65.0\n */\n/* eslint-disable */\n\nimport {\n context,\n diag,\n propagation,\n trace,\n Span,\n SpanKind,\n SpanStatusCode,\n ROOT_CONTEXT,\n Link,\n Context,\n} from '@opentelemetry/api';\nimport { timestampInSeconds } from '@sentry/core';\nimport {\n InstrumentationBase,\n InstrumentationNodeModuleDefinition,\n isWrapped,\n safeExecuteInTheMiddle,\n SemconvStability,\n semconvStabilityFromStr,\n} from '@opentelemetry/instrumentation';\nimport { InstrumentationNodeModuleFile } from '../../InstrumentationNodeModuleFile';\nimport { ATTR_MESSAGING_OPERATION } from './semconv';\nimport {\n ATTR_MESSAGING_DESTINATION,\n ATTR_MESSAGING_DESTINATION_KIND,\n ATTR_MESSAGING_RABBITMQ_ROUTING_KEY,\n MESSAGING_DESTINATION_KIND_VALUE_TOPIC,\n MESSAGING_OPERATION_VALUE_PROCESS,\n OLD_ATTR_MESSAGING_MESSAGE_ID,\n ATTR_MESSAGING_CONVERSATION_ID,\n} from './semconv-obsolete';\nimport type { Connection, Options, Replies } from './amqplib-types';\nimport { AmqplibInstrumentationConfig, DEFAULT_CONFIG, EndOperation, type ConsumeMessage, type Message } from './types';\nimport {\n CHANNEL_CONSUME_TIMEOUT_TIMER,\n CHANNEL_SPANS_NOT_ENDED,\n CONNECTION_ATTRIBUTES,\n getConnectionAttributesFromServer,\n getConnectionAttributesFromUrl,\n InstrumentationConnection,\n InstrumentationConsumeChannel,\n InstrumentationConsumeMessage,\n InstrumentationMessage,\n InstrumentationPublishChannel,\n isConfirmChannelTracing,\n markConfirmChannelTracing,\n MESSAGE_STORED_SPAN,\n normalizeExchange,\n unmarkConfirmChannelTracing,\n} from './utils';\n\nimport { SDK_VERSION } from '@sentry/core';\n\nconst PACKAGE_NAME = '@sentry/instrumentation-amqplib';\nconst supportedVersions = ['>=0.5.5 <2'];\n\nexport class AmqplibInstrumentation extends InstrumentationBase<AmqplibInstrumentationConfig> {\n private _netSemconvStability!: SemconvStability;\n\n constructor(config: AmqplibInstrumentationConfig = {}) {\n super(PACKAGE_NAME, SDK_VERSION, { ...DEFAULT_CONFIG, ...config });\n this._setSemconvStabilityFromEnv();\n }\n\n // Used for testing.\n private _setSemconvStabilityFromEnv() {\n this._netSemconvStability = semconvStabilityFromStr('http', process.env.OTEL_SEMCONV_STABILITY_OPT_IN);\n }\n\n override setConfig(config: AmqplibInstrumentationConfig = {}) {\n super.setConfig({ ...DEFAULT_CONFIG, ...config });\n }\n\n protected init() {\n const channelModelModuleFile = new InstrumentationNodeModuleFile(\n 'amqplib/lib/channel_model.js',\n supportedVersions,\n this.patchChannelModel.bind(this),\n this.unpatchChannelModel.bind(this),\n );\n\n const callbackModelModuleFile = new InstrumentationNodeModuleFile(\n 'amqplib/lib/callback_model.js',\n supportedVersions,\n this.patchChannelModel.bind(this),\n this.unpatchChannelModel.bind(this),\n );\n\n const connectModuleFile = new InstrumentationNodeModuleFile(\n 'amqplib/lib/connect.js',\n supportedVersions,\n this.patchConnect.bind(this),\n this.unpatchConnect.bind(this),\n );\n\n const module = new InstrumentationNodeModuleDefinition('amqplib', supportedVersions, undefined, undefined, [\n channelModelModuleFile,\n connectModuleFile,\n callbackModelModuleFile,\n ]);\n return module;\n }\n\n private patchConnect(moduleExports: any) {\n moduleExports = this.unpatchConnect(moduleExports);\n if (!isWrapped(moduleExports.connect)) {\n this._wrap(moduleExports, 'connect', this.getConnectPatch.bind(this));\n }\n return moduleExports;\n }\n\n private unpatchConnect(moduleExports: any) {\n if (isWrapped(moduleExports.connect)) {\n this._unwrap(moduleExports, 'connect');\n }\n return moduleExports;\n }\n\n private patchChannelModel(moduleExports: any, moduleVersion: string | undefined) {\n if (!isWrapped(moduleExports.Channel.prototype.publish)) {\n this._wrap(moduleExports.Channel.prototype, 'publish', this.getPublishPatch.bind(this, moduleVersion));\n }\n if (!isWrapped(moduleExports.Channel.prototype.consume)) {\n this._wrap(moduleExports.Channel.prototype, 'consume', this.getConsumePatch.bind(this, moduleVersion));\n }\n if (!isWrapped(moduleExports.Channel.prototype.ack)) {\n this._wrap(moduleExports.Channel.prototype, 'ack', this.getAckPatch.bind(this, false, EndOperation.Ack));\n }\n if (!isWrapped(moduleExports.Channel.prototype.nack)) {\n this._wrap(moduleExports.Channel.prototype, 'nack', this.getAckPatch.bind(this, true, EndOperation.Nack));\n }\n if (!isWrapped(moduleExports.Channel.prototype.reject)) {\n this._wrap(moduleExports.Channel.prototype, 'reject', this.getAckPatch.bind(this, true, EndOperation.Reject));\n }\n if (!isWrapped(moduleExports.Channel.prototype.ackAll)) {\n this._wrap(moduleExports.Channel.prototype, 'ackAll', this.getAckAllPatch.bind(this, false, EndOperation.AckAll));\n }\n if (!isWrapped(moduleExports.Channel.prototype.nackAll)) {\n this._wrap(\n moduleExports.Channel.prototype,\n 'nackAll',\n this.getAckAllPatch.bind(this, true, EndOperation.NackAll),\n );\n }\n if (!isWrapped(moduleExports.Channel.prototype.emit)) {\n this._wrap(moduleExports.Channel.prototype, 'emit', this.getChannelEmitPatch.bind(this));\n }\n if (!isWrapped(moduleExports.ConfirmChannel.prototype.publish)) {\n this._wrap(\n moduleExports.ConfirmChannel.prototype,\n 'publish',\n this.getConfirmedPublishPatch.bind(this, moduleVersion),\n );\n }\n return moduleExports;\n }\n\n private unpatchChannelModel(moduleExports: any) {\n if (isWrapped(moduleExports.Channel.prototype.publish)) {\n this._unwrap(moduleExports.Channel.prototype, 'publish');\n }\n if (isWrapped(moduleExports.Channel.prototype.consume)) {\n this._unwrap(moduleExports.Channel.prototype, 'consume');\n }\n if (isWrapped(moduleExports.Channel.prototype.ack)) {\n this._unwrap(moduleExports.Channel.prototype, 'ack');\n }\n if (isWrapped(moduleExports.Channel.prototype.nack)) {\n this._unwrap(moduleExports.Channel.prototype, 'nack');\n }\n if (isWrapped(moduleExports.Channel.prototype.reject)) {\n this._unwrap(moduleExports.Channel.prototype, 'reject');\n }\n if (isWrapped(moduleExports.Channel.prototype.ackAll)) {\n this._unwrap(moduleExports.Channel.prototype, 'ackAll');\n }\n if (isWrapped(moduleExports.Channel.prototype.nackAll)) {\n this._unwrap(moduleExports.Channel.prototype, 'nackAll');\n }\n if (isWrapped(moduleExports.Channel.prototype.emit)) {\n this._unwrap(moduleExports.Channel.prototype, 'emit');\n }\n if (isWrapped(moduleExports.ConfirmChannel.prototype.publish)) {\n this._unwrap(moduleExports.ConfirmChannel.prototype, 'publish');\n }\n return moduleExports;\n }\n\n private getConnectPatch(\n original: (\n url: string | Options.Connect,\n socketOptions: any,\n openCallback: (err: any, connection: Connection) => void,\n ) => Connection,\n ) {\n const self = this;\n return function patchedConnect(\n this: unknown,\n url: string | Options.Connect,\n socketOptions: any,\n openCallback: Function,\n ) {\n return original.call(\n this,\n url,\n socketOptions,\n function (this: unknown, err: any, conn: InstrumentationConnection) {\n if (err == null) {\n const urlAttributes = getConnectionAttributesFromUrl(url, self._netSemconvStability);\n const serverAttributes = getConnectionAttributesFromServer(conn);\n conn[CONNECTION_ATTRIBUTES] = {\n ...urlAttributes,\n ...serverAttributes,\n };\n }\n openCallback.apply(this, arguments);\n },\n );\n };\n }\n\n private getChannelEmitPatch(original: Function) {\n const self = this;\n return function emit(this: InstrumentationConsumeChannel, eventName: string) {\n if (eventName === 'close') {\n self.endAllSpansOnChannel(this, true, EndOperation.ChannelClosed, undefined);\n const activeTimer = this[CHANNEL_CONSUME_TIMEOUT_TIMER];\n if (activeTimer) {\n clearInterval(activeTimer);\n }\n this[CHANNEL_CONSUME_TIMEOUT_TIMER] = undefined;\n } else if (eventName === 'error') {\n self.endAllSpansOnChannel(this, true, EndOperation.ChannelError, undefined);\n }\n return original.apply(this, arguments);\n };\n }\n\n private getAckAllPatch(isRejected: boolean, endOperation: EndOperation, original: Function) {\n const self = this;\n return function ackAll(this: InstrumentationConsumeChannel, requeueOrEmpty?: boolean): void {\n self.endAllSpansOnChannel(this, isRejected, endOperation, requeueOrEmpty);\n return original.apply(this, arguments);\n };\n }\n\n private getAckPatch(isRejected: boolean, endOperation: EndOperation, original: Function) {\n const self = this;\n return function ack(\n this: InstrumentationConsumeChannel,\n message: Message,\n allUpToOrRequeue?: boolean,\n requeue?: boolean,\n ): void {\n const channel = this;\n // we use this patch in reject function as well, but it has different signature\n const requeueResolved = endOperation === EndOperation.Reject ? allUpToOrRequeue : requeue;\n\n const spansNotEnded: { msg: Message }[] = channel[CHANNEL_SPANS_NOT_ENDED] ?? [];\n const msgIndex = spansNotEnded.findIndex(msgDetails => msgDetails.msg === message);\n if (msgIndex < 0) {\n // should not happen in happy flow\n // but possible if user is calling the api function ack twice with same message\n self.endConsumerSpan(message, isRejected, endOperation, requeueResolved);\n } else if (endOperation !== EndOperation.Reject && allUpToOrRequeue) {\n for (let i = 0; i <= msgIndex; i++) {\n self.endConsumerSpan(spansNotEnded[i]!.msg, isRejected, endOperation, requeueResolved);\n }\n spansNotEnded.splice(0, msgIndex + 1);\n } else {\n self.endConsumerSpan(message, isRejected, endOperation, requeueResolved);\n spansNotEnded.splice(msgIndex, 1);\n }\n return original.apply(this, arguments);\n };\n }\n\n private getConsumePatch(moduleVersion: string | undefined, original: Function) {\n const self = this;\n return function consume(\n this: InstrumentationConsumeChannel,\n queue: string,\n onMessage: (msg: ConsumeMessage | null) => void,\n options?: Options.Consume,\n ): Promise<Replies.Consume> {\n const channel = this;\n if (!Object.prototype.hasOwnProperty.call(channel, CHANNEL_SPANS_NOT_ENDED)) {\n const { consumeTimeoutMs } = self.getConfig();\n if (consumeTimeoutMs) {\n const timer = setInterval(() => {\n self.checkConsumeTimeoutOnChannel(channel);\n }, consumeTimeoutMs);\n timer.unref();\n channel[CHANNEL_CONSUME_TIMEOUT_TIMER] = timer;\n }\n channel[CHANNEL_SPANS_NOT_ENDED] = [];\n }\n\n const patchedOnMessage = function (this: unknown, msg: InstrumentationConsumeMessage | null) {\n // msg is expected to be null for signaling consumer cancel notification\n // https://www.rabbitmq.com/consumer-cancel.html\n // in this case, we do not start a span, as this is not a real message.\n if (!msg) {\n return onMessage.call(this, msg);\n }\n\n const headers = msg.properties.headers ?? {};\n let parentContext: Context | undefined = propagation.extract(ROOT_CONTEXT, headers);\n const exchange = msg.fields?.exchange;\n let links: Link[] | undefined;\n if (self._config.useLinksForConsume) {\n const parentSpanContext = parentContext ? trace.getSpan(parentContext)?.spanContext() : undefined;\n parentContext = undefined;\n if (parentSpanContext) {\n links = [\n {\n context: parentSpanContext,\n },\n ];\n }\n }\n const span = self.tracer.startSpan(\n `${queue} process`,\n {\n kind: SpanKind.CONSUMER,\n attributes: {\n ...channel?.connection?.[CONNECTION_ATTRIBUTES],\n [ATTR_MESSAGING_DESTINATION]: exchange,\n [ATTR_MESSAGING_DESTINATION_KIND]: MESSAGING_DESTINATION_KIND_VALUE_TOPIC,\n [ATTR_MESSAGING_RABBITMQ_ROUTING_KEY]: msg.fields?.routingKey,\n [ATTR_MESSAGING_OPERATION]: MESSAGING_OPERATION_VALUE_PROCESS,\n [OLD_ATTR_MESSAGING_MESSAGE_ID]: msg?.properties.messageId,\n [ATTR_MESSAGING_CONVERSATION_ID]: msg?.properties.correlationId,\n },\n links,\n },\n parentContext,\n );\n\n const { consumeHook } = self.getConfig();\n if (consumeHook) {\n safeExecuteInTheMiddle(\n () => consumeHook(span, { moduleVersion, msg }),\n e => {\n if (e) {\n diag.error('amqplib instrumentation: consumerHook error', e);\n }\n },\n true,\n );\n }\n\n if (!options?.noAck) {\n // store the message on the channel so we can close the span on ackAll etc\n channel[CHANNEL_SPANS_NOT_ENDED]!.push({\n msg,\n timeOfConsume: timestampInSeconds(),\n });\n\n // store the span on the message, so we can end it when user call 'ack' on it\n msg[MESSAGE_STORED_SPAN] = span;\n }\n const setContext: Context = parentContext ? parentContext : ROOT_CONTEXT;\n context.with(trace.setSpan(setContext, span), () => {\n onMessage.call(this, msg);\n });\n\n if (options?.noAck) {\n self.callConsumeEndHook(span, msg, false, EndOperation.AutoAck);\n span.end();\n }\n };\n arguments[1] = patchedOnMessage;\n return original.apply(this, arguments);\n };\n }\n\n private getConfirmedPublishPatch(moduleVersion: string | undefined, original: Function) {\n const self = this;\n return function confirmedPublish(\n this: InstrumentationConsumeChannel,\n exchange: string,\n routingKey: string,\n content: Buffer,\n options?: Options.Publish,\n callback?: (err: any, ok: Replies.Empty) => void,\n ): boolean {\n const channel = this;\n const { span, modifiedOptions } = self.createPublishSpan(self, exchange, routingKey, channel, options);\n\n const { publishHook } = self.getConfig();\n if (publishHook) {\n safeExecuteInTheMiddle(\n () =>\n publishHook(span, {\n moduleVersion,\n exchange,\n routingKey,\n content,\n options: modifiedOptions,\n isConfirmChannel: true,\n }),\n e => {\n if (e) {\n diag.error('amqplib instrumentation: publishHook error', e);\n }\n },\n true,\n );\n }\n\n const patchedOnConfirm = function (this: unknown, err: any, ok: Replies.Empty) {\n try {\n callback?.call(this, err, ok);\n } finally {\n const { publishConfirmHook } = self.getConfig();\n if (publishConfirmHook) {\n safeExecuteInTheMiddle(\n () =>\n publishConfirmHook(span, {\n moduleVersion,\n exchange,\n routingKey,\n content,\n options,\n isConfirmChannel: true,\n confirmError: err,\n }),\n e => {\n if (e) {\n diag.error('amqplib instrumentation: publishConfirmHook error', e);\n }\n },\n true,\n );\n }\n\n if (err) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: \"message confirmation has been nack'ed\",\n });\n }\n span.end();\n }\n };\n\n // calling confirm channel publish function is storing the message in queue and registering the callback for broker confirm.\n // span ends in the patched callback.\n const markedContext = markConfirmChannelTracing(context.active());\n const argumentsCopy = [...arguments];\n argumentsCopy[3] = modifiedOptions;\n argumentsCopy[4] = context.bind(\n unmarkConfirmChannelTracing(trace.setSpan(markedContext, span)),\n patchedOnConfirm,\n );\n return context.with(markedContext, original.bind(this, ...argumentsCopy));\n };\n }\n\n private getPublishPatch(moduleVersion: string | undefined, original: Function) {\n const self = this;\n return function publish(\n this: InstrumentationPublishChannel,\n exchange: string,\n routingKey: string,\n content: Buffer,\n options?: Options.Publish,\n ): boolean {\n if (isConfirmChannelTracing(context.active())) {\n // work already done\n return original.apply(this, arguments);\n } else {\n const channel = this;\n const { span, modifiedOptions } = self.createPublishSpan(self, exchange, routingKey, channel, options);\n\n const { publishHook } = self.getConfig();\n if (publishHook) {\n safeExecuteInTheMiddle(\n () =>\n publishHook(span, {\n moduleVersion,\n exchange,\n routingKey,\n content,\n options: modifiedOptions,\n isConfirmChannel: false,\n }),\n e => {\n if (e) {\n diag.error('amqplib instrumentation: publishHook error', e);\n }\n },\n true,\n );\n }\n\n // calling normal channel publish function is only storing the message in queue.\n // it does not send it and waits for an ack, so the span duration is expected to be very short.\n const argumentsCopy = [...arguments];\n argumentsCopy[3] = modifiedOptions;\n const originalRes = original.apply(this, argumentsCopy as any);\n span.end();\n return originalRes;\n }\n };\n }\n\n private createPublishSpan(\n self: this,\n exchange: string,\n routingKey: string,\n channel: InstrumentationPublishChannel,\n options?: Options.Publish,\n ) {\n const normalizedExchange = normalizeExchange(exchange);\n\n const span = self.tracer.startSpan(`publish ${normalizedExchange}`, {\n kind: SpanKind.PRODUCER,\n attributes: {\n ...channel.connection[CONNECTION_ATTRIBUTES],\n [ATTR_MESSAGING_DESTINATION]: exchange,\n [ATTR_MESSAGING_DESTINATION_KIND]: MESSAGING_DESTINATION_KIND_VALUE_TOPIC,\n\n [ATTR_MESSAGING_RABBITMQ_ROUTING_KEY]: routingKey,\n [OLD_ATTR_MESSAGING_MESSAGE_ID]: options?.messageId,\n [ATTR_MESSAGING_CONVERSATION_ID]: options?.correlationId,\n },\n });\n const modifiedOptions = options ?? {};\n modifiedOptions.headers = modifiedOptions.headers ?? {};\n\n propagation.inject(trace.setSpan(context.active(), span), modifiedOptions.headers);\n\n return { span, modifiedOptions };\n }\n\n private endConsumerSpan(\n message: InstrumentationMessage,\n isRejected: boolean | null,\n operation: EndOperation,\n requeue: boolean | undefined,\n ) {\n const storedSpan: Span | undefined = message[MESSAGE_STORED_SPAN];\n if (!storedSpan) return;\n if (isRejected !== false) {\n storedSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message:\n operation !== EndOperation.ChannelClosed && operation !== EndOperation.ChannelError\n ? `${operation} called on message${\n requeue === true ? ' with requeue' : requeue === false ? ' without requeue' : ''\n }`\n : operation,\n });\n }\n this.callConsumeEndHook(storedSpan, message, isRejected, operation);\n storedSpan.end();\n message[MESSAGE_STORED_SPAN] = undefined;\n }\n\n private endAllSpansOnChannel(\n channel: InstrumentationConsumeChannel,\n isRejected: boolean,\n operation: EndOperation,\n requeue: boolean | undefined,\n ) {\n const spansNotEnded: { msg: Message }[] = channel[CHANNEL_SPANS_NOT_ENDED] ?? [];\n spansNotEnded.forEach(msgDetails => {\n this.endConsumerSpan(msgDetails.msg, isRejected, operation, requeue);\n });\n channel[CHANNEL_SPANS_NOT_ENDED] = [];\n }\n\n private callConsumeEndHook(\n span: Span,\n msg: InstrumentationMessage,\n rejected: boolean | null,\n endOperation: EndOperation,\n ) {\n const { consumeEndHook } = this.getConfig();\n if (!consumeEndHook) return;\n\n safeExecuteInTheMiddle(\n () => consumeEndHook(span, { msg, rejected, endOperation }),\n e => {\n if (e) {\n diag.error('amqplib instrumentation: consumerEndHook error', e);\n }\n },\n true,\n );\n }\n\n private checkConsumeTimeoutOnChannel(channel: InstrumentationConsumeChannel) {\n const currentTime = timestampInSeconds();\n const spansNotEnded = channel[CHANNEL_SPANS_NOT_ENDED] ?? [];\n let i: number;\n const { consumeTimeoutMs } = this.getConfig();\n for (i = 0; i < spansNotEnded.length; i++) {\n const currMessage = spansNotEnded[i]!;\n const timeFromConsumeMs = (currentTime - currMessage.timeOfConsume) * 1000;\n if (timeFromConsumeMs < consumeTimeoutMs!) {\n break;\n }\n this.endConsumerSpan(currMessage.msg, null, EndOperation.InstrumentationTimeout, true);\n }\n spansNotEnded.splice(0, i);\n }\n}\n"],"names":["InstrumentationBase","SDK_VERSION","DEFAULT_CONFIG","semconvStabilityFromStr","InstrumentationNodeModuleFile","InstrumentationNodeModuleDefinition","isWrapped","EndOperation","getConnectionAttributesFromUrl","getConnectionAttributesFromServer","CONNECTION_ATTRIBUTES","CHANNEL_CONSUME_TIMEOUT_TIMER","CHANNEL_SPANS_NOT_ENDED","propagation","ROOT_CONTEXT","trace","SpanKind","ATTR_MESSAGING_DESTINATION","ATTR_MESSAGING_DESTINATION_KIND","MESSAGING_DESTINATION_KIND_VALUE_TOPIC","ATTR_MESSAGING_RABBITMQ_ROUTING_KEY","ATTR_MESSAGING_OPERATION","MESSAGING_OPERATION_VALUE_PROCESS","OLD_ATTR_MESSAGING_MESSAGE_ID","ATTR_MESSAGING_CONVERSATION_ID","safeExecuteInTheMiddle","diag","timestampInSeconds","MESSAGE_STORED_SPAN","context","SpanStatusCode","markConfirmChannelTracing","unmarkConfirmChannelTracing","isConfirmChannelTracing","normalizeExchange"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../../../src/integrations/tracing/amqplib/vendored/utils.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/15ef7506553f631ea4181391e0c5725a56f0d082/packages/instrumentation-amqplib\n * - Upstream version: @opentelemetry/instrumentation-amqplib@0.65.0\n * - Some types vendored from @types/amqplib with simplifications\n */\n/* eslint-disable */\n\nimport { Context, createContextKey, diag, HrTime, Span, Attributes, AttributeValue } from '@opentelemetry/api';\nimport { SemconvStability } from '@opentelemetry/instrumentation';\nimport { ATTR_SERVER_ADDRESS, ATTR_SERVER_PORT } from '@opentelemetry/semantic-conventions';\nimport { ATTR_MESSAGING_SYSTEM, ATTR_NET_PEER_NAME, ATTR_NET_PEER_PORT } from './semconv';\nimport { ATTR_MESSAGING_PROTOCOL, ATTR_MESSAGING_PROTOCOL_VERSION, ATTR_MESSAGING_URL } from './semconv-obsolete';\nimport type { Connection, Channel, ConfirmChannel, Options } from './amqplib-types';\nimport type { ConsumeMessage, Message } from './types';\n\nexport const MESSAGE_STORED_SPAN: unique symbol = Symbol('opentelemetry.amqplib.message.stored-span');\nexport const CHANNEL_SPANS_NOT_ENDED: unique symbol = Symbol('opentelemetry.amqplib.channel.spans-not-ended');\nexport const CHANNEL_CONSUME_TIMEOUT_TIMER: unique symbol = Symbol(\n 'opentelemetry.amqplib.channel.consumer-timeout-timer',\n);\nexport const CONNECTION_ATTRIBUTES: unique symbol = Symbol('opentelemetry.amqplib.connection.attributes');\n\nexport type InstrumentationConnection = Connection & {\n [CONNECTION_ATTRIBUTES]?: Attributes;\n};\nexport type InstrumentationPublishChannel = (Channel | ConfirmChannel) & {\n connection: InstrumentationConnection;\n};\nexport type InstrumentationConsumeChannel = Channel & {\n connection: InstrumentationConnection;\n [CHANNEL_SPANS_NOT_ENDED]?: {\n msg: ConsumeMessage;\n timeOfConsume: HrTime;\n }[];\n [CHANNEL_CONSUME_TIMEOUT_TIMER]?: NodeJS.Timeout;\n};\nexport type InstrumentationMessage = Message & {\n [MESSAGE_STORED_SPAN]?: Span;\n};\nexport type InstrumentationConsumeMessage = ConsumeMessage & {\n [MESSAGE_STORED_SPAN]?: Span;\n};\n\nconst IS_CONFIRM_CHANNEL_CONTEXT_KEY: symbol = createContextKey('opentelemetry.amqplib.channel.is-confirm-channel');\n\nexport const normalizeExchange = (exchangeName: string) => (exchangeName !== '' ? exchangeName : '<default>');\n\nconst censorPassword = (url: string): string => {\n return url.replace(/:[^:@/]*@/, ':***@');\n};\n\nconst getPort = (portFromUrl: number | undefined, resolvedProtocol: string): number => {\n // we are using the resolved protocol which is upper case\n // this code mimic the behavior of the amqplib which is used to set connection params\n return portFromUrl || (resolvedProtocol === 'AMQP' ? 5672 : 5671);\n};\n\nconst getProtocol = (protocolFromUrl: string | undefined): string => {\n const resolvedProtocol = protocolFromUrl || 'amqp';\n // the substring removed the ':' part of the protocol ('amqp:' -> 'amqp')\n const noEndingColon = resolvedProtocol.endsWith(':')\n ? resolvedProtocol.substring(0, resolvedProtocol.length - 1)\n : resolvedProtocol;\n // upper cases to match spec\n return noEndingColon.toUpperCase();\n};\n\nconst getHostname = (hostnameFromUrl: string | undefined): string => {\n // if user supplies empty hostname, it gets forwarded to 'net' package which default it to localhost.\n // https://nodejs.org/docs/latest-v12.x/api/net.html#net_socket_connect_options_connectlistener\n return hostnameFromUrl || 'localhost';\n};\n\nconst extractConnectionAttributeOrLog = (\n url: string | Options.Connect,\n attributeKey: string,\n attributeValue: AttributeValue,\n nameForLog: string,\n): Attributes => {\n if (attributeValue) {\n return { [attributeKey]: attributeValue };\n } else {\n diag.error(`amqplib instrumentation: could not extract connection attribute ${nameForLog} from user supplied url`, {\n url,\n });\n return {};\n }\n};\n\nexport const getConnectionAttributesFromServer = (conn: Connection): Attributes => {\n const product = conn.serverProperties.product?.toLowerCase?.();\n if (product) {\n return {\n [ATTR_MESSAGING_SYSTEM]: product,\n };\n } else {\n return {};\n }\n};\n\nexport const getConnectionAttributesFromUrl = (\n url: string | Options.Connect,\n netSemconvStability: SemconvStability,\n): Attributes => {\n const attributes: Attributes = {\n [ATTR_MESSAGING_PROTOCOL_VERSION]: '0.9.1', // this is the only protocol supported by the instrumented library\n };\n\n url = url || 'amqp://localhost';\n if (typeof url === 'object') {\n const connectOptions = url as Options.Connect;\n\n const protocol = getProtocol(connectOptions?.protocol);\n Object.assign(attributes, {\n ...extractConnectionAttributeOrLog(url, ATTR_MESSAGING_PROTOCOL, protocol, 'protocol'),\n });\n\n const hostname = getHostname(connectOptions?.hostname);\n if (netSemconvStability & SemconvStability.OLD) {\n Object.assign(attributes, {\n ...extractConnectionAttributeOrLog(url, ATTR_NET_PEER_NAME, hostname, 'hostname'),\n });\n }\n if (netSemconvStability & SemconvStability.STABLE) {\n Object.assign(attributes, {\n ...extractConnectionAttributeOrLog(url, ATTR_SERVER_ADDRESS, hostname, 'hostname'),\n });\n }\n\n const port = getPort(connectOptions.port, protocol);\n if (netSemconvStability & SemconvStability.OLD) {\n Object.assign(attributes, extractConnectionAttributeOrLog(url, ATTR_NET_PEER_PORT, port, 'port'));\n }\n if (netSemconvStability & SemconvStability.STABLE) {\n Object.assign(attributes, extractConnectionAttributeOrLog(url, ATTR_SERVER_PORT, port, 'port'));\n }\n } else {\n const censoredUrl = censorPassword(url);\n attributes[ATTR_MESSAGING_URL] = censoredUrl;\n try {\n const urlParts = new URL(censoredUrl);\n\n const protocol = getProtocol(urlParts.protocol);\n Object.assign(attributes, {\n ...extractConnectionAttributeOrLog(censoredUrl, ATTR_MESSAGING_PROTOCOL, protocol, 'protocol'),\n });\n\n const hostname = getHostname(urlParts.hostname);\n if (netSemconvStability & SemconvStability.OLD) {\n Object.assign(attributes, {\n ...extractConnectionAttributeOrLog(censoredUrl, ATTR_NET_PEER_NAME, hostname, 'hostname'),\n });\n }\n if (netSemconvStability & SemconvStability.STABLE) {\n Object.assign(attributes, {\n ...extractConnectionAttributeOrLog(censoredUrl, ATTR_SERVER_ADDRESS, hostname, 'hostname'),\n });\n }\n\n const port = getPort(urlParts.port ? parseInt(urlParts.port) : undefined, protocol);\n if (netSemconvStability & SemconvStability.OLD) {\n Object.assign(attributes, extractConnectionAttributeOrLog(censoredUrl, ATTR_NET_PEER_PORT, port, 'port'));\n }\n if (netSemconvStability & SemconvStability.STABLE) {\n Object.assign(attributes, extractConnectionAttributeOrLog(censoredUrl, ATTR_SERVER_PORT, port, 'port'));\n }\n } catch (err) {\n diag.error('amqplib instrumentation: error while extracting connection details from connection url', {\n censoredUrl,\n err,\n });\n }\n }\n return attributes;\n};\n\nexport const markConfirmChannelTracing = (context: Context) => {\n return context.setValue(IS_CONFIRM_CHANNEL_CONTEXT_KEY, true);\n};\n\nexport const unmarkConfirmChannelTracing = (context: Context) => {\n return context.deleteValue(IS_CONFIRM_CHANNEL_CONTEXT_KEY);\n};\n\nexport const isConfirmChannelTracing = (context: Context) => {\n return context.getValue(IS_CONFIRM_CHANNEL_CONTEXT_KEY) === true;\n};\n"],"names":["createContextKey","diag","ATTR_MESSAGING_SYSTEM","ATTR_MESSAGING_PROTOCOL_VERSION","ATTR_MESSAGING_PROTOCOL","SemconvStability","ATTR_NET_PEER_NAME","ATTR_SERVER_ADDRESS","ATTR_NET_PEER_PORT","ATTR_SERVER_PORT","ATTR_MESSAGING_URL"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../../../src/integrations/tracing/amqplib/vendored/utils.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * NOTICE from the Sentry authors:\n * - Vendored from: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/15ef7506553f631ea4181391e0c5725a56f0d082/packages/instrumentation-amqplib\n * - Upstream version: @opentelemetry/instrumentation-amqplib@0.65.0\n * - Some types vendored from @types/amqplib with simplifications\n */\n/* eslint-disable */\n\nimport { Context, createContextKey, diag, Span, Attributes, AttributeValue } from '@opentelemetry/api';\nimport { SemconvStability } from '@opentelemetry/instrumentation';\nimport { ATTR_SERVER_ADDRESS, ATTR_SERVER_PORT } from '@opentelemetry/semantic-conventions';\nimport { ATTR_MESSAGING_SYSTEM, ATTR_NET_PEER_NAME, ATTR_NET_PEER_PORT } from './semconv';\nimport { ATTR_MESSAGING_PROTOCOL, ATTR_MESSAGING_PROTOCOL_VERSION, ATTR_MESSAGING_URL } from './semconv-obsolete';\nimport type { Connection, Channel, ConfirmChannel, Options } from './amqplib-types';\nimport type { ConsumeMessage, Message } from './types';\n\nexport const MESSAGE_STORED_SPAN: unique symbol = Symbol('opentelemetry.amqplib.message.stored-span');\nexport const CHANNEL_SPANS_NOT_ENDED: unique symbol = Symbol('opentelemetry.amqplib.channel.spans-not-ended');\nexport const CHANNEL_CONSUME_TIMEOUT_TIMER: unique symbol = Symbol(\n 'opentelemetry.amqplib.channel.consumer-timeout-timer',\n);\nexport const CONNECTION_ATTRIBUTES: unique symbol = Symbol('opentelemetry.amqplib.connection.attributes');\n\nexport type InstrumentationConnection = Connection & {\n [CONNECTION_ATTRIBUTES]?: Attributes;\n};\nexport type InstrumentationPublishChannel = (Channel | ConfirmChannel) & {\n connection: InstrumentationConnection;\n};\nexport type InstrumentationConsumeChannel = Channel & {\n connection: InstrumentationConnection;\n [CHANNEL_SPANS_NOT_ENDED]?: {\n msg: ConsumeMessage;\n timeOfConsume: number;\n }[];\n [CHANNEL_CONSUME_TIMEOUT_TIMER]?: NodeJS.Timeout;\n};\nexport type InstrumentationMessage = Message & {\n [MESSAGE_STORED_SPAN]?: Span;\n};\nexport type InstrumentationConsumeMessage = ConsumeMessage & {\n [MESSAGE_STORED_SPAN]?: Span;\n};\n\nconst IS_CONFIRM_CHANNEL_CONTEXT_KEY: symbol = createContextKey('opentelemetry.amqplib.channel.is-confirm-channel');\n\nexport const normalizeExchange = (exchangeName: string) => (exchangeName !== '' ? exchangeName : '<default>');\n\nconst censorPassword = (url: string): string => {\n return url.replace(/:[^:@/]*@/, ':***@');\n};\n\nconst getPort = (portFromUrl: number | undefined, resolvedProtocol: string): number => {\n // we are using the resolved protocol which is upper case\n // this code mimic the behavior of the amqplib which is used to set connection params\n return portFromUrl || (resolvedProtocol === 'AMQP' ? 5672 : 5671);\n};\n\nconst getProtocol = (protocolFromUrl: string | undefined): string => {\n const resolvedProtocol = protocolFromUrl || 'amqp';\n // the substring removed the ':' part of the protocol ('amqp:' -> 'amqp')\n const noEndingColon = resolvedProtocol.endsWith(':')\n ? resolvedProtocol.substring(0, resolvedProtocol.length - 1)\n : resolvedProtocol;\n // upper cases to match spec\n return noEndingColon.toUpperCase();\n};\n\nconst getHostname = (hostnameFromUrl: string | undefined): string => {\n // if user supplies empty hostname, it gets forwarded to 'net' package which default it to localhost.\n // https://nodejs.org/docs/latest-v12.x/api/net.html#net_socket_connect_options_connectlistener\n return hostnameFromUrl || 'localhost';\n};\n\nconst extractConnectionAttributeOrLog = (\n url: string | Options.Connect,\n attributeKey: string,\n attributeValue: AttributeValue,\n nameForLog: string,\n): Attributes => {\n if (attributeValue) {\n return { [attributeKey]: attributeValue };\n } else {\n diag.error(`amqplib instrumentation: could not extract connection attribute ${nameForLog} from user supplied url`, {\n url,\n });\n return {};\n }\n};\n\nexport const getConnectionAttributesFromServer = (conn: Connection): Attributes => {\n const product = conn.serverProperties.product?.toLowerCase?.();\n if (product) {\n return {\n [ATTR_MESSAGING_SYSTEM]: product,\n };\n } else {\n return {};\n }\n};\n\nexport const getConnectionAttributesFromUrl = (\n url: string | Options.Connect,\n netSemconvStability: SemconvStability,\n): Attributes => {\n const attributes: Attributes = {\n [ATTR_MESSAGING_PROTOCOL_VERSION]: '0.9.1', // this is the only protocol supported by the instrumented library\n };\n\n url = url || 'amqp://localhost';\n if (typeof url === 'object') {\n const connectOptions = url as Options.Connect;\n\n const protocol = getProtocol(connectOptions?.protocol);\n Object.assign(attributes, {\n ...extractConnectionAttributeOrLog(url, ATTR_MESSAGING_PROTOCOL, protocol, 'protocol'),\n });\n\n const hostname = getHostname(connectOptions?.hostname);\n if (netSemconvStability & SemconvStability.OLD) {\n Object.assign(attributes, {\n ...extractConnectionAttributeOrLog(url, ATTR_NET_PEER_NAME, hostname, 'hostname'),\n });\n }\n if (netSemconvStability & SemconvStability.STABLE) {\n Object.assign(attributes, {\n ...extractConnectionAttributeOrLog(url, ATTR_SERVER_ADDRESS, hostname, 'hostname'),\n });\n }\n\n const port = getPort(connectOptions.port, protocol);\n if (netSemconvStability & SemconvStability.OLD) {\n Object.assign(attributes, extractConnectionAttributeOrLog(url, ATTR_NET_PEER_PORT, port, 'port'));\n }\n if (netSemconvStability & SemconvStability.STABLE) {\n Object.assign(attributes, extractConnectionAttributeOrLog(url, ATTR_SERVER_PORT, port, 'port'));\n }\n } else {\n const censoredUrl = censorPassword(url);\n attributes[ATTR_MESSAGING_URL] = censoredUrl;\n try {\n const urlParts = new URL(censoredUrl);\n\n const protocol = getProtocol(urlParts.protocol);\n Object.assign(attributes, {\n ...extractConnectionAttributeOrLog(censoredUrl, ATTR_MESSAGING_PROTOCOL, protocol, 'protocol'),\n });\n\n const hostname = getHostname(urlParts.hostname);\n if (netSemconvStability & SemconvStability.OLD) {\n Object.assign(attributes, {\n ...extractConnectionAttributeOrLog(censoredUrl, ATTR_NET_PEER_NAME, hostname, 'hostname'),\n });\n }\n if (netSemconvStability & SemconvStability.STABLE) {\n Object.assign(attributes, {\n ...extractConnectionAttributeOrLog(censoredUrl, ATTR_SERVER_ADDRESS, hostname, 'hostname'),\n });\n }\n\n const port = getPort(urlParts.port ? parseInt(urlParts.port) : undefined, protocol);\n if (netSemconvStability & SemconvStability.OLD) {\n Object.assign(attributes, extractConnectionAttributeOrLog(censoredUrl, ATTR_NET_PEER_PORT, port, 'port'));\n }\n if (netSemconvStability & SemconvStability.STABLE) {\n Object.assign(attributes, extractConnectionAttributeOrLog(censoredUrl, ATTR_SERVER_PORT, port, 'port'));\n }\n } catch (err) {\n diag.error('amqplib instrumentation: error while extracting connection details from connection url', {\n censoredUrl,\n err,\n });\n }\n }\n return attributes;\n};\n\nexport const markConfirmChannelTracing = (context: Context) => {\n return context.setValue(IS_CONFIRM_CHANNEL_CONTEXT_KEY, true);\n};\n\nexport const unmarkConfirmChannelTracing = (context: Context) => {\n return context.deleteValue(IS_CONFIRM_CHANNEL_CONTEXT_KEY);\n};\n\nexport const isConfirmChannelTracing = (context: Context) => {\n return context.getValue(IS_CONFIRM_CHANNEL_CONTEXT_KEY) === true;\n};\n"],"names":["createContextKey","diag","ATTR_MESSAGING_SYSTEM","ATTR_MESSAGING_PROTOCOL_VERSION","ATTR_MESSAGING_PROTOCOL","SemconvStability","ATTR_NET_PEER_NAME","ATTR_SERVER_ADDRESS","ATTR_NET_PEER_PORT","ATTR_SERVER_PORT","ATTR_MESSAGING_URL"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../src/integrations/tracing/anthropic-ai/index.ts"],"sourcesContent":["import type { AnthropicAiOptions, IntegrationFn } from '@sentry/core';\nimport { ANTHROPIC_AI_INTEGRATION_NAME, defineIntegration } from '@sentry/core';\nimport { generateInstrumentOnce } from '@sentry/node-core';\nimport { SentryAnthropicAiInstrumentation } from './instrumentation';\n\nexport const instrumentAnthropicAi = generateInstrumentOnce<AnthropicAiOptions>(\n ANTHROPIC_AI_INTEGRATION_NAME,\n options => new SentryAnthropicAiInstrumentation(options),\n);\n\nconst _anthropicAIIntegration = ((options: AnthropicAiOptions = {}) => {\n return {\n name: ANTHROPIC_AI_INTEGRATION_NAME,\n options,\n setupOnce() {\n instrumentAnthropicAi(options);\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Adds Sentry tracing instrumentation for the Anthropic AI SDK.\n *\n * This integration is enabled by default.\n *\n * When configured, this integration automatically instruments Anthropic AI SDK client instances\n * to capture telemetry data following OpenTelemetry Semantic Conventions for Generative AI.\n *\n * @example\n * ```javascript\n * import * as Sentry from '@sentry/node';\n *\n * Sentry.init({\n * integrations: [Sentry.anthropicAIIntegration()],\n * });\n * ```\n *\n * ## Options\n *\n * - `recordInputs`: Whether to record prompt messages (default:
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/integrations/tracing/anthropic-ai/index.ts"],"sourcesContent":["import type { AnthropicAiOptions, IntegrationFn } from '@sentry/core';\nimport { ANTHROPIC_AI_INTEGRATION_NAME, defineIntegration } from '@sentry/core';\nimport { generateInstrumentOnce } from '@sentry/node-core';\nimport { SentryAnthropicAiInstrumentation } from './instrumentation';\n\nexport const instrumentAnthropicAi = generateInstrumentOnce<AnthropicAiOptions>(\n ANTHROPIC_AI_INTEGRATION_NAME,\n options => new SentryAnthropicAiInstrumentation(options),\n);\n\nconst _anthropicAIIntegration = ((options: AnthropicAiOptions = {}) => {\n return {\n name: ANTHROPIC_AI_INTEGRATION_NAME,\n options,\n setupOnce() {\n instrumentAnthropicAi(options);\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Adds Sentry tracing instrumentation for the Anthropic AI SDK.\n *\n * This integration is enabled by default.\n *\n * When configured, this integration automatically instruments Anthropic AI SDK client instances\n * to capture telemetry data following OpenTelemetry Semantic Conventions for Generative AI.\n *\n * @example\n * ```javascript\n * import * as Sentry from '@sentry/node';\n *\n * Sentry.init({\n * integrations: [Sentry.anthropicAIIntegration()],\n * });\n * ```\n *\n * ## Options\n *\n * - `recordInputs`: Whether to record prompt messages (default: follows `sendDefaultPii` or `dataCollection.genAI.inputs`)\n * - `recordOutputs`: Whether to record response text (default: follows `sendDefaultPii` or `dataCollection.genAI.outputs`)\n *\n * ### Default Behavior\n *\n * By default, the integration will:\n * - Record inputs and outputs based on `sendDefaultPii` or `dataCollection.genAI` in your Sentry client options\n * - Integration-level `recordInputs`/`recordOutputs` options take precedence over global config\n *\n * @example\n * ```javascript\n * // Always record inputs and outputs regardless of global dataCollection config\n * Sentry.init({\n * integrations: [\n * Sentry.anthropicAIIntegration({\n * recordInputs: true,\n * recordOutputs: true\n * })\n * ],\n * });\n *\n * // Never record inputs/outputs regardless of global dataCollection config\n * Sentry.init({\n * dataCollection: { genAI: { inputs: true, outputs: true } },\n * integrations: [\n * Sentry.anthropicAIIntegration({\n * recordInputs: false,\n * recordOutputs: false\n * })\n * ],\n * });\n * ```\n *\n */\nexport const anthropicAIIntegration = defineIntegration(_anthropicAIIntegration);\n"],"names":["generateInstrumentOnce","ANTHROPIC_AI_INTEGRATION_NAME","SentryAnthropicAiInstrumentation","defineIntegration"],"mappings":";;;;;;AAKO,MAAM,qBAAA,GAAwBA,+BAAA;AAAA,EACnCC,kCAAA;AAAA,EACA,CAAA,OAAA,KAAW,IAAIC,gDAAA,CAAiC,OAAO;AACzD;AAEA,MAAM,uBAAA,IAA2B,CAAC,OAAA,GAA8B,EAAC,KAAM;AACrE,EAAA,OAAO;AAAA,IACL,IAAA,EAAMD,kCAAA;AAAA,IACN,OAAA;AAAA,IACA,SAAA,GAAY;AACV,MAAA,qBAAA,CAAsB,OAAO,CAAA;AAAA,IAC/B;AAAA,GACF;AACF,CAAA,CAAA;AAuDO,MAAM,sBAAA,GAAyBE,uBAAkB,uBAAuB;;;;;"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
|
|
3
|
-
const api = require('@opentelemetry/api');
|
|
4
|
-
const core$1 = require('@opentelemetry/core');
|
|
5
3
|
const AttributeNames = require('./enums/AttributeNames.js');
|
|
6
4
|
const core = require('@sentry/core');
|
|
5
|
+
const setHttpServerSpanRouteAttribute = require('../../../../utils/setHttpServerSpanRouteAttribute.js');
|
|
7
6
|
const instrumentation = require('@opentelemetry/instrumentation');
|
|
8
7
|
const semanticConventions = require('@opentelemetry/semantic-conventions');
|
|
9
8
|
const utils = require('./utils.js');
|
|
@@ -79,9 +78,8 @@ class ConnectInstrumentation extends instrumentation.InstrumentationBase {
|
|
|
79
78
|
const res = arguments[resArgIdx];
|
|
80
79
|
const next = arguments[nextArgIdx];
|
|
81
80
|
utils.replaceCurrentStackRoute(req, routeName);
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
rpcMetadata.route = utils.generateRoute(req);
|
|
81
|
+
if (routeName) {
|
|
82
|
+
setHttpServerSpanRouteAttribute.setHttpServerSpanRouteAttribute(utils.generateRoute(req));
|
|
85
83
|
}
|
|
86
84
|
let spanName = "";
|
|
87
85
|
if (routeName) {
|