@sentry/node 9.19.0 → 9.21.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.
Files changed (39) hide show
  1. package/build/cjs/integrations/anr/index.js +1 -1
  2. package/build/cjs/integrations/http/SentryHttpInstrumentation.js +93 -76
  3. package/build/cjs/integrations/http/SentryHttpInstrumentation.js.map +1 -1
  4. package/build/cjs/integrations/http/index.js.map +1 -1
  5. package/build/cjs/integrations/local-variables/local-variables-async.js +1 -1
  6. package/build/cjs/integrations/node-fetch/SentryNodeFetchInstrumentation.js +29 -10
  7. package/build/cjs/integrations/node-fetch/SentryNodeFetchInstrumentation.js.map +1 -1
  8. package/build/cjs/integrations/tracing/fastify/fastify-otel/index.js +489 -0
  9. package/build/cjs/integrations/tracing/fastify/fastify-otel/index.js.map +1 -0
  10. package/build/cjs/integrations/tracing/fastify/index.js +2 -2
  11. package/build/cjs/integrations/tracing/fastify/index.js.map +1 -1
  12. package/build/esm/integrations/anr/index.js +1 -1
  13. package/build/esm/integrations/anr/worker-script.js +2 -2
  14. package/build/esm/integrations/http/SentryHttpInstrumentation.js +94 -77
  15. package/build/esm/integrations/http/SentryHttpInstrumentation.js.map +1 -1
  16. package/build/esm/integrations/http/index.js.map +1 -1
  17. package/build/esm/integrations/local-variables/local-variables-async.js +1 -1
  18. package/build/esm/integrations/local-variables/worker-script.js +2 -2
  19. package/build/esm/integrations/node-fetch/SentryNodeFetchInstrumentation.js +30 -11
  20. package/build/esm/integrations/node-fetch/SentryNodeFetchInstrumentation.js.map +1 -1
  21. package/build/esm/integrations/tracing/fastify/fastify-otel/index.js +487 -0
  22. package/build/esm/integrations/tracing/fastify/fastify-otel/index.js.map +1 -0
  23. package/build/esm/integrations/tracing/fastify/index.js +1 -1
  24. package/build/esm/integrations/tracing/fastify/index.js.map +1 -1
  25. package/build/esm/package.json +1 -1
  26. package/build/types/integrations/http/SentryHttpInstrumentation.d.ts +20 -0
  27. package/build/types/integrations/http/SentryHttpInstrumentation.d.ts.map +1 -1
  28. package/build/types/integrations/http/index.d.ts +15 -0
  29. package/build/types/integrations/http/index.d.ts.map +1 -1
  30. package/build/types/integrations/node-fetch/SentryNodeFetchInstrumentation.d.ts +5 -0
  31. package/build/types/integrations/node-fetch/SentryNodeFetchInstrumentation.d.ts.map +1 -1
  32. package/build/types/integrations/tracing/fastify/index.d.ts.map +1 -1
  33. package/build/types-ts3.8/integrations/http/SentryHttpInstrumentation.d.ts +20 -0
  34. package/build/types-ts3.8/integrations/http/index.d.ts +15 -0
  35. package/build/types-ts3.8/integrations/node-fetch/SentryNodeFetchInstrumentation.d.ts +5 -0
  36. package/package.json +5 -5
  37. package/build/types/integrations/http/utils.d.ts +0 -14
  38. package/build/types/integrations/http/utils.d.ts.map +0 -1
  39. package/build/types-ts3.8/integrations/http/utils.d.ts +0 -14
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../../../src/integrations/tracing/fastify/fastify-otel/index.js"],"sourcesContent":["/*\nVendored in and modified from @fastify/otel version 0.8.0\nhttps://github.com/fastify/otel/releases/tag/v0.8.0\n\nTried not to modify the original code too much keeping it as a JavaScript CJS module to make it easier to update when required\n\nModifications include:\n- Removed reading of package.json to get the version and package name\n\nMIT License\n\nCopyright (c) 2024 Fastify\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n/* eslint-disable @typescript-eslint/explicit-member-accessibility */\n/* eslint-disable jsdoc/require-jsdoc */\n/* eslint-disable max-lines */\n/* eslint-disable no-param-reassign */\nimport dc from 'node:diagnostics_channel';\nimport { context, diag, propagation, SpanStatusCode, trace } from '@opentelemetry/api';\nimport { getRPCMetadata, RPCType } from '@opentelemetry/core';\nimport { InstrumentationBase } from '@opentelemetry/instrumentation';\nimport {\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_SERVICE_NAME,\n} from '@opentelemetry/semantic-conventions';\n\n// SENTRY VENDOR NOTE\n// Instead of using the package.json file, we hard code the package name and version here.\nconst PACKAGE_NAME = '@fastify/otel';\nconst PACKAGE_VERSION = '0.8.0';\n\n// Constants\nconst SUPPORTED_VERSIONS = '>=4.0.0 <6';\nconst FASTIFY_HOOKS = [\n 'onRequest',\n 'preParsing',\n 'preValidation',\n 'preHandler',\n 'preSerialization',\n 'onSend',\n 'onResponse',\n 'onError',\n];\nconst ATTRIBUTE_NAMES = {\n HOOK_NAME: 'hook.name',\n FASTIFY_TYPE: 'fastify.type',\n HOOK_CALLBACK_NAME: 'hook.callback.name',\n ROOT: 'fastify.root',\n};\nconst HOOK_TYPES = {\n ROUTE: 'route-hook',\n INSTANCE: 'hook',\n HANDLER: 'request-handler',\n};\nconst ANONYMOUS_FUNCTION_NAME = 'anonymous';\n\n// Symbols\nconst kInstrumentation = Symbol('fastify otel instance');\nconst kRequestSpan = Symbol('fastify otel request spans');\nconst kRequestContext = Symbol('fastify otel request context');\nconst kAddHookOriginal = Symbol('fastify otel addhook original');\nconst kSetNotFoundOriginal = Symbol('fastify otel setnotfound original');\nconst kIgnorePaths = Symbol('fastify otel ignore path');\n\nexport class FastifyOtelInstrumentation extends InstrumentationBase {\n constructor(config) {\n super(PACKAGE_NAME, PACKAGE_VERSION, config);\n this.servername = config?.servername ?? process.env.OTEL_SERVICE_NAME ?? 'fastify';\n this[kIgnorePaths] = null;\n this._logger = diag.createComponentLogger({ namespace: PACKAGE_NAME });\n\n if (config?.ignorePaths != null || process.env.OTEL_FASTIFY_IGNORE_PATHS != null) {\n const ignorePaths = config?.ignorePaths ?? process.env.OTEL_FASTIFY_IGNORE_PATHS;\n\n if ((typeof ignorePaths !== 'string' || ignorePaths.length === 0) && typeof ignorePaths !== 'function') {\n throw new TypeError('ignorePaths must be a string or a function');\n }\n\n let globMatcher = null;\n\n this[kIgnorePaths] = routeOptions => {\n if (typeof ignorePaths === 'function') {\n return ignorePaths(routeOptions);\n } else {\n // Using minimatch to match the path until path.matchesGlob is out of experimental\n // path.matchesGlob uses minimatch internally\n if (globMatcher == null) {\n globMatcher = require('minimatch').minimatch;\n }\n\n return globMatcher(routeOptions.url, ignorePaths);\n }\n };\n }\n }\n\n enable() {\n if (this._handleInitialization === undefined && this.getConfig().registerOnInitialization) {\n const FastifyInstrumentationPlugin = this.plugin();\n this._handleInitialization = message => {\n message.fastify.register(FastifyInstrumentationPlugin);\n };\n dc.subscribe('fastify.initialization', this._handleInitialization);\n }\n return super.enable();\n }\n\n disable() {\n if (this._handleInitialization) {\n dc.unsubscribe('fastify.initialization', this._handleInitialization);\n this._handleInitialization = undefined;\n }\n return super.disable();\n }\n\n // We do not do patching in this instrumentation\n init() {\n return [];\n }\n\n plugin() {\n const instrumentation = this;\n\n FastifyInstrumentationPlugin[Symbol.for('skip-override')] = true;\n FastifyInstrumentationPlugin[Symbol.for('fastify.display-name')] = '@fastify/otel';\n FastifyInstrumentationPlugin[Symbol.for('plugin-meta')] = {\n fastify: SUPPORTED_VERSIONS,\n name: '@fastify/otel',\n };\n\n return FastifyInstrumentationPlugin;\n\n function FastifyInstrumentationPlugin(instance, opts, done) {\n instance.decorate(kInstrumentation, instrumentation);\n // addHook and notfoundHandler are essentially inherited from the prototype\n // what is important is to bound it to the right instance\n instance.decorate(kAddHookOriginal, instance.addHook);\n instance.decorate(kSetNotFoundOriginal, instance.setNotFoundHandler);\n instance.decorateRequest('opentelemetry', function openetelemetry() {\n const ctx = this[kRequestContext];\n const span = this[kRequestSpan];\n return {\n span,\n tracer: instrumentation.tracer,\n context: ctx,\n inject: (carrier, setter) => {\n return propagation.inject(ctx, carrier, setter);\n },\n extract: (carrier, getter) => {\n return propagation.extract(ctx, carrier, getter);\n },\n };\n });\n instance.decorateRequest(kRequestSpan, null);\n instance.decorateRequest(kRequestContext, null);\n\n instance.addHook('onRoute', function (routeOptions) {\n if (instrumentation[kIgnorePaths]?.(routeOptions) === true) {\n instrumentation._logger.debug(\n `Ignoring route instrumentation ${routeOptions.method} ${routeOptions.url} because it matches the ignore path`,\n );\n return;\n }\n\n for (const hook of FASTIFY_HOOKS) {\n if (routeOptions[hook] != null) {\n const handlerLike = routeOptions[hook];\n\n if (typeof handlerLike === 'function') {\n routeOptions[hook] = handlerWrapper(handlerLike, {\n [ATTR_SERVICE_NAME]: instance[kInstrumentation].servername,\n [ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - route -> ${hook}`,\n [ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.ROUTE,\n [ATTR_HTTP_ROUTE]: routeOptions.url,\n [ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]:\n handlerLike.name?.length > 0 ? handlerLike.name : ANONYMOUS_FUNCTION_NAME /* c8 ignore next */,\n });\n } else if (Array.isArray(handlerLike)) {\n const wrappedHandlers = [];\n\n for (const handler of handlerLike) {\n wrappedHandlers.push(\n handlerWrapper(handler, {\n [ATTR_SERVICE_NAME]: instance[kInstrumentation].servername,\n [ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - route -> ${hook}`,\n [ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.ROUTE,\n [ATTR_HTTP_ROUTE]: routeOptions.url,\n [ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]:\n handler.name?.length > 0 ? handler.name : ANONYMOUS_FUNCTION_NAME,\n }),\n );\n }\n\n routeOptions[hook] = wrappedHandlers;\n }\n }\n }\n\n // We always want to add the onSend hook to the route to be executed last\n if (routeOptions.onSend != null) {\n routeOptions.onSend = Array.isArray(routeOptions.onSend)\n ? [...routeOptions.onSend, onSendHook]\n : [routeOptions.onSend, onSendHook];\n } else {\n routeOptions.onSend = onSendHook;\n }\n\n // We always want to add the onError hook to the route to be executed last\n if (routeOptions.onError != null) {\n routeOptions.onError = Array.isArray(routeOptions.onError)\n ? [...routeOptions.onError, onErrorHook]\n : [routeOptions.onError, onErrorHook];\n } else {\n routeOptions.onError = onErrorHook;\n }\n\n routeOptions.handler = handlerWrapper(routeOptions.handler, {\n [ATTR_SERVICE_NAME]: instance[kInstrumentation].servername,\n [ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - route-handler`,\n [ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.HANDLER,\n [ATTR_HTTP_ROUTE]: routeOptions.url,\n [ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]:\n routeOptions.handler.name.length > 0 ? routeOptions.handler.name : ANONYMOUS_FUNCTION_NAME,\n });\n });\n\n instance.addHook('onRequest', function (request, _reply, hookDone) {\n if (this[kInstrumentation].isEnabled() === false) {\n return hookDone();\n } else if (\n this[kInstrumentation][kIgnorePaths]?.({\n url: request.url,\n method: request.method,\n }) === true\n ) {\n this[kInstrumentation]._logger.debug(\n `Ignoring request ${request.method} ${request.url} because it matches the ignore path`,\n );\n return hookDone();\n }\n\n let ctx = context.active();\n\n if (trace.getSpan(ctx) == null) {\n ctx = propagation.extract(ctx, request.headers);\n }\n\n const rpcMetadata = getRPCMetadata(ctx);\n\n if (request.routeOptions.url != null && rpcMetadata?.type === RPCType.HTTP) {\n rpcMetadata.route = request.routeOptions.url;\n }\n\n /** @type {import('@opentelemetry/api').Span} */\n const span = this[kInstrumentation].tracer.startSpan(\n 'request',\n {\n attributes: {\n [ATTR_SERVICE_NAME]: instance[kInstrumentation].servername,\n [ATTRIBUTE_NAMES.ROOT]: '@fastify/otel',\n [ATTR_HTTP_ROUTE]: request.url,\n [ATTR_HTTP_REQUEST_METHOD]: request.method,\n },\n },\n ctx,\n );\n\n request[kRequestContext] = trace.setSpan(ctx, span);\n request[kRequestSpan] = span;\n\n context.with(request[kRequestContext], () => {\n hookDone();\n });\n });\n\n // onResponse is the last hook to be executed, only added for 404 handlers\n instance.addHook('onResponse', function (request, reply, hookDone) {\n const span = request[kRequestSpan];\n\n if (span != null) {\n span.setStatus({\n code: SpanStatusCode.OK,\n message: 'OK',\n });\n span.setAttributes({\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: 404,\n });\n span.end();\n }\n\n request[kRequestSpan] = null;\n\n hookDone();\n });\n\n instance.addHook = addHookPatched;\n instance.setNotFoundHandler = setNotFoundHandlerPatched;\n\n done();\n\n function onSendHook(request, reply, payload, hookDone) {\n /** @type {import('@opentelemetry/api').Span} */\n const span = request[kRequestSpan];\n\n if (span != null) {\n if (reply.statusCode < 500) {\n span.setStatus({\n code: SpanStatusCode.OK,\n message: 'OK',\n });\n }\n\n span.setAttributes({\n [ATTR_HTTP_RESPONSE_STATUS_CODE]: reply.statusCode,\n });\n span.end();\n }\n\n request[kRequestSpan] = null;\n\n hookDone(null, payload);\n }\n\n function onErrorHook(request, reply, error, hookDone) {\n /** @type {Span} */\n const span = request[kRequestSpan];\n\n if (span != null) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.recordException(error);\n }\n\n hookDone();\n }\n\n function addHookPatched(name, hook) {\n const addHookOriginal = this[kAddHookOriginal];\n\n if (FASTIFY_HOOKS.includes(name)) {\n return addHookOriginal.call(\n this,\n name,\n handlerWrapper(hook, {\n [ATTR_SERVICE_NAME]: instance[kInstrumentation].servername,\n [ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - ${name}`,\n [ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.INSTANCE,\n [ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]:\n hook.name?.length > 0 ? hook.name : ANONYMOUS_FUNCTION_NAME /* c8 ignore next */,\n }),\n );\n } else {\n return addHookOriginal.call(this, name, hook);\n }\n }\n\n function setNotFoundHandlerPatched(hooks, handler) {\n const setNotFoundHandlerOriginal = this[kSetNotFoundOriginal];\n if (typeof hooks === 'function') {\n handler = handlerWrapper(hooks, {\n [ATTR_SERVICE_NAME]: instance[kInstrumentation].servername,\n [ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - not-found-handler`,\n [ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.INSTANCE,\n [ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]:\n hooks.name?.length > 0 ? hooks.name : ANONYMOUS_FUNCTION_NAME /* c8 ignore next */,\n });\n setNotFoundHandlerOriginal.call(this, handler);\n } else {\n if (hooks.preValidation != null) {\n hooks.preValidation = handlerWrapper(hooks.preValidation, {\n [ATTR_SERVICE_NAME]: instance[kInstrumentation].servername,\n [ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - not-found-handler - preValidation`,\n [ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.INSTANCE,\n [ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]:\n hooks.preValidation.name?.length > 0\n ? hooks.preValidation.name\n : ANONYMOUS_FUNCTION_NAME /* c8 ignore next */,\n });\n }\n\n if (hooks.preHandler != null) {\n hooks.preHandler = handlerWrapper(hooks.preHandler, {\n [ATTR_SERVICE_NAME]: instance[kInstrumentation].servername,\n [ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - not-found-handler - preHandler`,\n [ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.INSTANCE,\n [ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]:\n hooks.preHandler.name?.length > 0\n ? hooks.preHandler.name\n : ANONYMOUS_FUNCTION_NAME /* c8 ignore next */,\n });\n }\n\n handler = handlerWrapper(handler, {\n [ATTR_SERVICE_NAME]: instance[kInstrumentation].servername,\n [ATTRIBUTE_NAMES.HOOK_NAME]: `${this.pluginName} - not-found-handler`,\n [ATTRIBUTE_NAMES.FASTIFY_TYPE]: HOOK_TYPES.INSTANCE,\n [ATTRIBUTE_NAMES.HOOK_CALLBACK_NAME]:\n handler.name?.length > 0 ? handler.name : ANONYMOUS_FUNCTION_NAME /* c8 ignore next */,\n });\n setNotFoundHandlerOriginal.call(this, hooks, handler);\n }\n }\n\n function handlerWrapper(handler, spanAttributes = {}) {\n return function handlerWrapped(...args) {\n /** @type {FastifyOtelInstrumentation} */\n const instrumentation = this[kInstrumentation];\n const [request] = args;\n\n if (instrumentation.isEnabled() === false) {\n return handler.call(this, ...args);\n }\n\n const ctx = request[kRequestContext] ?? context.active();\n const span = instrumentation.tracer.startSpan(\n `handler - ${\n handler.name?.length > 0\n ? handler.name\n : this.pluginName /* c8 ignore next */ ?? ANONYMOUS_FUNCTION_NAME /* c8 ignore next */\n }`,\n {\n attributes: spanAttributes,\n },\n ctx,\n );\n\n return context.with(\n trace.setSpan(ctx, span),\n function () {\n try {\n const res = handler.call(this, ...args);\n\n if (typeof res?.then === 'function') {\n return res.then(\n result => {\n span.end();\n return result;\n },\n error => {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.recordException(error);\n span.end();\n return Promise.reject(error);\n },\n );\n }\n\n span.end();\n return res;\n } catch (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.recordException(error);\n span.end();\n throw error;\n }\n },\n this,\n );\n };\n }\n }\n }\n}\n"],"names":["dc"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import * as diagnosticsChannel from 'node:diagnostics_channel';
2
- import { FastifyOtelInstrumentation } from '@fastify/otel';
3
2
  import { defineIntegration, captureException, logger, getClient, getIsolationScope, spanToJSON, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
4
3
  import { DEBUG_BUILD } from '../../../debug-build.js';
5
4
  import { generateInstrumentOnce } from '../../../otel/instrument.js';
5
+ import { FastifyOtelInstrumentation } from './fastify-otel/index.js';
6
6
  import { FastifyInstrumentationV3 } from './v3/instrumentation.js';
7
7
 
8
8
  const INTEGRATION_NAME = 'Fastify';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../src/integrations/tracing/fastify/index.ts"],"sourcesContent":["import * as diagnosticsChannel from 'node:diagnostics_channel';\nimport { FastifyOtelInstrumentation } from '@fastify/otel';\nimport type { Instrumentation, InstrumentationConfig } from '@opentelemetry/instrumentation';\nimport type { IntegrationFn, Span } from '@sentry/core';\nimport {\n captureException,\n defineIntegration,\n getClient,\n getIsolationScope,\n logger,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n spanToJSON,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../../../debug-build';\nimport { generateInstrumentOnce } from '../../../otel/instrument';\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from './types';\nimport { FastifyInstrumentationV3 } from './v3/instrumentation';\n\ninterface FastifyHandlerOptions {\n /**\n * Callback method deciding whether error should be captured and sent to Sentry\n *\n * @param error Captured Fastify error\n * @param request Fastify request (or any object containing at least method, routeOptions.url, and routerPath)\n * @param reply Fastify reply (or any object containing at least statusCode)\n *\n * @example\n *\n * ```javascript\n * setupFastifyErrorHandler(app, {\n * shouldHandleError(_error, _request, reply) {\n * return reply.statusCode >= 400;\n * },\n * });\n * ```\n *\n * If using TypeScript, you can cast the request and reply to get full type safety.\n *\n * ```typescript\n * import type { FastifyRequest, FastifyReply } from 'fastify';\n *\n * setupFastifyErrorHandler(app, {\n * shouldHandleError(error, minimalRequest, minimalReply) {\n * const request = minimalRequest as FastifyRequest;\n * const reply = minimalReply as FastifyReply;\n * return reply.statusCode >= 500;\n * },\n * });\n * ```\n */\n shouldHandleError: (error: Error, request: FastifyRequest, reply: FastifyReply) => boolean;\n}\n\nconst INTEGRATION_NAME = 'Fastify';\nconst INTEGRATION_NAME_V3 = 'Fastify-V3';\n\nexport const instrumentFastifyV3 = generateInstrumentOnce(INTEGRATION_NAME_V3, () => new FastifyInstrumentationV3());\n\nexport const instrumentFastify = generateInstrumentOnce(INTEGRATION_NAME, () => {\n const fastifyOtelInstrumentationInstance = new FastifyOtelInstrumentation();\n const plugin = fastifyOtelInstrumentationInstance.plugin();\n\n // This message handler works for Fastify versions 3, 4 and 5\n diagnosticsChannel.subscribe('fastify.initialization', message => {\n const fastifyInstance = (message as { fastify?: FastifyInstance }).fastify;\n\n fastifyInstance?.register(plugin).after(err => {\n if (err) {\n DEBUG_BUILD && logger.error('Failed to setup Fastify instrumentation', err);\n } else {\n instrumentClient();\n\n if (fastifyInstance) {\n instrumentOnRequest(fastifyInstance);\n }\n }\n });\n });\n\n // Returning this as unknown not to deal with the internal types of the FastifyOtelInstrumentation\n return fastifyOtelInstrumentationInstance as Instrumentation<InstrumentationConfig>;\n});\n\nconst _fastifyIntegration = (() => {\n return {\n name: INTEGRATION_NAME,\n setupOnce() {\n instrumentFastifyV3();\n instrumentFastify();\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Adds Sentry tracing instrumentation for [Fastify](https://fastify.dev/).\n *\n * If you also want to capture errors, you need to call `setupFastifyErrorHandler(app)` after you set up your Fastify server.\n *\n * For more information, see the [fastify documentation](https://docs.sentry.io/platforms/javascript/guides/fastify/).\n *\n * @example\n * ```javascript\n * const Sentry = require('@sentry/node');\n *\n * Sentry.init({\n * integrations: [Sentry.fastifyIntegration()],\n * })\n * ```\n */\nexport const fastifyIntegration = defineIntegration(_fastifyIntegration);\n\n/**\n * Default function to determine if an error should be sent to Sentry\n *\n * 3xx and 4xx errors are not sent by default.\n */\nfunction defaultShouldHandleError(_error: Error, _request: FastifyRequest, reply: FastifyReply): boolean {\n const statusCode = reply.statusCode;\n // 3xx and 4xx errors are not sent by default.\n return statusCode >= 500 || statusCode <= 299;\n}\n\n/**\n * Add an Fastify error handler to capture errors to Sentry.\n *\n * @param fastify The Fastify instance to which to add the error handler\n * @param options Configuration options for the handler\n *\n * @example\n * ```javascript\n * const Sentry = require('@sentry/node');\n * const Fastify = require(\"fastify\");\n *\n * const app = Fastify();\n *\n * Sentry.setupFastifyErrorHandler(app);\n *\n * // Add your routes, etc.\n *\n * app.listen({ port: 3000 });\n * ```\n */\nexport function setupFastifyErrorHandler(fastify: FastifyInstance, options?: Partial<FastifyHandlerOptions>): void {\n const shouldHandleError = options?.shouldHandleError || defaultShouldHandleError;\n\n const plugin = Object.assign(\n function (fastify: FastifyInstance, _options: unknown, done: () => void): void {\n fastify.addHook('onError', async (request, reply, error) => {\n if (shouldHandleError(error, request, reply)) {\n captureException(error);\n }\n });\n\n done();\n },\n {\n [Symbol.for('skip-override')]: true,\n [Symbol.for('fastify.display-name')]: 'sentry-fastify-error-handler',\n },\n );\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n fastify.register(plugin);\n}\n\nfunction addFastifySpanAttributes(span: Span): void {\n const spanJSON = spanToJSON(span);\n const spanName = spanJSON.description;\n const attributes = spanJSON.data;\n\n const type = attributes['fastify.type'];\n\n const isHook = type === 'hook';\n const isHandler = type === spanName?.startsWith('handler -');\n // In @fastify/otel `request-handler` is separated by dash, not underscore\n const isRequestHandler = spanName === 'request' || type === 'request-handler';\n\n // If this is already set, or we have no fastify span, no need to process again...\n if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP] || (!isHandler && !isRequestHandler && !isHook)) {\n return;\n }\n\n const opPrefix = isHook ? 'hook' : isHandler ? 'middleware' : isRequestHandler ? 'request-handler' : '<unknown>';\n\n span.setAttributes({\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.otel.fastify',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${opPrefix}.fastify`,\n });\n\n const attrName = attributes['fastify.name'] || attributes['plugin.name'] || attributes['hook.name'];\n if (typeof attrName === 'string') {\n // Try removing `fastify -> ` and `@fastify/otel -> ` prefixes\n // This is a bit of a hack, and not always working for all spans\n // But it's the best we can do without a proper API\n const updatedName = attrName.replace(/^fastify -> /, '').replace(/^@fastify\\/otel -> /, '');\n\n span.updateName(updatedName);\n }\n}\n\nfunction instrumentClient(): void {\n const client = getClient();\n if (client) {\n client.on('spanStart', (span: Span) => {\n addFastifySpanAttributes(span);\n });\n }\n}\n\nfunction instrumentOnRequest(fastify: FastifyInstance): void {\n fastify.addHook('onRequest', async (request: FastifyRequest & { opentelemetry?: () => { span?: Span } }, _reply) => {\n if (request.opentelemetry) {\n const { span } = request.opentelemetry();\n\n if (span) {\n addFastifySpanAttributes(span);\n }\n }\n\n const routeName = request.routeOptions?.url;\n const method = request.method || 'GET';\n\n getIsolationScope().setTransactionName(`${method} ${routeName}`);\n });\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/integrations/tracing/fastify/index.ts"],"sourcesContent":["import * as diagnosticsChannel from 'node:diagnostics_channel';\nimport type { Instrumentation, InstrumentationConfig } from '@opentelemetry/instrumentation';\nimport type { IntegrationFn, Span } from '@sentry/core';\nimport {\n captureException,\n defineIntegration,\n getClient,\n getIsolationScope,\n logger,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n spanToJSON,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../../../debug-build';\nimport { generateInstrumentOnce } from '../../../otel/instrument';\nimport { FastifyOtelInstrumentation } from './fastify-otel/index';\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from './types';\nimport { FastifyInstrumentationV3 } from './v3/instrumentation';\n\ninterface FastifyHandlerOptions {\n /**\n * Callback method deciding whether error should be captured and sent to Sentry\n *\n * @param error Captured Fastify error\n * @param request Fastify request (or any object containing at least method, routeOptions.url, and routerPath)\n * @param reply Fastify reply (or any object containing at least statusCode)\n *\n * @example\n *\n * ```javascript\n * setupFastifyErrorHandler(app, {\n * shouldHandleError(_error, _request, reply) {\n * return reply.statusCode >= 400;\n * },\n * });\n * ```\n *\n * If using TypeScript, you can cast the request and reply to get full type safety.\n *\n * ```typescript\n * import type { FastifyRequest, FastifyReply } from 'fastify';\n *\n * setupFastifyErrorHandler(app, {\n * shouldHandleError(error, minimalRequest, minimalReply) {\n * const request = minimalRequest as FastifyRequest;\n * const reply = minimalReply as FastifyReply;\n * return reply.statusCode >= 500;\n * },\n * });\n * ```\n */\n shouldHandleError: (error: Error, request: FastifyRequest, reply: FastifyReply) => boolean;\n}\n\nconst INTEGRATION_NAME = 'Fastify';\nconst INTEGRATION_NAME_V3 = 'Fastify-V3';\n\nexport const instrumentFastifyV3 = generateInstrumentOnce(INTEGRATION_NAME_V3, () => new FastifyInstrumentationV3());\n\nexport const instrumentFastify = generateInstrumentOnce(INTEGRATION_NAME, () => {\n const fastifyOtelInstrumentationInstance = new FastifyOtelInstrumentation();\n const plugin = fastifyOtelInstrumentationInstance.plugin();\n\n // This message handler works for Fastify versions 3, 4 and 5\n diagnosticsChannel.subscribe('fastify.initialization', message => {\n const fastifyInstance = (message as { fastify?: FastifyInstance }).fastify;\n\n fastifyInstance?.register(plugin).after(err => {\n if (err) {\n DEBUG_BUILD && logger.error('Failed to setup Fastify instrumentation', err);\n } else {\n instrumentClient();\n\n if (fastifyInstance) {\n instrumentOnRequest(fastifyInstance);\n }\n }\n });\n });\n\n // Returning this as unknown not to deal with the internal types of the FastifyOtelInstrumentation\n return fastifyOtelInstrumentationInstance as Instrumentation<InstrumentationConfig>;\n});\n\nconst _fastifyIntegration = (() => {\n return {\n name: INTEGRATION_NAME,\n setupOnce() {\n instrumentFastifyV3();\n instrumentFastify();\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Adds Sentry tracing instrumentation for [Fastify](https://fastify.dev/).\n *\n * If you also want to capture errors, you need to call `setupFastifyErrorHandler(app)` after you set up your Fastify server.\n *\n * For more information, see the [fastify documentation](https://docs.sentry.io/platforms/javascript/guides/fastify/).\n *\n * @example\n * ```javascript\n * const Sentry = require('@sentry/node');\n *\n * Sentry.init({\n * integrations: [Sentry.fastifyIntegration()],\n * })\n * ```\n */\nexport const fastifyIntegration = defineIntegration(_fastifyIntegration);\n\n/**\n * Default function to determine if an error should be sent to Sentry\n *\n * 3xx and 4xx errors are not sent by default.\n */\nfunction defaultShouldHandleError(_error: Error, _request: FastifyRequest, reply: FastifyReply): boolean {\n const statusCode = reply.statusCode;\n // 3xx and 4xx errors are not sent by default.\n return statusCode >= 500 || statusCode <= 299;\n}\n\n/**\n * Add an Fastify error handler to capture errors to Sentry.\n *\n * @param fastify The Fastify instance to which to add the error handler\n * @param options Configuration options for the handler\n *\n * @example\n * ```javascript\n * const Sentry = require('@sentry/node');\n * const Fastify = require(\"fastify\");\n *\n * const app = Fastify();\n *\n * Sentry.setupFastifyErrorHandler(app);\n *\n * // Add your routes, etc.\n *\n * app.listen({ port: 3000 });\n * ```\n */\nexport function setupFastifyErrorHandler(fastify: FastifyInstance, options?: Partial<FastifyHandlerOptions>): void {\n const shouldHandleError = options?.shouldHandleError || defaultShouldHandleError;\n\n const plugin = Object.assign(\n function (fastify: FastifyInstance, _options: unknown, done: () => void): void {\n fastify.addHook('onError', async (request, reply, error) => {\n if (shouldHandleError(error, request, reply)) {\n captureException(error);\n }\n });\n\n done();\n },\n {\n [Symbol.for('skip-override')]: true,\n [Symbol.for('fastify.display-name')]: 'sentry-fastify-error-handler',\n },\n );\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n fastify.register(plugin);\n}\n\nfunction addFastifySpanAttributes(span: Span): void {\n const spanJSON = spanToJSON(span);\n const spanName = spanJSON.description;\n const attributes = spanJSON.data;\n\n const type = attributes['fastify.type'];\n\n const isHook = type === 'hook';\n const isHandler = type === spanName?.startsWith('handler -');\n // In @fastify/otel `request-handler` is separated by dash, not underscore\n const isRequestHandler = spanName === 'request' || type === 'request-handler';\n\n // If this is already set, or we have no fastify span, no need to process again...\n if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP] || (!isHandler && !isRequestHandler && !isHook)) {\n return;\n }\n\n const opPrefix = isHook ? 'hook' : isHandler ? 'middleware' : isRequestHandler ? 'request-handler' : '<unknown>';\n\n span.setAttributes({\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.otel.fastify',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${opPrefix}.fastify`,\n });\n\n const attrName = attributes['fastify.name'] || attributes['plugin.name'] || attributes['hook.name'];\n if (typeof attrName === 'string') {\n // Try removing `fastify -> ` and `@fastify/otel -> ` prefixes\n // This is a bit of a hack, and not always working for all spans\n // But it's the best we can do without a proper API\n const updatedName = attrName.replace(/^fastify -> /, '').replace(/^@fastify\\/otel -> /, '');\n\n span.updateName(updatedName);\n }\n}\n\nfunction instrumentClient(): void {\n const client = getClient();\n if (client) {\n client.on('spanStart', (span: Span) => {\n addFastifySpanAttributes(span);\n });\n }\n}\n\nfunction instrumentOnRequest(fastify: FastifyInstance): void {\n fastify.addHook('onRequest', async (request: FastifyRequest & { opentelemetry?: () => { span?: Span } }, _reply) => {\n if (request.opentelemetry) {\n const { span } = request.opentelemetry();\n\n if (span) {\n addFastifySpanAttributes(span);\n }\n }\n\n const routeName = request.routeOptions?.url;\n const method = request.method || 'GET';\n\n getIsolationScope().setTransactionName(`${method} ${routeName}`);\n });\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"type":"module","version":"9.19.0","sideEffects":false}
1
+ {"type":"module","version":"9.21.0","sideEffects":false}
@@ -46,6 +46,21 @@ export type SentryHttpInstrumentationOptions = InstrumentationConfig & {
46
46
  * @param request Contains the {@type RequestOptions} object used to make the outgoing request.
47
47
  */
48
48
  ignoreIncomingRequestBody?: (url: string, request: http.RequestOptions) => boolean;
49
+ /**
50
+ * Controls the maximum size of incoming HTTP request bodies attached to events.
51
+ *
52
+ * Available options:
53
+ * - 'none': No request bodies will be attached
54
+ * - 'small': Request bodies up to 1,000 bytes will be attached
55
+ * - 'medium': Request bodies up to 10,000 bytes will be attached (default)
56
+ * - 'always': Request bodies will always be attached
57
+ *
58
+ * Note that even with 'always' setting, bodies exceeding 1MB will never be attached
59
+ * for performance and security reasons.
60
+ *
61
+ * @default 'medium'
62
+ */
63
+ maxIncomingRequestBodySize?: 'none' | 'small' | 'medium' | 'always';
49
64
  /**
50
65
  * Whether the integration should create [Sessions](https://docs.sentry.io/product/releases/health/#sessions) for incoming requests to track the health and crash-free rate of your releases in Sentry.
51
66
  * Read more about Release Health: https://docs.sentry.io/product/releases/health/
@@ -75,6 +90,7 @@ export type SentryHttpInstrumentationOptions = InstrumentationConfig & {
75
90
  */
76
91
  export declare class SentryHttpInstrumentation extends InstrumentationBase<SentryHttpInstrumentationOptions> {
77
92
  private _propagationDecisionMap;
93
+ private _ignoreOutgoingRequestsMap;
78
94
  constructor(config?: SentryHttpInstrumentationOptions);
79
95
  /** @inheritdoc */
80
96
  init(): [InstrumentationNodeModuleDefinition, InstrumentationNodeModuleDefinition];
@@ -93,6 +109,10 @@ export declare class SentryHttpInstrumentation extends InstrumentationBase<Sentr
93
109
  * This will only patch the emit function if it was not already patched.
94
110
  */
95
111
  private _patchServerEmitOnce;
112
+ /**
113
+ * Check if the given outgoing request should be ignored.
114
+ */
115
+ private _shouldIgnoreOutgoingRequest;
96
116
  }
97
117
  /**
98
118
  * Starts a session and tracks it in the context of a given isolation scope.
@@ -1 +1 @@
1
- {"version":3,"file":"SentryHttpInstrumentation.d.ts","sourceRoot":"","sources":["../../../../src/integrations/http/SentryHttpInstrumentation.ts"],"names":[],"mappings":";;AAGA,OAAO,KAAK,KAAK,IAAI,MAAM,WAAW,CAAC;AAEvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,mCAAmC,EAAE,MAAM,gCAAgC,CAAC;AAC1G,OAAO,KAAK,EAAmD,KAAK,EAAE,MAAM,cAAc,CAAC;AA4B3F,MAAM,MAAM,gCAAgC,GAAG,qBAAqB,GAAG;IACrE;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;;;OAMG;IACH,8BAA8B,CAAC,EAAE,OAAO,CAAC;IAEzC;;;;;;OAMG;IACH,gCAAgC,CAAC,EAAE,OAAO,CAAC;IAE3C;;;;;;;;OAQG;IACH,sBAAsB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,cAAc,KAAK,OAAO,CAAC;IAEhF;;;;;;OAMG;IACH,yBAAyB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,cAAc,KAAK,OAAO,CAAC;IAEnF;;;;;OAKG;IACH,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAE1C;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAKF;;;;;;;;;;;;GAYG;AACH,qBAAa,yBAA0B,SAAQ,mBAAmB,CAAC,gCAAgC,CAAC;IAClG,OAAO,CAAC,uBAAuB,CAA0B;gBAEtC,MAAM,GAAE,gCAAqC;IAMhE,kBAAkB;IACX,IAAI,IAAI,CAAC,mCAAmC,EAAE,mCAAmC,CAAC;IA+FzF;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAgBhC;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAuCjC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;CAkF7B;AAgKD;;;;;;;;GAQG;AAEH,wBAAgB,oBAAoB,CAAC,EACnC,qBAAqB,EACrB,QAAQ,EACR,sBAAsB,GACvB,EAAE;IACD,qBAAqB,EAAE,KAAK,CAAC;IAC7B,QAAQ,EAAE,YAAY,CAAC;IACvB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,GAAG,IAAI,CAsDP"}
1
+ {"version":3,"file":"SentryHttpInstrumentation.d.ts","sourceRoot":"","sources":["../../../../src/integrations/http/SentryHttpInstrumentation.ts"],"names":[],"mappings":";;AAGA,OAAO,KAAK,KAAK,IAAI,MAAM,WAAW,CAAC;AAEvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,mCAAmC,EAAE,MAAM,gCAAgC,CAAC;AAC1G,OAAO,KAAK,EAAmD,KAAK,EAAE,MAAM,cAAc,CAAC;AA4B3F,MAAM,MAAM,gCAAgC,GAAG,qBAAqB,GAAG;IACrE;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;;;OAMG;IACH,8BAA8B,CAAC,EAAE,OAAO,CAAC;IAEzC;;;;;;OAMG;IACH,gCAAgC,CAAC,EAAE,OAAO,CAAC;IAE3C;;;;;;;;OAQG;IACH,sBAAsB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,cAAc,KAAK,OAAO,CAAC;IAEhF;;;;;;OAMG;IACH,yBAAyB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,cAAc,KAAK,OAAO,CAAC;IAEnF;;;;;;;;;;;;;OAaG;IACH,0BAA0B,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAEpE;;;;;OAKG;IACH,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAE1C;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAKF;;;;;;;;;;;;GAYG;AACH,qBAAa,yBAA0B,SAAQ,mBAAmB,CAAC,gCAAgC,CAAC;IAClG,OAAO,CAAC,uBAAuB,CAA0B;IACzD,OAAO,CAAC,0BAA0B,CAAuC;gBAEtD,MAAM,GAAE,gCAAqC;IAOhE,kBAAkB;IACX,IAAI,IAAI,CAAC,mCAAmC,EAAE,mCAAmC,CAAC;IAsEzF;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAehC;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAwCjC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAmF5B;;OAEG;IACH,OAAO,CAAC,4BAA4B;CAerC;AAsLD;;;;;;;;GAQG;AAEH,wBAAgB,oBAAoB,CAAC,EACnC,qBAAqB,EACrB,QAAQ,EACR,sBAAsB,GACvB,EAAE;IACD,qBAAqB,EAAE,KAAK,CAAC;IAC7B,QAAQ,EAAE,YAAY,CAAC;IACvB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,GAAG,IAAI,CAsDP"}
@@ -70,6 +70,21 @@ interface HttpOptions {
70
70
  * @param request Contains the {@type RequestOptions} object used to make the outgoing request.
71
71
  */
72
72
  ignoreIncomingRequestBody?: (url: string, request: RequestOptions) => boolean;
73
+ /**
74
+ * Controls the maximum size of incoming HTTP request bodies attached to events.
75
+ *
76
+ * Available options:
77
+ * - 'none': No request bodies will be attached
78
+ * - 'small': Request bodies up to 1,000 bytes will be attached
79
+ * - 'medium': Request bodies up to 10,000 bytes will be attached (default)
80
+ * - 'always': Request bodies will always be attached
81
+ *
82
+ * Note that even with 'always' setting, bodies exceeding 1MB will never be attached
83
+ * for performance and security reasons.
84
+ *
85
+ * @default 'medium'
86
+ */
87
+ maxIncomingRequestBodySize?: 'none' | 'small' | 'medium' | 'always';
73
88
  /**
74
89
  * If true, do not generate spans for incoming requests at all.
75
90
  * This is used by Remix to avoid generating spans for incoming requests, as it generates its own spans.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/integrations/http/index.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhG,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAIzC,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAUrD,UAAU,WAAW;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;;;OAKG;IACH,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAE1C;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC;;;;;;;;;OASG;IACH,sBAAsB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC;IAE3E;;;;;;;;;OASG;IACH,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC;IAEhF;;;;;;OAMG;IACH,sCAAsC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;IAEvE;;;;;;OAMG;IACH,yBAAyB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC;IAE9E;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAEtC;;OAEG;IACH,eAAe,CAAC,EAAE;QAChB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,GAAG,gCAAgC,KAAK,IAAI,CAAC;QAC1F,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,gCAAgC,GAAG,cAAc,KAAK,IAAI,CAAC;QACjG,2BAA2B,CAAC,EAAE,CAC5B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,aAAa,GAAG,gCAAgC,EACzD,QAAQ,EAAE,gCAAgC,GAAG,cAAc,KACxD,IAAI,CAAC;QAEV;;;WAGG;QACH,mBAAmB,CAAC,EAAE,qBAAqB,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;KAC5E,CAAC;CACH;AASD,eAAO,MAAM,kBAAkB;;CAe7B,CAAC;AAEH,+BAA+B;AAC/B,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,GAAE,OAAO,CAAC,iBAAiB,CAAM,GAAG,OAAO,CAIpH;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,2EA+C1B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/integrations/http/index.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhG,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAIzC,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAUrD,UAAU,WAAW;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;;;OAKG;IACH,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAE1C;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC;;;;;;;;;OASG;IACH,sBAAsB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC;IAE3E;;;;;;;;;OASG;IACH,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC;IAEhF;;;;;;OAMG;IACH,sCAAsC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;IAEvE;;;;;;OAMG;IACH,yBAAyB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC;IAE9E;;;;;;;;;;;;;OAaG;IACH,0BAA0B,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAEpE;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAEtC;;OAEG;IACH,eAAe,CAAC,EAAE;QAChB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,GAAG,gCAAgC,KAAK,IAAI,CAAC;QAC1F,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,gCAAgC,GAAG,cAAc,KAAK,IAAI,CAAC;QACjG,2BAA2B,CAAC,EAAE,CAC5B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,aAAa,GAAG,gCAAgC,EACzD,QAAQ,EAAE,gCAAgC,GAAG,cAAc,KACxD,IAAI,CAAC;QAEV;;;WAGG;QACH,mBAAmB,CAAC,EAAE,qBAAqB,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;KAC5E,CAAC;CACH;AASD,eAAO,MAAM,kBAAkB;;CAe7B,CAAC;AAEH,+BAA+B;AAC/B,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,GAAE,OAAO,CAAC,iBAAiB,CAAM,GAAG,OAAO,CAIpH;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,2EA+C1B,CAAC"}
@@ -29,6 +29,7 @@ export type SentryNodeFetchInstrumentationOptions = InstrumentationConfig & {
29
29
  export declare class SentryNodeFetchInstrumentation extends InstrumentationBase<SentryNodeFetchInstrumentationOptions> {
30
30
  private _channelSubs;
31
31
  private _propagationDecisionMap;
32
+ private _ignoreOutgoingRequestsMap;
32
33
  constructor(config?: SentryNodeFetchInstrumentationOptions);
33
34
  /** No need to instrument files/modules. */
34
35
  init(): void;
@@ -47,5 +48,9 @@ export declare class SentryNodeFetchInstrumentation extends InstrumentationBase<
47
48
  private _onResponseHeaders;
48
49
  /** Subscribe to a diagnostics channel. */
49
50
  private _subscribeToChannel;
51
+ /**
52
+ * Check if the given outgoing request should be ignored.
53
+ */
54
+ private _shouldIgnoreOutgoingRequest;
50
55
  }
51
56
  //# sourceMappingURL=SentryNodeFetchInstrumentation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SentryNodeFetchInstrumentation.d.ts","sourceRoot":"","sources":["../../../../src/integrations/node-fetch/SentryNodeFetchInstrumentation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAuBrE,MAAM,MAAM,qCAAqC,GAAG,qBAAqB,GAAG;IAC1E;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;;;OAMG;IACH,sBAAsB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CACnD,CAAC;AAOF;;;;;;;;;GASG;AACH,qBAAa,8BAA+B,SAAQ,mBAAmB,CAAC,qCAAqC,CAAC;IAG5G,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,uBAAuB,CAA0B;gBAEtC,MAAM,GAAE,qCAA0C;IAMrE,2CAA2C;IACpC,IAAI,IAAI,IAAI;IAInB,mCAAmC;IAC5B,OAAO,IAAI,IAAI;IAMtB,kCAAkC;IAC3B,MAAM,IAAI,IAAI;IAyBrB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAyEzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAsB1B,0CAA0C;IAC1C,OAAO,CAAC,mBAAmB;CAuB5B"}
1
+ {"version":3,"file":"SentryNodeFetchInstrumentation.d.ts","sourceRoot":"","sources":["../../../../src/integrations/node-fetch/SentryNodeFetchInstrumentation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAuBrE,MAAM,MAAM,qCAAqC,GAAG,qBAAqB,GAAG;IAC1E;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;;;OAMG;IACH,sBAAsB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CACnD,CAAC;AAOF;;;;;;;;;GASG;AACH,qBAAa,8BAA+B,SAAQ,mBAAmB,CAAC,qCAAqC,CAAC;IAG5G,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,uBAAuB,CAA0B;IACzD,OAAO,CAAC,0BAA0B,CAAkC;gBAEjD,MAAM,GAAE,qCAA0C;IAOrE,2CAA2C;IACpC,IAAI,IAAI,IAAI;IAInB,mCAAmC;IAC5B,OAAO,IAAI,IAAI;IAMtB,kCAAkC;IAC3B,MAAM,IAAI,IAAI;IAyBrB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IA2EzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkB1B,0CAA0C;IAC1C,OAAO,CAAC,mBAAmB;IAwB3B;;OAEG;IACH,OAAO,CAAC,4BAA4B;CAerC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/integrations/tracing/fastify/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAc7F,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,UAAU,qBAAqB;IAC7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,iBAAiB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC;CAC5F;AAKD,eAAO,MAAM,mBAAmB;;CAAoF,CAAC;AAErH,eAAO,MAAM,iBAAiB;;CAuB5B,CAAC;AAYH;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,kBAAkB,0CAAyC,CAAC;AAazE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAqBjH"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/integrations/tracing/fastify/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAe7F,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,UAAU,qBAAqB;IAC7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,iBAAiB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC;CAC5F;AAKD,eAAO,MAAM,mBAAmB;;CAAoF,CAAC;AAErH,eAAO,MAAM,iBAAiB;;CAuB5B,CAAC;AAYH;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,kBAAkB,0CAAyC,CAAC;AAazE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAqBjH"}
@@ -45,6 +45,21 @@ export type SentryHttpInstrumentationOptions = InstrumentationConfig & {
45
45
  * @param request Contains the {@type RequestOptions} object used to make the outgoing request.
46
46
  */
47
47
  ignoreIncomingRequestBody?: (url: string, request: http.RequestOptions) => boolean;
48
+ /**
49
+ * Controls the maximum size of incoming HTTP request bodies attached to events.
50
+ *
51
+ * Available options:
52
+ * - 'none': No request bodies will be attached
53
+ * - 'small': Request bodies up to 1,000 bytes will be attached
54
+ * - 'medium': Request bodies up to 10,000 bytes will be attached (default)
55
+ * - 'always': Request bodies will always be attached
56
+ *
57
+ * Note that even with 'always' setting, bodies exceeding 1MB will never be attached
58
+ * for performance and security reasons.
59
+ *
60
+ * @default 'medium'
61
+ */
62
+ maxIncomingRequestBodySize?: 'none' | 'small' | 'medium' | 'always';
48
63
  /**
49
64
  * Whether the integration should create [Sessions](https://docs.sentry.io/product/releases/health/#sessions) for incoming requests to track the health and crash-free rate of your releases in Sentry.
50
65
  * Read more about Release Health: https://docs.sentry.io/product/releases/health/
@@ -74,6 +89,7 @@ export type SentryHttpInstrumentationOptions = InstrumentationConfig & {
74
89
  */
75
90
  export declare class SentryHttpInstrumentation extends InstrumentationBase<SentryHttpInstrumentationOptions> {
76
91
  private _propagationDecisionMap;
92
+ private _ignoreOutgoingRequestsMap;
77
93
  constructor(config?: SentryHttpInstrumentationOptions);
78
94
  /** @inheritdoc */
79
95
  init(): [
@@ -95,6 +111,10 @@ export declare class SentryHttpInstrumentation extends InstrumentationBase<Sentr
95
111
  * This will only patch the emit function if it was not already patched.
96
112
  */
97
113
  private _patchServerEmitOnce;
114
+ /**
115
+ * Check if the given outgoing request should be ignored.
116
+ */
117
+ private _shouldIgnoreOutgoingRequest;
98
118
  }
99
119
  /**
100
120
  * Starts a session and tracks it in the context of a given isolation scope.
@@ -73,6 +73,21 @@ interface HttpOptions {
73
73
  * @param request Contains the {@type RequestOptions} object used to make the outgoing request.
74
74
  */
75
75
  ignoreIncomingRequestBody?: (url: string, request: RequestOptions) => boolean;
76
+ /**
77
+ * Controls the maximum size of incoming HTTP request bodies attached to events.
78
+ *
79
+ * Available options:
80
+ * - 'none': No request bodies will be attached
81
+ * - 'small': Request bodies up to 1,000 bytes will be attached
82
+ * - 'medium': Request bodies up to 10,000 bytes will be attached (default)
83
+ * - 'always': Request bodies will always be attached
84
+ *
85
+ * Note that even with 'always' setting, bodies exceeding 1MB will never be attached
86
+ * for performance and security reasons.
87
+ *
88
+ * @default 'medium'
89
+ */
90
+ maxIncomingRequestBodySize?: 'none' | 'small' | 'medium' | 'always';
76
91
  /**
77
92
  * If true, do not generate spans for incoming requests at all.
78
93
  * This is used by Remix to avoid generating spans for incoming requests, as it generates its own spans.
@@ -29,6 +29,7 @@ export type SentryNodeFetchInstrumentationOptions = InstrumentationConfig & {
29
29
  export declare class SentryNodeFetchInstrumentation extends InstrumentationBase<SentryNodeFetchInstrumentationOptions> {
30
30
  private _channelSubs;
31
31
  private _propagationDecisionMap;
32
+ private _ignoreOutgoingRequestsMap;
32
33
  constructor(config?: SentryNodeFetchInstrumentationOptions);
33
34
  /** No need to instrument files/modules. */
34
35
  init(): void;
@@ -47,5 +48,9 @@ export declare class SentryNodeFetchInstrumentation extends InstrumentationBase<
47
48
  private _onResponseHeaders;
48
49
  /** Subscribe to a diagnostics channel. */
49
50
  private _subscribeToChannel;
51
+ /**
52
+ * Check if the given outgoing request should be ignored.
53
+ */
54
+ private _shouldIgnoreOutgoingRequest;
50
55
  }
51
56
  //# sourceMappingURL=SentryNodeFetchInstrumentation.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/node",
3
- "version": "9.19.0",
3
+ "version": "9.21.0",
4
4
  "description": "Sentry Node SDK using OpenTelemetry for performance instrumentation",
5
5
  "repository": "git://github.com/getsentry/sentry-javascript.git",
6
6
  "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/node",
@@ -65,7 +65,6 @@
65
65
  "access": "public"
66
66
  },
67
67
  "dependencies": {
68
- "@fastify/otel": "https://codeload.github.com/getsentry/fastify-otel/tar.gz/ae3088d65e286bdc94ac5d722573537d6a6671bb",
69
68
  "@opentelemetry/api": "^1.9.0",
70
69
  "@opentelemetry/context-async-hooks": "^1.30.1",
71
70
  "@opentelemetry/core": "^1.30.1",
@@ -96,9 +95,10 @@
96
95
  "@opentelemetry/sdk-trace-base": "^1.30.1",
97
96
  "@opentelemetry/semantic-conventions": "^1.30.0",
98
97
  "@prisma/instrumentation": "6.7.0",
99
- "@sentry/core": "9.19.0",
100
- "@sentry/opentelemetry": "9.19.0",
101
- "import-in-the-middle": "^1.13.1"
98
+ "@sentry/core": "9.21.0",
99
+ "@sentry/opentelemetry": "9.21.0",
100
+ "import-in-the-middle": "^1.13.1",
101
+ "minimatch": "^9.0.0"
102
102
  },
103
103
  "devDependencies": {
104
104
  "@types/node": "^18.19.1"
@@ -1,14 +0,0 @@
1
- /**
2
- * This is a minimal version of `wrap` from shimmer:
3
- * https://github.com/othiym23/shimmer/blob/master/index.js
4
- *
5
- * In contrast to the original implementation, this version does not allow to unwrap,
6
- * and does not make it clear that the method is wrapped.
7
- * This is necessary because we want to wrap the http module with our own code,
8
- * while still allowing to use the HttpInstrumentation from OTEL.
9
- *
10
- * Without this, if we'd just use `wrap` from shimmer, the OTEL instrumentation would remove our wrapping,
11
- * because it only allows any module to be wrapped a single time.
12
- */
13
- export declare function stealthWrap<Nodule extends object, FieldName extends keyof Nodule>(nodule: Nodule, name: FieldName, wrapper: (original: Nodule[FieldName]) => Nodule[FieldName]): Nodule[FieldName];
14
- //# sourceMappingURL=utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/integrations/http/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,MAAM,SAAS,MAAM,EAAE,SAAS,SAAS,MAAM,MAAM,EAC/E,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC,GAC1D,MAAM,CAAC,SAAS,CAAC,CAMnB"}
@@ -1,14 +0,0 @@
1
- /**
2
- * This is a minimal version of `wrap` from shimmer:
3
- * https://github.com/othiym23/shimmer/blob/master/index.js
4
- *
5
- * In contrast to the original implementation, this version does not allow to unwrap,
6
- * and does not make it clear that the method is wrapped.
7
- * This is necessary because we want to wrap the http module with our own code,
8
- * while still allowing to use the HttpInstrumentation from OTEL.
9
- *
10
- * Without this, if we'd just use `wrap` from shimmer, the OTEL instrumentation would remove our wrapping,
11
- * because it only allows any module to be wrapped a single time.
12
- */
13
- export declare function stealthWrap<Nodule extends object, FieldName extends keyof Nodule>(nodule: Nodule, name: FieldName, wrapper: (original: Nodule[FieldName]) => Nodule[FieldName]): Nodule[FieldName];
14
- //# sourceMappingURL=utils.d.ts.map