k8s attributes processor
Kubernetes の Pod に関する情報を resource attributes として付与する OpenTelemetry Collector の processor
otlp でテレメトリを送る場合、誰が送ったかは自己申告制なので Pod 自身が知り得ない情報を復元してあげる必要がある
特にサイドカーとして OpenTelemetry Collector を用いない場合は resource attribute には基本的にはアプリケーションレベルの情報しか載ってこない
どうやって?
Kubernetes の API を叩いて Pod を watch し、Pod を識別する情報(IP など) -> Pod のマッピングを持っておく
resource attributes で識別可能な場合(k8s.namespace.name と k8s.pod.name がある)ときはそこから引く
無い場合は reveiver が付与してくる client ip の情報から引く
注意点
そのままだと Pod 全てを watch する controller になってしまう
大規模環境だと扱う Pod が多すぎるので分散してあげる必要がある
Agent 構成(DaemonSet)の場合は node 単位でフィルタリングができる
InternalTrafficPolicy を Local にして同一ノード内のエージェントにのみルーティングされるようにする
ただしエージェントなので落ちていることがあり、その場合テレメトリ(典型的にはスパン)が落ちる
Gateway 構成(Deployment)の場合は namespace 単位であったり label でフィルタリングすることができる
各 namespace に Gateway Service を提供するという形になるんだろうか
HNC でテナントみたいなことをやっている場合は事実上は複数の namespace に跨ることになるが……
receiver の context を参照しているので、batch processor より前に置く必要がある
batch はその性質上 context を切る