Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

@sentry/cloudflare: Flue agents need a hand-written Durable Object wrapper

未关闭
#24,601 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
5/5
预计耗时
一周以上
新手友好度
35/100
Issue 类型
功能
描述清晰度
基本清楚
活跃度
活跃
技术栈
typescript

调研方向

Start with autoInstrument.ts, options.ts, and instrument.ts, then inspect the generated Flue worker shape and the cloudflare-mastra e2e app. Trace how createFlueAgentClass exposes each agent and verify the existing wrapping guard before choosing the applicable Agent or Durable Object wrapper. Done means Flue agents are instrumented without clobbering extensions, double-wrapping documented setups, or silently accepting an unmatched generated module.

由索引模型根据 Issue 内容生成。

描述

agents Cloudflare Workers Package: cloudflare Type: Improvement

Flue runs each agent in its own Durable Object, and nothing in the SDK runs Sentry.init() in that isolate. Users have to hand-write a wrapper module and re-export it from every agent module:

// src/sentry.ts
export const cloudflare = extend({
  wrap: Final =>
    Sentry.instrumentDurableObjectWithSentry((env: Env) => ({ dsn: env.SENTRY_DSN }), Final),
});

// src/agents/support.ts
export { cloudflare } from '../sentry.ts';

Miss the re-export in one agent module and that agent captures nothing, with no error anywhere. The Flue Cloudflare guide (getsentry/sentry-docs#19528) covers it with a warning and a troubleshooting entry, which is a weak fix for a silent failure.

Why auto-instrumentation doesn't cover it

sentryCloudflareAutoInstrumentPlugin is gated on wrangler's main, which resolveWranglerConfig reads from disk. Flue sets main to virtual:flue/worker and adds the DO bindings in memory, inside @cloudflare/vite-plugin's config hook, and never writes either to the file. Running wrangler's own reader against a real flue init app:

unstable_readConfig('<flue app>/wrangler.jsonc')

main                     : undefined
durable_objects.bindings : []

So entryFilePath is never assigned and transform returns on its first line (autoInstrument.ts:65). instrument.server.ts sits behind the same gate at autoInstrument.ts:51, so it is never probed either.

Contrast the cloudflare-mastra e2e app, whose wrangler.toml has main = "src/index.ts": a real file the user wrote that exports the classes. That is why Mastra works here and Flue does not.

Where to investigate

Flue's generated worker is a real module in the graph, and it exports each agent class from a fixed shape:

export const FlueHelloAgent = createFlueAgentClass({
  AgentBase: Agent,
  className: "FlueHelloAgent",
  extension: Reflect.get(__flue_agent_module_0__, 'cloudflare'),
});

Wrapping the result there looks viable. Open questions:

  • Where options come from. getFinalOptions already reads env.SENTRY_DSN (options.ts:68), so the env fallback may be enough and the setup could end up zero-config. An instrument.server.* probe would need a directory to start from, since there is no real main to sit next to.
  • Not double-wrapping. Anyone on the documented setup applies the wrapper inside createFlueAgentClass, which the build cannot see. _INTERNAL_wrapUnlessInstrumented (instrument.ts:96) was built for this case; confirm it covers it before relying on it.
  • Which wrapper. Flue builds the class with AgentBase: Agent from agents, so it is a real Agent rather than a plain Durable Object. instrumentAgentWithSentry may apply and carry more than instrumentDurableObjectWithSentry.
  • Failing loudly. The generated module is marked "Do not edit" and is not API. A transform that matches it should warn when it finds no createFlueAgentClass call, rather than silently shipping an uninstrumented worker.

One thing to rule out up front: do not reuse the extension slot. resolveCloudflareExtension reads exactly one cloudflare export per agent, with no array and no registry, so taking it would clobber a user's own extension.

主要语言
TypeScript
星标
8.7k
派生
1.9k
平均合并
1 天 16 小时
30 天内合并 PR
576

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

getsentry/sentry-javascript 的其他 Issue

查看 getsentry/sentry-javascript 的全部 Issue

相似的 Issue

更多 TypeScript Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。