cloudflare: Several common bindings are not instrumented
還沒有人認領這個 Issue。
評估
- 難度
- 3/5
- 預估耗時
- 1-2 天
- 新手友好度
- 72/100
- Issue 類型
- 功能
- 描述清晰度
- 描述清楚
- 活躍度
- 活躍
- 技術堆疊
- typescript
研究方向
從 packages/cloudflare/src/instrumentations/worker/instrumentEnv.ts 開始,並比較現有的 R2 偵測與插樁路徑。使用 get、put、list 和 getWithMetadata 新增 KV 專用偵測,同時排除 JSRPC,然後使用與 instrumentR2 相符的 span 對該 binding 進行插樁。完成的標準是:直接的 env.MY_KV 操作能夠被插樁而不會誤判其他 binding,且相關的 Cloudflare 插樁測試已更新或新增。
由索引模型根據 Issue 內容生成。
描述
packages/cloudflare/src/instrumentations/worker/instrumentEnv.ts detects D1, Queue, R2, RateLimit, Workers AI, DurableObjectNamespace and JSRPC. Nothing else matches, so these fall through untouched:
| Binding | Note |
|---|---|
KV namespace (env.MY_KV) |
the most-used Cloudflare binding. Durable Object storage KV (ctx.storage.kv) is instrumented, which makes this easy to mistake for covered. |
| Vectorize | query, insert, upsert, getByIds |
| Analytics Engine | writeDataPoint |
| Pipelines | send only, so isQueue (which needs send + sendBatch) misses it |
| Secrets Store | get |
| Dispatch namespace | Workers for Platforms |
| Hyperdrive | connection only; the query itself needs the driver instrumented |
| Containers, Browser Rendering | |
Cache API (caches.default.match / .put) |
not a binding, but the same category of missing span. The cache-client test suite is about the SDK client cache, not this. |
Workers KV verification A live KvNamespace binding matches none of the seven duck-type checks, so instrumentEnv's proxy returns it untouched:
kvCtor: "KvNamespace", methods: [get, put, delete, list, getWithMetadata]
isJSRPC: false hasIdFromName: false hasSendAndSendBatch: false
hasPrepareBatchExec: false hasHeadPutMultipart: false hasLimit: false
hasRunGatewayToMarkdown: false
The same worker, one invocation, with two controls to prove the harness works:
| Call | Span |
|---|---|
Sentry.startSpan('control-manual-span') |
test.control | control-manual-span |
env.MY_R2.put() (R2 is instrumented, same env proxy) |
object.put | r2_put |
env.MY_R2.head() |
object.head | r2_head |
env.MY_KV.put() |
none |
env.MY_KV.get() |
none |
env.MY_KV.list() |
none |
env.MY_KV.delete() |
none |
KVNamespace and getWithMetadata appear nowhere in any package's src. Every kv match in packages/cloudflare/src is Durable Object storage (ctx.storage.kv), including the durableObjectSqlSpanAllowlist sibling option at client.ts:386 that mentions "KV reads/writes".
One exception: KV is not completely uncovered across the monorepo. @sentry/nitro and @sentry/nuxt subscribe to unstorage tracing channels (packages/nitro/src/runtime/hooks/captureStorageEvents.ts:84) and emit cache spans with db.system.name taken from the unstorage driver. A Nitro or Nuxt app on Cloudflare that reads through useStorage() over a KV-backed mount therefore does get spans. That path does not help direct env.MY_KV access, and does not exist for Next.js, TanStack Start, SvelteKit, Hono, React Router, or a plain Worker. So the gap is real, but scope any new issue to the binding rather than to "KV", and reuse the op naming that instrumentation already established.
Work item. Start with the KV binding alone: an isKVNamespace duck-type (get + put + list + getWithMetadata, and not JSRPC) plus an instrumentKV that emits spans matching instrumentR2. getWithMetadata is the discriminator worth keying on, since get/put/delete/list are common enough to risk a false positive. Order the check before isRateLimit, which matches anything with a limit method. Ship Vectorize and Analytics Engine as follow-ups.
**Prior art **(tracked). Most of this list is already tracked, one issue per binding:
| Binding | Issue |
|---|---|
| Workers KV | none |
| Vectorize | #20847 (open) |
| Analytics Engine | #20860 (open) |
| Dispatch namespace | #20859 (open) |
| Cache API | #16895 (open) |
| Hyperdrive / relational DBs | #16249 (open) |
| PITR API | #20831 (open) |
| Flagship feature flags | #21184 (open) |
storage.sql |
#20833 (open) |
| Pipelines, Secrets Store, Containers, Browser Rendering | none |
Workers KV having no issue was worth double-checking, because two closed issues look like they cover it and do not: #19384 "Cloudflare Instrument Async KV Api" and #20830 "Cloudflare instrument Sync KV API" are both sub-tickets of #19106 (SQLite-backed Durable Object storage). They are about ctx.storage.kv, not the env.MY_KV binding, and both shipped. So the most-used Cloudflare binding is the one gap with no ticket, and it reads as already done.
- 主要語言
- TypeScript
- 星號
- 8.7k
- 分支
- 1.9k
- 平均合併
- 1 天 16 小時
- 30 天內合併 PR
- 576
貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
getsentry/sentry-javascript 的其他 Issue
-
Browser Bug Next.js Traces Waiting for: Product Owner
難度 2/5 1-3 小時 新手友好度 75/100
getsentry/sentry-javascript#24672 · 1 則留言 ·
-
javascript
難度 2/5 1-3 小時 新手友好度 75/100
getsentry/sentry-javascript#24200 · 2 則留言 ·
-
javascript Task
難度 2/5 1-3 小時 新手友好度 82/100
getsentry/sentry-javascript#24134 · 1 則留言 ·
-
Cloudflare Workers javascript Tests
難度 2/5 1-3 小時 新手友好度 78/100
getsentry/sentry-javascript#24051 · 1 則留言 ·
-
Bug Bun javascript
難度 2/5 1-3 小時 新手友好度 92/100
getsentry/sentry-javascript#24045 · 1 則留言 ·
查看 getsentry/sentry-javascript 的全部 Issue
相似的 Issue
-
難度 2/5 1-3 小時 新手友好度 84/100
bcgov/bc-wallet-mobile#4761 · 1 則留言 ·
-
external-issue to-triage
難度 2/5 1-3 小時 新手友好度 88/100
-
area-deployment area-integrations triage:bot-seen
難度 2/5 半天 新手友好度 86/100
-
難度 2/5 1-3 小時 新手友好度 82/100
-
refactor
難度 2/5 1-3 小時 新手友好度 84/100