@sentry/nitro 11.0.0-alpha.0 → 11.0.0-alpha.2

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.
@@ -1 +1 @@
1
- {"type":"module","version":"11.0.0-alpha.0","sideEffects":false}
1
+ {"type":"module","version":"11.0.0-alpha.2","sideEffects":false}
@@ -1,6 +1,6 @@
1
1
  import * as dc from 'node:diagnostics_channel';
2
2
  import { SENTRY_OP } from '@sentry/conventions/attributes';
3
- import { DATABASE_CACHE_REMOVE_SPAN_OP, DATABASE_CACHE_PUT_SPAN_OP, DATABASE_CACHE_GET_SPAN_OP } from '@sentry/conventions/op';
3
+ import { CACHE_REMOVE, CACHE_PUT, CACHE_GET } from '@sentry/conventions/op';
4
4
  import { GLOBAL_OBJ, startInactiveSpan, SEMANTIC_ATTRIBUTE_CACHE_KEY, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_CACHE_HIT, flushIfServerless, isObjectLike } from '@sentry/core';
5
5
  import { bindTracingChannelToSpan } from '@sentry/server-utils';
6
6
 
@@ -20,16 +20,16 @@ const TRACED_OPERATIONS = [
20
20
  ];
21
21
  const CACHE_HIT_OPERATIONS = /* @__PURE__ */ new Set(["hasItem", "getItem", "getItemRaw", "getItems"]);
22
22
  const OPERATION_SPAN_OPS = {
23
- hasItem: DATABASE_CACHE_GET_SPAN_OP,
24
- getItem: DATABASE_CACHE_GET_SPAN_OP,
25
- getItemRaw: DATABASE_CACHE_GET_SPAN_OP,
26
- getItems: DATABASE_CACHE_GET_SPAN_OP,
27
- getKeys: DATABASE_CACHE_GET_SPAN_OP,
28
- setItem: DATABASE_CACHE_PUT_SPAN_OP,
29
- setItemRaw: DATABASE_CACHE_PUT_SPAN_OP,
30
- setItems: DATABASE_CACHE_PUT_SPAN_OP,
31
- removeItem: DATABASE_CACHE_REMOVE_SPAN_OP,
32
- clear: DATABASE_CACHE_REMOVE_SPAN_OP
23
+ hasItem: CACHE_GET,
24
+ getItem: CACHE_GET,
25
+ getItemRaw: CACHE_GET,
26
+ getItems: CACHE_GET,
27
+ getKeys: CACHE_GET,
28
+ setItem: CACHE_PUT,
29
+ setItemRaw: CACHE_PUT,
30
+ setItems: CACHE_PUT,
31
+ removeItem: CACHE_REMOVE,
32
+ clear: CACHE_REMOVE
33
33
  };
34
34
  const CACHED_FN_HANDLERS_RE = /^nitro:(functions|handlers):/i;
35
35
  function captureStorageEvents() {
@@ -1 +1 @@
1
- {"version":3,"file":"captureStorageEvents.js","sources":["../../../../src/runtime/hooks/captureStorageEvents.ts"],"sourcesContent":["import * as dc from 'node:diagnostics_channel';\nimport { SENTRY_OP } from '@sentry/conventions/attributes';\nimport {\n DATABASE_CACHE_GET_SPAN_OP,\n DATABASE_CACHE_PUT_SPAN_OP,\n DATABASE_CACHE_REMOVE_SPAN_OP,\n} from '@sentry/conventions/op';\nimport {\n flushIfServerless,\n GLOBAL_OBJ,\n isObjectLike,\n SEMANTIC_ATTRIBUTE_CACHE_HIT,\n SEMANTIC_ATTRIBUTE_CACHE_KEY,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n startInactiveSpan,\n} from '@sentry/core';\nimport { bindTracingChannelToSpan } from '@sentry/server-utils';\nimport type { TraceContext } from 'unstorage/tracing';\n\nconst ORIGIN = 'auto.cache.nitro';\n\nconst globalWithStorageChannels = GLOBAL_OBJ as typeof GLOBAL_OBJ & {\n __SENTRY_NITRO_STORAGE_CHANNELS_INSTRUMENTED__: boolean;\n};\n\nconst TRACED_OPERATIONS = [\n 'hasItem',\n 'getItem',\n 'getItemRaw',\n 'getItems',\n 'setItem',\n 'setItemRaw',\n 'setItems',\n 'removeItem',\n 'getKeys',\n 'clear',\n] as const;\n\ntype TracedOperation = (typeof TRACED_OPERATIONS)[number];\n\nconst CACHE_HIT_OPERATIONS = new Set<TracedOperation>(['hasItem', 'getItem', 'getItemRaw', 'getItems']);\n\n/**\n * Maps each unstorage operation to a convention cache op. Reads (including existence and key\n * listing) are `cache.get`, writes are `cache.put`, and deletions are `cache.remove`.\n * The precise operation stays available on `db.operation.name`.\n */\nconst OPERATION_SPAN_OPS = {\n hasItem: DATABASE_CACHE_GET_SPAN_OP,\n getItem: DATABASE_CACHE_GET_SPAN_OP,\n getItemRaw: DATABASE_CACHE_GET_SPAN_OP,\n getItems: DATABASE_CACHE_GET_SPAN_OP,\n getKeys: DATABASE_CACHE_GET_SPAN_OP,\n setItem: DATABASE_CACHE_PUT_SPAN_OP,\n setItemRaw: DATABASE_CACHE_PUT_SPAN_OP,\n setItems: DATABASE_CACHE_PUT_SPAN_OP,\n removeItem: DATABASE_CACHE_REMOVE_SPAN_OP,\n clear: DATABASE_CACHE_REMOVE_SPAN_OP,\n} as const satisfies Record<TracedOperation, string>;\n\nconst CACHED_FN_HANDLERS_RE = /^nitro:(functions|handlers):/i;\n\n/**\n * Subscribes to unstorage tracing channels and creates Sentry spans for storage operations.\n */\nexport function captureStorageEvents(): void {\n if (globalWithStorageChannels.__SENTRY_NITRO_STORAGE_CHANNELS_INSTRUMENTED__) {\n return;\n }\n\n for (const operation of TRACED_OPERATIONS) {\n setupStorageTracingChannel(operation);\n }\n\n globalWithStorageChannels.__SENTRY_NITRO_STORAGE_CHANNELS_INSTRUMENTED__ = true;\n}\n\nfunction setupStorageTracingChannel(operation: TracedOperation): void {\n const keys = (data: TraceContext): string[] => data.keys ?? [];\n const mountBase = (data: TraceContext): string => (data.base ?? '').replace(/:$/, '');\n\n // Bail if this is not available\n if (!dc.tracingChannel) {\n return;\n }\n\n bindTracingChannelToSpan(\n dc.tracingChannel<TraceContext>(`unstorage.${operation}`),\n data => {\n const cacheKeys = keys(data);\n\n return startInactiveSpan({\n name: cacheKeys.join(', ') || operation,\n attributes: {\n [SENTRY_OP]: OPERATION_SPAN_OPS[operation],\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n [SEMANTIC_ATTRIBUTE_CACHE_KEY]: cacheKeys.length > 1 ? cacheKeys : cacheKeys[0],\n 'db.operation.name': operation,\n 'db.collection.name': mountBase(data),\n 'db.system.name': data.driver?.name ?? 'unknown',\n },\n });\n },\n {\n beforeSpanEnd(span, data) {\n // Error status is set by the binding; the error itself is captured at the request boundary,\n // not here (cache ops aren't an error boundary). Only enrich the success path.\n if (!('error' in data)) {\n const result = (data as { result?: unknown }).result;\n if (CACHE_HIT_OPERATIONS.has(operation)) {\n span.setAttribute(SEMANTIC_ATTRIBUTE_CACHE_HIT, resolveCacheHit(operation, data.keys?.[0], result));\n }\n }\n\n void flushIfServerless();\n },\n },\n );\n}\n\n/**\n * Resolves the `cache.hit` value for a read operation. `hasItem` returns a boolean directly,\n * `getItems` returns a `{ key, value }[]` where a hit means at least one entry has a value,\n * and single-key reads fall back to the value-based `isCacheHit` check.\n */\nfunction resolveCacheHit(operation: TracedOperation, key: unknown, result: unknown): boolean {\n if (operation === 'hasItem') {\n return Boolean(result);\n }\n\n if (operation === 'getItems') {\n return Array.isArray(result) && result.some(item => isObjectLike(item) && item.value != null);\n }\n\n return isCacheHit(key, result);\n}\n\ninterface CacheEntry<T = unknown> {\n value?: T;\n expires?: number;\n}\n\ninterface ResponseCacheEntry {\n status?: number;\n body?: unknown;\n headers?: Record<string, string | undefined>;\n}\n\nfunction isCacheHit(key: unknown, value: unknown): boolean {\n try {\n const isEmpty = value == null;\n if (isEmpty || typeof key !== 'string' || !CACHED_FN_HANDLERS_RE.test(key)) {\n return !isEmpty;\n }\n\n const entry = typeof value === 'string' ? (JSON.parse(value) as CacheEntry) : (value as CacheEntry);\n\n return validateCacheEntry(key, entry);\n } catch {\n return false;\n }\n}\n\nfunction validateCacheEntry(\n key: string,\n entry: CacheEntry | CacheEntry<ResponseCacheEntry & { status: number }>,\n): boolean {\n if (entry.value == null) {\n return false;\n }\n\n if (Date.now() > (entry.expires || 0)) {\n return false;\n }\n\n if (isResponseCacheEntry(key, entry)) {\n if ((entry.value.status ?? 0) >= 400) {\n return false;\n }\n\n if (entry.value.body === undefined) {\n return false;\n }\n\n if (entry.value.headers?.etag === 'undefined' || entry.value.headers?.['last-modified'] === 'undefined') {\n return false;\n }\n }\n\n return true;\n}\n\nfunction isResponseCacheEntry(key: string, _: CacheEntry): _ is CacheEntry<ResponseCacheEntry & { status: number }> {\n return key.startsWith('nitro:handlers:');\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"captureStorageEvents.js","sources":["../../../../src/runtime/hooks/captureStorageEvents.ts"],"sourcesContent":["import * as dc from 'node:diagnostics_channel';\nimport { SENTRY_OP } from '@sentry/conventions/attributes';\nimport { CACHE_GET, CACHE_PUT, CACHE_REMOVE } from '@sentry/conventions/op';\nimport {\n flushIfServerless,\n GLOBAL_OBJ,\n isObjectLike,\n SEMANTIC_ATTRIBUTE_CACHE_HIT,\n SEMANTIC_ATTRIBUTE_CACHE_KEY,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n startInactiveSpan,\n} from '@sentry/core';\nimport { bindTracingChannelToSpan } from '@sentry/server-utils';\nimport type { TraceContext } from 'unstorage/tracing';\n\nconst ORIGIN = 'auto.cache.nitro';\n\nconst globalWithStorageChannels = GLOBAL_OBJ as typeof GLOBAL_OBJ & {\n __SENTRY_NITRO_STORAGE_CHANNELS_INSTRUMENTED__: boolean;\n};\n\nconst TRACED_OPERATIONS = [\n 'hasItem',\n 'getItem',\n 'getItemRaw',\n 'getItems',\n 'setItem',\n 'setItemRaw',\n 'setItems',\n 'removeItem',\n 'getKeys',\n 'clear',\n] as const;\n\ntype TracedOperation = (typeof TRACED_OPERATIONS)[number];\n\nconst CACHE_HIT_OPERATIONS = new Set<TracedOperation>(['hasItem', 'getItem', 'getItemRaw', 'getItems']);\n\n/**\n * Maps each unstorage operation to a convention cache op. Reads (including existence and key\n * listing) are `cache.get`, writes are `cache.put`, and deletions are `cache.remove`.\n * The precise operation stays available on `db.operation.name`.\n */\nconst OPERATION_SPAN_OPS = {\n hasItem: CACHE_GET,\n getItem: CACHE_GET,\n getItemRaw: CACHE_GET,\n getItems: CACHE_GET,\n getKeys: CACHE_GET,\n setItem: CACHE_PUT,\n setItemRaw: CACHE_PUT,\n setItems: CACHE_PUT,\n removeItem: CACHE_REMOVE,\n clear: CACHE_REMOVE,\n} as const satisfies Record<TracedOperation, string>;\n\nconst CACHED_FN_HANDLERS_RE = /^nitro:(functions|handlers):/i;\n\n/**\n * Subscribes to unstorage tracing channels and creates Sentry spans for storage operations.\n */\nexport function captureStorageEvents(): void {\n if (globalWithStorageChannels.__SENTRY_NITRO_STORAGE_CHANNELS_INSTRUMENTED__) {\n return;\n }\n\n for (const operation of TRACED_OPERATIONS) {\n setupStorageTracingChannel(operation);\n }\n\n globalWithStorageChannels.__SENTRY_NITRO_STORAGE_CHANNELS_INSTRUMENTED__ = true;\n}\n\nfunction setupStorageTracingChannel(operation: TracedOperation): void {\n const keys = (data: TraceContext): string[] => data.keys ?? [];\n const mountBase = (data: TraceContext): string => (data.base ?? '').replace(/:$/, '');\n\n // Bail if this is not available\n if (!dc.tracingChannel) {\n return;\n }\n\n bindTracingChannelToSpan(\n dc.tracingChannel<TraceContext>(`unstorage.${operation}`),\n data => {\n const cacheKeys = keys(data);\n\n return startInactiveSpan({\n name: cacheKeys.join(', ') || operation,\n attributes: {\n [SENTRY_OP]: OPERATION_SPAN_OPS[operation],\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: ORIGIN,\n [SEMANTIC_ATTRIBUTE_CACHE_KEY]: cacheKeys.length > 1 ? cacheKeys : cacheKeys[0],\n 'db.operation.name': operation,\n 'db.collection.name': mountBase(data),\n 'db.system.name': data.driver?.name ?? 'unknown',\n },\n });\n },\n {\n beforeSpanEnd(span, data) {\n // Error status is set by the binding; the error itself is captured at the request boundary,\n // not here (cache ops aren't an error boundary). Only enrich the success path.\n if (!('error' in data)) {\n const result = (data as { result?: unknown }).result;\n if (CACHE_HIT_OPERATIONS.has(operation)) {\n span.setAttribute(SEMANTIC_ATTRIBUTE_CACHE_HIT, resolveCacheHit(operation, data.keys?.[0], result));\n }\n }\n\n void flushIfServerless();\n },\n },\n );\n}\n\n/**\n * Resolves the `cache.hit` value for a read operation. `hasItem` returns a boolean directly,\n * `getItems` returns a `{ key, value }[]` where a hit means at least one entry has a value,\n * and single-key reads fall back to the value-based `isCacheHit` check.\n */\nfunction resolveCacheHit(operation: TracedOperation, key: unknown, result: unknown): boolean {\n if (operation === 'hasItem') {\n return Boolean(result);\n }\n\n if (operation === 'getItems') {\n return Array.isArray(result) && result.some(item => isObjectLike(item) && item.value != null);\n }\n\n return isCacheHit(key, result);\n}\n\ninterface CacheEntry<T = unknown> {\n value?: T;\n expires?: number;\n}\n\ninterface ResponseCacheEntry {\n status?: number;\n body?: unknown;\n headers?: Record<string, string | undefined>;\n}\n\nfunction isCacheHit(key: unknown, value: unknown): boolean {\n try {\n const isEmpty = value == null;\n if (isEmpty || typeof key !== 'string' || !CACHED_FN_HANDLERS_RE.test(key)) {\n return !isEmpty;\n }\n\n const entry = typeof value === 'string' ? (JSON.parse(value) as CacheEntry) : (value as CacheEntry);\n\n return validateCacheEntry(key, entry);\n } catch {\n return false;\n }\n}\n\nfunction validateCacheEntry(\n key: string,\n entry: CacheEntry | CacheEntry<ResponseCacheEntry & { status: number }>,\n): boolean {\n if (entry.value == null) {\n return false;\n }\n\n if (Date.now() > (entry.expires || 0)) {\n return false;\n }\n\n if (isResponseCacheEntry(key, entry)) {\n if ((entry.value.status ?? 0) >= 400) {\n return false;\n }\n\n if (entry.value.body === undefined) {\n return false;\n }\n\n if (entry.value.headers?.etag === 'undefined' || entry.value.headers?.['last-modified'] === 'undefined') {\n return false;\n }\n }\n\n return true;\n}\n\nfunction isResponseCacheEntry(key: string, _: CacheEntry): _ is CacheEntry<ResponseCacheEntry & { status: number }> {\n return key.startsWith('nitro:handlers:');\n}\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import * as dc from 'node:diagnostics_channel';
2
- import { SENTRY_OP } from '@sentry/conventions/attributes';
3
- import { WEB_SERVER_MIDDLEWARE_SPAN_OP, WEB_SERVER_HTTP_SERVER_SPAN_OP } from '@sentry/conventions/op';
4
- import { GLOBAL_OBJ, parseStringToURLObject, getHttpSpanDetailsFromUrlObject, startInactiveSpan, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, getClient, httpHeadersToSpanAttributes, getActiveSpan, getRootSpan, isObjectLike, setHttpStatus } from '@sentry/core';
2
+ import { SENTRY_SEGMENT_NAME_SOURCE, SENTRY_OP } from '@sentry/conventions/attributes';
3
+ import { MIDDLEWARE, HTTP_SERVER } from '@sentry/conventions/op';
4
+ import { GLOBAL_OBJ, parseStringToURLObject, getHttpSpanDetailsFromUrlObject, getClient, hasSpanStreamingEnabled, startInactiveSpan, HTTP_SPAN_NAME_FALLBACK, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, httpHeadersToSpanAttributes, getActiveSpan, getRootSpan, isObjectLike, setHttpStatus } from '@sentry/core';
5
5
  import { bindTracingChannelToSpan, setHttpServerSpanRouteAttribute } from '@sentry/server-utils';
6
6
  import { setServerTimingHeaders } from './setServerTimingHeaders.js';
7
7
 
@@ -53,12 +53,14 @@ function setupH3TracingChannels() {
53
53
  { method: data.event.req.method },
54
54
  routePattern
55
55
  );
56
+ const client = getClient();
57
+ const isUnparameterizedStreamedServerSpan = data?.type !== "middleware" && urlAttributes[SENTRY_SEGMENT_NAME_SOURCE] !== "route" && !!client && hasSpanStreamingEnabled(client);
56
58
  const span = startInactiveSpan({
57
- name: spanName,
59
+ name: isUnparameterizedStreamedServerSpan ? data.event.req.method?.toUpperCase() || HTTP_SPAN_NAME_FALLBACK : spanName,
58
60
  attributes: {
59
61
  ...urlAttributes,
60
62
  [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.http.nitro.h3",
61
- [SENTRY_OP]: data?.type === "middleware" ? WEB_SERVER_MIDDLEWARE_SPAN_OP : WEB_SERVER_HTTP_SERVER_SPAN_OP
63
+ [SENTRY_OP]: data?.type === "middleware" ? MIDDLEWARE : HTTP_SERVER
62
64
  }
63
65
  });
64
66
  setParameterizedRouteAttributes(span, data.event);
@@ -108,13 +110,14 @@ function setupSrvxTracingChannels() {
108
110
  Object.fromEntries(data.request.headers.entries()),
109
111
  client.getDataCollectionOptions()
110
112
  ) : {};
113
+ const isUnparameterizedStreamedServerSpan = !data.middleware && urlAttributes[SENTRY_SEGMENT_NAME_SOURCE] !== "route" && !!client && hasSpanStreamingEnabled(client);
111
114
  return startInactiveSpan({
112
- name: spanName,
115
+ name: isUnparameterizedStreamedServerSpan ? data.request.method?.toUpperCase() || HTTP_SPAN_NAME_FALLBACK : spanName,
113
116
  attributes: {
114
117
  ...urlAttributes,
115
118
  ...headerAttributes,
116
119
  [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.http.nitro.srvx",
117
- [SENTRY_OP]: data.middleware ? WEB_SERVER_MIDDLEWARE_SPAN_OP : WEB_SERVER_HTTP_SERVER_SPAN_OP,
120
+ [SENTRY_OP]: data.middleware ? MIDDLEWARE : HTTP_SERVER,
118
121
  "server.port": data.server.options.port
119
122
  },
120
123
  // Use the same parent span as middleware to make them siblings
@@ -146,7 +149,7 @@ function setupSrvxTracingChannels() {
146
149
  attributes: {
147
150
  ...urlAttributes,
148
151
  [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.http.nitro.srvx",
149
- [SENTRY_OP]: WEB_SERVER_MIDDLEWARE_SPAN_OP
152
+ [SENTRY_OP]: MIDDLEWARE
150
153
  },
151
154
  parentSpan: requestParentSpans.get(data.request) || void 0
152
155
  });
@@ -1 +1 @@
1
- {"version":3,"file":"captureTracingEvents.js","sources":["../../../../src/runtime/hooks/captureTracingEvents.ts"],"sourcesContent":["import * as dc from 'node:diagnostics_channel';\nimport { SENTRY_OP } from '@sentry/conventions/attributes';\nimport { WEB_SERVER_HTTP_SERVER_SPAN_OP, WEB_SERVER_MIDDLEWARE_SPAN_OP } from '@sentry/conventions/op';\nimport {\n isObjectLike,\n getActiveSpan,\n getClient,\n getHttpSpanDetailsFromUrlObject,\n getRootSpan,\n GLOBAL_OBJ,\n httpHeadersToSpanAttributes,\n parseStringToURLObject,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n setHttpStatus,\n type Span,\n startInactiveSpan,\n} from '@sentry/core';\nimport {\n bindTracingChannelToSpan,\n setHttpServerSpanRouteAttribute,\n type TracingChannelPayloadWithSpan,\n} from '@sentry/server-utils';\nimport type { TracingRequestEvent as H3TracingRequestEvent } from 'h3/tracing';\nimport type { RequestEvent as SrvxRequestEvent } from 'srvx/tracing';\nimport { setServerTimingHeaders } from './setServerTimingHeaders';\n\n/**\n * Global object with the trace channels\n */\nconst globalWithTraceChannels = GLOBAL_OBJ as typeof GLOBAL_OBJ & {\n __SENTRY_NITRO_HTTP_CHANNELS_INSTRUMENTED__: boolean;\n};\n\n/**\n * Captures tracing events emitted by Nitro tracing channels.\n */\nexport function captureTracingEvents(): void {\n if (globalWithTraceChannels.__SENTRY_NITRO_HTTP_CHANNELS_INSTRUMENTED__) {\n return;\n }\n\n setupH3TracingChannels();\n setupSrvxTracingChannels();\n globalWithTraceChannels.__SENTRY_NITRO_HTTP_CHANNELS_INSTRUMENTED__ = true;\n}\n\n/**\n * Extracts the HTTP status code from a tracing channel result.\n * The result is the return value of the traced handler, which is a Response for srvx\n * and may or may not be a Response for h3.\n */\nfunction getResponseStatusCode(result: unknown): number | undefined {\n if (isObjectLike(result) && 'status' in result && typeof result.status === 'number') {\n return result.status;\n }\n return undefined;\n}\n\n/** Applies the HTTP status from the traced handler's result to the span, when present. */\nfunction applyResponseStatus(span: Span, data: TracingChannelPayloadWithSpan<{ result?: unknown }>): void {\n const statusCode = getResponseStatusCode(data.result);\n if (statusCode !== undefined) {\n setHttpStatus(span, statusCode);\n }\n}\n\n/**\n * Extracts the parameterized route pattern from the h3 event context.\n */\nfunction getParameterizedRoute(event: H3TracingRequestEvent['event']): string | undefined {\n const matchedRoute = event.context?.matchedRoute;\n if (!matchedRoute) {\n return undefined;\n }\n\n const routePath = matchedRoute.route;\n\n // Skip catch-all routes as they're not useful for transaction grouping\n if (!routePath || routePath === '/**') {\n return undefined;\n }\n\n return routePath;\n}\n\nfunction setupH3TracingChannels(): void {\n // Bail if this is not available\n if (!dc.tracingChannel) {\n return;\n }\n\n const { channel: h3Channel } = bindTracingChannelToSpan(\n dc.tracingChannel<H3TracingRequestEvent>('h3.request'),\n data => {\n const parsedUrl = parseStringToURLObject(data.event.url.href);\n const routePattern = getParameterizedRoute(data.event);\n\n const [spanName, urlAttributes] = getHttpSpanDetailsFromUrlObject(\n parsedUrl,\n 'server',\n 'auto.http.nitro.h3',\n { method: data.event.req.method },\n routePattern,\n );\n\n const span = startInactiveSpan({\n name: spanName,\n attributes: {\n ...urlAttributes,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.nitro.h3',\n [SENTRY_OP]: data?.type === 'middleware' ? WEB_SERVER_MIDDLEWARE_SPAN_OP : WEB_SERVER_HTTP_SERVER_SPAN_OP,\n },\n });\n\n setParameterizedRouteAttributes(span, data.event);\n\n return span;\n },\n {\n captureError: () => ({\n mechanism: {\n handled: false,\n type: 'auto.http.nitro.onTraceError',\n },\n }),\n beforeSpanEnd(span, data) {\n applyResponseStatus(span, data);\n\n // Update the root span (srvx transaction) with the parameterized route name.\n // The srvx span is created before h3 resolves the route, so it initially has the raw URL.\n // Note: data.type is always 'middleware' here regardless of handler type, so we rely on\n // getParameterizedRoute() to filter out catch-all routes instead.\n const routePattern = getParameterizedRoute(data.event);\n if (routePattern) {\n setHttpServerSpanRouteAttribute(routePattern);\n }\n },\n },\n );\n\n h3Channel.subscribe({\n start: (data: H3TracingRequestEvent) => {\n setServerTimingHeaders(data.event);\n },\n });\n}\n\nfunction setupSrvxTracingChannels(): void {\n if (!dc.tracingChannel) {\n return;\n }\n\n // Store the parent span per-request so middleware and fetch share the same parent.\n // WeakMap ensures per-request isolation in concurrent environments and automatic cleanup.\n const requestParentSpans = new WeakMap<Request, Span>();\n\n bindTracingChannelToSpan(\n dc.tracingChannel<SrvxRequestEvent>('srvx.request'),\n data => {\n const parsedUrl = data.request._url ? parseStringToURLObject(data.request._url.href) : undefined;\n const client = getClient();\n const [spanName, urlAttributes] = getHttpSpanDetailsFromUrlObject(\n parsedUrl,\n 'server',\n 'auto.http.nitro.srvx',\n { method: data.request.method },\n undefined,\n client,\n );\n\n const headerAttributes = client\n ? httpHeadersToSpanAttributes(\n Object.fromEntries(data.request.headers.entries()),\n client.getDataCollectionOptions(),\n )\n : {};\n\n return startInactiveSpan({\n name: spanName,\n attributes: {\n ...urlAttributes,\n ...headerAttributes,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.nitro.srvx',\n [SENTRY_OP]: data.middleware ? WEB_SERVER_MIDDLEWARE_SPAN_OP : WEB_SERVER_HTTP_SERVER_SPAN_OP,\n 'server.port': data.server.options.port,\n },\n // Use the same parent span as middleware to make them siblings\n parentSpan: requestParentSpans.get(data.request) || undefined,\n });\n },\n {\n beforeSpanEnd(span, data) {\n applyResponseStatus(span, data);\n\n // Clean up parent span reference after the fetch handler completes (success or error).\n requestParentSpans.delete(data.request);\n },\n },\n );\n\n bindTracingChannelToSpan(\n dc.tracingChannel<SrvxRequestEvent>('srvx.middleware'),\n data => {\n // For the first middleware, capture the current parent span per-request\n if (data.middleware?.index === 0) {\n const activeSpan = getActiveSpan();\n if (activeSpan) {\n requestParentSpans.set(data.request, activeSpan);\n }\n }\n\n const parsedUrl = data.request._url ? parseStringToURLObject(data.request._url.href) : undefined;\n const [, urlAttributes] = getHttpSpanDetailsFromUrlObject(parsedUrl, 'server', 'auto.http.nitro.srvx', {\n method: data.request.method,\n });\n\n // Create span as a child of the original parent, not the previous middleware\n return startInactiveSpan({\n name: `${data.middleware?.handler.name ?? 'unknown'} - ${data.request.method} ${data.request._url?.pathname}`,\n attributes: {\n ...urlAttributes,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.nitro.srvx',\n [SENTRY_OP]: WEB_SERVER_MIDDLEWARE_SPAN_OP,\n },\n parentSpan: requestParentSpans.get(data.request) || undefined,\n });\n },\n {\n beforeSpanEnd(span, data) {\n applyResponseStatus(span, data);\n },\n },\n );\n}\n\n/**\n * Sets the parameterized route attributes on the span.\n */\nfunction setParameterizedRouteAttributes(span: Span, event: H3TracingRequestEvent['event']): void {\n const matchedRoutePath = getParameterizedRoute(event);\n if (!matchedRoutePath) {\n return;\n }\n\n setHttpServerSpanRouteAttribute(matchedRoutePath);\n\n const rootSpan = getRootSpan(span);\n if (!rootSpan) {\n return;\n }\n\n const params = event.context?.params;\n\n if (isObjectLike(params)) {\n Object.entries(params).forEach(([key, value]) => {\n // Based on this convention: https://getsentry.github.io/sentry-conventions/generated/attributes/url.html#urlpathparameterkey\n rootSpan.setAttributes({\n [`url.path.parameter.${key}`]: String(value),\n [`params.${key}`]: String(value),\n });\n });\n }\n}\n"],"names":[],"mappings":";;;;;;;AA6BA,MAAM,uBAAA,GAA0B,UAAA;AAOzB,SAAS,oBAAA,GAA6B;AAC3C,EAAA,IAAI,wBAAwB,2CAAA,EAA6C;AACvE,IAAA;AAAA,EACF;AAEA,EAAA,sBAAA,EAAuB;AACvB,EAAA,wBAAA,EAAyB;AACzB,EAAA,uBAAA,CAAwB,2CAAA,GAA8C,IAAA;AACxE;AAOA,SAAS,sBAAsB,MAAA,EAAqC;AAClE,EAAA,IAAI,YAAA,CAAa,MAAM,CAAA,IAAK,QAAA,IAAY,UAAU,OAAO,MAAA,CAAO,WAAW,QAAA,EAAU;AACnF,IAAA,OAAO,MAAA,CAAO,MAAA;AAAA,EAChB;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,mBAAA,CAAoB,MAAY,IAAA,EAAiE;AACxG,EAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,IAAA,CAAK,MAAM,CAAA;AACpD,EAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,IAAA,aAAA,CAAc,MAAM,UAAU,CAAA;AAAA,EAChC;AACF;AAKA,SAAS,sBAAsB,KAAA,EAA2D;AACxF,EAAA,MAAM,YAAA,GAAe,MAAM,OAAA,EAAS,YAAA;AACpC,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAY,YAAA,CAAa,KAAA;AAG/B,EAAA,IAAI,CAAC,SAAA,IAAa,SAAA,KAAc,KAAA,EAAO;AACrC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,sBAAA,GAA+B;AAEtC,EAAA,IAAI,CAAC,GAAG,cAAA,EAAgB;AACtB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAU,GAAI,wBAAA;AAAA,IAC7B,EAAA,CAAG,eAAsC,YAAY,CAAA;AAAA,IACrD,CAAA,IAAA,KAAQ;AACN,MAAA,MAAM,SAAA,GAAY,sBAAA,CAAuB,IAAA,CAAK,KAAA,CAAM,IAAI,IAAI,CAAA;AAC5D,MAAA,MAAM,YAAA,GAAe,qBAAA,CAAsB,IAAA,CAAK,KAAK,CAAA;AAErD,MAAA,MAAM,CAAC,QAAA,EAAU,aAAa,CAAA,GAAI,+BAAA;AAAA,QAChC,SAAA;AAAA,QACA,QAAA;AAAA,QACA,oBAAA;AAAA,QACA,EAAE,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,MAAA,EAAO;AAAA,QAChC;AAAA,OACF;AAEA,MAAA,MAAM,OAAO,iBAAA,CAAkB;AAAA,QAC7B,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,GAAG,aAAA;AAAA,UACH,CAAC,gCAAgC,GAAG,oBAAA;AAAA,UACpC,CAAC,SAAS,GAAG,IAAA,EAAM,IAAA,KAAS,eAAe,6BAAA,GAAgC;AAAA;AAC7E,OACD,CAAA;AAED,MAAA,+BAAA,CAAgC,IAAA,EAAM,KAAK,KAAK,CAAA;AAEhD,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA;AAAA,MACE,cAAc,OAAO;AAAA,QACnB,SAAA,EAAW;AAAA,UACT,OAAA,EAAS,KAAA;AAAA,UACT,IAAA,EAAM;AAAA;AACR,OACF,CAAA;AAAA,MACA,aAAA,CAAc,MAAM,IAAA,EAAM;AACxB,QAAA,mBAAA,CAAoB,MAAM,IAAI,CAAA;AAM9B,QAAA,MAAM,YAAA,GAAe,qBAAA,CAAsB,IAAA,CAAK,KAAK,CAAA;AACrD,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,+BAAA,CAAgC,YAAY,CAAA;AAAA,QAC9C;AAAA,MACF;AAAA;AACF,GACF;AAEA,EAAA,SAAA,CAAU,SAAA,CAAU;AAAA,IAClB,KAAA,EAAO,CAAC,IAAA,KAAgC;AACtC,MAAA,sBAAA,CAAuB,KAAK,KAAK,CAAA;AAAA,IACnC;AAAA,GACD,CAAA;AACH;AAEA,SAAS,wBAAA,GAAiC;AACxC,EAAA,IAAI,CAAC,GAAG,cAAA,EAAgB;AACtB,IAAA;AAAA,EACF;AAIA,EAAA,MAAM,kBAAA,uBAAyB,OAAA,EAAuB;AAEtD,EAAA,wBAAA;AAAA,IACE,EAAA,CAAG,eAAiC,cAAc,CAAA;AAAA,IAClD,CAAA,IAAA,KAAQ;AACN,MAAA,MAAM,SAAA,GAAY,KAAK,OAAA,CAAQ,IAAA,GAAO,uBAAuB,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AACvF,MAAA,MAAM,SAAS,SAAA,EAAU;AACzB,MAAA,MAAM,CAAC,QAAA,EAAU,aAAa,CAAA,GAAI,+BAAA;AAAA,QAChC,SAAA;AAAA,QACA,QAAA;AAAA,QACA,sBAAA;AAAA,QACA,EAAE,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO;AAAA,QAC9B,MAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,mBAAmB,MAAA,GACrB,2BAAA;AAAA,QACE,OAAO,WAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA;AAAA,QACjD,OAAO,wBAAA;AAAyB,UAElC,EAAC;AAEL,MAAA,OAAO,iBAAA,CAAkB;AAAA,QACvB,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,GAAG,aAAA;AAAA,UACH,GAAG,gBAAA;AAAA,UACH,CAAC,gCAAgC,GAAG,sBAAA;AAAA,UACpC,CAAC,SAAS,GAAG,IAAA,CAAK,aAAa,6BAAA,GAAgC,8BAAA;AAAA,UAC/D,aAAA,EAAe,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ;AAAA,SACrC;AAAA;AAAA,QAEA,UAAA,EAAY,kBAAA,CAAmB,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,IAAK;AAAA,OACrD,CAAA;AAAA,IACH,CAAA;AAAA,IACA;AAAA,MACE,aAAA,CAAc,MAAM,IAAA,EAAM;AACxB,QAAA,mBAAA,CAAoB,MAAM,IAAI,CAAA;AAG9B,QAAA,kBAAA,CAAmB,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,MACxC;AAAA;AACF,GACF;AAEA,EAAA,wBAAA;AAAA,IACE,EAAA,CAAG,eAAiC,iBAAiB,CAAA;AAAA,IACrD,CAAA,IAAA,KAAQ;AAEN,MAAA,IAAI,IAAA,CAAK,UAAA,EAAY,KAAA,KAAU,CAAA,EAAG;AAChC,QAAA,MAAM,aAAa,aAAA,EAAc;AACjC,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,kBAAA,CAAmB,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,UAAU,CAAA;AAAA,QACjD;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,KAAK,OAAA,CAAQ,IAAA,GAAO,uBAAuB,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AACvF,MAAA,MAAM,GAAG,aAAa,IAAI,+BAAA,CAAgC,SAAA,EAAW,UAAU,sBAAA,EAAwB;AAAA,QACrG,MAAA,EAAQ,KAAK,OAAA,CAAQ;AAAA,OACtB,CAAA;AAGD,MAAA,OAAO,iBAAA,CAAkB;AAAA,QACvB,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,UAAA,EAAY,QAAQ,IAAA,IAAQ,SAAS,CAAA,GAAA,EAAM,IAAA,CAAK,QAAQ,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,MAAM,QAAQ,CAAA,CAAA;AAAA,QAC3G,UAAA,EAAY;AAAA,UACV,GAAG,aAAA;AAAA,UACH,CAAC,gCAAgC,GAAG,sBAAA;AAAA,UACpC,CAAC,SAAS,GAAG;AAAA,SACf;AAAA,QACA,UAAA,EAAY,kBAAA,CAAmB,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,IAAK;AAAA,OACrD,CAAA;AAAA,IACH,CAAA;AAAA,IACA;AAAA,MACE,aAAA,CAAc,MAAM,IAAA,EAAM;AACxB,QAAA,mBAAA,CAAoB,MAAM,IAAI,CAAA;AAAA,MAChC;AAAA;AACF,GACF;AACF;AAKA,SAAS,+BAAA,CAAgC,MAAY,KAAA,EAA6C;AAChG,EAAA,MAAM,gBAAA,GAAmB,sBAAsB,KAAK,CAAA;AACpD,EAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,IAAA;AAAA,EACF;AAEA,EAAA,+BAAA,CAAgC,gBAAgB,CAAA;AAEhD,EAAA,MAAM,QAAA,GAAW,YAAY,IAAI,CAAA;AACjC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,EAAS,MAAA;AAE9B,EAAA,IAAI,YAAA,CAAa,MAAM,CAAA,EAAG;AACxB,IAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAE/C,MAAA,QAAA,CAAS,aAAA,CAAc;AAAA,QACrB,CAAC,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAE,GAAG,OAAO,KAAK,CAAA;AAAA,QAC3C,CAAC,CAAA,OAAA,EAAU,GAAG,CAAA,CAAE,GAAG,OAAO,KAAK;AAAA,OAChC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AACF;;;;"}
1
+ {"version":3,"file":"captureTracingEvents.js","sources":["../../../../src/runtime/hooks/captureTracingEvents.ts"],"sourcesContent":["import * as dc from 'node:diagnostics_channel';\nimport { SENTRY_OP, SENTRY_SEGMENT_NAME_SOURCE } from '@sentry/conventions/attributes';\nimport { HTTP_SERVER, MIDDLEWARE } from '@sentry/conventions/op';\nimport {\n isObjectLike,\n getActiveSpan,\n getClient,\n getHttpSpanDetailsFromUrlObject,\n getRootSpan,\n GLOBAL_OBJ,\n hasSpanStreamingEnabled,\n httpHeadersToSpanAttributes,\n HTTP_SPAN_NAME_FALLBACK,\n parseStringToURLObject,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n setHttpStatus,\n type Span,\n startInactiveSpan,\n} from '@sentry/core';\nimport {\n bindTracingChannelToSpan,\n setHttpServerSpanRouteAttribute,\n type TracingChannelPayloadWithSpan,\n} from '@sentry/server-utils';\nimport type { TracingRequestEvent as H3TracingRequestEvent } from 'h3/tracing';\nimport type { RequestEvent as SrvxRequestEvent } from 'srvx/tracing';\nimport { setServerTimingHeaders } from './setServerTimingHeaders';\n\n/**\n * Global object with the trace channels\n */\nconst globalWithTraceChannels = GLOBAL_OBJ as typeof GLOBAL_OBJ & {\n __SENTRY_NITRO_HTTP_CHANNELS_INSTRUMENTED__: boolean;\n};\n\n/**\n * Captures tracing events emitted by Nitro tracing channels.\n */\nexport function captureTracingEvents(): void {\n if (globalWithTraceChannels.__SENTRY_NITRO_HTTP_CHANNELS_INSTRUMENTED__) {\n return;\n }\n\n setupH3TracingChannels();\n setupSrvxTracingChannels();\n globalWithTraceChannels.__SENTRY_NITRO_HTTP_CHANNELS_INSTRUMENTED__ = true;\n}\n\n/**\n * Extracts the HTTP status code from a tracing channel result.\n * The result is the return value of the traced handler, which is a Response for srvx\n * and may or may not be a Response for h3.\n */\nfunction getResponseStatusCode(result: unknown): number | undefined {\n if (isObjectLike(result) && 'status' in result && typeof result.status === 'number') {\n return result.status;\n }\n return undefined;\n}\n\n/** Applies the HTTP status from the traced handler's result to the span, when present. */\nfunction applyResponseStatus(span: Span, data: TracingChannelPayloadWithSpan<{ result?: unknown }>): void {\n const statusCode = getResponseStatusCode(data.result);\n if (statusCode !== undefined) {\n setHttpStatus(span, statusCode);\n }\n}\n\n/**\n * Extracts the parameterized route pattern from the h3 event context.\n */\nfunction getParameterizedRoute(event: H3TracingRequestEvent['event']): string | undefined {\n const matchedRoute = event.context?.matchedRoute;\n if (!matchedRoute) {\n return undefined;\n }\n\n const routePath = matchedRoute.route;\n\n // Skip catch-all routes as they're not useful for transaction grouping\n if (!routePath || routePath === '/**') {\n return undefined;\n }\n\n return routePath;\n}\n\nfunction setupH3TracingChannels(): void {\n // Bail if this is not available\n if (!dc.tracingChannel) {\n return;\n }\n\n const { channel: h3Channel } = bindTracingChannelToSpan(\n dc.tracingChannel<H3TracingRequestEvent>('h3.request'),\n data => {\n const parsedUrl = parseStringToURLObject(data.event.url.href);\n const routePattern = getParameterizedRoute(data.event);\n\n const [spanName, urlAttributes] = getHttpSpanDetailsFromUrlObject(\n parsedUrl,\n 'server',\n 'auto.http.nitro.h3',\n { method: data.event.req.method },\n routePattern,\n );\n\n const client = getClient();\n // With span streaming, span names have to be low cardinality, so we can't fall back to the URL.\n // Only applies to the http.server span; middleware spans keep their own naming.\n const isUnparameterizedStreamedServerSpan =\n data?.type !== 'middleware' &&\n urlAttributes[SENTRY_SEGMENT_NAME_SOURCE] !== 'route' &&\n !!client &&\n hasSpanStreamingEnabled(client);\n\n const span = startInactiveSpan({\n name: isUnparameterizedStreamedServerSpan\n ? data.event.req.method?.toUpperCase() || HTTP_SPAN_NAME_FALLBACK\n : spanName,\n attributes: {\n ...urlAttributes,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.nitro.h3',\n [SENTRY_OP]: data?.type === 'middleware' ? MIDDLEWARE : HTTP_SERVER,\n },\n });\n\n setParameterizedRouteAttributes(span, data.event);\n\n return span;\n },\n {\n captureError: () => ({\n mechanism: {\n handled: false,\n type: 'auto.http.nitro.onTraceError',\n },\n }),\n beforeSpanEnd(span, data) {\n applyResponseStatus(span, data);\n\n // Update the root span (srvx transaction) with the parameterized route name.\n // The srvx span is created before h3 resolves the route, so it initially has the raw URL.\n // Note: data.type is always 'middleware' here regardless of handler type, so we rely on\n // getParameterizedRoute() to filter out catch-all routes instead.\n const routePattern = getParameterizedRoute(data.event);\n if (routePattern) {\n setHttpServerSpanRouteAttribute(routePattern);\n }\n },\n },\n );\n\n h3Channel.subscribe({\n start: (data: H3TracingRequestEvent) => {\n setServerTimingHeaders(data.event);\n },\n });\n}\n\nfunction setupSrvxTracingChannels(): void {\n if (!dc.tracingChannel) {\n return;\n }\n\n // Store the parent span per-request so middleware and fetch share the same parent.\n // WeakMap ensures per-request isolation in concurrent environments and automatic cleanup.\n const requestParentSpans = new WeakMap<Request, Span>();\n\n bindTracingChannelToSpan(\n dc.tracingChannel<SrvxRequestEvent>('srvx.request'),\n data => {\n const parsedUrl = data.request._url ? parseStringToURLObject(data.request._url.href) : undefined;\n const client = getClient();\n const [spanName, urlAttributes] = getHttpSpanDetailsFromUrlObject(\n parsedUrl,\n 'server',\n 'auto.http.nitro.srvx',\n { method: data.request.method },\n undefined,\n client,\n );\n\n const headerAttributes = client\n ? httpHeadersToSpanAttributes(\n Object.fromEntries(data.request.headers.entries()),\n client.getDataCollectionOptions(),\n )\n : {};\n\n // With span streaming, span names have to be low cardinality, so we can't fall back to the URL.\n // Only applies to the http.server span; middleware spans keep their own naming.\n // h3 renames this span via `setHttpServerSpanRouteAttribute` once it resolves the route.\n const isUnparameterizedStreamedServerSpan =\n !data.middleware &&\n urlAttributes[SENTRY_SEGMENT_NAME_SOURCE] !== 'route' &&\n !!client &&\n hasSpanStreamingEnabled(client);\n\n return startInactiveSpan({\n name: isUnparameterizedStreamedServerSpan\n ? data.request.method?.toUpperCase() || HTTP_SPAN_NAME_FALLBACK\n : spanName,\n attributes: {\n ...urlAttributes,\n ...headerAttributes,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.nitro.srvx',\n [SENTRY_OP]: data.middleware ? MIDDLEWARE : HTTP_SERVER,\n 'server.port': data.server.options.port,\n },\n // Use the same parent span as middleware to make them siblings\n parentSpan: requestParentSpans.get(data.request) || undefined,\n });\n },\n {\n beforeSpanEnd(span, data) {\n applyResponseStatus(span, data);\n\n // Clean up parent span reference after the fetch handler completes (success or error).\n requestParentSpans.delete(data.request);\n },\n },\n );\n\n bindTracingChannelToSpan(\n dc.tracingChannel<SrvxRequestEvent>('srvx.middleware'),\n data => {\n // For the first middleware, capture the current parent span per-request\n if (data.middleware?.index === 0) {\n const activeSpan = getActiveSpan();\n if (activeSpan) {\n requestParentSpans.set(data.request, activeSpan);\n }\n }\n\n const parsedUrl = data.request._url ? parseStringToURLObject(data.request._url.href) : undefined;\n const [, urlAttributes] = getHttpSpanDetailsFromUrlObject(parsedUrl, 'server', 'auto.http.nitro.srvx', {\n method: data.request.method,\n });\n\n // Create span as a child of the original parent, not the previous middleware\n return startInactiveSpan({\n name: `${data.middleware?.handler.name ?? 'unknown'} - ${data.request.method} ${data.request._url?.pathname}`,\n attributes: {\n ...urlAttributes,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.nitro.srvx',\n [SENTRY_OP]: MIDDLEWARE,\n },\n parentSpan: requestParentSpans.get(data.request) || undefined,\n });\n },\n {\n beforeSpanEnd(span, data) {\n applyResponseStatus(span, data);\n },\n },\n );\n}\n\n/**\n * Sets the parameterized route attributes on the span.\n */\nfunction setParameterizedRouteAttributes(span: Span, event: H3TracingRequestEvent['event']): void {\n const matchedRoutePath = getParameterizedRoute(event);\n if (!matchedRoutePath) {\n return;\n }\n\n setHttpServerSpanRouteAttribute(matchedRoutePath);\n\n const rootSpan = getRootSpan(span);\n if (!rootSpan) {\n return;\n }\n\n const params = event.context?.params;\n\n if (isObjectLike(params)) {\n Object.entries(params).forEach(([key, value]) => {\n // Based on this convention: https://getsentry.github.io/sentry-conventions/generated/attributes/url.html#urlpathparameterkey\n rootSpan.setAttributes({\n [`url.path.parameter.${key}`]: String(value),\n [`params.${key}`]: String(value),\n });\n });\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"captureStorageEvents.d.ts","sourceRoot":"","sources":["../../../../src/runtime/hooks/captureStorageEvents.ts"],"names":[],"mappings":"AA8DA;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAU3C"}
1
+ {"version":3,"file":"captureStorageEvents.d.ts","sourceRoot":"","sources":["../../../../src/runtime/hooks/captureStorageEvents.ts"],"names":[],"mappings":"AA0DA;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAU3C"}
@@ -1 +1 @@
1
- {"version":3,"file":"captureTracingEvents.d.ts","sourceRoot":"","sources":["../../../../src/runtime/hooks/captureTracingEvents.ts"],"names":[],"mappings":"AAiCA;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAQ3C"}
1
+ {"version":3,"file":"captureTracingEvents.d.ts","sourceRoot":"","sources":["../../../../src/runtime/hooks/captureTracingEvents.ts"],"names":[],"mappings":"AAmCA;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAQ3C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/nitro",
3
- "version": "11.0.0-alpha.0",
3
+ "version": "11.0.0-alpha.2",
4
4
  "description": "Official Sentry SDK for Nitro",
5
5
  "repository": "git://github.com/getsentry/sentry-javascript.git",
6
6
  "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/nitro",
@@ -35,11 +35,11 @@
35
35
  "nitro": ">=3.0.0-0 <4.0.0 || 3.0.260311-beta || 3.0.260415-beta"
36
36
  },
37
37
  "dependencies": {
38
- "@sentry/bundler-plugins": "11.0.0-alpha.0",
39
- "@sentry/conventions": "^0.16.0",
40
- "@sentry/core": "11.0.0-alpha.0",
41
- "@sentry/node": "11.0.0-alpha.0",
42
- "@sentry/server-utils": "11.0.0-alpha.0"
38
+ "@sentry/bundler-plugins": "11.0.0-alpha.2",
39
+ "@sentry/conventions": "^0.20.0",
40
+ "@sentry/core": "11.0.0-alpha.2",
41
+ "@sentry/node": "11.0.0-alpha.2",
42
+ "@sentry/server-utils": "11.0.0-alpha.2"
43
43
  },
44
44
  "devDependencies": {
45
45
  "nitro": "^3.0.260415-beta",
@@ -58,6 +58,7 @@
58
58
  "build:tarball": "npm pack",
59
59
  "clean": "rimraf build coverage sentry-nitro-*.tgz",
60
60
  "lint": "oxlint . --type-aware",
61
+ "lint:types": "oxlint src --type-aware --type-check",
61
62
  "lint:fix": "oxlint . --fix --type-aware",
62
63
  "lint:es-compatibility": "es-check es2022 ./build/esm/*.js --module",
63
64
  "test": "vitest run",