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

如何在OpenTelemetry初始化完成后禁用追踪功能?

在Express中根据请求动态终止OpenTelemetry追踪并不发送数据

针对你的场景,核心是在路由处理时动态决定是否丢弃已启动的追踪,这里提供两种互补的实现方式,确保彻底停止追踪且不发送任何数据:

1. 路由内直接终止并标记Span

在接收到PHP传递的追踪状态后,直接操作当前请求的根Span,终止它并标记为无需导出:

首先导入OpenTelemetry API:

const { trace, context } = require('@opentelemetry/api');

然后在目标路由中处理:

app.post('/ssr-render', (req, res) => {
  // 从请求体获取PHP传来的追踪启用标记
  const enableTracing = req.body.enableTracing;

  if (!enableTracing) {
    // 获取当前请求的活跃根Span
    const rootSpan = trace.getSpan(context.active());
    if (rootSpan) {
      // 标记Span为取消状态,后续处理器可据此过滤
      rootSpan.updateSpanStatus({ code: trace.SpanStatusCode.CANCELLED });
      // 立即结束Span,停止后续数据收集
      rootSpan.end();
      // 清空上下文Span,确保后续逻辑不会生成新的子Span
      context.with(trace.setSpan(context.active(), null), () => {
        // 执行你的SSR渲染逻辑
        res.render('page-template', { data: req.body.data });
      });
    } else {
      // 无活跃Span时直接处理
      res.render('page-template', { data: req.body.data });
    }
  } else {
    // 需要追踪时正常执行SSR逻辑
    res.render('page-template', { data: req.body.data });
  }
});

2. 自定义Span处理器过滤待丢弃的Span

为了确保万无一失,添加一个自定义Span处理器,在数据导出前自动过滤掉标记为取消的Span:

const { SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base');
const { trace } = require('@opentelemetry/api');

class TraceFilterProcessor extends SimpleSpanProcessor {
  onEnd(span) {
    // 仅导出未被取消的Span
    if (span.status.code !== trace.SpanStatusCode.CANCELLED) {
      super.onEnd(span);
    }
  }
}

// 在初始化TracerProvider时替换默认处理器
tracerProvider.addSpanProcessor(new TraceFilterProcessor(yourExporter));

原理说明

  • 路由内的操作直接终止当前追踪的根Span,并清空上下文,阻止后续生成子Span;
  • 自定义处理器作为最后一道防线,即使有漏网的Span,也会在导出前被过滤,确保不会发送任何不需要的追踪数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:57:29