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

如何在Python应用端阻止Otel追踪自身指标导出活动?

问题描述

我已经为Python应用实现了OpenTelemetry,将遥测数据发送至GCP后端。现在发现生成了针对https://otel-collector-xxx.asia-southeast1.run.app/opentelemetry.proto.collector.metrics.v1.MetricsService/Export的追踪跨度,推测这是指标导出活动产生的追踪。

我希望在应用源端停止收集这类追踪,而不是在Collector层面做过滤,求解决办法。

应用端埋点代码:

resource = Resource.create(attributes={
    SERVICE_NAME: "your-service-name"})

tracerProvider = TracerProvider(resource=resource)
processor = BatchSpanProcessor(OTLPSpanExporter(endpoint="<traces-endpoint>/v1/traces"))
tracerProvider.add_span_processor(processor)
trace.set_tracer_provider(tracerProvider)

reader = PeriodicExportingMetricReader(
    OTLPMetricExporter(endpoint="<traces-endpoint>/v1/metrics"))
meterProvider = MeterProvider(resource=resource, metric_readers=[reader])
metrics.set_meter_provider(meterProvider)

已添加的Otel配置:

telemetry:
    metrics:
      # disable self metrics
      level: none
      address: localhost:8888
解决方法

这些追踪是OpenTelemetry的OTLP导出器自身生成的请求追踪,要在源端禁用,可通过以下方式处理:

方式1:禁用导出器内部追踪(推荐)

初始化OTLPMetricExporter和OTLPSpanExporter时,显式传入tracer_provider=None,关闭导出器的内部追踪功能。修改后的代码如下:

resource = Resource.create(attributes={
    SERVICE_NAME: "your-service-name"})

# 配置追踪导出器,禁用内部追踪
tracerProvider = TracerProvider(resource=resource)
processor = BatchSpanProcessor(OTLPSpanExporter(
    endpoint="<traces-endpoint>/v1/traces",
    tracer_provider=None
))
tracerProvider.add_span_processor(processor)
trace.set_tracer_provider(tracerProvider)

# 配置指标导出器,禁用内部追踪
reader = PeriodicExportingMetricReader(
    OTLPMetricExporter(
        endpoint="<traces-endpoint>/v1/metrics",
        tracer_provider=None
    )
)
meterProvider = MeterProvider(resource=resource, metric_readers=[reader])
metrics.set_meter_provider(meterProvider)

方式2:自定义跨度过滤处理器

如果方式1不生效,可添加自定义SpanProcessor过滤掉目标URL的跨度:

from opentelemetry.trace import SpanProcessor, StatusCode

class ExportSpanFilter(SpanProcessor):
    def on_start(self, span, parent_context):
        # 匹配指标导出的目标URL,直接结束该跨度
        target_url = "https://otel-collector-xxx.asia-southeast1.run.app/opentelemetry.proto.collector.metrics.v1.MetricsService/Export"
        if span.attributes.get("http.url") == target_url:
            span.set_status(StatusCode.ERROR)
            span.end()
        return super().on_start(span, parent_context)
    
    def on_end(self, span):
        pass
    
    def shutdown(self):
        pass
    
    def force_flush(self, timeout_millis=None):
        return True

# 将过滤处理器添加到TracerProvider
tracerProvider.add_span_processor(ExportSpanFilter())

关键说明

  • 你当前配置的telemetry.metrics.level: none仅禁用了Collector的自监控指标,对应用端导出器生成的追踪无影响,因此需要修改应用代码层面的配置。
  • 优先选择方式1,这是官方支持的禁用导出器内部追踪的方案,更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:06:19