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

