使用 Kubernetes 注解指定资源属性

所有带有 resource.opentelemetry.io/ 前缀的注解都应转换为相应的资源属性。

例如,注解 resource.opentelemetry.io/service.name 应转换为 service.name 属性。

服务属性

以下 服务资源属性 推荐用于 Kubernetes 服务。

计算服务属性有多种方法。

  1. 众所周知的标签
  2. Pod 模板上的注解,具有本页面所述的 resource.opentelemetry.io/ 前缀。
  3. 上面定义的 Kubernetes 资源属性的一个函数

此转换通常可以通过 OpenTelemetry Collector 组件来完成,例如 Kubernetes Attribute Processor

提供此功能的工具应提供一个选择加入标志,用于使用众所周知的标签,因为用户可能不知道他们的标签被用于此目的。

每个属性都有一个优先级顺序,描述如下。

如何计算 service.namespace

选择找到的第一个值

  1. pod.annotation[resource.opentelemetry.io/service.namespace]
  2. k8s.namespace.name

如何计算 service.name

选择找到的第一个值

  • pod.annotation[resource.opentelemetry.io/service.name]
  • pod.label[app.kubernetes.io/instance] (众所周知的标签 app.kubernetes.io/instance)
  • pod.label[app.kubernetes.io/name] (众所周知的标签 app.kubernetes.io/name)
  • k8s.deployment.name
  • k8s.replicaset.name
  • k8s.statefulset.name
  • k8s.daemonset.name
  • k8s.cronjob.name
  • k8s.job.name
  • k8s.pod.name
  • k8s.container.name

其原理是沿 Kubernetes 资源层级结构从祖先追溯到后代,例如从 deploymentpod - 请参阅 Kubernetes 对象层级结构

如何计算 service.version

选择找到的第一个值

  • pod.annotation[resource.opentelemetry.io/service.version]
  • pod.label[app.kubernetes.io/version] (众所周知的标签 app.kubernetes.io/version)
  • 使用下面描述的算法计算版本
  1. 使用 reference 库 中描述的算法计算标签和摘要
  2. 选择找到的第一个值
    • <tag>@<digest>
    • <digest>
    • <tag>

如何计算 service.instance.id

选择找到的第一个值

  • pod.annotation[resource.opentelemetry.io/service.instance.id]
  • concat([k8s.namespace.name, k8s.pod.name, k8s.container.name], '.')

请注意,容器重启计数不包含在 service.instance.id 的计算中,因为当 ID 在每次重启时都发生变化(例如在崩溃循环中)时,这会使故障排除更加困难。