发布时间:2026/9/6 17:15:55
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/9/6 14:52:38

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

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

2026/9/6 16:42:42

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

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

2026/9/6 17:13:03

大功率激光二极管脉冲电源设计:从原理到调试的完整指南

简介:这是一份大功率激光二极管脉冲电源设计的完整Word设计文档,面向电力电子、激光应用及相关专业的工程师、科研人员与高年级学生。文档系统化梳理LD驱动电源的工作原理,明确其对激光二极管驱动、控制和保护的核心作用;同时依据…

2026/9/6 17:13:03

YOLO11cls血细胞分类实战:从数据整理到双阈值校验

简介:面向癌症检测与血细胞分类场景的医疗图像数据集资源,已按文件夹整理好 basophil、erythroblast、monocyte、myeloblast、seg_neutrophil 五个类别的真实血细胞图片,标注质量较高,可直接用于 YOLO11cls 等目标分类算法的训练与…

2026/9/6 17:13:03

基于STM32的农作物生长管理系统实战:从硬件选型到调试排障

简介:一份基于STM32微控制器的智能农作物生长管理系统项目设计文档,面向物联网农业应用场景,适合嵌入式开发、物联网实训及农业信息化方向读者。资源包为单个PDF文档,容量约52MB,全文按实际工程项目流程编排&#xff0…

2026/9/6 17:13:03

Flipper Zero Unleashed 固件第三方应用 FAP 安装完整避坑指南

Flipper Zero Unleashed 固件第三方应用 FAP 安装完整避坑指南 【免费下载链接】unleashed-firmware Flipper Zero Unleashed Firmware 项目地址: https://gitcode.com/GitHub_Trending/un/unleashed-firmware 想给 Flipper Zero 加个内置菜单里没有的功能,却…

2026/9/6 0:06:59

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

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

2026/9/6 0:06:59

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

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

2026/9/6 0:06:59

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

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

2026/9/6 0:06:59

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

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

2026/9/6 0:06:59

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

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

2026/9/6 0:06:59

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

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

2026/9/6 11:40:10

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

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

2026/9/5 2:30:42

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

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

2026/9/6 10:19:40

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

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