feat(mongoose): Instrument mongoose >= 9.7 via native tracing channels - #21803

Merged
logaretm merged 7 commits into
developfrom
awad/mongoose-tracing-channels
Jul 2, 2026
Merged

feat(mongoose): Instrument mongoose >= 9.7 via native tracing channels#21803
logaretm merged 7 commits into
developfrom
awad/mongoose-tracing-channels

Conversation

@logaretm

@logaretmlogaretm commented Jun 25, 2026

Copy link
Copy Markdown
Member

Instruments mongoose >= 9.7 through its native diagnostics_channel tracing channels instead of monkey-patching, the same way we did for redis/ioredis. The subscription lives in server-utils as mongooseChannelIntegration, and the node mongooseIntegration extends it (via extendIntegration) to keep running the IITM patcher for mongoose < 9.7.

The channel path emits the latest stable DB semconv, so there is an attribute drift. We did that for redis so I thought to do the same here, but we could match the legacy attributes and drop them later for v11 if that's what we want.

@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 668581c to 0e1e4c1CompareJune 25, 2026 17:26
@github-actions

github-actionsBot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.59 kB--
@sentry/browser - with treeshaking flags26.03 kB--
@sentry/browser (incl. Tracing)46.05 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.79 kB--
@sentry/browser (incl. Tracing, Profiling)50.81 kB--
@sentry/browser (incl. Tracing, Replay)85.28 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.89 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.97 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.64 kB--
@sentry/browser (incl. Feedback)44.77 kB--
@sentry/browser (incl. sendFeedback)32.39 kB--
@sentry/browser (incl. FeedbackAsync)37.52 kB--
@sentry/browser (incl. Metrics)28.67 kB--
@sentry/browser (incl. Logs)28.91 kB--
@sentry/browser (incl. Metrics & Logs)29.6 kB--
@sentry/react29.38 kB--
@sentry/react (incl. Tracing)48.35 kB--
@sentry/vue32.82 kB--
@sentry/vue (incl. Tracing)47.91 kB--
@sentry/svelte27.61 kB--
CDN Bundle30 kB--
CDN Bundle (incl. Tracing)47.98 kB--
CDN Bundle (incl. Logs, Metrics)31.57 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.32 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.77 kB--
CDN Bundle (incl. Tracing, Replay)85.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.76 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.29 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.53 kB--
CDN Bundle - uncompressed89.35 kB--
CDN Bundle (incl. Tracing) - uncompressed145.28 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.05 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.25 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.59 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.29 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.25 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.99 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.94 kB--
@sentry/nextjs (client)50.73 kB--
@sentry/sveltekit (client)46.44 kB--
@sentry/core/server77.75 kB--
@sentry/core/browser64.06 kB--
@sentry/node-core62.37 kB--
@sentry/node121.67 kB+0.36%+425 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)69.95 kB--
@sentry/node/light50.46 kB--
@sentry/node - without tracing72.68 kB--
@sentry/aws-serverless83.52 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified180.62 kB--
@sentry/cloudflare (withSentry)446.93 kB--

View base workflow run

@mydea

Copy link
Copy Markdown
Member

mongooseChannelIntegration

more a general thing, but I think I'd just call this mongooseIntegration? When using this from server-utils this is kind of an implementation detail that is not that relevant, you can just use the integration from there? It's a bit different for the orchestrion ones because they should not be "accidentally" used, but for these with native support I think just calling them "normally" is fine?

@mydea
mydeaforce-pushed the fn/better-integration-extend branch 2 times, most recently from 2407b9e to 31520beCompareJune 26, 2026 08:48
Base automatically changed from fn/better-integration-extend to developJune 26, 2026 09:38
@logaretm

Copy link
Copy Markdown
MemberAuthor

Yea I was thinking about this yesterday, we ideally would export those as-is for the environments that do not support module hooks. Will make that change

@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 5a990f3 to 3e8b992CompareJune 26, 2026 11:49
@logaretm
logaretm marked this pull request as ready for review June 26, 2026 12:55
@logaretm
logaretm requested a review from a team as a code ownerJune 26, 2026 12:55
@logaretm
logaretm requested review from JPeer264, andreiborza, isaacs, mydea and nicohrubec and removed request for a teamJune 26, 2026 12:55
@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from ccbdd92 to 9cbf9dfCompareJune 26, 2026 13:01

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 9cbf9df. Configure here.

instrumentMongoose();
},
};
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Preload skips mongoose channel subscribe

Medium Severity

For mongoose >=9.7, diagnostics-channel subscription runs only in the server-utils integration setupOnce, while preloadOpenTelemetry invokes instrumentMongoose alone. The IITM patcher no longer covers 9.7+, so mongoose work between preload and Sentry.init() (or any preload-only usage) is not traced.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 9cbf9df. Configure here.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that is ok.

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code wise LGTM. I think this one has not been done yet? #21803 (comment) (I would vote for that too)

...(collection != null ? { [DB_COLLECTION_NAME]: collection } : {}),
...(data.database != null ? { [DB_NAMESPACE]: data.database } : {}),
...(queryText != null ? { [DB_QUERY_TEXT]: queryText } : {}),
...(batchSize != null ? { [DB_OPERATION_BATCH_SIZE]: batchSize } : {}),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: undefined values are skipped, null not, so it seems like this was done on purpose. I think following is a little easier to read:

Suggested change
...(batchSize!=null ? {[DB_OPERATION_BATCH_SIZE]: batchSize} : {}),
[DB_OPERATION_BATCH_SIZE]: batchSize??undefined

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good, that was ugly

Subscribe to mongoose 9.7's native diagnostics_channel tracing channels via
bindTracingChannelToSpan, emitting stable OTel DB semconv. Narrow the vendored
OTel patcher to < 9.7.0 to avoid double instrumentation.
…gration
Runtimes that use the server-utils integration directly expose it to users,
so 'channel' in the name leaks an implementation detail. Node imports it under
an internal alias since it keeps its own composed mongooseIntegration.
Replace the conditional-spread pattern for optional attributes with
`?? undefined`. Undefined-valued keys are dropped by the span backends,
so this is equivalent while keeping all six attribute lines consistent.
Replace the ad-hoc `void Promise.resolve().then(...)` deferral with the
shared `waitForTracingChannelBinding` util, matching the vercel-ai and
redis integrations. It retries until the async context binding is
available, so it also handles custom OTel setups where the binding isn't
ready on the first tick.
@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 9cbf9df to 6e85b2fCompareJuly 1, 2026 17:13
@logaretm
logaretm merged commit 0c33a8d into developJul 2, 2026
372 of 376 checks passed
@logaretm
logaretm deleted the awad/mongoose-tracing-channels branch July 2, 2026 15:47
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@logaretm@mydea@JPeer264
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(mongoose): Instrument mongoose >= 9.7 via native tracing channels - #21803

Merged
logaretm merged 7 commits into
developfrom
awad/mongoose-tracing-channels
Jul 2, 2026
Merged

feat(mongoose): Instrument mongoose >= 9.7 via native tracing channels#21803
logaretm merged 7 commits into
developfrom
awad/mongoose-tracing-channels

Conversation

@logaretm

@logaretmlogaretm commented Jun 25, 2026

Copy link
Copy Markdown
Member

Instruments mongoose >= 9.7 through its native diagnostics_channel tracing channels instead of monkey-patching, the same way we did for redis/ioredis. The subscription lives in server-utils as mongooseChannelIntegration, and the node mongooseIntegration extends it (via extendIntegration) to keep running the IITM patcher for mongoose < 9.7.

The channel path emits the latest stable DB semconv, so there is an attribute drift. We did that for redis so I thought to do the same here, but we could match the legacy attributes and drop them later for v11 if that's what we want.

@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 668581c to 0e1e4c1CompareJune 25, 2026 17:26
@github-actions

github-actionsBot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.59 kB--
@sentry/browser - with treeshaking flags26.03 kB--
@sentry/browser (incl. Tracing)46.05 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.79 kB--
@sentry/browser (incl. Tracing, Profiling)50.81 kB--
@sentry/browser (incl. Tracing, Replay)85.28 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.89 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.97 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.64 kB--
@sentry/browser (incl. Feedback)44.77 kB--
@sentry/browser (incl. sendFeedback)32.39 kB--
@sentry/browser (incl. FeedbackAsync)37.52 kB--
@sentry/browser (incl. Metrics)28.67 kB--
@sentry/browser (incl. Logs)28.91 kB--
@sentry/browser (incl. Metrics & Logs)29.6 kB--
@sentry/react29.38 kB--
@sentry/react (incl. Tracing)48.35 kB--
@sentry/vue32.82 kB--
@sentry/vue (incl. Tracing)47.91 kB--
@sentry/svelte27.61 kB--
CDN Bundle30 kB--
CDN Bundle (incl. Tracing)47.98 kB--
CDN Bundle (incl. Logs, Metrics)31.57 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.32 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.77 kB--
CDN Bundle (incl. Tracing, Replay)85.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.76 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.29 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.53 kB--
CDN Bundle - uncompressed89.35 kB--
CDN Bundle (incl. Tracing) - uncompressed145.28 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.05 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.25 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.59 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.29 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.25 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.99 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.94 kB--
@sentry/nextjs (client)50.73 kB--
@sentry/sveltekit (client)46.44 kB--
@sentry/core/server77.75 kB--
@sentry/core/browser64.06 kB--
@sentry/node-core62.37 kB--
@sentry/node121.67 kB+0.36%+425 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)69.95 kB--
@sentry/node/light50.46 kB--
@sentry/node - without tracing72.68 kB--
@sentry/aws-serverless83.52 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified180.62 kB--
@sentry/cloudflare (withSentry)446.93 kB--

View base workflow run

@mydea

Copy link
Copy Markdown
Member

mongooseChannelIntegration

more a general thing, but I think I'd just call this mongooseIntegration? When using this from server-utils this is kind of an implementation detail that is not that relevant, you can just use the integration from there? It's a bit different for the orchestrion ones because they should not be "accidentally" used, but for these with native support I think just calling them "normally" is fine?

@mydea
mydeaforce-pushed the fn/better-integration-extend branch 2 times, most recently from 2407b9e to 31520beCompareJune 26, 2026 08:48
Base automatically changed from fn/better-integration-extend to developJune 26, 2026 09:38
@logaretm

Copy link
Copy Markdown
MemberAuthor

Yea I was thinking about this yesterday, we ideally would export those as-is for the environments that do not support module hooks. Will make that change

@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 5a990f3 to 3e8b992CompareJune 26, 2026 11:49
@logaretm
logaretm marked this pull request as ready for review June 26, 2026 12:55
@logaretm
logaretm requested a review from a team as a code ownerJune 26, 2026 12:55
@logaretm
logaretm requested review from JPeer264, andreiborza, isaacs, mydea and nicohrubec and removed request for a teamJune 26, 2026 12:55
@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from ccbdd92 to 9cbf9dfCompareJune 26, 2026 13:01

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 9cbf9df. Configure here.

instrumentMongoose();
},
};
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Preload skips mongoose channel subscribe

Medium Severity

For mongoose >=9.7, diagnostics-channel subscription runs only in the server-utils integration setupOnce, while preloadOpenTelemetry invokes instrumentMongoose alone. The IITM patcher no longer covers 9.7+, so mongoose work between preload and Sentry.init() (or any preload-only usage) is not traced.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 9cbf9df. Configure here.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that is ok.

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code wise LGTM. I think this one has not been done yet? #21803 (comment) (I would vote for that too)

...(collection != null ? { [DB_COLLECTION_NAME]: collection } : {}),
...(data.database != null ? { [DB_NAMESPACE]: data.database } : {}),
...(queryText != null ? { [DB_QUERY_TEXT]: queryText } : {}),
...(batchSize != null ? { [DB_OPERATION_BATCH_SIZE]: batchSize } : {}),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: undefined values are skipped, null not, so it seems like this was done on purpose. I think following is a little easier to read:

Suggested change
...(batchSize!=null ? {[DB_OPERATION_BATCH_SIZE]: batchSize} : {}),
[DB_OPERATION_BATCH_SIZE]: batchSize??undefined

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good, that was ugly

Subscribe to mongoose 9.7's native diagnostics_channel tracing channels via
bindTracingChannelToSpan, emitting stable OTel DB semconv. Narrow the vendored
OTel patcher to < 9.7.0 to avoid double instrumentation.
…gration
Runtimes that use the server-utils integration directly expose it to users,
so 'channel' in the name leaks an implementation detail. Node imports it under
an internal alias since it keeps its own composed mongooseIntegration.
Replace the conditional-spread pattern for optional attributes with
`?? undefined`. Undefined-valued keys are dropped by the span backends,
so this is equivalent while keeping all six attribute lines consistent.
Replace the ad-hoc `void Promise.resolve().then(...)` deferral with the
shared `waitForTracingChannelBinding` util, matching the vercel-ai and
redis integrations. It retries until the async context binding is
available, so it also handles custom OTel setups where the binding isn't
ready on the first tick.
@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 9cbf9df to 6e85b2fCompareJuly 1, 2026 17:13
@logaretm
logaretm merged commit 0c33a8d into developJul 2, 2026
372 of 376 checks passed
@logaretm
logaretm deleted the awad/mongoose-tracing-channels branch July 2, 2026 15:47
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@logaretm@mydea@JPeer264
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(mongoose): Instrument mongoose >= 9.7 via native tracing channels - #21803

Merged
logaretm merged 7 commits into
developfrom
awad/mongoose-tracing-channels
Jul 2, 2026
Merged

feat(mongoose): Instrument mongoose >= 9.7 via native tracing channels#21803
logaretm merged 7 commits into
developfrom
awad/mongoose-tracing-channels

Conversation

@logaretm

@logaretmlogaretm commented Jun 25, 2026

Copy link
Copy Markdown
Member

Instruments mongoose >= 9.7 through its native diagnostics_channel tracing channels instead of monkey-patching, the same way we did for redis/ioredis. The subscription lives in server-utils as mongooseChannelIntegration, and the node mongooseIntegration extends it (via extendIntegration) to keep running the IITM patcher for mongoose < 9.7.

The channel path emits the latest stable DB semconv, so there is an attribute drift. We did that for redis so I thought to do the same here, but we could match the legacy attributes and drop them later for v11 if that's what we want.

@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 668581c to 0e1e4c1CompareJune 25, 2026 17:26
@github-actions

github-actionsBot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.59 kB--
@sentry/browser - with treeshaking flags26.03 kB--
@sentry/browser (incl. Tracing)46.05 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.79 kB--
@sentry/browser (incl. Tracing, Profiling)50.81 kB--
@sentry/browser (incl. Tracing, Replay)85.28 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.89 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.97 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.64 kB--
@sentry/browser (incl. Feedback)44.77 kB--
@sentry/browser (incl. sendFeedback)32.39 kB--
@sentry/browser (incl. FeedbackAsync)37.52 kB--
@sentry/browser (incl. Metrics)28.67 kB--
@sentry/browser (incl. Logs)28.91 kB--
@sentry/browser (incl. Metrics & Logs)29.6 kB--
@sentry/react29.38 kB--
@sentry/react (incl. Tracing)48.35 kB--
@sentry/vue32.82 kB--
@sentry/vue (incl. Tracing)47.91 kB--
@sentry/svelte27.61 kB--
CDN Bundle30 kB--
CDN Bundle (incl. Tracing)47.98 kB--
CDN Bundle (incl. Logs, Metrics)31.57 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.32 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.77 kB--
CDN Bundle (incl. Tracing, Replay)85.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.76 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.29 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.53 kB--
CDN Bundle - uncompressed89.35 kB--
CDN Bundle (incl. Tracing) - uncompressed145.28 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.05 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.25 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.59 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.29 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.25 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.99 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.94 kB--
@sentry/nextjs (client)50.73 kB--
@sentry/sveltekit (client)46.44 kB--
@sentry/core/server77.75 kB--
@sentry/core/browser64.06 kB--
@sentry/node-core62.37 kB--
@sentry/node121.67 kB+0.36%+425 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)69.95 kB--
@sentry/node/light50.46 kB--
@sentry/node - without tracing72.68 kB--
@sentry/aws-serverless83.52 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified180.62 kB--
@sentry/cloudflare (withSentry)446.93 kB--

View base workflow run

@mydea

Copy link
Copy Markdown
Member

mongooseChannelIntegration

more a general thing, but I think I'd just call this mongooseIntegration? When using this from server-utils this is kind of an implementation detail that is not that relevant, you can just use the integration from there? It's a bit different for the orchestrion ones because they should not be "accidentally" used, but for these with native support I think just calling them "normally" is fine?

@mydea
mydeaforce-pushed the fn/better-integration-extend branch 2 times, most recently from 2407b9e to 31520beCompareJune 26, 2026 08:48
Base automatically changed from fn/better-integration-extend to developJune 26, 2026 09:38
@logaretm

Copy link
Copy Markdown
MemberAuthor

Yea I was thinking about this yesterday, we ideally would export those as-is for the environments that do not support module hooks. Will make that change

@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 5a990f3 to 3e8b992CompareJune 26, 2026 11:49
@logaretm
logaretm marked this pull request as ready for review June 26, 2026 12:55
@logaretm
logaretm requested a review from a team as a code ownerJune 26, 2026 12:55
@logaretm
logaretm requested review from JPeer264, andreiborza, isaacs, mydea and nicohrubec and removed request for a teamJune 26, 2026 12:55
@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from ccbdd92 to 9cbf9dfCompareJune 26, 2026 13:01

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 9cbf9df. Configure here.

instrumentMongoose();
},
};
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Preload skips mongoose channel subscribe

Medium Severity

For mongoose >=9.7, diagnostics-channel subscription runs only in the server-utils integration setupOnce, while preloadOpenTelemetry invokes instrumentMongoose alone. The IITM patcher no longer covers 9.7+, so mongoose work between preload and Sentry.init() (or any preload-only usage) is not traced.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 9cbf9df. Configure here.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that is ok.

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code wise LGTM. I think this one has not been done yet? #21803 (comment) (I would vote for that too)

...(collection != null ? { [DB_COLLECTION_NAME]: collection } : {}),
...(data.database != null ? { [DB_NAMESPACE]: data.database } : {}),
...(queryText != null ? { [DB_QUERY_TEXT]: queryText } : {}),
...(batchSize != null ? { [DB_OPERATION_BATCH_SIZE]: batchSize } : {}),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: undefined values are skipped, null not, so it seems like this was done on purpose. I think following is a little easier to read:

Suggested change
...(batchSize!=null ? {[DB_OPERATION_BATCH_SIZE]: batchSize} : {}),
[DB_OPERATION_BATCH_SIZE]: batchSize??undefined

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good, that was ugly

Subscribe to mongoose 9.7's native diagnostics_channel tracing channels via
bindTracingChannelToSpan, emitting stable OTel DB semconv. Narrow the vendored
OTel patcher to < 9.7.0 to avoid double instrumentation.
…gration
Runtimes that use the server-utils integration directly expose it to users,
so 'channel' in the name leaks an implementation detail. Node imports it under
an internal alias since it keeps its own composed mongooseIntegration.
Replace the conditional-spread pattern for optional attributes with
`?? undefined`. Undefined-valued keys are dropped by the span backends,
so this is equivalent while keeping all six attribute lines consistent.
Replace the ad-hoc `void Promise.resolve().then(...)` deferral with the
shared `waitForTracingChannelBinding` util, matching the vercel-ai and
redis integrations. It retries until the async context binding is
available, so it also handles custom OTel setups where the binding isn't
ready on the first tick.
@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 9cbf9df to 6e85b2fCompareJuly 1, 2026 17:13
@logaretm
logaretm merged commit 0c33a8d into developJul 2, 2026
372 of 376 checks passed
@logaretm
logaretm deleted the awad/mongoose-tracing-channels branch July 2, 2026 15:47
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@logaretm@mydea@JPeer264
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(mongoose): Instrument mongoose >= 9.7 via native tracing channels - #21803

Merged
logaretm merged 7 commits into
developfrom
awad/mongoose-tracing-channels
Jul 2, 2026
Merged

feat(mongoose): Instrument mongoose >= 9.7 via native tracing channels#21803
logaretm merged 7 commits into
developfrom
awad/mongoose-tracing-channels

Conversation

@logaretm

@logaretmlogaretm commented Jun 25, 2026

Copy link
Copy Markdown
Member

Instruments mongoose >= 9.7 through its native diagnostics_channel tracing channels instead of monkey-patching, the same way we did for redis/ioredis. The subscription lives in server-utils as mongooseChannelIntegration, and the node mongooseIntegration extends it (via extendIntegration) to keep running the IITM patcher for mongoose < 9.7.

The channel path emits the latest stable DB semconv, so there is an attribute drift. We did that for redis so I thought to do the same here, but we could match the legacy attributes and drop them later for v11 if that's what we want.

@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 668581c to 0e1e4c1CompareJune 25, 2026 17:26
@github-actions

github-actionsBot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.59 kB--
@sentry/browser - with treeshaking flags26.03 kB--
@sentry/browser (incl. Tracing)46.05 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.79 kB--
@sentry/browser (incl. Tracing, Profiling)50.81 kB--
@sentry/browser (incl. Tracing, Replay)85.28 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.89 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.97 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.64 kB--
@sentry/browser (incl. Feedback)44.77 kB--
@sentry/browser (incl. sendFeedback)32.39 kB--
@sentry/browser (incl. FeedbackAsync)37.52 kB--
@sentry/browser (incl. Metrics)28.67 kB--
@sentry/browser (incl. Logs)28.91 kB--
@sentry/browser (incl. Metrics & Logs)29.6 kB--
@sentry/react29.38 kB--
@sentry/react (incl. Tracing)48.35 kB--
@sentry/vue32.82 kB--
@sentry/vue (incl. Tracing)47.91 kB--
@sentry/svelte27.61 kB--
CDN Bundle30 kB--
CDN Bundle (incl. Tracing)47.98 kB--
CDN Bundle (incl. Logs, Metrics)31.57 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.32 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.77 kB--
CDN Bundle (incl. Tracing, Replay)85.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.76 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.29 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.53 kB--
CDN Bundle - uncompressed89.35 kB--
CDN Bundle (incl. Tracing) - uncompressed145.28 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.05 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.25 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.59 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.29 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.25 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.99 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.94 kB--
@sentry/nextjs (client)50.73 kB--
@sentry/sveltekit (client)46.44 kB--
@sentry/core/server77.75 kB--
@sentry/core/browser64.06 kB--
@sentry/node-core62.37 kB--
@sentry/node121.67 kB+0.36%+425 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)69.95 kB--
@sentry/node/light50.46 kB--
@sentry/node - without tracing72.68 kB--
@sentry/aws-serverless83.52 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified180.62 kB--
@sentry/cloudflare (withSentry)446.93 kB--

View base workflow run

@mydea

Copy link
Copy Markdown
Member

mongooseChannelIntegration

more a general thing, but I think I'd just call this mongooseIntegration? When using this from server-utils this is kind of an implementation detail that is not that relevant, you can just use the integration from there? It's a bit different for the orchestrion ones because they should not be "accidentally" used, but for these with native support I think just calling them "normally" is fine?

@mydea
mydeaforce-pushed the fn/better-integration-extend branch 2 times, most recently from 2407b9e to 31520beCompareJune 26, 2026 08:48
Base automatically changed from fn/better-integration-extend to developJune 26, 2026 09:38
@logaretm

Copy link
Copy Markdown
MemberAuthor

Yea I was thinking about this yesterday, we ideally would export those as-is for the environments that do not support module hooks. Will make that change

@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 5a990f3 to 3e8b992CompareJune 26, 2026 11:49
@logaretm
logaretm marked this pull request as ready for review June 26, 2026 12:55
@logaretm
logaretm requested a review from a team as a code ownerJune 26, 2026 12:55
@logaretm
logaretm requested review from JPeer264, andreiborza, isaacs, mydea and nicohrubec and removed request for a teamJune 26, 2026 12:55
@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from ccbdd92 to 9cbf9dfCompareJune 26, 2026 13:01

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 9cbf9df. Configure here.

instrumentMongoose();
},
};
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Preload skips mongoose channel subscribe

Medium Severity

For mongoose >=9.7, diagnostics-channel subscription runs only in the server-utils integration setupOnce, while preloadOpenTelemetry invokes instrumentMongoose alone. The IITM patcher no longer covers 9.7+, so mongoose work between preload and Sentry.init() (or any preload-only usage) is not traced.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 9cbf9df. Configure here.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that is ok.

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code wise LGTM. I think this one has not been done yet? #21803 (comment) (I would vote for that too)

...(collection != null ? { [DB_COLLECTION_NAME]: collection } : {}),
...(data.database != null ? { [DB_NAMESPACE]: data.database } : {}),
...(queryText != null ? { [DB_QUERY_TEXT]: queryText } : {}),
...(batchSize != null ? { [DB_OPERATION_BATCH_SIZE]: batchSize } : {}),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: undefined values are skipped, null not, so it seems like this was done on purpose. I think following is a little easier to read:

Suggested change
...(batchSize!=null ? {[DB_OPERATION_BATCH_SIZE]: batchSize} : {}),
[DB_OPERATION_BATCH_SIZE]: batchSize??undefined

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good, that was ugly

Subscribe to mongoose 9.7's native diagnostics_channel tracing channels via
bindTracingChannelToSpan, emitting stable OTel DB semconv. Narrow the vendored
OTel patcher to < 9.7.0 to avoid double instrumentation.
…gration
Runtimes that use the server-utils integration directly expose it to users,
so 'channel' in the name leaks an implementation detail. Node imports it under
an internal alias since it keeps its own composed mongooseIntegration.
Replace the conditional-spread pattern for optional attributes with
`?? undefined`. Undefined-valued keys are dropped by the span backends,
so this is equivalent while keeping all six attribute lines consistent.
Replace the ad-hoc `void Promise.resolve().then(...)` deferral with the
shared `waitForTracingChannelBinding` util, matching the vercel-ai and
redis integrations. It retries until the async context binding is
available, so it also handles custom OTel setups where the binding isn't
ready on the first tick.
@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 9cbf9df to 6e85b2fCompareJuly 1, 2026 17:13
@logaretm
logaretm merged commit 0c33a8d into developJul 2, 2026
372 of 376 checks passed
@logaretm
logaretm deleted the awad/mongoose-tracing-channels branch July 2, 2026 15:47
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@logaretm@mydea@JPeer264
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(mongoose): Instrument mongoose >= 9.7 via native tracing channels - #21803

Merged
logaretm merged 7 commits into
developfrom
awad/mongoose-tracing-channels
Jul 2, 2026
Merged

feat(mongoose): Instrument mongoose >= 9.7 via native tracing channels#21803
logaretm merged 7 commits into
developfrom
awad/mongoose-tracing-channels

Conversation

@logaretm

@logaretmlogaretm commented Jun 25, 2026

Copy link
Copy Markdown
Member

Instruments mongoose >= 9.7 through its native diagnostics_channel tracing channels instead of monkey-patching, the same way we did for redis/ioredis. The subscription lives in server-utils as mongooseChannelIntegration, and the node mongooseIntegration extends it (via extendIntegration) to keep running the IITM patcher for mongoose < 9.7.

The channel path emits the latest stable DB semconv, so there is an attribute drift. We did that for redis so I thought to do the same here, but we could match the legacy attributes and drop them later for v11 if that's what we want.

@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 668581c to 0e1e4c1CompareJune 25, 2026 17:26
@github-actions

github-actionsBot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.59 kB--
@sentry/browser - with treeshaking flags26.03 kB--
@sentry/browser (incl. Tracing)46.05 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.79 kB--
@sentry/browser (incl. Tracing, Profiling)50.81 kB--
@sentry/browser (incl. Tracing, Replay)85.28 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.89 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.97 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.64 kB--
@sentry/browser (incl. Feedback)44.77 kB--
@sentry/browser (incl. sendFeedback)32.39 kB--
@sentry/browser (incl. FeedbackAsync)37.52 kB--
@sentry/browser (incl. Metrics)28.67 kB--
@sentry/browser (incl. Logs)28.91 kB--
@sentry/browser (incl. Metrics & Logs)29.6 kB--
@sentry/react29.38 kB--
@sentry/react (incl. Tracing)48.35 kB--
@sentry/vue32.82 kB--
@sentry/vue (incl. Tracing)47.91 kB--
@sentry/svelte27.61 kB--
CDN Bundle30 kB--
CDN Bundle (incl. Tracing)47.98 kB--
CDN Bundle (incl. Logs, Metrics)31.57 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.32 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.77 kB--
CDN Bundle (incl. Tracing, Replay)85.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.76 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.29 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.53 kB--
CDN Bundle - uncompressed89.35 kB--
CDN Bundle (incl. Tracing) - uncompressed145.28 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.05 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.25 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.59 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.29 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.25 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.99 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.94 kB--
@sentry/nextjs (client)50.73 kB--
@sentry/sveltekit (client)46.44 kB--
@sentry/core/server77.75 kB--
@sentry/core/browser64.06 kB--
@sentry/node-core62.37 kB--
@sentry/node121.67 kB+0.36%+425 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)69.95 kB--
@sentry/node/light50.46 kB--
@sentry/node - without tracing72.68 kB--
@sentry/aws-serverless83.52 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified180.62 kB--
@sentry/cloudflare (withSentry)446.93 kB--

View base workflow run

@mydea

Copy link
Copy Markdown
Member

mongooseChannelIntegration

more a general thing, but I think I'd just call this mongooseIntegration? When using this from server-utils this is kind of an implementation detail that is not that relevant, you can just use the integration from there? It's a bit different for the orchestrion ones because they should not be "accidentally" used, but for these with native support I think just calling them "normally" is fine?

@mydea
mydeaforce-pushed the fn/better-integration-extend branch 2 times, most recently from 2407b9e to 31520beCompareJune 26, 2026 08:48
Base automatically changed from fn/better-integration-extend to developJune 26, 2026 09:38
@logaretm

Copy link
Copy Markdown
MemberAuthor

Yea I was thinking about this yesterday, we ideally would export those as-is for the environments that do not support module hooks. Will make that change

@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 5a990f3 to 3e8b992CompareJune 26, 2026 11:49
@logaretm
logaretm marked this pull request as ready for review June 26, 2026 12:55
@logaretm
logaretm requested a review from a team as a code ownerJune 26, 2026 12:55
@logaretm
logaretm requested review from JPeer264, andreiborza, isaacs, mydea and nicohrubec and removed request for a teamJune 26, 2026 12:55
@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from ccbdd92 to 9cbf9dfCompareJune 26, 2026 13:01

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 9cbf9df. Configure here.

instrumentMongoose();
},
};
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Preload skips mongoose channel subscribe

Medium Severity

For mongoose >=9.7, diagnostics-channel subscription runs only in the server-utils integration setupOnce, while preloadOpenTelemetry invokes instrumentMongoose alone. The IITM patcher no longer covers 9.7+, so mongoose work between preload and Sentry.init() (or any preload-only usage) is not traced.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 9cbf9df. Configure here.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that is ok.

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code wise LGTM. I think this one has not been done yet? #21803 (comment) (I would vote for that too)

...(collection != null ? { [DB_COLLECTION_NAME]: collection } : {}),
...(data.database != null ? { [DB_NAMESPACE]: data.database } : {}),
...(queryText != null ? { [DB_QUERY_TEXT]: queryText } : {}),
...(batchSize != null ? { [DB_OPERATION_BATCH_SIZE]: batchSize } : {}),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: undefined values are skipped, null not, so it seems like this was done on purpose. I think following is a little easier to read:

Suggested change
...(batchSize!=null ? {[DB_OPERATION_BATCH_SIZE]: batchSize} : {}),
[DB_OPERATION_BATCH_SIZE]: batchSize??undefined

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good, that was ugly

Subscribe to mongoose 9.7's native diagnostics_channel tracing channels via
bindTracingChannelToSpan, emitting stable OTel DB semconv. Narrow the vendored
OTel patcher to < 9.7.0 to avoid double instrumentation.
…gration
Runtimes that use the server-utils integration directly expose it to users,
so 'channel' in the name leaks an implementation detail. Node imports it under
an internal alias since it keeps its own composed mongooseIntegration.
Replace the conditional-spread pattern for optional attributes with
`?? undefined`. Undefined-valued keys are dropped by the span backends,
so this is equivalent while keeping all six attribute lines consistent.
Replace the ad-hoc `void Promise.resolve().then(...)` deferral with the
shared `waitForTracingChannelBinding` util, matching the vercel-ai and
redis integrations. It retries until the async context binding is
available, so it also handles custom OTel setups where the binding isn't
ready on the first tick.
@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 9cbf9df to 6e85b2fCompareJuly 1, 2026 17:13
@logaretm
logaretm merged commit 0c33a8d into developJul 2, 2026
372 of 376 checks passed
@logaretm
logaretm deleted the awad/mongoose-tracing-channels branch July 2, 2026 15:47
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@logaretm@mydea@JPeer264
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(mongoose): Instrument mongoose >= 9.7 via native tracing channels - #21803

Merged
logaretm merged 7 commits into
developfrom
awad/mongoose-tracing-channels
Jul 2, 2026
Merged

feat(mongoose): Instrument mongoose >= 9.7 via native tracing channels#21803
logaretm merged 7 commits into
developfrom
awad/mongoose-tracing-channels

Conversation

@logaretm

@logaretmlogaretm commented Jun 25, 2026

Copy link
Copy Markdown
Member

Instruments mongoose >= 9.7 through its native diagnostics_channel tracing channels instead of monkey-patching, the same way we did for redis/ioredis. The subscription lives in server-utils as mongooseChannelIntegration, and the node mongooseIntegration extends it (via extendIntegration) to keep running the IITM patcher for mongoose < 9.7.

The channel path emits the latest stable DB semconv, so there is an attribute drift. We did that for redis so I thought to do the same here, but we could match the legacy attributes and drop them later for v11 if that's what we want.

@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 668581c to 0e1e4c1CompareJune 25, 2026 17:26
@github-actions

github-actionsBot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.59 kB--
@sentry/browser - with treeshaking flags26.03 kB--
@sentry/browser (incl. Tracing)46.05 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.79 kB--
@sentry/browser (incl. Tracing, Profiling)50.81 kB--
@sentry/browser (incl. Tracing, Replay)85.28 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.89 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.97 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.64 kB--
@sentry/browser (incl. Feedback)44.77 kB--
@sentry/browser (incl. sendFeedback)32.39 kB--
@sentry/browser (incl. FeedbackAsync)37.52 kB--
@sentry/browser (incl. Metrics)28.67 kB--
@sentry/browser (incl. Logs)28.91 kB--
@sentry/browser (incl. Metrics & Logs)29.6 kB--
@sentry/react29.38 kB--
@sentry/react (incl. Tracing)48.35 kB--
@sentry/vue32.82 kB--
@sentry/vue (incl. Tracing)47.91 kB--
@sentry/svelte27.61 kB--
CDN Bundle30 kB--
CDN Bundle (incl. Tracing)47.98 kB--
CDN Bundle (incl. Logs, Metrics)31.57 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.32 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.77 kB--
CDN Bundle (incl. Tracing, Replay)85.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.76 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.29 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.53 kB--
CDN Bundle - uncompressed89.35 kB--
CDN Bundle (incl. Tracing) - uncompressed145.28 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.05 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.25 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.59 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.29 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.25 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.99 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.94 kB--
@sentry/nextjs (client)50.73 kB--
@sentry/sveltekit (client)46.44 kB--
@sentry/core/server77.75 kB--
@sentry/core/browser64.06 kB--
@sentry/node-core62.37 kB--
@sentry/node121.67 kB+0.36%+425 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)69.95 kB--
@sentry/node/light50.46 kB--
@sentry/node - without tracing72.68 kB--
@sentry/aws-serverless83.52 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified180.62 kB--
@sentry/cloudflare (withSentry)446.93 kB--

View base workflow run

@mydea

Copy link
Copy Markdown
Member

mongooseChannelIntegration

more a general thing, but I think I'd just call this mongooseIntegration? When using this from server-utils this is kind of an implementation detail that is not that relevant, you can just use the integration from there? It's a bit different for the orchestrion ones because they should not be "accidentally" used, but for these with native support I think just calling them "normally" is fine?

@mydea
mydeaforce-pushed the fn/better-integration-extend branch 2 times, most recently from 2407b9e to 31520beCompareJune 26, 2026 08:48
Base automatically changed from fn/better-integration-extend to developJune 26, 2026 09:38
@logaretm

Copy link
Copy Markdown
MemberAuthor

Yea I was thinking about this yesterday, we ideally would export those as-is for the environments that do not support module hooks. Will make that change

@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 5a990f3 to 3e8b992CompareJune 26, 2026 11:49
@logaretm
logaretm marked this pull request as ready for review June 26, 2026 12:55
@logaretm
logaretm requested a review from a team as a code ownerJune 26, 2026 12:55
@logaretm
logaretm requested review from JPeer264, andreiborza, isaacs, mydea and nicohrubec and removed request for a teamJune 26, 2026 12:55
@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from ccbdd92 to 9cbf9dfCompareJune 26, 2026 13:01

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 9cbf9df. Configure here.

instrumentMongoose();
},
};
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Preload skips mongoose channel subscribe

Medium Severity

For mongoose >=9.7, diagnostics-channel subscription runs only in the server-utils integration setupOnce, while preloadOpenTelemetry invokes instrumentMongoose alone. The IITM patcher no longer covers 9.7+, so mongoose work between preload and Sentry.init() (or any preload-only usage) is not traced.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 9cbf9df. Configure here.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that is ok.

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code wise LGTM. I think this one has not been done yet? #21803 (comment) (I would vote for that too)

...(collection != null ? { [DB_COLLECTION_NAME]: collection } : {}),
...(data.database != null ? { [DB_NAMESPACE]: data.database } : {}),
...(queryText != null ? { [DB_QUERY_TEXT]: queryText } : {}),
...(batchSize != null ? { [DB_OPERATION_BATCH_SIZE]: batchSize } : {}),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: undefined values are skipped, null not, so it seems like this was done on purpose. I think following is a little easier to read:

Suggested change
...(batchSize!=null ? {[DB_OPERATION_BATCH_SIZE]: batchSize} : {}),
[DB_OPERATION_BATCH_SIZE]: batchSize??undefined

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good, that was ugly

Subscribe to mongoose 9.7's native diagnostics_channel tracing channels via
bindTracingChannelToSpan, emitting stable OTel DB semconv. Narrow the vendored
OTel patcher to < 9.7.0 to avoid double instrumentation.
…gration
Runtimes that use the server-utils integration directly expose it to users,
so 'channel' in the name leaks an implementation detail. Node imports it under
an internal alias since it keeps its own composed mongooseIntegration.
Replace the conditional-spread pattern for optional attributes with
`?? undefined`. Undefined-valued keys are dropped by the span backends,
so this is equivalent while keeping all six attribute lines consistent.
Replace the ad-hoc `void Promise.resolve().then(...)` deferral with the
shared `waitForTracingChannelBinding` util, matching the vercel-ai and
redis integrations. It retries until the async context binding is
available, so it also handles custom OTel setups where the binding isn't
ready on the first tick.
@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 9cbf9df to 6e85b2fCompareJuly 1, 2026 17:13
@logaretm
logaretm merged commit 0c33a8d into developJul 2, 2026
372 of 376 checks passed
@logaretm
logaretm deleted the awad/mongoose-tracing-channels branch July 2, 2026 15:47
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@logaretm@mydea@JPeer264
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(mongoose): Instrument mongoose >= 9.7 via native tracing channels - #21803

Merged
logaretm merged 7 commits into
developfrom
awad/mongoose-tracing-channels
Jul 2, 2026
Merged

feat(mongoose): Instrument mongoose >= 9.7 via native tracing channels#21803
logaretm merged 7 commits into
developfrom
awad/mongoose-tracing-channels

Conversation

@logaretm

@logaretmlogaretm commented Jun 25, 2026

Copy link
Copy Markdown
Member

Instruments mongoose >= 9.7 through its native diagnostics_channel tracing channels instead of monkey-patching, the same way we did for redis/ioredis. The subscription lives in server-utils as mongooseChannelIntegration, and the node mongooseIntegration extends it (via extendIntegration) to keep running the IITM patcher for mongoose < 9.7.

The channel path emits the latest stable DB semconv, so there is an attribute drift. We did that for redis so I thought to do the same here, but we could match the legacy attributes and drop them later for v11 if that's what we want.

@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 668581c to 0e1e4c1CompareJune 25, 2026 17:26
@github-actions

github-actionsBot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.59 kB--
@sentry/browser - with treeshaking flags26.03 kB--
@sentry/browser (incl. Tracing)46.05 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.79 kB--
@sentry/browser (incl. Tracing, Profiling)50.81 kB--
@sentry/browser (incl. Tracing, Replay)85.28 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.89 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.97 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.64 kB--
@sentry/browser (incl. Feedback)44.77 kB--
@sentry/browser (incl. sendFeedback)32.39 kB--
@sentry/browser (incl. FeedbackAsync)37.52 kB--
@sentry/browser (incl. Metrics)28.67 kB--
@sentry/browser (incl. Logs)28.91 kB--
@sentry/browser (incl. Metrics & Logs)29.6 kB--
@sentry/react29.38 kB--
@sentry/react (incl. Tracing)48.35 kB--
@sentry/vue32.82 kB--
@sentry/vue (incl. Tracing)47.91 kB--
@sentry/svelte27.61 kB--
CDN Bundle30 kB--
CDN Bundle (incl. Tracing)47.98 kB--
CDN Bundle (incl. Logs, Metrics)31.57 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.32 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.77 kB--
CDN Bundle (incl. Tracing, Replay)85.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.76 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.29 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.53 kB--
CDN Bundle - uncompressed89.35 kB--
CDN Bundle (incl. Tracing) - uncompressed145.28 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.05 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.25 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.59 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.29 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.25 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.99 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.94 kB--
@sentry/nextjs (client)50.73 kB--
@sentry/sveltekit (client)46.44 kB--
@sentry/core/server77.75 kB--
@sentry/core/browser64.06 kB--
@sentry/node-core62.37 kB--
@sentry/node121.67 kB+0.36%+425 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)69.95 kB--
@sentry/node/light50.46 kB--
@sentry/node - without tracing72.68 kB--
@sentry/aws-serverless83.52 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified180.62 kB--
@sentry/cloudflare (withSentry)446.93 kB--

View base workflow run

@mydea

Copy link
Copy Markdown
Member

mongooseChannelIntegration

more a general thing, but I think I'd just call this mongooseIntegration? When using this from server-utils this is kind of an implementation detail that is not that relevant, you can just use the integration from there? It's a bit different for the orchestrion ones because they should not be "accidentally" used, but for these with native support I think just calling them "normally" is fine?

@mydea
mydeaforce-pushed the fn/better-integration-extend branch 2 times, most recently from 2407b9e to 31520beCompareJune 26, 2026 08:48
Base automatically changed from fn/better-integration-extend to developJune 26, 2026 09:38
@logaretm

Copy link
Copy Markdown
MemberAuthor

Yea I was thinking about this yesterday, we ideally would export those as-is for the environments that do not support module hooks. Will make that change

@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 5a990f3 to 3e8b992CompareJune 26, 2026 11:49
@logaretm
logaretm marked this pull request as ready for review June 26, 2026 12:55
@logaretm
logaretm requested a review from a team as a code ownerJune 26, 2026 12:55
@logaretm
logaretm requested review from JPeer264, andreiborza, isaacs, mydea and nicohrubec and removed request for a teamJune 26, 2026 12:55
@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from ccbdd92 to 9cbf9dfCompareJune 26, 2026 13:01

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 9cbf9df. Configure here.

instrumentMongoose();
},
};
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Preload skips mongoose channel subscribe

Medium Severity

For mongoose >=9.7, diagnostics-channel subscription runs only in the server-utils integration setupOnce, while preloadOpenTelemetry invokes instrumentMongoose alone. The IITM patcher no longer covers 9.7+, so mongoose work between preload and Sentry.init() (or any preload-only usage) is not traced.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 9cbf9df. Configure here.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that is ok.

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code wise LGTM. I think this one has not been done yet? #21803 (comment) (I would vote for that too)

...(collection != null ? { [DB_COLLECTION_NAME]: collection } : {}),
...(data.database != null ? { [DB_NAMESPACE]: data.database } : {}),
...(queryText != null ? { [DB_QUERY_TEXT]: queryText } : {}),
...(batchSize != null ? { [DB_OPERATION_BATCH_SIZE]: batchSize } : {}),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: undefined values are skipped, null not, so it seems like this was done on purpose. I think following is a little easier to read:

Suggested change
...(batchSize!=null ? {[DB_OPERATION_BATCH_SIZE]: batchSize} : {}),
[DB_OPERATION_BATCH_SIZE]: batchSize??undefined

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good, that was ugly

Subscribe to mongoose 9.7's native diagnostics_channel tracing channels via
bindTracingChannelToSpan, emitting stable OTel DB semconv. Narrow the vendored
OTel patcher to < 9.7.0 to avoid double instrumentation.
…gration
Runtimes that use the server-utils integration directly expose it to users,
so 'channel' in the name leaks an implementation detail. Node imports it under
an internal alias since it keeps its own composed mongooseIntegration.
Replace the conditional-spread pattern for optional attributes with
`?? undefined`. Undefined-valued keys are dropped by the span backends,
so this is equivalent while keeping all six attribute lines consistent.
Replace the ad-hoc `void Promise.resolve().then(...)` deferral with the
shared `waitForTracingChannelBinding` util, matching the vercel-ai and
redis integrations. It retries until the async context binding is
available, so it also handles custom OTel setups where the binding isn't
ready on the first tick.
@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 9cbf9df to 6e85b2fCompareJuly 1, 2026 17:13
@logaretm
logaretm merged commit 0c33a8d into developJul 2, 2026
372 of 376 checks passed
@logaretm
logaretm deleted the awad/mongoose-tracing-channels branch July 2, 2026 15:47
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@logaretm@mydea@JPeer264
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(mongoose): Instrument mongoose >= 9.7 via native tracing channels - #21803

Merged
logaretm merged 7 commits into
developfrom
awad/mongoose-tracing-channels
Jul 2, 2026
Merged

feat(mongoose): Instrument mongoose >= 9.7 via native tracing channels#21803
logaretm merged 7 commits into
developfrom
awad/mongoose-tracing-channels

Conversation

@logaretm

@logaretmlogaretm commented Jun 25, 2026

Copy link
Copy Markdown
Member

Instruments mongoose >= 9.7 through its native diagnostics_channel tracing channels instead of monkey-patching, the same way we did for redis/ioredis. The subscription lives in server-utils as mongooseChannelIntegration, and the node mongooseIntegration extends it (via extendIntegration) to keep running the IITM patcher for mongoose < 9.7.

The channel path emits the latest stable DB semconv, so there is an attribute drift. We did that for redis so I thought to do the same here, but we could match the legacy attributes and drop them later for v11 if that's what we want.

@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 668581c to 0e1e4c1CompareJune 25, 2026 17:26
@github-actions

github-actionsBot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.59 kB--
@sentry/browser - with treeshaking flags26.03 kB--
@sentry/browser (incl. Tracing)46.05 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.79 kB--
@sentry/browser (incl. Tracing, Profiling)50.81 kB--
@sentry/browser (incl. Tracing, Replay)85.28 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.89 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.97 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.64 kB--
@sentry/browser (incl. Feedback)44.77 kB--
@sentry/browser (incl. sendFeedback)32.39 kB--
@sentry/browser (incl. FeedbackAsync)37.52 kB--
@sentry/browser (incl. Metrics)28.67 kB--
@sentry/browser (incl. Logs)28.91 kB--
@sentry/browser (incl. Metrics & Logs)29.6 kB--
@sentry/react29.38 kB--
@sentry/react (incl. Tracing)48.35 kB--
@sentry/vue32.82 kB--
@sentry/vue (incl. Tracing)47.91 kB--
@sentry/svelte27.61 kB--
CDN Bundle30 kB--
CDN Bundle (incl. Tracing)47.98 kB--
CDN Bundle (incl. Logs, Metrics)31.57 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.32 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.77 kB--
CDN Bundle (incl. Tracing, Replay)85.48 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.76 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.29 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.53 kB--
CDN Bundle - uncompressed89.35 kB--
CDN Bundle (incl. Tracing) - uncompressed145.28 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.05 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.25 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.59 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.29 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.25 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed277.99 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed281.94 kB--
@sentry/nextjs (client)50.73 kB--
@sentry/sveltekit (client)46.44 kB--
@sentry/core/server77.75 kB--
@sentry/core/browser64.06 kB--
@sentry/node-core62.37 kB--
@sentry/node121.67 kB+0.36%+425 B 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)69.95 kB--
@sentry/node/light50.46 kB--
@sentry/node - without tracing72.68 kB--
@sentry/aws-serverless83.52 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified180.62 kB--
@sentry/cloudflare (withSentry)446.93 kB--

View base workflow run

@mydea

Copy link
Copy Markdown
Member

mongooseChannelIntegration

more a general thing, but I think I'd just call this mongooseIntegration? When using this from server-utils this is kind of an implementation detail that is not that relevant, you can just use the integration from there? It's a bit different for the orchestrion ones because they should not be "accidentally" used, but for these with native support I think just calling them "normally" is fine?

@mydea
mydeaforce-pushed the fn/better-integration-extend branch 2 times, most recently from 2407b9e to 31520beCompareJune 26, 2026 08:48
Base automatically changed from fn/better-integration-extend to developJune 26, 2026 09:38
@logaretm

Copy link
Copy Markdown
MemberAuthor

Yea I was thinking about this yesterday, we ideally would export those as-is for the environments that do not support module hooks. Will make that change

@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 5a990f3 to 3e8b992CompareJune 26, 2026 11:49
@logaretm
logaretm marked this pull request as ready for review June 26, 2026 12:55
@logaretm
logaretm requested a review from a team as a code ownerJune 26, 2026 12:55
@logaretm
logaretm requested review from JPeer264, andreiborza, isaacs, mydea and nicohrubec and removed request for a teamJune 26, 2026 12:55
@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from ccbdd92 to 9cbf9dfCompareJune 26, 2026 13:01

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 9cbf9df. Configure here.

instrumentMongoose();
},
};
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Preload skips mongoose channel subscribe

Medium Severity

For mongoose >=9.7, diagnostics-channel subscription runs only in the server-utils integration setupOnce, while preloadOpenTelemetry invokes instrumentMongoose alone. The IITM patcher no longer covers 9.7+, so mongoose work between preload and Sentry.init() (or any preload-only usage) is not traced.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 9cbf9df. Configure here.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that is ok.

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code wise LGTM. I think this one has not been done yet? #21803 (comment) (I would vote for that too)

...(collection != null ? { [DB_COLLECTION_NAME]: collection } : {}),
...(data.database != null ? { [DB_NAMESPACE]: data.database } : {}),
...(queryText != null ? { [DB_QUERY_TEXT]: queryText } : {}),
...(batchSize != null ? { [DB_OPERATION_BATCH_SIZE]: batchSize } : {}),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: undefined values are skipped, null not, so it seems like this was done on purpose. I think following is a little easier to read:

Suggested change
...(batchSize!=null ? {[DB_OPERATION_BATCH_SIZE]: batchSize} : {}),
[DB_OPERATION_BATCH_SIZE]: batchSize??undefined

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good, that was ugly

Subscribe to mongoose 9.7's native diagnostics_channel tracing channels via
bindTracingChannelToSpan, emitting stable OTel DB semconv. Narrow the vendored
OTel patcher to < 9.7.0 to avoid double instrumentation.
…gration
Runtimes that use the server-utils integration directly expose it to users,
so 'channel' in the name leaks an implementation detail. Node imports it under
an internal alias since it keeps its own composed mongooseIntegration.
Replace the conditional-spread pattern for optional attributes with
`?? undefined`. Undefined-valued keys are dropped by the span backends,
so this is equivalent while keeping all six attribute lines consistent.
Replace the ad-hoc `void Promise.resolve().then(...)` deferral with the
shared `waitForTracingChannelBinding` util, matching the vercel-ai and
redis integrations. It retries until the async context binding is
available, so it also handles custom OTel setups where the binding isn't
ready on the first tick.
@logaretm
logaretmforce-pushed the awad/mongoose-tracing-channels branch from 9cbf9df to 6e85b2fCompareJuly 1, 2026 17:13
@logaretm
logaretm merged commit 0c33a8d into developJul 2, 2026
372 of 376 checks passed
@logaretm
logaretm deleted the awad/mongoose-tracing-channels branch July 2, 2026 15:47
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@logaretm@mydea@JPeer264