Serverless Framework Node.js 可观测性 SDK 深度指南:捕获错误、设置 Tag 与自定义 Span

发布时间:2026/9/8 22:10:09

Serverless Framework Node.js 可观测性 SDK 深度指南:捕获错误、设置 Tag 与自定义 Span Serverless Framework Node.js 可观测性 SDK 深度指南捕获错误、设置 Tag 与自定义 Span【免费下载链接】serverless⚡ Serverless Framework – Effortlessly build apps that auto-scale, incur zero costs when idle, and require minimal maintenance using AWS Lambda and other managed cloud services.项目地址: https://gitcode.com/GitHub_Trending/se/serverlessServerless Framework Dashboard 的自动插桩虽然能采集 Metrics 与 Traces但要捕获函数内已处理的错误handled errors、记录警告并打上自定义 Tag需要在 AWS Lambda handler 中引入 Node.js 版本的 Serverless SDK。本篇完整讲解serverless/sdk与serverless/aws-lambda-sdk两个包的安装与选型、bundler 场景下的手动插桩、Source Maps 配置、错误/警告捕获、Tag 层级继承规则、结构化日志输出与自定义 Span 的创建方法并结合仓库中 Dashboard 集成与 Trace 数据处理的源码说明 SDK 生成的数据最终如何进入平台。核心概念Event、Captured Error、Captured Warning 与 TagSDK 生成的所有数据都挂在一次调用的 Trace 之下理解四个基本术语是使用 SDK 的前提EventTrace 中被捕获的 error、warning 或 notice 实例一次 Trace 中可以有多个 EventCaptured Error以 Event 形式发送到 Serverless Dashboard 的错误实例可以在 Trace Explorer 的 Details 视图中查看Captured WarningNode.js 中以字符串形式发送的警告实例处理方式与 Captured Error 类似Tag可以设置在 Trace 或单个 Event 上的键值对同样显示在 Trace Explorer 的 Details 中。这些 Event 类型在平台侧是有明确定义的。从 Trace 文档 可以看到 Dashboard 区分五类事件未捕获错误ERROR_TYPE_UNCAUGHT、通过 SDK/结构化日志/标准输出捕获的用户错误ERROR_TYPE_CAUGHT_USER、用户警告WARNING_TYPE_USER、因误用 SDK 而报告的 SDK 错误ERROR_TYPE_CAUGHT_SDK_USER以及 SDK 警告WARNING_TYPE_SDK_USER。后两类错误不会导致 handler 失败只是提示 SDK 使用有误可能导致部分数据缺失——例如setTag传入非法输入时Tag 不会被设置但会在 Trace Details 中出现一条 SDK 错误记录。安装与包选型基础场景安装 serverless/sdk当在 Serverless Dashboard 中开启 Tracing 后平台会自动向目标 AWS Lambda 函数附加一个包含serverless/sdk的 AWS Lambda Layer。但由于手动部署或某些 IaC 工具可能临时移除该 Layer官方建议将 SDK 直接 bundle 进 handler以避免对 SDK 的引用无法解析npm install serverless/sdk --save # 或 yarn add serverless/sdkSDK 本身不需要任何配置开启 Tracing 时认证凭据会自动写入 AWS Lambda 函数的环境变量。Bundler 场景serverless/aws-lambda-sdk如果 handler 使用了 esbuild 等打包工具情况会有所不同。Dashboard 的 AWS Lambda Layer 会自动插桩原生 Node.js API如http、console以及运行时可用的 AWS SDK 等 API但一旦 bundler 把express或 AWS SDK 这类依赖打包进了函数代码平台就无法再自动插桩它们。此时需要改用serverless/aws-lambda-sdk包它取代serverless/sdk两者不必同时安装npm install serverless/aws-lambda-sdk --save # 或 yarn add serverless/aws-lambda-sdk使用它手动插桩 AWS 客户端库和 Express.jsconst express require(express) const serverlessSdk require(serverless/aws-lambda-sdk) // 插桩 AWS SDK v2 serverlessSdk.instrumentation.awsSdkV2.install(AWS) // 插桩 AWS SDK v3 client serverlessSdk.instrumentation.awsSdkV3Client.install(client) // 插桩 Express.js const expressApp express() // 注意必须在安装任何 express 中间件之前完成插桩 serverlessSdk.instrumentation.expressApp.install(expressApp)两个关键细节插桩时机Express 的插桩必须在挂载任何中间件之前执行否则后续注册的路由不会被捕获保留函数名很多插桩依赖函数名来解析 Span 名称与 Tag因此不能允许 bundler 改写函数名。以 esbuild 为例可通过其官方的--keep-names选项保证。仓库中配套的 esbuild 打包插件即为serverless-esbuild见下文 Source Maps 一节配置该插件时可一并启用这一行为。别忘了开启 InstrumentationSDK 只负责生成 Tags、Spans 和 Events数据能否被平台摄入取决于是否对每个函数单独开启了 InstrumentationDashboard UI 的 Instrument 开关或通过 CLI 在serverless.yml的stages下设置observability详见 监控总览文档。这一机制在框架源码中可以得到印证部署时 Dashboard 可观测性集成服务 会通过instrumentResources接口按每批 50 个函数发送插桩请求并轮询getInstrumentationFlow等待插桩完成。也就是说即使你的 handler 里已经写好了captureError调用只要平台侧未对该函数执行插桩附加 Layer 与环境变量这些数据就不会出现在 Dashboard 中。使用 SDK在 handler 中引入const serverlessSdk require(serverless/sdk)如前所述凭据来自平台开启 Tracing 时注入的 Lambda 环境变量无需显式配置。配置 Source Maps让压缩/转译后的堆栈可读Source map 文件将转译或编译后的代码映射回原始源码。当代码经过 TypeScript、ESBuild、Babel 等工具压缩、转译或打包后错误堆栈通常难以阅读而 Source Maps 可以让 Dashboard 展示还原后的堆栈。若使用的 Serverless Framework 版本低于 3.36.0需要通过disableWrapping移除 Dashboard SDK Wrappercustom: enterprise: disableWrapping: true第一步生成 source map 文件配置转译器/打包器输出.js.map文件。推荐通过serverless-esbuild插件支持 ESBuild并在serverless.yml中添加sourcemap选项plugins: - serverless-esbuild custom: esbuild: bundle: true minify: true sourcemap: true仓库内即内置了 esbuild 插件的实现与集成测试可参考 esbuild 插件源码 以及 esbuild 集成测试 了解该插件在打包阶段的处理方式。第二步确保 source map 被打进函数包Serverless Framework 默认会把服务目录下的所有文件和目录包括生成的.js.map打进部署包.gitignore与.npmignore中列出的除外。如果使用了package.include或package.exclude务必确认*.js.map文件仍被包含。第三步让 Node 使用 Source MapsNode 14 通过修改 stack trace handler 原生支持 Source Maps需要给node传入--enable-source-mapsCLI 选项可通过NODE_OPTIONS环境变量实现provider: environment: NODE_OPTIONS: --enable-source-maps捕获错误Capturing Errors捕获已处理错误handled errors是 SDK 最常见的用途有两种方式方式一captureErrortry { // an error is thrown } catch (ex) { serverlessSdk.captureError(ex) }方式二console.errortry { // an error is thrown } catch (ex) { console.error(ex) }SDK 自动插桩了console.error如果你本来就用它打印错误几乎零成本即可获得捕获能力。行为细节只传Error对象时Dashboard 中显示该Error对象自身的堆栈传字符串或字符串与Error的组合时捕获的是console.error调用处的堆栈字符串参数也支持任意组合。捕获警告Capturing Warnings方式一captureWarningserverlessSdk.captureWarning(Something bad will happen soon)方式二console.warnconsole.warn(My Warning)console.warn同样被自动插桩且会捕获该console.warn调用的堆栈便于在 Dashboard 中定位。两点约束与最佳实践只支持捕获字符串避免在字符串中使用唯一实例值。如果需要带上userId、email、request ID 等每次调用可能不同的值应改用 Tagging见下节。这样相同的警告可以按消息聚合而唯一的上下文信息通过 Tag 检索。Tagging给 Trace 与 Event 打标签在 Trace 级别设置 TagserverlessSdk.setTag(userId, bd86489cf036)setTag创建的是整个 Trace 级别的 Tag显示在 Trace Explorer 的 Trace Details 页。所有通过setTag设置的 Tag 会被该 Trace 下的所有 Captured Errors 和 Captured Warnings继承。约束Tag 的 key 只能包含字母、数字、.、-和_value 可以是任意字符串。非法的 key 不会抛出异常而是产生一条 SDK 错误记录显示在 Trace Details 中对应 Trace 文档中提到的ERROR_TYPE_CAUGHT_SDK_USER类型Tag 本身不会被设置。与 console.error / console.warn 配合serverlessSdk.setTag(userId, bd86489cf036) console.warn(warning message) console.error(new Error(some error))由于 Captured Errors 和 Captured Warnings 可以经由console.error/console.warn产生setTag设置的 Tag 会应用到之后所有用这两种方式创建的 Captured Errors 与 Captured Warnings 上。在单个 Captured Error 上设置 TagserverlessSdk.captureError(ex, { tags: { userId: 1b8b4c6b4b14 } })也可以在单个错误上直接设置 Tag。若此前已通过setTag设置过同名 Tag则captureError中传入的 Tag 会覆盖该 Captured Error 上的同名 Tag但 Trace 级别的 Tag 保持不变。captureError的 Tag key 校验规则与setTag一致。在单个 Captured Warning 上设置 TagserverlessSdk.captureWarning(warning message, { tags: { userId: eb661c69405c }, })与 Captured Errors 相同警告也可以携带自己的 Tagkey 校验规则也一致。结构化日志输出captureError和captureWarning会以二进制格式把内容发送给 Dashboard为了兼顾人类可读性这两个方法会同时向标准输出打印一段结构化 JSON 日志例如{ source: serverlessSdk, type: ERROR_TYPE_CAUGHT_USER, message: User not found, stackTrace: ..., tags: { userId: eb661c69405c } }其中type字段与 Dashboard 的 Event 类型体系如 Trace 文档中列出的ERROR_TYPE_CAUGHT_USER一一对应。这段 JSON 除了易读还可被 CloudWatch Log Insights 等其他工具解析检索。如果不需要标准输出在运行时设置以下环境变量即可关闭SLS_DISABLE_CAPTURED_EVENTS_STDOUTtrue创建自定义 SpanSpan 是 Trace 中记录某件事何时开始、何时结束的单元可以嵌套、可以包含 Event。SDK 会自动为 AWS 服务调用和 HTTP 请求创建 Span平台侧也支持通过SLS_DISABLE_AWS_SDK_MONITORING、SLS_DISABLE_HTTP_MONITORING等环境变量关闭这两类采集详见 监控总览文档。如果需要记录业务逻辑的执行区间可以手动创建基础用法const customSpan1 serverlessSdk.createSpan(mySpan) // do some work customSpan1.close()回调形式可以把回调传给createSpanSpan 会随回调的开始/结束自动开闭serverlessSdk.createSpan(mySpan, () { // do some work })回调形式同样支持asyncserverlessSdk.createSpan(mySpan, async () { // do some work })嵌套 Span在 Span 实例上调用createSpan即可创建子 Spanconst span1 serverlessSdk.createSpan(span1) const span2 span1.createSpan(span2) // do some work span2.close() // do additional work span1.close()关闭顺序有约束子 Span 必须先于父 Span 关闭如果父 Span 被关闭其所有子 Span 会被一并关闭。设置自定义 Endpoint在 mono-lambda 架构中——单个 Lambda 函数搭配 Express.js 等框架、由 API Gateway 的单一路由端点转发——API Gateway 收到的请求会被记为 proxy 端点于是请求可能显示为/{proxy}而不是真实路径。SDK 会自动插桩 Express.js、KOA 等框架以捕获正确的 endpoint使你可以按预期路径过滤 HTTP 请求。在自动插桩不够用的场景下可以用setEndpoint手动指定serverlessSdk.setEndpoint(/my/custom/endpoint)数据流向小结SDK 数据如何到达 Dashboard从仓库源码可以完整拼出 SDK 数据的路径平台集成 AWS 账号时创建 IAM Role 并搭建 Kinesis Firehose将各函数 CloudWatch Logs 的日志汇入 Firehose每次调用时插桩层会在 CloudWatch Logs 中写入以SERVERLESS_TELEMETRY开头的压缩 Trace payload平台从 Firehose 摄入这些数据机制说明见 监控总览文档。这也解释了前文两条看似矛盾的设计其一SDK 无配置可用——凭据与路由都由插桩阶段注入其二SDK 必须与 Instrumentation 配套——没有插桩就没有 Layer 包装SDK 产生的数据也就没有上报通道。部署侧的插桩流程则由 Dashboard 集成服务 在部署钩子中驱动包含集成状态检查、按 50 个函数一批下发插桩请求、以及等待插桩完成超时后转入后台继续等步骤。适用前提与限制平台监控目前支持的 Node.js 运行时为 nodejs14.x / nodejs16.x / nodejs18.xPython 3.8 亦支持且仅限 AWS 商业区不含 GovCloud 与中国区集成后 Metrics 与 Traces 通常有最长约 10 分钟的可见延迟高流量函数默认启用 20% 的 Trace 采样产生错误/警告事件的调用永不被采样也可用SLS_DISABLE_TRACE_SAMPLING环境变量关闭采样本文所有配置与代码示例以当前仓库 docs/sf/guides/dashboard/monitoring/sdk/nodejs.md 文档为准Python 版本可参考同目录的 python.md。【免费下载链接】serverless⚡ Serverless Framework – Effortlessly build apps that auto-scale, incur zero costs when idle, and require minimal maintenance using AWS Lambda and other managed cloud services.项目地址: https://gitcode.com/GitHub_Trending/se/serverless创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/8 22:10:09

obsidian-skills 安装使用指南:让 AI 直接操作 Obsidian 笔记

obsidian-skills 安装使用指南:让 AI 直接操作 Obsidian 笔记 【免费下载链接】obsidian-skills Agent skills for Obsidian. Teach your agent to use Obsidian CLI and open formats including Markdown, Bases, JSON Canvas. 项目地址: https://gitcode.com/Gi…

2026/9/8 22:10:09

微信开源生产级模型:从工程视角拆解部署与落地

微信内部长期在生产链路里跑的生产级模型,最近突然以开源姿态对外放了出来。消息刚出那会儿,技术群里讨论最多的不是模型榜单刷了多少分,而是另一件事:腾讯这种体量的团队,敢把“真在线上扛流量”的模型源代码和权重一…

2026/9/8 23:20:41

Win10下USBasp驱动安装与排错指南:从黄叹号到稳定下载

简介:USBasp和USBisp是AVR单片机开发中常用的编程器,但Windows 10对未签名驱动的限制常导致设备无法识别或通信失败。本下载包提供“一键安装”解决方案,内含18个文件,包含驱动核心sys文件、动态库dll、安装引导exe以及inf配置信息…

2026/9/8 23:20:41

全志T153工业网关双网口与RS485抗干扰设计实战

1. 项目概述:为什么工业网关底板的双网口和RS485不是“能用就行”?全志T153这颗芯片,我盯了快三年。它不是消费级H3或V3s那种“拿来就跑Linux”的省心货,而是专为工业边缘节点打磨的SoC——内置HIFI4 DSP核、双千兆以太网MAC、双独…

2026/9/8 23:20:41

嵌入式全栈安全体系:纵深防御与应急响应落地指南

在CSDN的付费专栏里,我把前19讲的内容基本都放在了“如何把嵌入式系统做成一个可靠产品”这条主线上,从内核态到应用态、从驱动调试到量产烧录,每一讲都在解决某一个具体问题。这一讲会明显不一样:我要把“安全”作为顶层主线&…

2026/9/8 23:20:41

STM32F103C8T6驱动ILI9341 TFT LCD完整教程与调试指南

简介:面向STM32入门者与嵌入式开发者的ILI9341液晶显示工程,基于STM32F103C8T6最小系统板和2.8寸TFT LCD模块,重点演示如何在无FSMC的48脚芯片上用普通GPIO模拟总线,实现16位并口TFT驱动,可直接迁移到类似MCU平台&…

2026/9/8 23:15:41

OpenCode实测:从安装配置到Skills与Memory的终端AI编码代理全指南

元旦前我接手了一个七万多行的老仓库,原本只是想找个能在终端里陪我看代码的 AI 搭档,结果在 Claude Code、Codex 之间来回折腾了三四天,反而被一个当时还算小众的工具留住了。它就是 opencode——一个开源的、跑在终端里的 AI 编码代理&…

2026/9/8 7:15:10

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/8 7:15:10

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/8 0:01:49

踩多轮坑才跑通|OpenClaw 3.1.0 双平台本地 AI 自动化搭建实操实录

🔹 工具简述 OpenClaw 是一款备受开发者与办公人群青睐的开源本地智能工具,凭借离线本地运行、可视化图形面板、全流程自主任务处理三大核心特点,积累了众多忠实用户。与普通对话类 AI 产品不同,它能够直接调用电脑的软硬件操作权…

2026/9/8 0:01:50

拒绝复杂命令行,Hermes Agent 一键包快速解锁智能办公能力

🔍前言 不少想要体验 Hermes Agent 办公能力的使用者,往往会被复杂的环境配置拦住使用脚步。手动下载匹配依赖、反复调整系统目录、处理命令行持续报错、修复权限异常、补全丢失核心文件等一系列操作,对普通使用者而言门槛较高,很…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/7 22:45:59

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码