> Source: https://www.ymotongpoo.com/works/otel-specs-ja/semconv/non-normative/k8s-attributes/


# Kubernetesアノテーションによるリソース属性の指定

`resource.opentelemetry.io/`という接頭辞を持つすべてのアノテーションは、対応するリソース属性へ変換すべきです（SHOULD）。

例えば、アノテーション`resource.opentelemetry.io/service.name`は`service.name`属性へ変換すべきです（SHOULD）。

## サービス属性

Kubernetesのサービスに対しては、以下の[サービスリソース属性](https://opentelemetry.io/docs/specs/semconv/registry/attributes/service/)を推奨します。

サービス属性の計算方法には、いくつかの種類があります。

1. [Well-Known Labels](https://kubernetes.io/docs/reference/labels-annotations-taints/)
2. このページで説明している`resource.opentelemetry.io/`接頭辞を持つ、Podテンプレート上のアノテーション
3. 上記で定義したKubernetesリソース属性の関数

この変換は通常、[Kubernetes Attribute Processor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/k8sattributesprocessor)のようなOpenTelemetry Collectorコンポーネントによって行えます。

この機能を提供するツールは、well-known labelsの使用に対するオプトインフラグを用意すべきです。ユーザーが自分のラベルがこの目的で使われていることに気づいていない場合があるためです。

それぞれの属性には、以下で説明するように、どのように計算すべきかについての優先順位があります。

### `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]`（well-known labelの
  [app.kubernetes.io/instance](https://kubernetes.io/docs/reference/labels-annotations-taints/#app-kubernetes-io-instance)）
- `pod.label[app.kubernetes.io/name]`（well-known labelの
  [app.kubernetes.io/name](https://kubernetes.io/docs/reference/labels-annotations-taints/#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のリソース階層において祖先から子孫へ、例えば`deployment`から`pod`へと辿ることです。[Kubernetes Object Hierarchy](https://gist.github.com/fardjad/ea3c38d566c845e0b353237d3959e365)を参照してください。

### `service.version`の計算方法

見つかった最初の値を選択します。

- `pod.annotation[resource.opentelemetry.io/service.version]`
- `pod.label[app.kubernetes.io/version]`（well-known labelの
  [app.kubernetes.io/version](https://kubernetes.io/docs/reference/labels-annotations-taints/#app-kubernetes-io-version)）
- 以下で説明するアルゴリズムを使ってバージョンを計算する

1. [reference library](https://github.com/distribution/reference/blob/main/reference.go)で説明されているアルゴリズムを使ってタグとダイジェストを計算する
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が変わってしまうと、トラブルシューティングが難しくなるためです。

