如何从OpenTelemetry生成的Trace中排除K8s资源属性?
解决OpenTelemetry自动注入Java应用后无法移除K8s资源属性的问题
核心原因
你尝试的K8sResourceProvider类名不存在于核心OpenTelemetry Java Agent中,且大部分场景下这些k8s.*资源属性并非由Java Agent生成,而是来自OpenTelemetry Operator自动注入的环境变量,或是contrib扩展组件提供的资源提供者。
具体解决方法
方法1:覆盖Operator注入的默认资源属性
OpenTelemetry Operator在自动注入时,通常会给Pod添加OTEL_RESOURCE_ATTRIBUTES环境变量,直接包含这些K8s相关属性。你可以在Instrumentation CR中显式清空或覆盖该变量:
apiVersion: opentelemetry.io/v1alpha1 kind: Instrumentation metadata: name: my-instrumentation spec: java: env: # 清空默认注入的K8s资源属性,或只保留你需要的属性 - name: OTEL_RESOURCE_ATTRIBUTES value: "" # 保留你已配置的其他禁用项 - name: OTEL_JAVA_DISABLED_RESOURCE_PROVIDERS value: io.opentelemetry.instrumentation.resources.OsResourceProvider,io.opentelemetry.instrumentation.resources.HostResourceProvider,io.opentelemetry.instrumentation.resources.ContainerResourceProvider
方法2:禁用contrib扩展的K8s资源提供者
如果你使用的Java Agent包含了opentelemetry-contrib的K8s扩展组件,对应的资源提供者类名是io.opentelemetry.contrib.kubernetes.resource.KubernetesResourceProvider,将其加入禁用列表即可:
- name: OTEL_JAVA_DISABLED_RESOURCE_PROVIDERS value: io.opentelemetry.instrumentation.resources.OsResourceProvider,io.opentelemetry.instrumentation.resources.HostResourceProvider,io.opentelemetry.instrumentation.resources.ContainerResourceProvider,io.opentelemetry.contrib.kubernetes.resource.KubernetesResourceProvider
方法3:在Grafana Agent/Tempo端过滤属性
如果前两种方法无效,可以在数据转发链路中直接过滤这些属性。以Grafana Agent为例,添加attributes处理器删除指定资源属性:
processors: attributes/remove_k8s_attrs: actions: - key: k8s.container.name action: delete - key: k8s.deployment.name action: delete - key: k8s.namespace.name action: delete - key: k8s.node.name action: delete - key: k8s.pod.name action: delete - key: k8s.replicaset.name action: delete service: pipelines: traces: receivers: [otlp] processors: [attributes/remove_k8s_attrs, batch] exporters: [tempo]
内容的提问来源于stack exchange,提问作者jacopo barcellesi
相关产品推荐
相关产品推荐

