如何在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
相关产品推荐
相关产品推荐

