发布时间:2026/7/15 18:42:27
NestJS OpenTelemetry (OTEL) 完全指南:从入门到精通的一站式教程 NestJS OpenTelemetry (OTEL) 完全指南从入门到精通的一站式教程【免费下载链接】nestjs-otelOpenTelemetry (Tracing Metrics) module for Nest framework (node.js) 项目地址: https://gitcode.com/gh_mirrors/ne/nestjs-otelNestJS OpenTelemetryOTEL模块是专为Nest框架设计的可观测性解决方案它整合了OpenTelemetry的追踪Tracing和指标Metrics功能帮助开发者轻松构建可观测的Node.js应用。本教程将带你从基础安装到高级功能应用掌握NestJS应用的可观测性实践。为什么选择NestJS OpenTelemetry在现代微服务架构中可观测性至关重要。OpenTelemetry提供了统一的标准支持多种数据导出和指标类型如Prometheus指标。nestjs-otel模块简化了OpenTelemetry在NestJS应用中的集成让开发者无需深入了解底层细节即可实现分布式追踪和性能监控。核心概念可观测性三支柱可观测性建立在三个核心信号之上追踪Tracing记录请求在系统中的传播路径帮助定位性能瓶颈指标Metrics量化系统行为如请求量、错误率、响应时间日志Logs记录系统事件提供调试上下文图NestJS OpenTelemetry可观测性三支柱示意图快速安装步骤1. 安装核心依赖npm i nestjs-otel opentelemetry/sdk-node --save2. 安装可选依赖根据需要的导出器类型安装额外依赖npm i opentelemetry/exporter-prometheus --save基础配置指南创建Tracing配置文件在项目根目录创建tracing.ts文件import { NodeSDK } from opentelemetry/sdk-node; import { getNodeAutoInstrumentations } from opentelemetry/auto-instrumentations-node; import { PrometheusExporter } from opentelemetry/exporter-prometheus; import { BatchSpanProcessor } from opentelemetry/sdk-trace-base; import { JaegerExporter } from opentelemetry/exporter-jaeger; import { AsyncLocalStorageContextManager } from opentelemetry/context-async-hooks; const otelSDK new NodeSDK({ metricReader: new PrometheusExporter({ port: 8081 }), spanProcessor: new BatchSpanProcessor(new JaegerExporter()), contextManager: new AsyncLocalStorageContextManager(), instrumentations: [getNodeAutoInstrumentations()], }); export default otelSDK;集成到NestJS应用在应用入口文件通常是main.ts中启动OTEL SDKimport otelSDK from ./tracing; import { NestFactory } from nestjs/core; import { AppModule } from ./app.module; async function bootstrap() { // 在创建Nest应用前启动OTEL SDK await otelSDK.start(); const app await NestFactory.create(AppModule); await app.listen(3000); } bootstrap();注册OpenTelemetry模块在AppModule中配置OpenTelemetry模块import { OpenTelemetryModule } from nestjs-otel; Module({ imports: [ OpenTelemetryModule.forRoot({ metrics: { hostMetrics: true } // 启用主机指标收集 }) ] }) export class AppModule {}追踪功能详解使用Span装饰器创建自定义追踪Span装饰器可用于标记需要追踪的方法支持自定义名称和属性import { Span } from nestjs-otel; export class BooksService { // 自定义span名称 Span(getBooks) async getBooks() { return [Harry Potter, The Hobbit]; } // 动态设置span属性 Span((id) ({ attributes: { bookId: id } })) async getBook(id: number) { return { id, title: NestJS in Action }; } }使用Traceable装饰器追踪类所有方法对类使用Traceable装饰器可自动追踪所有方法import { Traceable } from nestjs-otel; Injectable() Traceable() export class UsersService { findAll() { return []; } findOne(id: string) { return {}; } }访问当前Span使用CurrentSpan装饰器在控制器中获取当前spanimport { Controller, Get } from nestjs/common; import { CurrentSpan } from nestjs-otel; import { Span } from opentelemetry/api; Controller(cats) export class CatsController { Get() findAll(CurrentSpan() span: Span) { span?.setAttribute(custom.attribute, value); return This action returns all cats; } }指标监控实战使用MetricService创建指标通过MetricService可以创建和管理各种类型的指标import { MetricService } from nestjs-otel; import { Counter } from opentelemetry/api; Injectable() export class BookService { private bookCounter: Counter; constructor(private metricService: MetricService) { this.bookCounter this.metricService.getCounter(book_requests_total, { description: Total number of book requests }); } async getBooks() { this.bookCounter.add(1); return [Book 1, Book 2]; } }方法级指标装饰器使用OtelMethodCounter装饰器自动统计方法调用次数Controller() export class AppController { Get() OtelMethodCounter() // 自动生成 app_AppController_doSomething_calls_total 指标 doSomething() { // 业务逻辑 } }Prometheus指标导出配置Prometheus导出器后指标将在http://localhost:8081/metrics端点可用可直接被Prometheus抓取。高级功能Wide EventsWide Events宽事件模式在单个请求生命周期中累积属性最终生成一个上下文丰富的事件。注册WideEventInterceptorimport { APP_INTERCEPTOR } from nestjs/core; import { WideEventInterceptor } from nestjs-otel; Module({ providers: [ { provide: APP_INTERCEPTOR, useClass: WideEventInterceptor } ] }) export class AppModule {}使用WideEventService丰富事件import { WideEventService } from nestjs-otel; Injectable() export class CheckoutService { constructor(private wideEvent: WideEventService) {} async checkout(cart: Cart) { this.wideEvent.setMany({ user.id: cart.userId, cart.items: cart.items.length, cart.total: cart.total }); const timer this.wideEvent.startTimer(payment.duration_ms); await this.processPayment(cart); timer(); // 停止计时并记录 } }与日志集成Pino日志集成通过OpenTelemetry instrumentation自动将traceId和spanId注入日志import { PinoInstrumentation } from opentelemetry/instrumentation-pino; const otelSDK new NodeSDK({ instrumentations: [new PinoInstrumentation()] });完整示例项目查看完整的示例项目包含NestJS应用与Prometheus、Grafana、Loki和Tempo的集成nestjs-otel-prom-grafana-tempo总结NestJS OpenTelemetry模块为Nest应用提供了强大的可观测性能力通过简单的配置和装饰器即可实现分布式追踪和指标监控。无论是小型项目还是大型微服务架构nestjs-otel都能帮助你构建更可靠、更易于维护的应用系统。开始使用NestJS OpenTelemetry提升你的应用可观测性快速定位问题优化性能【免费下载链接】nestjs-otelOpenTelemetry (Tracing Metrics) module for Nest framework (node.js) 项目地址: https://gitcode.com/gh_mirrors/ne/nestjs-otel创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2026/7/15 18:37:26

FastAPI集成Redis高可用实践:缓存、锁与异步连接

1. 项目概述:为什么 FastAPI 需要 Redis,而不是“加个缓存”这么简单 你写完一个 FastAPI 接口,本地跑得飞快,QPS 轻松破千——结果一上生产,用户量刚过 200 并发,数据库连接池就告急,响应延迟从…

2026/7/15 18:37:26

游戏技巧性能验证:从数据测试到实战应用的方法论

1. 先搞清楚这个标题到底在说什么如果你看到“【机翻中字】【IB】不怎么用的特格特格竟有意外性能!? 时隔解禁日再探飞翼高达!!【EXVSIB】【无限加速】【飞翼高达】”这样的标题,第一反应可能是“这到底是个游戏攻略还是什么技术内容”。其实这是典型的游戏实况视频…

2026/7/15 21:53:10

实验设计:从数据到结论的工程化实践

1. 数据集:实验的基石与起点做实验就像盖房子,数据集就是地基。地基不牢,房子再漂亮也是空中楼阁。我见过太多同行在数据集选择上栽跟头,最后实验做得再精致,结论也站不住脚。选数据集不是简单的"越多越好"&…

2026/7/15 21:53:10

PHP内置开发服务器源码泄露漏洞深度剖析:从成因到实战利用

1. PHP内置开发服务器源码泄露漏洞概述第一次听说这个漏洞是在某个技术论坛上,当时就觉得这个漏洞的利用方式非常巧妙。PHP内置开发服务器(通过php -S命令启动)在特定版本中存在一个严重的安全问题,允许攻击者直接读取服务器上的P…

2026/7/15 21:53:10

让角色“活“起来的大脑:深入理解 Animator 状态机

引子:一具"僵硬"的木偶 想象一下,你刚刚做好了一个游戏角色。 他有精致的模型(Mesh)、逼真的皮肤贴图(Texture)、在灯光下泛着恰到好处的光泽。从外表看,他堪称完美——一个英姿飒爽的…

2026/7/15 21:53:10

嵌入式触觉反馈设计:DRV2604 I2C驱动、自动校准与波形编程实战

1. 项目概述与核心价值在当今的消费电子和工业设备中,触觉反馈(Haptic Feedback)早已超越了简单的“嗡嗡”振动,演变为一种精细、可编程的交互语言。无论是智能手机上模拟实体按键的清脆点击,还是游戏手柄中传递的爆炸…

2026/7/15 21:53:10

前端资源完整性校验:Subresource Integrity 防篡改实战

前端资源完整性校验:Subresource Integrity 防篡改实战 一、CDN 上的 JS 文件被中间人篡改,用户浑然不知执行了恶意代码 CDN 劫持不是科幻场景。中间网络设备(路由器、ISP 缓存)在特定条件下可能篡改或替换静态资源。如果在页面中…

2026/7/15 17:04:06

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/14 19:23:19

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/14 18:30:06

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/15 0:08:29

【LINUX】驱动

【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】

2026/7/15 0:08:29

【1982-2026】全国高精度建筑轮廓|村级精度|SHP矢量

🔍 数据简介 本次分享1982-2026年全国村级精度建筑轮廓矢量数据,覆盖全国各省市区县,到村级别精细,为2026年最新实时采集成果,非网传仅60/77个城市的老旧数据。 数据含带高度/不带高度双版本,单体建筑边界精…

2026/7/15 0:08:29

【1975-2026】全国水系水路数据|河流/水库/运河|SHP矢量

🔍 数据简介 本次分享1975-2026年全国高精度水系水路矢量数据,覆盖全国全域,包含河流、水系、水库、运河、湿地、冰川、沟渠等全类别水文要素。 数据集包含双层矢量图层,字段分类清晰、要素齐全,支持2013-2026逐年完整…

2026/7/15 13:36:32

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…