使用 @envelop/newrelic 为 GraphQL Yoga 应用接入 New Relic 监控与分布式追踪

发布时间:2026/9/26 3:09:38

使用 @envelop/newrelic 为 GraphQL Yoga 应用接入 New Relic 监控与分布式追踪 后端API设计【免费下载链接】graphql-yoga Rewrite of a fully-featured GraphQL Server with focus on easy setup, performance great developer experience. The core of Yoga implements WHATWG Fetch API and can run/deploy on any JS environment.项目地址https://gitcode.com/gh_mirrors/gr/graphql-yoga点击查看免费下载本文以 envelop/newrelic 插件文档 为核心介绍如何在基于 Envelop / GraphQL Yoga 的 GraphQL 应用中接入 New Relic Node.js Agent通过分布式追踪监控操作operation与解析器resolver的性能和错误。读完本文你将掌握插件的安装配置、全部选项的语义与默认值、基于正则表达式的变量/参数白名单黑名单过滤以及 newrelic.js 与环境变量两种 Agent 配置方式并能从源码与测试层面理解其工作原理。说明envelop/newrelic属于本仓库packages/envelop/plugins/newrelic目录是 Envelop 插件体系的一员可直接与 envelop/core 组合使用GraphQL Yoga 同样基于 Envelop 构建因此该插件也适用于 Yoga 服务。插件能做什么envelop/newrelic为你的 GraphQL 应用提供 New Relic 上报能力核心价值在于分布式追踪Distributed Tracing将 GraphQL 操作接入 New Relic 的跨服务追踪链路定位性能瓶颈与错误根因操作级监控以 GraphQL 操作operation为单位记录事务transaction可携带操作名、操作类型、请求文档、变量与执行结果Resolver 级监控把每个解析器的调用记录为 segment展示根字段root-field与子字段sub-field的逐级耗时错误追踪将执行结果中的GraphQLError上报给 New Relic Agent并支持自定义跳过规则。插件依赖 New Relic 官方 Node.js Agentnewrelicnpm 包自身只负责把 GraphQL 的语义信息桥接到 Agent 的 API 上最终的上报、采样、展示均由 Agent 与 New Relic 平台完成。快速开始按官方文档接入分三步安装依赖 → 配置 Agent → 注册插件。安装yarn add newrelic envelop/newrelic从 package.json 可以看到本插件的版本要求Node.js18.0.0作为peerDependency的envelop/coregraphql支持^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0newrelic支持7 12当前开发环境使用newrelic11.0.0。基本用法在创建 Envelop 实例时将插件加入 plugins 数组import { execute, parse, specifiedRules, subscribe, validate } from graphql import { envelop, useEngine } from envelop/core import { useNewRelic } from envelop/newrelic const getEnveloped envelop({ plugins: [ useEngine({ parse, validate, specifiedRules, execute, subscribe }), // ... other plugins ... useNewRelic({ includeOperationDocument: true, // 默认 false。为 true 时把定义操作与片段的 GraphQL 文档作为属性上报 includeExecuteVariables: false, // 默认 false。为 true 时把操作变量及值全部上报 includeRawResult: false, // 默认 false。为 true 时把执行结果上报 trackResolvers: true, // 默认 false。为 true 时把 resolver 记录为 segment 以监控性能 includeResolverArgs: false, // 默认 false。为 true 时把传给 resolver 的参数及值全部上报 rootFieldsNaming: true, // 默认 false。为 true 时把操作根字段名追加到事务名中 skipError: error { return true // 允许你决定某个错误是否上报给 NewRelic。默认情况下自定义的 EnvelopError 会被跳过 }, extractOperationName: context context.request.body.customOperationName // 从 context 中提取自定义操作名用于事务名与属性 }) ] })所有选项在源码 src/index.ts 中都有明确的默认值const DEFAULT_OPTIONS: UseNewRelicOptions { includeOperationDocument: false, includeExecuteVariables: false, includeRawResult: false, trackResolvers: false, includeResolverArgs: false, rootFieldsNaming: false, skipError: () false, };其中skipError的默认行为需要留意文档与源码注释指出插件默认会跳过EnvelopErrorEnvelop 自定义错误类型的上报避免把业务校验错误当作系统故障而对普通Error则按默认规则上报源码中skipError默认实现为恒返回false即不跳过。重要提示事务transaction与 segment/span 的计时可能受其他插件影响。为了获得更准确的追踪数据官方建议把 New Relic 插件放在插件列表的最后。选项详解与底层实现结合 src/index.ts我们逐项说明各选项的语义及其在源码中的落点。事务命名与操作级属性插件在onExecute阶段执行核心逻辑src/index.ts#L141-L241通过getOperationAST(args.document, args.operationName)解析出根操作拿不到则直接放弃记录确定操作名优先级为extractOperationName(context)→args.operationName→rootOperation.name?.value→ 匿名占位符anonymous源码中的AttributeName.ANONYMOUS_OPERATION如果开启了rootFieldsNaming会从 selectionSet 中收集所有根字段名只统计Kind.FIELD节点事务名被设置为operationType delimiter operationName ( delimiter rootFields.join())例如query/Greetings/hello分隔符来自 Agent 的transactionNameState.delimiter测试见 tests/newrelic.spec.ts通过getSpanContext()向 span 写入自定义属性。插件写入的属性名集中在AttributeName枚举中src/index.ts#L8-L21枚举值属性名含义COMPONENT_NAMEEnvelop_NewRelic_Plugin组件标识同时用于注册Supportability/ExternalModules/Envelop_NewRelic_Plugin指标EXECUTION_OPERATION_NAMEgraphql.execute.operationName操作名EXECUTION_OPERATION_TYPEgraphql.execute.operationType操作类型query / mutation / subscriptionEXECUTION_OPERATION_DOCUMENTgraphql.execute.documentGraphQL 文档字符串开启includeOperationDocument时写入EXECUTION_VARIABLESgraphql.execute.variables操作变量 JSON开启includeExecuteVariables时写入EXECUTION_RESULTgraphql.execute.result执行结果 JSON开启includeRawResult且结果含data时写入RESOLVER_FIELD_PATHgraphql.resolver.fieldPathresolver 字段路径如country/nameRESOLVER_TYPE_NAMEgraphql.resolver.typeName所属类型名如QueryRESOLVER_RESULT_TYPEgraphql.resolver.resultType返回类型如Country、String!RESOLVER_RESULTgraphql.resolver.resultresolver 返回结果 JSON开启includeRawResult时写入RESOLVER_ARGSgraphql.resolver.argsresolver 参数 JSON开启includeResolverArgs时写入includeOperationDocument把定义操作与片段的完整 GraphQL 文档写入graphql.execute.document。文档字符串通过envelop/core的getDocumentString(args.document, print)获取。includeExecuteVariables把操作变量 JSON 写入graphql.execute.variables变量取自args.variableValues。includeRawResult操作成功后把执行结果写入graphql.execute.result同时每个被追踪的 resolver 会把返回值写入graphql.resolver.result仅当includeRawResult开启。extractOperationName接收 Envelop 的DefaultContext返回自定义操作名同时用于事务名与graphql.execute.operationName属性。该能力在 4.0.0 版本由operationNameProperty改为函数式 API见 CHANGELOG.md好处是你可以读取 context 中的嵌套属性或来自其他 Envelop 插件的上下文扩展。错误处理与 skipError在onExecuteDone中插件对执行结果逐条检查错误src/index.ts#L204-L239if (singularResult.errors singularResult.errors.length 0) { const agent instrumentationApi.agent; const transaction instrumentationApi.tracer.getTransaction(); if (transaction) { for (const error of singularResult.errors) { if (options.skipError?.(error)) continue; agent.errors.add(transaction, JSON.stringify(error)); } } }skipError接收每个GraphQLError返回true表示跳过该错误的上报测试用例验证了这一点当skipError: e e.message Ignore me!时抛错 resolver 所在事务的hasError为falsetests/newrelic.spec.ts#L177-L198。流式结果支持对于订阅subscription等异步可迭代结果插件通过isAsyncIterable判断并使用onNext逐条上报、onEnd关闭 operation segmentsrc/index.ts#L226-L235。这一能力在 3.2.0 版本加入support async iterable results保证订阅类操作的错误与数据同样被记录。Resolver 级追踪的工作原理开启trackResolvers: true后插件会在onPluginInit阶段动态注入基于envelop/on-resolve的钩子src/index.ts#L81-L139useOnResolve在onSchemaChange阶段遍历 schema 中所有对象类型的字段把每个字段的 resolver 包上一层拦截逻辑packages/envelop/plugins/on-resolve/src/index.ts默认跳过 introspection 查询在 resolver 调用前插件通过instrumentationApi.getActiveSegment()拿到当前活动 segment为其创建名为resolver/路径的子 segment例如resolver/country、resolver/country/name字段路径由flattenPath递归拼接info.path得到数字类型索引如列表项下标会被跳过src/index.ts#L245-L257为 segment 写入graphql.resolver.fieldPath、graphql.resolver.typeName、graphql.resolver.resultTyperesolver 返回后包括异步 Promise 场景若开启includeRawResult则写入返回结果 JSON并结束 segment回调形式({ result }) { ...; resolverSegment.end(); }若当前没有活动事务或活动 segment例如 Agent 未初始化插件会通过 logger 以trace级别记录原因并跳过不会影响业务执行。另外插件在初始化时会先检查 Agent 是否可用rawOptions?.shim || newRelic?.shim以及instrumentationApi?.agent。若 Agent 不可用未正确安装newrelic、配置缺失或被禁用会打印警告并返回空插件避免应用崩溃src/index.ts#L65-L72。注册成功后还会上报一个Supportability/ExternalModules/Envelop_NewRelic_Plugin指标测试中对此有断言tests/newrelic.spec.ts#L79-L83。高级用法正则过滤变量与参数除了布尔值includeExecuteVariables和includeResolverArgs还接受RegExp用于对追踪内容做白名单/黑名单过滤。这在防止泄露用户数据如 PII的同时保留调试所需的字段非常有用。useNewRelic({ includeExecuteVariables: /client|application/i, // 白名单只追踪名称含 client 或 application 的变量如 clientName、applicationId、xApplicationId trackResolvers: true, // 追踪 resolver因为同时想追踪 resolver 参数 includeResolverArgs: /^(?!name|email|password).*/i, // 黑名单追踪所有名称不等于 name、email、password 的参数 }),实现上插件在初始化时用instanceof RegExp判断是否为正则options.isExecuteVariablesRegex/options.isResolverArgsRegex随后通过filterPropertiesByRegex遍历对象键、用pattern.test(property)逐键筛选src/index.ts#L259-L267。测试用例提供了直观的验证includeExecuteVariables: true 变量{ name: Laurin }→ 上报{name:Laurin}tests/newrelic.spec.ts#L86-L114includeExecuteVariables: /verb/ 变量{ verb: Hi, name: Dotan }→ 只上报{verb:Hi}tests/newrelic.spec.ts#L115-L150。性能提醒过滤变量和参数的方式是循环遍历因此会产生 O(n) 的开销其中n为操作变量个数追踪执行变量时或传给 resolver 的参数个数追踪 resolver 参数时。在生产环境请权衡过滤粒度与开销尤其是高 QPS 的服务。Agent 配置newrelic.js 与环境变量插件本身只负责桥接真正的 Agent 配置需要按 New Relic 官方文档完成。官方推荐两种配置方式newrelic.js 文件放在应用根目录。New Relic 官方仓库提供了该文件的基础示例对应node-newrelic的newrelic.js模板环境变量与 newrelic.js 中的配置项一一对应只需全部大写、以NEW_RELIC_前缀开头并在应用启动前确保变量已就绪。两个必填项描述newrelic.js环境变量应用名app_name: [MyAppName]NEW_RELIC_APP_NAMEMyAppName许可证密钥license_key: 40HexadecimalCharactersNEW_RELIC_LICENSE_KEY40HexadecimalCharacters常用配置项描述newrelic.js环境变量开启分布式追踪distributed_tracing: { enabled: true }NEW_RELIC_DISTRIBUTED_TRACING_ENABLEDtrue日志级别logging: { level: info }NEW_RELIC_LOG_LEVELinfo捕获所有请求头allow_all_headers: trueNEW_RELIC_ALLOW_ALL_HEADERStrue开启错误收集error_collector: { enabled: true }NEW_RELIC_ERROR_COLLECTOR_ENABLEDtrue更多可配置项可参考 New Relic Node.js Agent 的官方配置文档及其lib/config/default.js该文件列出了 newrelic.js 中可包含的全部配置变量均可转换为对应的环境变量。注意分布式追踪是本文场景跨服务定位 GraphQL 请求根因的基础建议显式开启。监控效果一览以下截图来自插件 README展示的是所有插件选项均为true时的 New Relic 界面效果。错误追踪与操作/Resolver 视图成功操作追踪——操作、根字段与子字段 resolver 视图从截图可以看到操作名为myCustomQuery的查询在 New Relic 中被记录为一次分布式追踪右侧 Attributes 面板展示graphql.execute.operationName、graphql.execute.operationType、请求文档、变量与结果span 列表中resolver/country、resolver/language等顶级 resolver 与resolver/country/name等子字段 resolver 被逐级展开错误场景下还会标注具体的GraphQLError错误类与出错 resolver如resolver/country及其入参{code:GB}、字段路径、结果类型等信息帮助快速定位究竟是哪个字段、哪个入参导致耗时异常或失败。小结envelop/newrelic以很小的接入成本为 GraphQL 服务补齐了 APM 能力操作级事务命名与属性、resolver 级 segment、错误上报、基于正则的敏感数据过滤一应俱全且对query/mutation/subscription三类操作均做了处理。其实现完全建立在 Envelop 的onExecute/onExecuteDone钩子与envelop/on-resolve的 resolver 拦截机制之上不侵入业务代码需要留意的是 Agent 未初始化时插件会静默降级打印警告、不记录以及按官方建议将插件置于 plugins 数组末尾以获得更准确的计时。赞分享后端API设计【免费下载链接】graphql-yoga Rewrite of a fully-featured GraphQL Server with focus on easy setup, performance great developer experience. The core of Yoga implements WHATWG Fetch API and can run/deploy on any JS environment.项目地址https://gitcode.com/gh_mirrors/gr/graphql-yoga点击查看免费下载相关推荐使用 redisotel 为 go-redis 接入 OpenTelemetry 分布式追踪与指标监控使用 redisotel 为 go redis 接入 OpenTelemetry 分布式追踪与指标监控 导读 redisotel 是 go redis git云原生存储GraphQL Yoga 与 Envelop 集成 OpenTelemetry 追踪从零接入到 Jaeger 全流程实战GraphQL Yoga 与 Envelop 集成 OpenTelemetry 追踪从零接入到 Jaeger 全流程实战 导读本文以开源仓库 graphql后端API设计Quansheng UV-K5硬件逆向工程从PCB到射频设计的完整技术解析Quansheng UV K5硬件逆向工程从PCB到射频设计的完整技术解析 在开源硬件与业余无线电技术快速融合的今天逆向工程已成为理解复杂射频系统设计的重要硬件开发逆向工程嵌入式智能硬件上一篇OmniGibson完整指南照片级渲染与物理仿真兼备的Embodied AI仿真平台下一篇暗影精灵性能解锁终极指南OmenSuperHub风扇曲线、功耗与灯效控制完整教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/26 3:09:38

IntelliJ IDEA 2026.1 实战部署指南:JDK 21.0.3 与系统级兼容配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/26 5:44:46

护理AI落地实战:从数据抽取到风险预警的工程化路径

简介:这份PPT资料围绕人工智能在护理领域的应用现状及发展前景展开,面向护理专业学生、临床护理管理者及医疗信息化从业者,帮助读者系统了解智能技术如何嵌入日常护理流程。内容涵盖智能护士机器人、智能病历管理、智能护理计划三大典型场景&…

2026/9/26 5:44:46

iOS 27折叠屏适配核心指南:铰链感知与多显示域架构

1. iPhone Duo不是“双屏手机”,而是苹果重构人机交互范式的物理载体最近朋友圈和开发者群都在刷“iPhone Duo”这个词,很多人第一反应是:又一个安卓厂商玩过的双屏折叠概念?甚至有人直接搜“iPhone Duo参数”“iPhone Duo发布时间…

2026/9/26 5:44:46

二进制编辑器本质:数据抽象层级的工具选择逻辑

1. 为什么“Editor”这个词在技术圈里总让人摸不着头脑?“Editor”这个词,乍一看就是“编辑器”,像记事本、VS Code、Sublime Text那样打开文件改几行字的工具。但只要你真在逆向分析、游戏存档破解、嵌入式调试、固件逆向这些一线场景里泡过…

2026/9/26 5:44:46

SpringBoot+Vue影院选座系统:并发锁座与订单状态流转实战

简介:这是一套面向Java Web全栈学习者的电影售票及影院管理系统完整源码,基于SpringBoot与Vue.js前后端分离架构实现,适合课程设计、毕业设计或技术进阶练习。系统覆盖用户注册登录、电影信息维护、影院与放映厅管理、排片场次设定、可视化选…

2026/9/26 5:44:46

基于C#的Fanuc数控系统上位机开发:Focas通信与车间设备联网实践

简介:面向工业自动化与数控机床运维场景,这是一套基于C#开发的FANUC系统上位机管理工具,聚焦车削类机床的多设备数据采集、运行状态监控、故障报警与刀具寿命管理。工程覆盖FANUC FOCAS通信库调用(fwlib32.cs)、轴控制…

2026/9/26 5:39:46

飞鸟云邀请码获取指南:从注册机制到激活避坑全解析

1. 从一枚邀请码说起:飞鸟云到底在火什么最近“飞鸟云邀请码”这个词的热度一路走高。说实话,做这个领域的内容这么久,我明显感觉到邀请码这种模式已经从小众圈子的“暗号”变成了大众眼里的“入场券”。飞鸟云不是第一个这么玩的&#xff0c…

2026/9/25 21:00:17

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/25 20:59:52

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/26 0:04:28

画质修复APP怎么选?Wink影像修复能力与产品实力解析

现如今手机拍摄场景愈发丰富,演唱会直拍、漫展记录、老视频翻新、日常vlog录制,都会遇到画面模糊、噪点多、曝光失衡等问题,不少用户在挑选工具时比较在意一款画质修复APP能够兼顾修复效果与自然质感。Wink作为美图公司推出的全球化AI影像增强…

2026/9/26 0:04:28

超低能耗建筑K值要求能否满足?浙东铝业建筑型材解析

核心摘要浙东铝业的超低能耗系统门窗产品,资料显示保温性能可达 K≤1.4W/(㎡K),能够对应上海地区超低能耗住宅对门窗保温性能的应用需求。判断建筑是否满足超低能耗要求,不能只看铝型材本身,还需要结合玻璃、隔热条、密封系统、开…

2026/9/25 20:55:38

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

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

2026/9/25 18:41:36

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

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

2026/9/25 18:34:56

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

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

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

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

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