You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OpenTelemetry JS SDK中动态调整采样率或更新采样器?

OpenTelemetry JS SDK 运行时调整采样率方案

原生组件限制

  • TraceIdRatioBasedSampler:初始化时传入采样率,实例创建后无公开方法修改该值,原生不支持运行时动态调整。
  • NodeTracerProvider/BasicTracerProvider:没有提供修改已配置采样器的公开API,采样器在初始化或start()阶段确定后无法直接替换。

可行解决方案:封装动态采样器

自己实现一个支持动态调整采样率的采样器,兼容OpenTelemetry的Sampler接口,内部维护可更新的采样率值,每次采样时使用最新值判断。

示例代码:

import { TraceIdRatioBasedSampler } from '@opentelemetry/sdk-trace-base';

class DynamicTraceIdRatioSampler {
  constructor(initialRatio) {
    this._ratio = initialRatio;
    this._updateSampler();
  }

  // 动态设置新采样率(限制在0-1范围内)
  setRatio(newRatio) {
    if (newRatio >= 0 && newRatio <= 1) {
      this._ratio = newRatio;
      this._updateSampler();
    }
  }

  _updateSampler() {
    this._sampler = new TraceIdRatioBasedSampler(this._ratio);
  }

  // 实现Sampler核心采样逻辑
  shouldSample(context, traceId, spanName, spanKind, attributes, links) {
    return this._sampler.shouldSample(context, traceId, spanName, spanKind, attributes, links);
  }

  toString() {
    return `DynamicTraceIdRatioSampler{ratio=${this._ratio}}`;
  }
}

使用方式

  1. 初始化TracerProvider时传入该动态采样器:
import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';

const dynamicSampler = new DynamicTraceIdRatioSampler(0.1); // 初始采样率10%
const provider = new NodeTracerProvider({ sampler: dynamicSampler });
provider.start();
  1. 运行时随时调整采样率:
// 调整为50%采样率
dynamicSampler.setRatio(0.5);

不推荐的方案

重新创建TracerProvider并替换原有实例会导致已有的追踪上下文中断,可能丢失正在处理的Span,因此不建议采用这种方式。

内容的提问来源于stack exchange,提问作者davids

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 21:43:14