Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
63 lines
2.2 KiB
Plaintext
63 lines
2.2 KiB
Plaintext
import { SEMATTRS_HTTP_TARGET } from '@opentelemetry/semantic-conventions';
|
|
import { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, GLOBAL_OBJ } from '@sentry/core';
|
|
import { isSentryRequestSpan } from '@sentry/opentelemetry';
|
|
import { ATTR_NEXT_SPAN_TYPE } from '../nextSpanAttributes.js';
|
|
import { TRANSACTION_ATTR_SHOULD_DROP_TRANSACTION } from '../span-attributes-with-logic-attached.js';
|
|
|
|
const globalWithInjectedValues = GLOBAL_OBJ
|
|
|
|
;
|
|
|
|
/**
|
|
* Drops spans for tunnel requests from middleware or fetch instrumentation.
|
|
* This catches both:
|
|
* 1. Requests to the local tunnel route (before rewrite)
|
|
* 2. Requests to Sentry ingest (after rewrite)
|
|
*/
|
|
function dropMiddlewareTunnelRequests(span, attrs) {
|
|
// Only filter middleware spans or HTTP fetch spans
|
|
const isMiddleware = attrs?.[ATTR_NEXT_SPAN_TYPE] === 'Middleware.execute';
|
|
// The fetch span could be originating from rewrites re-writing a tunnel request
|
|
// So we want to filter it out
|
|
const isFetchSpan = attrs?.[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] === 'auto.http.otel.node_fetch';
|
|
|
|
// If the span is not a middleware span or a fetch span, return
|
|
if (!isMiddleware && !isFetchSpan) {
|
|
return;
|
|
}
|
|
|
|
// Check if this is either a tunnel route request or a Sentry ingest request
|
|
const isTunnel = isTunnelRouteSpan(attrs || {});
|
|
const isSentry = isSentryRequestSpan(span);
|
|
|
|
if (isTunnel || isSentry) {
|
|
// Mark the span to be dropped
|
|
span.setAttribute(TRANSACTION_ATTR_SHOULD_DROP_TRANSACTION, true);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Checks if a span's HTTP target matches the tunnel route.
|
|
*/
|
|
function isTunnelRouteSpan(spanAttributes) {
|
|
const tunnelPath = globalWithInjectedValues._sentryRewritesTunnelPath || process.env._sentryRewritesTunnelPath;
|
|
if (!tunnelPath) {
|
|
return false;
|
|
}
|
|
|
|
// eslint-disable-next-line deprecation/deprecation
|
|
const httpTarget = spanAttributes[SEMATTRS_HTTP_TARGET];
|
|
|
|
if (typeof httpTarget === 'string') {
|
|
// Extract pathname from the target (e.g., "/tunnel?o=123&p=456" -> "/tunnel")
|
|
const pathname = httpTarget.split('?')[0] || '';
|
|
|
|
return pathname.startsWith(tunnelPath);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
export { dropMiddlewareTunnelRequests };
|
|
//# sourceMappingURL=dropMiddlewareTunnelRequests.js.map
|