首页
/ Backstage项目中OpenTelemetry指标丢失问题的分析与解决

Backstage项目中OpenTelemetry指标丢失问题的分析与解决

2025-05-05 21:20:52作者:郜逊炳

问题背景

在Backstage项目中使用OpenTelemetry进行应用监控时,开发人员遇到了一个棘手的问题:虽然OpenTelemetry的指标端口(默认9464)能够正常访问,但只能看到基础的初始化指标,而来自各个插件的自定义指标却全部丢失。这个问题在Backstage 1.36.1版本后开始出现,影响了开发环境下的监控功能。

问题现象

当开发人员通过yarn dev命令启动Backstage实例后,访问http://localhost:9464/metrics端点时,只能看到如下基本指标信息:

# HELP target_info Target metadata
# TYPE target_info gauge
target_info{...} 1
# no registered metrics

而正常情况下,这里应该包含丰富的插件指标数据。通过深入分析,发现instrumentation.js文件中的初始化代码被执行了两次,导致OpenTelemetry的全局状态被重置。

根本原因

经过技术团队深入调查,发现问题源于Node.js模块加载机制与Backstage CLI工具的交互方式:

  1. Backstage CLI在启动时会通过--require参数加载instrumentation.js文件
  2. 同时,CLI内部会创建一个独立的上下文环境来执行模块转换
  3. 根据Node.js文档,--require加载的模块会被同时加载到主线程和任何工作线程中
  4. 这种双重加载导致OpenTelemetry SDK被初始化两次
  5. 最终结果是插件指标被注册到了错误的指标注册表中,而不是导出器关联的那个

解决方案

针对这个问题,Backstage技术团队提出了一个简单而有效的解决方案:在instrumentation.js文件顶部添加主线程检查逻辑。具体实现如下:

const { isMainThread } = require('node:worker_threads');

if (isMainThread) {
  const { NodeSDK } = require('@opentelemetry/sdk-node');
  const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
  const { PrometheusExporter } = require('@opentelemetry/exporter-prometheus');

  const prometheus = new PrometheusExporter();
  const sdk = new NodeSDK({
    metricReader: prometheus,
    instrumentations: [getNodeAutoInstrumentations()],
  });

  sdk.start();
}

这个解决方案通过worker_threads模块检查当前执行环境是否为主线程,确保OpenTelemetry SDK只会在主线程中被初始化一次。这样既保留了原有的功能,又避免了重复初始化导致的问题。

技术要点

  1. Node.js模块加载机制:理解Node.js如何处理--require参数和模块加载对于解决这类问题至关重要。模块会被加载到所有线程环境中,而不仅仅是主线程。

  2. OpenTelemetry全局状态:OpenTelemetry SDK维护全局状态,重复初始化会导致指标注册混乱。这种设计在大多数情况下是合理的,但在特定场景下需要特别注意。

  3. Worker Threads检测:使用worker_threads模块检测执行环境是一个可靠的解决方案,它直接利用了Node.js提供的原生能力。

最佳实践

对于在Backstage项目中集成OpenTelemetry的开发人员,建议:

  1. 始终在监控初始化代码中添加主线程检查
  2. 考虑将监控配置封装为独立模块,便于维护
  3. 在升级Backstage版本时,注意检查监控功能是否正常
  4. 开发环境和生产环境都应当验证指标收集功能

总结

Backstage项目中OpenTelemetry指标丢失问题展示了现代JavaScript应用中模块加载和全局状态管理的复杂性。通过深入理解底层机制,技术团队找到了既简单又可靠的解决方案。这个案例也提醒开发人员,在构建复杂应用时,需要考虑各种边界条件和执行环境差异。

对于希望在自己的Backstage项目中实现可靠监控的开发人员,遵循本文提供的解决方案和最佳实践,可以确保OpenTelemetry指标收集功能正常工作,为应用的可观测性提供坚实基础。

登录后查看全文
热门项目推荐
相关项目推荐

热门内容推荐

最新内容推荐

项目优选

收起
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
854
505
kernelkernel
deepin linux kernel
C
21
5
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
246
288
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
UAVSUAVS
智能无人机路径规划仿真系统是一个具有操作控制精细、平台整合性强、全方向模型建立与应用自动化特点的软件。它以A、B两国在C区开展无人机战争为背景,该系统的核心功能是通过仿真平台规划无人机航线,并进行验证输出,数据可导入真实无人机,使其按照规定路线精准抵达战场任一位置,支持多人多设备编队联合行动。
JavaScript
78
55
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
7
0
vue-devuivue-devui
基于全新 DevUI Design 设计体系的 Vue3 组件库,面向研发工具的开源前端解决方案。
TypeScript
615
74
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
176
260
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
331
1.08 K