NestJS-otel指标监控实战:7步掌握自定义Metric与Prometheus集成
NestJS-otel指标监控实战7步掌握自定义Metric与Prometheus集成【免费下载链接】nestjs-otelOpenTelemetry (Tracing Metrics) module for Nest framework (node.js) 项目地址: https://gitcode.com/gh_mirrors/ne/nestjs-otel在微服务架构中监控系统的健康状态至关重要。nestjs-otel作为NestJS的OpenTelemetry模块为开发者提供了强大的指标监控能力让您能够轻松收集应用指标并与Prometheus无缝集成。本文将带您深入了解nestjs-otel的指标监控功能掌握自定义Metric的创建与Prometheus集成的完整实战方案。 为什么选择nestjs-otel进行指标监控nestjs-otel是一个专为NestJS框架设计的OpenTelemetry模块它简化了在Node.js应用中实现可观测性的复杂度。通过nestjs-otel您可以一站式解决方案集成追踪、指标和宽事件功能标准化输出遵循OpenTelemetry标准兼容多种后端系统低侵入性通过装饰器和服务注入不影响业务逻辑Prometheus原生支持内置Prometheus导出器轻松对接监控系统 核心指标类型详解nestjs-otel支持OpenTelemetry API定义的所有核心指标类型每种类型都有特定的应用场景1. 计数器Counter计数器是只能递增的指标适用于统计请求次数、成功/失败操作数量等场景。例如您可以使用计数器来监控API调用次数// 在服务类中定义计数器 private requestCounter this.metricService.getCounter(api_requests_total, { description: Total number of API requests });2. 直方图Histogram直方图用于记录数值分布特别适合测量响应时间、请求大小等连续值。它会自动计算平均值、百分位数等统计信息// 监控响应时间分布 private responseTimeHistogram this.metricService.getHistogram(api_response_time_ms, { description: API response time distribution, unit: milliseconds });3. 仪表Gauge仪表表示可以上下浮动的当前值适用于监控内存使用量、连接数等瞬时状态// 监控活跃用户数 private activeUsersGauge this.metricService.getGauge(active_users, { description: Number of currently active users });4. 可观测计数器ObservableCounter可观测计数器允许您通过回调函数提供指标值适合监控系统级别的指标// 监控系统内存使用 this.metricService.getObservableCounter(system_memory_usage, { description: System memory usage in bytes }); 实战自定义业务指标监控让我们通过一个电商系统的实际案例看看如何实现完整的业务指标监控步骤1初始化MetricService首先在您的服务类中注入MetricServiceimport { Injectable } from nestjs/common; import { MetricService } from nestjs-otel; import { Counter, Histogram, Gauge } from opentelemetry/api; Injectable() export class OrderService { private orderCounter: Counter; private orderValueHistogram: Histogram; private processingOrdersGauge: Gauge; constructor(private readonly metricService: MetricService) { // 初始化订单计数器 this.orderCounter this.metricService.getCounter(orders_total, { description: Total number of orders processed }); // 初始化订单金额直方图 this.orderValueHistogram this.metricService.getHistogram(order_value_usd, { description: Distribution of order values in USD, unit: usd }); // 初始化处理中订单仪表 this.processingOrdersGauge this.metricService.getGauge(orders_processing, { description: Number of orders currently being processed }); } }步骤2在业务逻辑中记录指标在业务方法中根据操作结果记录相应的指标async processOrder(orderData: OrderData): PromiseOrder { // 开始处理时增加处理中订单数 this.processingOrdersGauge.add(1); try { // 记录订单金额分布 this.orderValueHistogram.record(orderData.amount); // 处理订单业务逻辑 const order await this.createOrder(orderData); // 订单处理成功增加总订单数 this.orderCounter.add(1); return order; } catch (error) { // 记录失败订单指标 this.metricService.getCounter(orders_failed_total).add(1); throw error; } finally { // 订单处理完成减少处理中订单数 this.processingOrdersGauge.add(-1); } }步骤3使用装饰器简化指标记录nestjs-otel提供了便捷的装饰器来进一步简化指标记录import { Controller, Get } from nestjs/common; import { OtelCounter, OtelHistogram } from nestjs-otel; import { Counter, Histogram } from opentelemetry/api; Controller(products) export class ProductsController { Get() OtelCounter(products_viewed_total, { description: Total product page views }) getProducts( OtelHistogram(products_load_time_ms) loadTimeHistogram: Histogram ) { const startTime Date.now(); // 业务逻辑... // 记录页面加载时间 const loadTime Date.now() - startTime; loadTimeHistogram.record(loadTime); return products; } } 与Prometheus集成配置Prometheus导出器设置要在nestjs-otel中启用Prometheus指标导出需要在OpenTelemetry SDK配置中添加PrometheusExporter// tracing.ts - OpenTelemetry SDK配置 import { PrometheusExporter } from opentelemetry/exporter-prometheus; import { NodeSDK } from opentelemetry/sdk-node; const otelSDK new NodeSDK({ metricReader: new PrometheusExporter({ port: 8081, // Prometheus指标暴露端口 }), // 其他配置... }); export default otelSDK;应用启动配置确保在NestJS应用启动前初始化OpenTelemetry SDK// main.ts import otelSDK from ./tracing; async function bootstrap() { // 必须先启动OpenTelemetry SDK await otelSDK.start(); const app await NestFactory.create(AppModule); await app.listen(3000); }Prometheus抓取配置在Prometheus的配置文件中添加抓取目标# prometheus.yml scrape_configs: - job_name: nestjs-app static_configs: - targets: [localhost:8081] scrape_interval: 15s 高级监控场景实践场景1监控API性能指标Injectable() export class ApiMetricsService { private requestDuration: Histogram; private requestSize: Histogram; private errorCounter: Counter; constructor(private metricService: MetricService) { this.requestDuration metricService.getHistogram(http_request_duration_seconds, { description: HTTP request duration in seconds, buckets: [0.1, 0.5, 1, 2, 5] // 自定义分桶 }); this.requestSize metricService.getHistogram(http_request_size_bytes, { description: HTTP request size in bytes }); this.errorCounter metricService.getCounter(http_errors_total, { description: Total HTTP errors by status code }); } recordRequest(duration: number, size: number, statusCode: number) { this.requestDuration.record(duration); this.requestSize.record(size); if (statusCode 400) { this.errorCounter.add(1, { status_code: statusCode.toString() }); } } }场景2数据库连接池监控Injectable() export class DatabaseMetricsService { private connectionPoolSize: Gauge; private activeConnections: Gauge; private queryDuration: Histogram; constructor(private metricService: MetricService) { this.connectionPoolSize metricService.getGauge(db_connection_pool_size); this.activeConnections metricService.getGauge(db_active_connections); this.queryDuration metricService.getHistogram(db_query_duration_ms); } async monitorQueryT(queryFn: () PromiseT): PromiseT { this.activeConnections.add(1); const startTime Date.now(); try { const result await queryFn(); const duration Date.now() - startTime; this.queryDuration.record(duration); return result; } finally { this.activeConnections.add(-1); } } }场景3自定义业务健康检查指标Injectable() export class HealthMetricsService { private serviceHealth: Gauge; private dependencyHealth: Gauge; constructor(private metricService: MetricService) { this.serviceHealth metricService.getGauge(service_health_score, { description: Overall service health score (0-100) }); this.dependencyHealth metricService.getGauge(dependency_health, { description: Dependency health status, unit: 1 // 1健康, 0不健康 }); } Cron(*/30 * * * * *) // 每30秒执行一次 async updateHealthMetrics() { // 检查数据库连接 const dbHealth await this.checkDatabase(); this.dependencyHealth.set(dbHealth ? 1 : 0, { dependency: database }); // 检查外部API const apiHealth await this.checkExternalApi(); this.dependencyHealth.set(apiHealth ? 1 : 0, { dependency: external_api }); // 计算总体健康分数 const overallHealth this.calculateOverallHealth(dbHealth, apiHealth); this.serviceHealth.set(overallHealth); } } 可视化与告警配置Grafana仪表板配置将Prometheus作为数据源添加到Grafana后可以创建丰富的监控仪表板API性能仪表板展示请求率、错误率、响应时间百分位数业务指标仪表板显示订单量、用户活跃度、转化率等业务指标系统资源仪表板监控CPU、内存、磁盘使用情况Prometheus告警规则在Prometheus中配置告警规则及时发现系统异常# alert.rules.yml groups: - name: nestjs_alerts rules: - alert: HighErrorRate expr: rate(http_errors_total[5m]) 0.05 for: 2m labels: severity: warning annotations: summary: High error rate detected description: Error rate is {{ $value }} per second - alert: SlowResponseTime expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) 2 for: 5m labels: severity: critical annotations: summary: Slow response time detected description: 95th percentile response time is {{ $value }} seconds 调试与问题排查常见问题及解决方案指标未显示在Prometheus中检查PrometheusExporter端口是否正确暴露验证Prometheus配置中的目标地址确认OpenTelemetry SDK已正确启动指标值异常检查指标名称是否重复定义验证指标类型是否与使用方式匹配确认指标标签的正确性性能影响使用异步方式记录指标避免阻塞主线程合理设置指标采样率定期清理不再使用的指标调试技巧// 启用调试日志 import { diag, DiagConsoleLogger, DiagLogLevel } from opentelemetry/api; diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG); 最佳实践总结命名规范使用_total后缀表示计数器使用描述性名称标签使用合理使用标签进行维度划分但避免标签基数爆炸指标设计优先使用直方图记录延迟计数器记录事件资源管理及时清理不再使用的指标实例测试验证为关键业务指标编写测试用例 下一步行动建议逐步实施从核心业务指标开始逐步扩展到全系统监控团队培训确保团队成员理解指标的含义和使用方式监控告警建立完整的监控-告警-响应闭环持续优化定期审查指标设计优化监控体系通过nestjs-otel的指标监控功能您可以为NestJS应用构建一个强大、灵活且标准化的监控系统。无论是业务指标还是系统指标都能通过统一的接口进行收集和导出大大简化了微服务架构下的监控复杂度。记住好的监控系统不仅能够帮助您发现问题更能帮助您预防问题。从今天开始为您的NestJS应用构建专业的指标监控体系吧 ✨【免费下载链接】nestjs-otelOpenTelemetry (Tracing Metrics) module for Nest framework (node.js) 项目地址: https://gitcode.com/gh_mirrors/ne/nestjs-otel创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

如何为Researcher模板添加个人头像和机构Logo:完整配置教程

如何为Researcher模板添加个人头像和机构Logo:完整配置教程

如何为Researcher模板添加个人头像和机构Logo:完整配置教程 【免费下载链接】researcher A jekyll based resume template 项目地址: https://gitcode.com/gh_mirrors/re/researcher Researcher是一款基于Jekyll的简历模板,通过简单配置即可快速搭…

2026/7/15 17:54:49阅读更多 →
AI泡澡球技术解析:智能温控与个性化香氛的硬件实现

AI泡澡球技术解析:智能温控与个性化香氛的硬件实现

最近在各大社交平台上,一款号称"AI泡澡球"的产品突然火了起来。从朋友圈到小红书,从抖音到微博,到处都是这款产品的开箱视频和使用体验分享。作为一个长期关注AI技术落地的开发者,我的第一反应是:这到底是真…

2026/7/15 17:54:49阅读更多 →
小程序毕设项目:基于 SpringBoot + 微信小程序的党员履职记录管理系统 基于 SpringBoot + 微信小程序的党支部活动管理系统的设计与实现 (源码+文档,讲解、调试运行,定制等)

小程序毕设项目:基于 SpringBoot + 微信小程序的党员履职记录管理系统 基于 SpringBoot + 微信小程序的党支部活动管理系统的设计与实现 (源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/15 17:54:49阅读更多 →
CANN/Ascend C浮点数舍入函数

CANN/Ascend C浮点数舍入函数

asc_trunc / asc_rint / asc_round / asc_floor / asc_ceil 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算…

2026/7/15 18:50:04阅读更多 →
Python与C++零拷贝交互实战:基于pybind11的高性能数据传递

Python与C++零拷贝交互实战:基于pybind11的高性能数据传递

1. 项目概述:为什么我们需要零拷贝? 在数据密集型应用和算法开发中,Python因其简洁易用而广受欢迎,而C则以其无与伦比的运行时性能成为计算核心的首选。一个常见的架构模式是:用Python做上层胶水,负责流程控…

2026/7/15 18:50:04阅读更多 →
Laravel Developer Roadmap:部署与性能优化完整解决方案

Laravel Developer Roadmap:部署与性能优化完整解决方案

Laravel Developer Roadmap:部署与性能优化完整解决方案 【免费下载链接】laravel-developer-roadmap Roadmap to becoming a Laravel developer 项目地址: https://gitcode.com/gh_mirrors/la/laravel-developer-roadmap 想要成为一名专业的 Laravel 开发者…

2026/7/15 18:50:04阅读更多 →
feedgnuplot与gnuplot深度集成:自定义样式、方程和图像叠加技巧

feedgnuplot与gnuplot深度集成:自定义样式、方程和图像叠加技巧

feedgnuplot与gnuplot深度集成:自定义样式、方程和图像叠加技巧 【免费下载链接】feedgnuplot Tool to plot realtime and stored data from the commandline, using gnuplot. 项目地址: https://gitcode.com/gh_mirrors/fe/feedgnuplot feedgnuplot是一款强…

2026/7/15 18:50:04阅读更多 →
沙美特罗替卡松吸入粉雾剂2026FDA获批:哮喘患者迎来高性价比替代选择

沙美特罗替卡松吸入粉雾剂2026FDA获批:哮喘患者迎来高性价比替代选择

2026年1月,润生药业自主申报的沙美特罗替卡松吸入粉雾剂正式获得美国FDA仿制药上市批准,这是国内药企在吸入制剂这一高壁垒仿制药领域取得的又一标志性突破。作为哮喘和慢性阻塞性肺疾病长期控制的核心用药,原研沙美特罗替卡松此前长期占据美…

2026/7/15 18:50:04阅读更多 →
Android 输入事件调试与模拟:从 getevent 到 input 命令的实战解析

Android 输入事件调试与模拟:从 getevent 到 input 命令的实战解析

1. Android输入事件调试基础在Android开发中,调试输入事件是每个开发者都会遇到的场景。无论是处理物理按键、触摸屏事件,还是实现自动化测试,掌握输入事件的调试方法都至关重要。Android系统提供了多种工具来帮助我们完成这些任务&#xff0…

2026/7/15 18:45:04阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/15 6:42:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/15 6:12:45阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/15 10:54:00阅读更多 →
AI框架决定企业AI能走多远

AI框架决定企业AI能走多远

企业AI建设的第一性原理 企业搞AI,最关键的决定是什么?不是选哪家大模型,不是先做哪个场景,不是招多少AI人才——而是选哪个AI开发框架。 为什么?因为框架决定了企业AI能力的"天花板"。选对了框架&#xff0…

2026/7/15 0:01:30阅读更多 →
Java企业为什么需要AI框架

Java企业为什么需要AI框架

Java企业在AI时代的尴尬处境 Java是全球企业级应用开发的主流语言——全球超过一半的企业系统跑在Java上。但在AI浪潮面前,很多Java企业感到尴尬:大模型的接口是各种语言的,AI开发社区以其他语言为主流,似乎Java在AI时代"掉队…

2026/7/15 0:01:30阅读更多 →
CC3230x嵌入式开发实战:SD主机、定时器与低功耗模式深度解析

CC3230x嵌入式开发实战:SD主机、定时器与低功耗模式深度解析

1. 项目概述:为什么需要关注CC3230x的SD主机、定时器与低功耗?在物联网和嵌入式设备开发领域,我们常常面临一个核心矛盾:设备需要具备强大的连接能力、可靠的数据存储和实时控制功能,同时又必须严格控制功耗以延长电池…

2026/7/15 0:01:30阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/15 15:50:47阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/15 8:52:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/15 14:06:23阅读更多 →