
可观测性【免费下载链接】sentry-javascriptOfficial Sentry SDKs for JavaScript项目地址https://gitcode.com/gh_mirrors/se/sentry-javascript点击查看免费下载在 Sentry 官方 JavaScript SDK 仓库的端到端E2E测试体系中solidstart-top-level-import 是一个专门验证sentry/solidstart构建插件autoInjectServerSentry: top-level-import模式的测试应用。本篇以该应用为骨架完整介绍它的项目结构与本地运行方式并结合 SDK 源码withSentry.ts、types.ts深入解析 top-level-import 注入模式的实现原理、可配置参数以及它与experimental_dynamic-import模式的差异帮助你在自己的 SolidStart 项目中正确选择和配置服务端 Sentry 注入方式。一、这个测试应用是做什么的dev-packages/e2e-tests/test-applications/目录是 sentry-javascript 仓库中 E2E 测试的应用矩阵覆盖了 Next.js、Nuxt、SvelteKit、React Router、Solid 等大量框架的多个版本。其中 SolidStart 系列包含多个变体solidstart基线 SolidStart 应用solidstart-top-level-import本文主角启用autoInjectServerSentry: top-level-importsolidstart-dynamic-import启用autoInjectServerSentry: experimental_dynamic-import用于对比验证两种注入模式的差异。top-level-import模式解决的核心问题是在**无法修改 Node 启动参数不能加--import标志**的环境中如何在服务端自动加载并初始化 Sentry SDK。SDK 的做法是在构建阶段向 Nitro 服务端入口文件的顶部注入对 Sentry 服务端配置的 import 语句使 SDK 在服务器启动的最早期加载。该应用的目录结构体现了一个完整的 SolidStart Sentry E2E 测试应用形态solidstart-top-level-import/ ├── app.config.ts # withSentry() 包装的 Solid Start 配置核心 ├── package.json # 依赖与 E2E 测试脚本 ├── playwright.config.mjs # Playwright 生产环境 E2E 配置 ├── start-event-proxy.mjs # 本地事件代理接收 SDK 上报的事件 ├── vitest.config.ts # 单元测试配置 ├── src/ │ ├── instrument.server.ts # 服务端 Sentry 初始化入口 │ ├── entry-client.tsx │ ├── entry-server.tsx │ └── routes/ # 用于触发客户端/服务端错误与性能事件的测试路由 └── tests/ # Playwright E2E 断言client/server 错误与性能二、项目创建与本地运行方式该应用的 README.md 沿用了 Solid CLI 生成的标准说明这里继承其完整操作步骤并结合应用自身的 package.json 补充实际脚本。创建项目# 在当前目录创建新的 Solid 项目 npm init solidlatest # 或在 my-app 目录中创建 npm init solidlatest my-app开发模式安装依赖npm install/pnpm install/yarn后启动开发服务器npm run dev # 或启动服务并在新浏览器标签页打开应用 npm run dev -- --open在本应用中dev脚本实际是vinxi devpackage.json因为 SolidStart 内部构建由 Vite Vinxi 驱动sentry/solidstart的 Vite 插件正是挂载在这条链路上。构建与预览Solid 应用基于 preset 构建针对不同部署环境做优化。默认npm run build会生成一个可用npm start运行的 Node 应用要使用其他 preset需将其加入devDependencies并在app.config.js中指定。本应用对应脚本为# 构建vinxi build触发 withSentry 的构建期注入逻辑 npm run build # 在 localhost:3030 上以生产模式运行构建产物 npm run preview测试测试分两层工具链为vitestsolidjs/testing-librarytesting-library/jest-dom后者为 expect 扩展了自定义匹配器# 单元测试 npm testE2E 层面package.json 定义了完整的 CI 脚本链test:build: pnpm install pnpm build, test:prod: TEST_ENVproduction playwright test, test:assert: pnpm test:prod即安装依赖 →vinxi build构建生产产物此时 top-level-import 注入发生在 Nitro/Rollup 的rollup:before钩子中→ 以TEST_ENVproduction运行 playwright.config.mjs 断言错误与性能事件是否按预期上报。tests/目录下的 errors.server.test.ts、performance.server.test.ts 等用例正是在验证 top-level-import 注入后服务端错误捕获与服务端性能采集确实生效。三、核心配置withSentry() 与 top-level-import 选项应用的 app.config.ts 只有 11 行但它是整个测试的关键import { withSentry } from sentry/solidstart; import { defineConfig } from solidjs/start/config; export default defineConfig( withSentry( {}, { autoInjectServerSentry: top-level-import, }, ), );withSentry是sentry/solidstart提供的配置包装函数源码见 withSentry.ts接收两个参数传给defineConfig的原始 SolidStart 配置对象可为空对象SentrySolidStartPluginOptions插件选项。从源码看withSentry做了三件事注入 Vite 插件把sentryPluginOptions与默认选项合并后通过addSentryPluginToVite挂到vite配置上withSentry.ts这是客户端浏览器侧Sentry 的打包入口注册 Nitro 模块以sentryNitroModule追加到server.modules在 Nitro 的rollup:before钩子里执行构建期插桩Orchestrion 代码变换以及服务端 Sentry 自动注入withSentry.ts强制内联被插桩模块将INSTRUMENTED_MODULE_NAMES及 ioredis 所需的standard-as-callback写入server.externals.inline因为外部化依赖不会经过 Orchestrion 的代码变换withSentry.ts。autoInjectServerSentry 的两个取值类型定义见 types.ts完整参数说明如下参数类型 / 取值说明instrumentationstringinstrument.server.ts\|js文件路径默认./src/instrument.server.tsserverEntrypointFileNamestring服务器入口文件名SDK 会按 Nitro preset 自动设置入口文件改名时可覆盖autoInjectServerSentrytop-level-import \| experimental_dynamic-import在无法使用 Node--import标志的环境中自动注入 Sentry 以启用部分服务端追踪experimental_entrypointWrappedFunctionsstring[]仅 dynamic-import 模式生效默认[default, handler, server]可被包装的入口导出名top-level-import模式本应用启用的模式适用环境无法修改 Node 启动脚本、加不了--import标志的部署环境受托管平台或运维约束的场景能力边界只支持有限的追踪插桩仅采集 HTTP 追踪不会得到数据库等具体框架级别的 span实现方式Sentry SDK 会在服务端入口文件顶部 import Sentry 服务端配置从而在服务器启动时加载 SDKtypes.ts 的文档注释。experimental_dynamic-import模式用动态import()包裹整个服务端入口文件使 Sentry 可以在其他代码运行之前预加载并注册必要的 hook支持更完整的插桩。对比应用 solidstart-dynamic-import/app.config.ts 中仅将选项值换成了experimental_dynamic-import两个应用由此形成同构 A/B 验证。重要警告来自类型定义文档注释启用任何一种自动注入模式时不要在 Node 启动脚本中再加--import标志加载 Sentry否则服务端会初始化两次 Sentry导致不可预期的问题。此外插件选项还继承了BuildTimeOptionsBase因此支持buildTimeInstrumentation等构建期选项在 withSentry.ts 中可以看到buildTimeInstrumentation ! false时才会注入sentryOrchestrionPlugin即默认开启、可显式关闭。四、top-level-import 的构建期实现细节withSentry内部的分支逻辑withSentry.tsif (sentryPluginOptions.autoInjectServerSentry experimental_dynamic-import) { await addDynamicImportEntryFileWrapper({ nitro, rollupConfig, sentryPluginOptions }); // 日志Wrapping the server entry file with a dynamic import() ... } else { await addInstrumentationFileToBuild(nitro); if (sentryPluginOptions?.autoInjectServerSentry top-level-import) { await addSentryTopImport(nitro); } }可以读出三个要点addInstrumentationFileToBuild(nitro)无条件执行非 dynamic-import 分支下负责把instrument.server.ts编译进对应构建产物目录这与withSentry的文档注释一致——“将instrument.server.ts构建到基于构建 preset 的合适目录”withSentry.ts仅当选项为top-level-import时额外调用 addSentryTopImport(nitro)实现位于 addInstrumentation.ts它把对 Sentry 服务端入口的 import 语句插入到服务端入口文件顶部从而在 Nitro 服务器启动的第一时间加载 SDKdynamic-import 模式则走addDynamicImportEntryFileWrapperaddInstrumentation.ts重写入口文件为动态import()包装并按experimental_entrypointWrappedFunctions默认[default, handler, server]见 withSentry.ts 中的默认选项包裹对应的 serverless 导出函数。这也解释了为什么该 E2E 应用必须先执行test:buildvinxi build再做生产断言——top-level-import 的注入是构建期行为不验证构建产物就无法验证注入是否生效。五、服务端初始化文件instrument.server.ts注入的“顶部 import”最终要落到一个服务端初始化文件。本应用的 src/instrument.server.tsimport * as Sentry from sentry/solidstart; Sentry.init({ dsn: process.env.E2E_TEST_DSN, environment: qa, // 动态采样偏好使事务得以保留 tracesSampleRate: 1.0, // 采集 100% 的事务 tunnel: http://localhost:3031/, // 事件代理服务器 debug: !!process.env.DEBUG, });几个配置要点的实战含义dsn取自环境变量E2E_TEST_DSN由 CI 注入代码中不落库任何真实 DSNenvironment: qa配合动态采样偏好DSB使事务在采样链路中被保留方便 E2E 断言关联 spantracesSampleRate: 1.0全量采集事务确保 performance.server.test.ts 中的服务端性能断言不会被采样率干扰tunnel: http://localhost:3031/把所有上报事件导向本地代理start-event-proxy.mjsPlaywright 用例通过该代理捕获并断言事件内容——这是 Sentry 浏览器/服务端 E2E 应用的通用做法。src/routes/下的client-error.tsx、server-error.tsx、error-boundary.tsx、back-navigation.tsx等路由则用于在浏览器中触发确定性的错误与导航场景供 tests/ 目录中的 Playwright 用例消费。六、小结围绕 solidstart-top-level-import 这个 E2E 测试应用你可以掌握标准 SolidStart 项目的创建、开发、构建与测试流程npm init solidlatest、vinxi dev、vinxi build、vitest Playwright 双层测试withSentry()的接入方式在app.config.ts中用withSentry(config, pluginOptions)包装defineConfig客户端与 Nitro 服务端插桩由此统一启用autoInjectServerSentry的参数语义与选型无法加 Node--import标志时用top-level-import仅 HTTP 追踪、零启动脚本改动需要更完整的服务端插桩时考虑experimental_dynamic-import配合experimental_entrypointWrappedFunctions调整入口导出包装源码级证据链注入逻辑位于 withSentry.ts 的 Nitrorollup:before钩子具体实现在 addInstrumentation.ts选项定义在 types.ts。如果你的部署平台限制启动参数top-level-import是在 SolidStart 中“零启动脚本改动”接入服务端 Sentry 的务实选择代价是服务端追踪范围收窄到 HTTP 层这一点在配置前需要明确预期。赞分享可观测性【免费下载链接】sentry-javascriptOfficial Sentry SDKs for JavaScript项目地址https://gitcode.com/gh_mirrors/se/sentry-javascript点击查看免费下载相关推荐Sentry SolidStart 端到端测试应用解析experimental_dynamic-import 服务端自动注入机制Sentry SolidStart 端到端测试应用解析experimental_dynamic import 服务端自动注入机制 本篇以 dev packag可观测性Consul服务网格在Kubernetes中的自动注入机制详解Consul服务网格在Kubernetes中的自动注入机制详解 前言 在现代微服务架构中服务网格 Service Mesh 已成为管理服务间通信的重要基础设施服务网格服务注册发现API网关健康检查微服务Velero version 命令详解客户端版本注入机制与服务端版本探测原理Velero version 命令详解客户端版本注入机制与服务端版本探测原理 本文基于 Velero 仓库中 v0.6.0 文档 ark version 对云原生灾备存储后端上一篇SOFABoot企业级应用实战金融、电商、物流三大行业完整案例指南 下一篇API速率限制在gh_mirrors/de/deprecated-version中的实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考