feat(cloudflare): Instrument sync KV - #21316

Merged
JPeer264 merged 3 commits into
developfrom
jp/cloudflare-sync-kv-instrument
Jun 15, 2026
Merged

feat(cloudflare): Instrument sync KV#21316
JPeer264 merged 3 commits into
developfrom
jp/cloudflare-sync-kv-instrument

Conversation

@JPeer264

Copy link
Copy Markdown
Member

closes#20830
closes JS-2443

This adds instrumentation for ctx.storage.kv.* (it only adds a span like with the async KV).

Cloudflare itself is having cloudflare-durable-object-sql as db.system.name, that is why we have it here now too.

@JPeer264JPeer264 self-assigned this Jun 3, 2026
@JPeer264
JPeer264 requested a review from a team as a code ownerJune 3, 2026 08:32
@JPeer264
JPeer264 requested review from andreiborza and mydea and removed request for a teamJune 3, 2026 08:32
@linear-code

Copy link
Copy Markdown

JS-2443

@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 2decb59. Configure here.

@JPeer264
JPeer264force-pushed the jp/cloudflare-sync-kv-instrument branch from 2decb59 to 091b09bCompareJune 3, 2026 08:40
@JPeer264
JPeer264 requested a review from a team as a code ownerJune 3, 2026 08:40
@JPeer264
JPeer264 requested review from nicohrubec and removed request for a teamJune 3, 2026 08:41
@JPeer264
JPeer264force-pushed the jp/cloudflare-sync-kv-instrument branch from 0526d91 to 26e3446CompareJune 3, 2026 13:52
Comment on lines +39 to +41
if (prop === 'kv' && original != null && typeof original === 'object') {
return instrumentDurableObjectSyncKvStorage(original as SyncKvStorage);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bug: Accessing storage.kv repeatedly creates a new proxy object each time instead of reusing a cached one, causing unnecessary performance overhead.
Severity: MEDIUM

Suggested Fix

Use a WeakMap to cache the instrumented proxy for the kv property. On the first access, create the proxy, store it in the map, and return it. On subsequent accesses, return the cached proxy from the WeakMap. This aligns with the existing caching pattern in instrumentEnv.ts and avoids creating multiple proxy objects.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location:
packages/cloudflare/src/instrumentations/instrumentDurableObjectStorage.ts#L39-L41
Potential issue: The instrumentation for Durable Object storage creates a new proxy for
the `kv` property on every access. In scenarios where code makes multiple sequential
calls like `storage.kv.get(...)` and then `storage.kv.put(...)`, a new proxy object is
unnecessarily created for each call. This leads to increased object allocations and
garbage collection pressure, which can degrade performance in serverless environments.
This behavior is inconsistent with the caching pattern (using `WeakMap`) established in
other parts of the codebase, such as in `instrumentEnv.ts`.

Did we get this right? 👍 / 👎 to inform future reviews.

@github-actions

github-actionsBot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser27.4 kB--
@sentry/browser - with treeshaking flags25.84 kB--
@sentry/browser (incl. Tracing)45.7 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.94 kB--
@sentry/browser (incl. Tracing, Profiling)50.5 kB--
@sentry/browser (incl. Tracing, Replay)84.92 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.53 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.61 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.3 kB--
@sentry/browser (incl. Feedback)44.56 kB--
@sentry/browser (incl. sendFeedback)32.2 kB--
@sentry/browser (incl. FeedbackAsync)37.31 kB--
@sentry/browser (incl. Metrics)28.47 kB--
@sentry/browser (incl. Logs)28.71 kB--
@sentry/browser (incl. Metrics & Logs)29.4 kB--
@sentry/react29.2 kB--
@sentry/react (incl. Tracing)48 kB--
@sentry/vue32.42 kB--
@sentry/vue (incl. Tracing)47.59 kB--
@sentry/svelte27.42 kB--
CDN Bundle29.79 kB--
CDN Bundle (incl. Tracing)48.2 kB--
CDN Bundle (incl. Logs, Metrics)31.33 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.49 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.62 kB--
CDN Bundle (incl. Tracing, Replay)85.52 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.77 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.37 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.62 kB--
CDN Bundle - uncompressed88.59 kB--
CDN Bundle (incl. Tracing) - uncompressed145.8 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.29 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.77 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.12 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.67 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.63 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.37 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.31 kB--
@sentry/nextjs (client)50.45 kB--
@sentry/sveltekit (client)46.12 kB--
@sentry/core/server76.08 kB--
@sentry/core/browser63.22 kB--
@sentry/node-core61.72 kB-0.01%-3 B 🔽
@sentry/node130.53 kB--
@sentry/node - without tracing74.11 kB+0.01%+1 B 🔺
@sentry/aws-serverless86.29 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified174.19 kB+0.29%+500 B 🔺
@sentry/cloudflare (withSentry)435.41 kB+0.36%+1.56 kB 🔺

View base workflow run

// reference" errors.
const original = Reflect.get(target, prop, target);

if (prop === 'kv' && original != null && typeof original === 'object') {

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.

Can this be hardened a bit? typeof object is a bit broad. Maybe you can check for some typical object keys.

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.

Good idea. I'll add that.

@JPeer264
JPeer264 merged commit 058e2ad into developJun 15, 2026
532 of 534 checks passed
@JPeer264
JPeer264 deleted the jp/cloudflare-sync-kv-instrument branch June 15, 2026 16:13
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.

Cloudflare instrument Sync KV API

4 participants

@JPeer264@nicohrubec@s1gr1d@andreiborza
, '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(cloudflare): Instrument sync KV - #21316

Merged
JPeer264 merged 3 commits into
developfrom
jp/cloudflare-sync-kv-instrument
Jun 15, 2026
Merged

feat(cloudflare): Instrument sync KV#21316
JPeer264 merged 3 commits into
developfrom
jp/cloudflare-sync-kv-instrument

Conversation

@JPeer264

Copy link
Copy Markdown
Member

closes#20830
closes JS-2443

This adds instrumentation for ctx.storage.kv.* (it only adds a span like with the async KV).

Cloudflare itself is having cloudflare-durable-object-sql as db.system.name, that is why we have it here now too.

@JPeer264JPeer264 self-assigned this Jun 3, 2026
@JPeer264
JPeer264 requested a review from a team as a code ownerJune 3, 2026 08:32
@JPeer264
JPeer264 requested review from andreiborza and mydea and removed request for a teamJune 3, 2026 08:32
@linear-code

Copy link
Copy Markdown

JS-2443

@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 2decb59. Configure here.

@JPeer264
JPeer264force-pushed the jp/cloudflare-sync-kv-instrument branch from 2decb59 to 091b09bCompareJune 3, 2026 08:40
@JPeer264
JPeer264 requested a review from a team as a code ownerJune 3, 2026 08:40
@JPeer264
JPeer264 requested review from nicohrubec and removed request for a teamJune 3, 2026 08:41
@JPeer264
JPeer264force-pushed the jp/cloudflare-sync-kv-instrument branch from 0526d91 to 26e3446CompareJune 3, 2026 13:52
Comment on lines +39 to +41
if (prop === 'kv' && original != null && typeof original === 'object') {
return instrumentDurableObjectSyncKvStorage(original as SyncKvStorage);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bug: Accessing storage.kv repeatedly creates a new proxy object each time instead of reusing a cached one, causing unnecessary performance overhead.
Severity: MEDIUM

Suggested Fix

Use a WeakMap to cache the instrumented proxy for the kv property. On the first access, create the proxy, store it in the map, and return it. On subsequent accesses, return the cached proxy from the WeakMap. This aligns with the existing caching pattern in instrumentEnv.ts and avoids creating multiple proxy objects.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location:
packages/cloudflare/src/instrumentations/instrumentDurableObjectStorage.ts#L39-L41
Potential issue: The instrumentation for Durable Object storage creates a new proxy for
the `kv` property on every access. In scenarios where code makes multiple sequential
calls like `storage.kv.get(...)` and then `storage.kv.put(...)`, a new proxy object is
unnecessarily created for each call. This leads to increased object allocations and
garbage collection pressure, which can degrade performance in serverless environments.
This behavior is inconsistent with the caching pattern (using `WeakMap`) established in
other parts of the codebase, such as in `instrumentEnv.ts`.

Did we get this right? 👍 / 👎 to inform future reviews.

@github-actions

github-actionsBot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser27.4 kB--
@sentry/browser - with treeshaking flags25.84 kB--
@sentry/browser (incl. Tracing)45.7 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.94 kB--
@sentry/browser (incl. Tracing, Profiling)50.5 kB--
@sentry/browser (incl. Tracing, Replay)84.92 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.53 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.61 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.3 kB--
@sentry/browser (incl. Feedback)44.56 kB--
@sentry/browser (incl. sendFeedback)32.2 kB--
@sentry/browser (incl. FeedbackAsync)37.31 kB--
@sentry/browser (incl. Metrics)28.47 kB--
@sentry/browser (incl. Logs)28.71 kB--
@sentry/browser (incl. Metrics & Logs)29.4 kB--
@sentry/react29.2 kB--
@sentry/react (incl. Tracing)48 kB--
@sentry/vue32.42 kB--
@sentry/vue (incl. Tracing)47.59 kB--
@sentry/svelte27.42 kB--
CDN Bundle29.79 kB--
CDN Bundle (incl. Tracing)48.2 kB--
CDN Bundle (incl. Logs, Metrics)31.33 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.49 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.62 kB--
CDN Bundle (incl. Tracing, Replay)85.52 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.77 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.37 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.62 kB--
CDN Bundle - uncompressed88.59 kB--
CDN Bundle (incl. Tracing) - uncompressed145.8 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.29 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.77 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.12 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.67 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.63 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.37 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.31 kB--
@sentry/nextjs (client)50.45 kB--
@sentry/sveltekit (client)46.12 kB--
@sentry/core/server76.08 kB--
@sentry/core/browser63.22 kB--
@sentry/node-core61.72 kB-0.01%-3 B 🔽
@sentry/node130.53 kB--
@sentry/node - without tracing74.11 kB+0.01%+1 B 🔺
@sentry/aws-serverless86.29 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified174.19 kB+0.29%+500 B 🔺
@sentry/cloudflare (withSentry)435.41 kB+0.36%+1.56 kB 🔺

View base workflow run

// reference" errors.
const original = Reflect.get(target, prop, target);

if (prop === 'kv' && original != null && typeof original === 'object') {

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.

Can this be hardened a bit? typeof object is a bit broad. Maybe you can check for some typical object keys.

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.

Good idea. I'll add that.

@JPeer264
JPeer264 merged commit 058e2ad into developJun 15, 2026
532 of 534 checks passed
@JPeer264
JPeer264 deleted the jp/cloudflare-sync-kv-instrument branch June 15, 2026 16:13
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.

Cloudflare instrument Sync KV API

4 participants

@JPeer264@nicohrubec@s1gr1d@andreiborza
, '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(cloudflare): Instrument sync KV - #21316

Merged
JPeer264 merged 3 commits into
developfrom
jp/cloudflare-sync-kv-instrument
Jun 15, 2026
Merged

feat(cloudflare): Instrument sync KV#21316
JPeer264 merged 3 commits into
developfrom
jp/cloudflare-sync-kv-instrument

Conversation

@JPeer264

Copy link
Copy Markdown
Member

closes#20830
closes JS-2443

This adds instrumentation for ctx.storage.kv.* (it only adds a span like with the async KV).

Cloudflare itself is having cloudflare-durable-object-sql as db.system.name, that is why we have it here now too.

@JPeer264JPeer264 self-assigned this Jun 3, 2026
@JPeer264
JPeer264 requested a review from a team as a code ownerJune 3, 2026 08:32
@JPeer264
JPeer264 requested review from andreiborza and mydea and removed request for a teamJune 3, 2026 08:32
@linear-code

Copy link
Copy Markdown

JS-2443

@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 2decb59. Configure here.

@JPeer264
JPeer264force-pushed the jp/cloudflare-sync-kv-instrument branch from 2decb59 to 091b09bCompareJune 3, 2026 08:40
@JPeer264
JPeer264 requested a review from a team as a code ownerJune 3, 2026 08:40
@JPeer264
JPeer264 requested review from nicohrubec and removed request for a teamJune 3, 2026 08:41
@JPeer264
JPeer264force-pushed the jp/cloudflare-sync-kv-instrument branch from 0526d91 to 26e3446CompareJune 3, 2026 13:52
Comment on lines +39 to +41
if (prop === 'kv' && original != null && typeof original === 'object') {
return instrumentDurableObjectSyncKvStorage(original as SyncKvStorage);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bug: Accessing storage.kv repeatedly creates a new proxy object each time instead of reusing a cached one, causing unnecessary performance overhead.
Severity: MEDIUM

Suggested Fix

Use a WeakMap to cache the instrumented proxy for the kv property. On the first access, create the proxy, store it in the map, and return it. On subsequent accesses, return the cached proxy from the WeakMap. This aligns with the existing caching pattern in instrumentEnv.ts and avoids creating multiple proxy objects.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location:
packages/cloudflare/src/instrumentations/instrumentDurableObjectStorage.ts#L39-L41
Potential issue: The instrumentation for Durable Object storage creates a new proxy for
the `kv` property on every access. In scenarios where code makes multiple sequential
calls like `storage.kv.get(...)` and then `storage.kv.put(...)`, a new proxy object is
unnecessarily created for each call. This leads to increased object allocations and
garbage collection pressure, which can degrade performance in serverless environments.
This behavior is inconsistent with the caching pattern (using `WeakMap`) established in
other parts of the codebase, such as in `instrumentEnv.ts`.

Did we get this right? 👍 / 👎 to inform future reviews.

@github-actions

github-actionsBot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser27.4 kB--
@sentry/browser - with treeshaking flags25.84 kB--
@sentry/browser (incl. Tracing)45.7 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.94 kB--
@sentry/browser (incl. Tracing, Profiling)50.5 kB--
@sentry/browser (incl. Tracing, Replay)84.92 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.53 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.61 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.3 kB--
@sentry/browser (incl. Feedback)44.56 kB--
@sentry/browser (incl. sendFeedback)32.2 kB--
@sentry/browser (incl. FeedbackAsync)37.31 kB--
@sentry/browser (incl. Metrics)28.47 kB--
@sentry/browser (incl. Logs)28.71 kB--
@sentry/browser (incl. Metrics & Logs)29.4 kB--
@sentry/react29.2 kB--
@sentry/react (incl. Tracing)48 kB--
@sentry/vue32.42 kB--
@sentry/vue (incl. Tracing)47.59 kB--
@sentry/svelte27.42 kB--
CDN Bundle29.79 kB--
CDN Bundle (incl. Tracing)48.2 kB--
CDN Bundle (incl. Logs, Metrics)31.33 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.49 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.62 kB--
CDN Bundle (incl. Tracing, Replay)85.52 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.77 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.37 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.62 kB--
CDN Bundle - uncompressed88.59 kB--
CDN Bundle (incl. Tracing) - uncompressed145.8 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.29 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.77 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.12 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.67 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.63 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.37 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.31 kB--
@sentry/nextjs (client)50.45 kB--
@sentry/sveltekit (client)46.12 kB--
@sentry/core/server76.08 kB--
@sentry/core/browser63.22 kB--
@sentry/node-core61.72 kB-0.01%-3 B 🔽
@sentry/node130.53 kB--
@sentry/node - without tracing74.11 kB+0.01%+1 B 🔺
@sentry/aws-serverless86.29 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified174.19 kB+0.29%+500 B 🔺
@sentry/cloudflare (withSentry)435.41 kB+0.36%+1.56 kB 🔺

View base workflow run

// reference" errors.
const original = Reflect.get(target, prop, target);

if (prop === 'kv' && original != null && typeof original === 'object') {

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.

Can this be hardened a bit? typeof object is a bit broad. Maybe you can check for some typical object keys.

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.

Good idea. I'll add that.

@JPeer264
JPeer264 merged commit 058e2ad into developJun 15, 2026
532 of 534 checks passed
@JPeer264
JPeer264 deleted the jp/cloudflare-sync-kv-instrument branch June 15, 2026 16:13
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.

Cloudflare instrument Sync KV API

4 participants

@JPeer264@nicohrubec@s1gr1d@andreiborza
, '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(cloudflare): Instrument sync KV - #21316

Merged
JPeer264 merged 3 commits into
developfrom
jp/cloudflare-sync-kv-instrument
Jun 15, 2026
Merged

feat(cloudflare): Instrument sync KV#21316
JPeer264 merged 3 commits into
developfrom
jp/cloudflare-sync-kv-instrument

Conversation

@JPeer264

Copy link
Copy Markdown
Member

closes#20830
closes JS-2443

This adds instrumentation for ctx.storage.kv.* (it only adds a span like with the async KV).

Cloudflare itself is having cloudflare-durable-object-sql as db.system.name, that is why we have it here now too.

@JPeer264JPeer264 self-assigned this Jun 3, 2026
@JPeer264
JPeer264 requested a review from a team as a code ownerJune 3, 2026 08:32
@JPeer264
JPeer264 requested review from andreiborza and mydea and removed request for a teamJune 3, 2026 08:32
@linear-code

Copy link
Copy Markdown

JS-2443

@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 2decb59. Configure here.

@JPeer264
JPeer264force-pushed the jp/cloudflare-sync-kv-instrument branch from 2decb59 to 091b09bCompareJune 3, 2026 08:40
@JPeer264
JPeer264 requested a review from a team as a code ownerJune 3, 2026 08:40
@JPeer264
JPeer264 requested review from nicohrubec and removed request for a teamJune 3, 2026 08:41
@JPeer264
JPeer264force-pushed the jp/cloudflare-sync-kv-instrument branch from 0526d91 to 26e3446CompareJune 3, 2026 13:52
Comment on lines +39 to +41
if (prop === 'kv' && original != null && typeof original === 'object') {
return instrumentDurableObjectSyncKvStorage(original as SyncKvStorage);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bug: Accessing storage.kv repeatedly creates a new proxy object each time instead of reusing a cached one, causing unnecessary performance overhead.
Severity: MEDIUM

Suggested Fix

Use a WeakMap to cache the instrumented proxy for the kv property. On the first access, create the proxy, store it in the map, and return it. On subsequent accesses, return the cached proxy from the WeakMap. This aligns with the existing caching pattern in instrumentEnv.ts and avoids creating multiple proxy objects.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location:
packages/cloudflare/src/instrumentations/instrumentDurableObjectStorage.ts#L39-L41
Potential issue: The instrumentation for Durable Object storage creates a new proxy for
the `kv` property on every access. In scenarios where code makes multiple sequential
calls like `storage.kv.get(...)` and then `storage.kv.put(...)`, a new proxy object is
unnecessarily created for each call. This leads to increased object allocations and
garbage collection pressure, which can degrade performance in serverless environments.
This behavior is inconsistent with the caching pattern (using `WeakMap`) established in
other parts of the codebase, such as in `instrumentEnv.ts`.

Did we get this right? 👍 / 👎 to inform future reviews.

@github-actions

github-actionsBot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser27.4 kB--
@sentry/browser - with treeshaking flags25.84 kB--
@sentry/browser (incl. Tracing)45.7 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.94 kB--
@sentry/browser (incl. Tracing, Profiling)50.5 kB--
@sentry/browser (incl. Tracing, Replay)84.92 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.53 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.61 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.3 kB--
@sentry/browser (incl. Feedback)44.56 kB--
@sentry/browser (incl. sendFeedback)32.2 kB--
@sentry/browser (incl. FeedbackAsync)37.31 kB--
@sentry/browser (incl. Metrics)28.47 kB--
@sentry/browser (incl. Logs)28.71 kB--
@sentry/browser (incl. Metrics & Logs)29.4 kB--
@sentry/react29.2 kB--
@sentry/react (incl. Tracing)48 kB--
@sentry/vue32.42 kB--
@sentry/vue (incl. Tracing)47.59 kB--
@sentry/svelte27.42 kB--
CDN Bundle29.79 kB--
CDN Bundle (incl. Tracing)48.2 kB--
CDN Bundle (incl. Logs, Metrics)31.33 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.49 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.62 kB--
CDN Bundle (incl. Tracing, Replay)85.52 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.77 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.37 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.62 kB--
CDN Bundle - uncompressed88.59 kB--
CDN Bundle (incl. Tracing) - uncompressed145.8 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.29 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.77 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.12 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.67 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.63 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.37 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.31 kB--
@sentry/nextjs (client)50.45 kB--
@sentry/sveltekit (client)46.12 kB--
@sentry/core/server76.08 kB--
@sentry/core/browser63.22 kB--
@sentry/node-core61.72 kB-0.01%-3 B 🔽
@sentry/node130.53 kB--
@sentry/node - without tracing74.11 kB+0.01%+1 B 🔺
@sentry/aws-serverless86.29 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified174.19 kB+0.29%+500 B 🔺
@sentry/cloudflare (withSentry)435.41 kB+0.36%+1.56 kB 🔺

View base workflow run

// reference" errors.
const original = Reflect.get(target, prop, target);

if (prop === 'kv' && original != null && typeof original === 'object') {

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.

Can this be hardened a bit? typeof object is a bit broad. Maybe you can check for some typical object keys.

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.

Good idea. I'll add that.

@JPeer264
JPeer264 merged commit 058e2ad into developJun 15, 2026
532 of 534 checks passed
@JPeer264
JPeer264 deleted the jp/cloudflare-sync-kv-instrument branch June 15, 2026 16:13
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.

Cloudflare instrument Sync KV API

4 participants

@JPeer264@nicohrubec@s1gr1d@andreiborza
, '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(cloudflare): Instrument sync KV - #21316

Merged
JPeer264 merged 3 commits into
developfrom
jp/cloudflare-sync-kv-instrument
Jun 15, 2026
Merged

feat(cloudflare): Instrument sync KV#21316
JPeer264 merged 3 commits into
developfrom
jp/cloudflare-sync-kv-instrument

Conversation

@JPeer264

Copy link
Copy Markdown
Member

closes#20830
closes JS-2443

This adds instrumentation for ctx.storage.kv.* (it only adds a span like with the async KV).

Cloudflare itself is having cloudflare-durable-object-sql as db.system.name, that is why we have it here now too.

@JPeer264JPeer264 self-assigned this Jun 3, 2026
@JPeer264
JPeer264 requested a review from a team as a code ownerJune 3, 2026 08:32
@JPeer264
JPeer264 requested review from andreiborza and mydea and removed request for a teamJune 3, 2026 08:32
@linear-code

Copy link
Copy Markdown

JS-2443

@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 2decb59. Configure here.

@JPeer264
JPeer264force-pushed the jp/cloudflare-sync-kv-instrument branch from 2decb59 to 091b09bCompareJune 3, 2026 08:40
@JPeer264
JPeer264 requested a review from a team as a code ownerJune 3, 2026 08:40
@JPeer264
JPeer264 requested review from nicohrubec and removed request for a teamJune 3, 2026 08:41
@JPeer264
JPeer264force-pushed the jp/cloudflare-sync-kv-instrument branch from 0526d91 to 26e3446CompareJune 3, 2026 13:52
Comment on lines +39 to +41
if (prop === 'kv' && original != null && typeof original === 'object') {
return instrumentDurableObjectSyncKvStorage(original as SyncKvStorage);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bug: Accessing storage.kv repeatedly creates a new proxy object each time instead of reusing a cached one, causing unnecessary performance overhead.
Severity: MEDIUM

Suggested Fix

Use a WeakMap to cache the instrumented proxy for the kv property. On the first access, create the proxy, store it in the map, and return it. On subsequent accesses, return the cached proxy from the WeakMap. This aligns with the existing caching pattern in instrumentEnv.ts and avoids creating multiple proxy objects.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location:
packages/cloudflare/src/instrumentations/instrumentDurableObjectStorage.ts#L39-L41
Potential issue: The instrumentation for Durable Object storage creates a new proxy for
the `kv` property on every access. In scenarios where code makes multiple sequential
calls like `storage.kv.get(...)` and then `storage.kv.put(...)`, a new proxy object is
unnecessarily created for each call. This leads to increased object allocations and
garbage collection pressure, which can degrade performance in serverless environments.
This behavior is inconsistent with the caching pattern (using `WeakMap`) established in
other parts of the codebase, such as in `instrumentEnv.ts`.

Did we get this right? 👍 / 👎 to inform future reviews.

@github-actions

github-actionsBot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser27.4 kB--
@sentry/browser - with treeshaking flags25.84 kB--
@sentry/browser (incl. Tracing)45.7 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.94 kB--
@sentry/browser (incl. Tracing, Profiling)50.5 kB--
@sentry/browser (incl. Tracing, Replay)84.92 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.53 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.61 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.3 kB--
@sentry/browser (incl. Feedback)44.56 kB--
@sentry/browser (incl. sendFeedback)32.2 kB--
@sentry/browser (incl. FeedbackAsync)37.31 kB--
@sentry/browser (incl. Metrics)28.47 kB--
@sentry/browser (incl. Logs)28.71 kB--
@sentry/browser (incl. Metrics & Logs)29.4 kB--
@sentry/react29.2 kB--
@sentry/react (incl. Tracing)48 kB--
@sentry/vue32.42 kB--
@sentry/vue (incl. Tracing)47.59 kB--
@sentry/svelte27.42 kB--
CDN Bundle29.79 kB--
CDN Bundle (incl. Tracing)48.2 kB--
CDN Bundle (incl. Logs, Metrics)31.33 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.49 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.62 kB--
CDN Bundle (incl. Tracing, Replay)85.52 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.77 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.37 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.62 kB--
CDN Bundle - uncompressed88.59 kB--
CDN Bundle (incl. Tracing) - uncompressed145.8 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.29 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.77 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.12 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.67 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.63 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.37 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.31 kB--
@sentry/nextjs (client)50.45 kB--
@sentry/sveltekit (client)46.12 kB--
@sentry/core/server76.08 kB--
@sentry/core/browser63.22 kB--
@sentry/node-core61.72 kB-0.01%-3 B 🔽
@sentry/node130.53 kB--
@sentry/node - without tracing74.11 kB+0.01%+1 B 🔺
@sentry/aws-serverless86.29 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified174.19 kB+0.29%+500 B 🔺
@sentry/cloudflare (withSentry)435.41 kB+0.36%+1.56 kB 🔺

View base workflow run

// reference" errors.
const original = Reflect.get(target, prop, target);

if (prop === 'kv' && original != null && typeof original === 'object') {

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.

Can this be hardened a bit? typeof object is a bit broad. Maybe you can check for some typical object keys.

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.

Good idea. I'll add that.

@JPeer264
JPeer264 merged commit 058e2ad into developJun 15, 2026
532 of 534 checks passed
@JPeer264
JPeer264 deleted the jp/cloudflare-sync-kv-instrument branch June 15, 2026 16:13
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.

Cloudflare instrument Sync KV API

4 participants

@JPeer264@nicohrubec@s1gr1d@andreiborza
, '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(cloudflare): Instrument sync KV - #21316

Merged
JPeer264 merged 3 commits into
developfrom
jp/cloudflare-sync-kv-instrument
Jun 15, 2026
Merged

feat(cloudflare): Instrument sync KV#21316
JPeer264 merged 3 commits into
developfrom
jp/cloudflare-sync-kv-instrument

Conversation

@JPeer264

Copy link
Copy Markdown
Member

closes#20830
closes JS-2443

This adds instrumentation for ctx.storage.kv.* (it only adds a span like with the async KV).

Cloudflare itself is having cloudflare-durable-object-sql as db.system.name, that is why we have it here now too.

@JPeer264JPeer264 self-assigned this Jun 3, 2026
@JPeer264
JPeer264 requested a review from a team as a code ownerJune 3, 2026 08:32
@JPeer264
JPeer264 requested review from andreiborza and mydea and removed request for a teamJune 3, 2026 08:32
@linear-code

Copy link
Copy Markdown

JS-2443

@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 2decb59. Configure here.

@JPeer264
JPeer264force-pushed the jp/cloudflare-sync-kv-instrument branch from 2decb59 to 091b09bCompareJune 3, 2026 08:40
@JPeer264
JPeer264 requested a review from a team as a code ownerJune 3, 2026 08:40
@JPeer264
JPeer264 requested review from nicohrubec and removed request for a teamJune 3, 2026 08:41
@JPeer264
JPeer264force-pushed the jp/cloudflare-sync-kv-instrument branch from 0526d91 to 26e3446CompareJune 3, 2026 13:52
Comment on lines +39 to +41
if (prop === 'kv' && original != null && typeof original === 'object') {
return instrumentDurableObjectSyncKvStorage(original as SyncKvStorage);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bug: Accessing storage.kv repeatedly creates a new proxy object each time instead of reusing a cached one, causing unnecessary performance overhead.
Severity: MEDIUM

Suggested Fix

Use a WeakMap to cache the instrumented proxy for the kv property. On the first access, create the proxy, store it in the map, and return it. On subsequent accesses, return the cached proxy from the WeakMap. This aligns with the existing caching pattern in instrumentEnv.ts and avoids creating multiple proxy objects.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location:
packages/cloudflare/src/instrumentations/instrumentDurableObjectStorage.ts#L39-L41
Potential issue: The instrumentation for Durable Object storage creates a new proxy for
the `kv` property on every access. In scenarios where code makes multiple sequential
calls like `storage.kv.get(...)` and then `storage.kv.put(...)`, a new proxy object is
unnecessarily created for each call. This leads to increased object allocations and
garbage collection pressure, which can degrade performance in serverless environments.
This behavior is inconsistent with the caching pattern (using `WeakMap`) established in
other parts of the codebase, such as in `instrumentEnv.ts`.

Did we get this right? 👍 / 👎 to inform future reviews.

@github-actions

github-actionsBot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser27.4 kB--
@sentry/browser - with treeshaking flags25.84 kB--
@sentry/browser (incl. Tracing)45.7 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.94 kB--
@sentry/browser (incl. Tracing, Profiling)50.5 kB--
@sentry/browser (incl. Tracing, Replay)84.92 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.53 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.61 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.3 kB--
@sentry/browser (incl. Feedback)44.56 kB--
@sentry/browser (incl. sendFeedback)32.2 kB--
@sentry/browser (incl. FeedbackAsync)37.31 kB--
@sentry/browser (incl. Metrics)28.47 kB--
@sentry/browser (incl. Logs)28.71 kB--
@sentry/browser (incl. Metrics & Logs)29.4 kB--
@sentry/react29.2 kB--
@sentry/react (incl. Tracing)48 kB--
@sentry/vue32.42 kB--
@sentry/vue (incl. Tracing)47.59 kB--
@sentry/svelte27.42 kB--
CDN Bundle29.79 kB--
CDN Bundle (incl. Tracing)48.2 kB--
CDN Bundle (incl. Logs, Metrics)31.33 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.49 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.62 kB--
CDN Bundle (incl. Tracing, Replay)85.52 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.77 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.37 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.62 kB--
CDN Bundle - uncompressed88.59 kB--
CDN Bundle (incl. Tracing) - uncompressed145.8 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.29 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.77 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.12 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.67 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.63 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.37 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.31 kB--
@sentry/nextjs (client)50.45 kB--
@sentry/sveltekit (client)46.12 kB--
@sentry/core/server76.08 kB--
@sentry/core/browser63.22 kB--
@sentry/node-core61.72 kB-0.01%-3 B 🔽
@sentry/node130.53 kB--
@sentry/node - without tracing74.11 kB+0.01%+1 B 🔺
@sentry/aws-serverless86.29 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified174.19 kB+0.29%+500 B 🔺
@sentry/cloudflare (withSentry)435.41 kB+0.36%+1.56 kB 🔺

View base workflow run

// reference" errors.
const original = Reflect.get(target, prop, target);

if (prop === 'kv' && original != null && typeof original === 'object') {

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.

Can this be hardened a bit? typeof object is a bit broad. Maybe you can check for some typical object keys.

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.

Good idea. I'll add that.

@JPeer264
JPeer264 merged commit 058e2ad into developJun 15, 2026
532 of 534 checks passed
@JPeer264
JPeer264 deleted the jp/cloudflare-sync-kv-instrument branch June 15, 2026 16:13
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.

Cloudflare instrument Sync KV API

4 participants

@JPeer264@nicohrubec@s1gr1d@andreiborza
, '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(cloudflare): Instrument sync KV - #21316

Merged
JPeer264 merged 3 commits into
developfrom
jp/cloudflare-sync-kv-instrument
Jun 15, 2026
Merged

feat(cloudflare): Instrument sync KV#21316
JPeer264 merged 3 commits into
developfrom
jp/cloudflare-sync-kv-instrument

Conversation

@JPeer264

Copy link
Copy Markdown
Member

closes#20830
closes JS-2443

This adds instrumentation for ctx.storage.kv.* (it only adds a span like with the async KV).

Cloudflare itself is having cloudflare-durable-object-sql as db.system.name, that is why we have it here now too.

@JPeer264JPeer264 self-assigned this Jun 3, 2026
@JPeer264
JPeer264 requested a review from a team as a code ownerJune 3, 2026 08:32
@JPeer264
JPeer264 requested review from andreiborza and mydea and removed request for a teamJune 3, 2026 08:32
@linear-code

Copy link
Copy Markdown

JS-2443

@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 2decb59. Configure here.

@JPeer264
JPeer264force-pushed the jp/cloudflare-sync-kv-instrument branch from 2decb59 to 091b09bCompareJune 3, 2026 08:40
@JPeer264
JPeer264 requested a review from a team as a code ownerJune 3, 2026 08:40
@JPeer264
JPeer264 requested review from nicohrubec and removed request for a teamJune 3, 2026 08:41
@JPeer264
JPeer264force-pushed the jp/cloudflare-sync-kv-instrument branch from 0526d91 to 26e3446CompareJune 3, 2026 13:52
Comment on lines +39 to +41
if (prop === 'kv' && original != null && typeof original === 'object') {
return instrumentDurableObjectSyncKvStorage(original as SyncKvStorage);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bug: Accessing storage.kv repeatedly creates a new proxy object each time instead of reusing a cached one, causing unnecessary performance overhead.
Severity: MEDIUM

Suggested Fix

Use a WeakMap to cache the instrumented proxy for the kv property. On the first access, create the proxy, store it in the map, and return it. On subsequent accesses, return the cached proxy from the WeakMap. This aligns with the existing caching pattern in instrumentEnv.ts and avoids creating multiple proxy objects.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location:
packages/cloudflare/src/instrumentations/instrumentDurableObjectStorage.ts#L39-L41
Potential issue: The instrumentation for Durable Object storage creates a new proxy for
the `kv` property on every access. In scenarios where code makes multiple sequential
calls like `storage.kv.get(...)` and then `storage.kv.put(...)`, a new proxy object is
unnecessarily created for each call. This leads to increased object allocations and
garbage collection pressure, which can degrade performance in serverless environments.
This behavior is inconsistent with the caching pattern (using `WeakMap`) established in
other parts of the codebase, such as in `instrumentEnv.ts`.

Did we get this right? 👍 / 👎 to inform future reviews.

@github-actions

github-actionsBot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser27.4 kB--
@sentry/browser - with treeshaking flags25.84 kB--
@sentry/browser (incl. Tracing)45.7 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.94 kB--
@sentry/browser (incl. Tracing, Profiling)50.5 kB--
@sentry/browser (incl. Tracing, Replay)84.92 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.53 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.61 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.3 kB--
@sentry/browser (incl. Feedback)44.56 kB--
@sentry/browser (incl. sendFeedback)32.2 kB--
@sentry/browser (incl. FeedbackAsync)37.31 kB--
@sentry/browser (incl. Metrics)28.47 kB--
@sentry/browser (incl. Logs)28.71 kB--
@sentry/browser (incl. Metrics & Logs)29.4 kB--
@sentry/react29.2 kB--
@sentry/react (incl. Tracing)48 kB--
@sentry/vue32.42 kB--
@sentry/vue (incl. Tracing)47.59 kB--
@sentry/svelte27.42 kB--
CDN Bundle29.79 kB--
CDN Bundle (incl. Tracing)48.2 kB--
CDN Bundle (incl. Logs, Metrics)31.33 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.49 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.62 kB--
CDN Bundle (incl. Tracing, Replay)85.52 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.77 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.37 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.62 kB--
CDN Bundle - uncompressed88.59 kB--
CDN Bundle (incl. Tracing) - uncompressed145.8 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.29 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.77 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.12 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.67 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.63 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.37 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.31 kB--
@sentry/nextjs (client)50.45 kB--
@sentry/sveltekit (client)46.12 kB--
@sentry/core/server76.08 kB--
@sentry/core/browser63.22 kB--
@sentry/node-core61.72 kB-0.01%-3 B 🔽
@sentry/node130.53 kB--
@sentry/node - without tracing74.11 kB+0.01%+1 B 🔺
@sentry/aws-serverless86.29 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified174.19 kB+0.29%+500 B 🔺
@sentry/cloudflare (withSentry)435.41 kB+0.36%+1.56 kB 🔺

View base workflow run

// reference" errors.
const original = Reflect.get(target, prop, target);

if (prop === 'kv' && original != null && typeof original === 'object') {

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.

Can this be hardened a bit? typeof object is a bit broad. Maybe you can check for some typical object keys.

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.

Good idea. I'll add that.

@JPeer264
JPeer264 merged commit 058e2ad into developJun 15, 2026
532 of 534 checks passed
@JPeer264
JPeer264 deleted the jp/cloudflare-sync-kv-instrument branch June 15, 2026 16:13
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.

Cloudflare instrument Sync KV API

4 participants

@JPeer264@nicohrubec@s1gr1d@andreiborza
, '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(cloudflare): Instrument sync KV - #21316

Merged
JPeer264 merged 3 commits into
developfrom
jp/cloudflare-sync-kv-instrument
Jun 15, 2026
Merged

feat(cloudflare): Instrument sync KV#21316
JPeer264 merged 3 commits into
developfrom
jp/cloudflare-sync-kv-instrument

Conversation

@JPeer264

Copy link
Copy Markdown
Member

closes#20830
closes JS-2443

This adds instrumentation for ctx.storage.kv.* (it only adds a span like with the async KV).

Cloudflare itself is having cloudflare-durable-object-sql as db.system.name, that is why we have it here now too.

@JPeer264JPeer264 self-assigned this Jun 3, 2026
@JPeer264
JPeer264 requested a review from a team as a code ownerJune 3, 2026 08:32
@JPeer264
JPeer264 requested review from andreiborza and mydea and removed request for a teamJune 3, 2026 08:32
@linear-code

Copy link
Copy Markdown

JS-2443

@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 2decb59. Configure here.

@JPeer264
JPeer264force-pushed the jp/cloudflare-sync-kv-instrument branch from 2decb59 to 091b09bCompareJune 3, 2026 08:40
@JPeer264
JPeer264 requested a review from a team as a code ownerJune 3, 2026 08:40
@JPeer264
JPeer264 requested review from nicohrubec and removed request for a teamJune 3, 2026 08:41
@JPeer264
JPeer264force-pushed the jp/cloudflare-sync-kv-instrument branch from 0526d91 to 26e3446CompareJune 3, 2026 13:52
Comment on lines +39 to +41
if (prop === 'kv' && original != null && typeof original === 'object') {
return instrumentDurableObjectSyncKvStorage(original as SyncKvStorage);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Bug: Accessing storage.kv repeatedly creates a new proxy object each time instead of reusing a cached one, causing unnecessary performance overhead.
Severity: MEDIUM

Suggested Fix

Use a WeakMap to cache the instrumented proxy for the kv property. On the first access, create the proxy, store it in the map, and return it. On subsequent accesses, return the cached proxy from the WeakMap. This aligns with the existing caching pattern in instrumentEnv.ts and avoids creating multiple proxy objects.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location:
packages/cloudflare/src/instrumentations/instrumentDurableObjectStorage.ts#L39-L41
Potential issue: The instrumentation for Durable Object storage creates a new proxy for
the `kv` property on every access. In scenarios where code makes multiple sequential
calls like `storage.kv.get(...)` and then `storage.kv.put(...)`, a new proxy object is
unnecessarily created for each call. This leads to increased object allocations and
garbage collection pressure, which can degrade performance in serverless environments.
This behavior is inconsistent with the caching pattern (using `WeakMap`) established in
other parts of the codebase, such as in `instrumentEnv.ts`.

Did we get this right? 👍 / 👎 to inform future reviews.

@github-actions

github-actionsBot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser27.4 kB--
@sentry/browser - with treeshaking flags25.84 kB--
@sentry/browser (incl. Tracing)45.7 kB--
@sentry/browser (incl. Tracing + Span Streaming)47.94 kB--
@sentry/browser (incl. Tracing, Profiling)50.5 kB--
@sentry/browser (incl. Tracing, Replay)84.92 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags74.53 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)89.61 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)102.3 kB--
@sentry/browser (incl. Feedback)44.56 kB--
@sentry/browser (incl. sendFeedback)32.2 kB--
@sentry/browser (incl. FeedbackAsync)37.31 kB--
@sentry/browser (incl. Metrics)28.47 kB--
@sentry/browser (incl. Logs)28.71 kB--
@sentry/browser (incl. Metrics & Logs)29.4 kB--
@sentry/react29.2 kB--
@sentry/react (incl. Tracing)48 kB--
@sentry/vue32.42 kB--
@sentry/vue (incl. Tracing)47.59 kB--
@sentry/svelte27.42 kB--
CDN Bundle29.79 kB--
CDN Bundle (incl. Tracing)48.2 kB--
CDN Bundle (incl. Logs, Metrics)31.33 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.49 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.62 kB--
CDN Bundle (incl. Tracing, Replay)85.52 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)86.77 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.37 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)92.62 kB--
CDN Bundle - uncompressed88.59 kB--
CDN Bundle (incl. Tracing) - uncompressed145.8 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed93.29 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed149.77 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed218.12 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed264.67 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed268.63 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed278.37 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed282.31 kB--
@sentry/nextjs (client)50.45 kB--
@sentry/sveltekit (client)46.12 kB--
@sentry/core/server76.08 kB--
@sentry/core/browser63.22 kB--
@sentry/node-core61.72 kB-0.01%-3 B 🔽
@sentry/node130.53 kB--
@sentry/node - without tracing74.11 kB+0.01%+1 B 🔺
@sentry/aws-serverless86.29 kB-0.01%-1 B 🔽
@sentry/cloudflare (withSentry) - minified174.19 kB+0.29%+500 B 🔺
@sentry/cloudflare (withSentry)435.41 kB+0.36%+1.56 kB 🔺

View base workflow run

// reference" errors.
const original = Reflect.get(target, prop, target);

if (prop === 'kv' && original != null && typeof original === 'object') {

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.

Can this be hardened a bit? typeof object is a bit broad. Maybe you can check for some typical object keys.

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.

Good idea. I'll add that.

@JPeer264
JPeer264 merged commit 058e2ad into developJun 15, 2026
532 of 534 checks passed
@JPeer264
JPeer264 deleted the jp/cloudflare-sync-kv-instrument branch June 15, 2026 16:13
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.

Cloudflare instrument Sync KV API

4 participants

@JPeer264@nicohrubec@s1gr1d@andreiborza