如何在Python OpenTelemetry中为Jaeger Span的Process添加自定义标签
解决方案
OpenTelemetry中进程级别的标签全部通过Resource对象配置即可,Jaeger Exporter会自动将所有Resource属性转换为你期望的process.tags结构,不需要额外做特殊处理。
你代码中trace.set_attribute("hostname","018.zeus.run")的写法是给当前活跃Span加属性,只会出现在单个Span的标签中,不会作用到进程层级。
你之前配置不生效的核心原因大概率是2点:
- 没有将创建的
TracerProvider设置为全局生效的实例 - 没有给
TracerProvider绑定Jaeger Exporter对应的Span处理器,导致配置的Resource没有被导出器识别
修正后的完整初始化代码如下:
from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor from opentelemetry.sdk.resources import Resource from opentelemetry.exporter.jaeger.thrift import JaegerExporter from opentelemetry.semconv.resource import ResourceAttributes # 所有在Resource中定义的属性都会自动转为process.tags下的条目 resource = Resource.create({ ResourceAttributes.SERVICE_NAME: "xxxx", ResourceAttributes.SERVICE_INSTANCE_ID: "1", ResourceAttributes.HOST_NAME: "xxxx", # 自定义的进程标签直接加在这个字典里即可 "hostname": "018.zeus.run", "自定义标签key": "自定义标签值" }) # 初始化TracerProvider provider = TracerProvider(resource=resource) # 初始化Jaeger导出器 jaeger_exporter = JaegerExporter( agent_host_name='xxxxx', agent_port=6831, collector_endpoint='http://xxxxx:14268/api/traces?format=jaeger.thrift' ) # 绑定Span处理器,负责将生成的Span导出到Jaeger provider.add_span_processor( BatchSpanProcessor(jaeger_exporter) ) # 将当前TracerProvider设置为全局生效,后续所有get_tracer调用都会使用该配置 trace.set_tracer_provider(provider) # 后续正常获取tracer创建Span即可 tracer = trace.get_tracer(__name__)
按以上代码调整后,你导出的Trace结构就会自动生成你需要的process.tags结构,所有Resource中定义的属性都会自动对应到tags数组中的条目,vType会根据属性值的类型自动识别。
内容的提问来源于stack exchange,提问作者Kishan
相关产品推荐
相关产品推荐

