如何使用OpenTelemetry发送一次性指标值?
解决方案
你可以通过两种方式实现仅上报一次启动时的未完成操作数:
方式一:取消Observable回调订阅
创建Observable Gauge后,在回调执行完成时调用订阅对象的unsubscribe()方法,彻底终止后续的回调触发,这样指标只会被收集一次:
import { metrics } from '@opentelemetry/api'; const meter = metrics.getMeter('your-service-meter'); // 启动时从DB获取未完成操作数 const startupUnfinishedOps = await fetchUnfinishedOperationsFromDB(); // 创建Observable Gauge并添加回调 const subscription = meter.createObservableGauge('foo.ops_at_startup', { description: '未完成操作数(服务器启动时快照)' }).addCallback((result) => { result.observe(startupUnfinishedOps); // 上报后立即取消订阅,后续不再触发 subscription.unsubscribe(); });
方式二:使用标志位控制仅上报一次
如果不想取消订阅,可以设置一个布尔标志,仅在第一次回调时上报指标,后续回调直接跳过:
import { metrics } from '@opentelemetry/api'; const meter = metrics.getMeter('your-service-meter'); let hasReportedStartupOps = false; const startupUnfinishedOps = await fetchUnfinishedOperationsFromDB(); meter.createObservableGauge('foo.ops_at_startup', { description: '未完成操作数(服务器启动时快照)' }).addCallback((result) => { if (!hasReportedStartupOps) { result.observe(startupUnfinishedOps); hasReportedStartupOps = true; } });
两种方式的区别:
- 方式一彻底移除了回调,后续指标收集周期不会再执行该回调,性能更优;
- 方式二的回调仍会被触发,但仅第一次有实际上报动作,适合需要保留回调但无需重复上报的场景。
内容的提问来源于stack exchange,提问作者beta
相关产品推荐
相关产品推荐

