Telemetry API の workload selector を使って任意のサービスのみOpenTelemetryトレースを有効化する
OpenTelemetry Advent Calendar 2024 3日目に空きがあったのでOpenTelemtry だけのための機能ではないですが OpenTelemetry を利用したので、投稿します。
本題
Istio で提供されている Telemetry API はメッシュ内のテレメトリがどのように生成されるかを定義するものです。
istio で OpenTelemetry(以降 otel) のトレースをメッシュ全体で有効にしてしまうとそれによって負荷が高まってしまうやデータ量が大量になってしまってコスト面などで負担になってしまう可能性もあります。そこで本記事では workload selector を使って任意のワークロードのみ otel のトレース情報を生成するように制御する方法をご紹介します。
前提知識
- istio をちょっと触ったことがある
- kubectl が叩ける
筆者は EKS 上で Bookinfo アプリケーションを利用しています。他の k8s 環境でも利用は可能だと思います。
以前別の記事でotelのトレースを有効化する記事については紹介していますので以下の記事を参照ください。
Bookinfo アプリケーションの情報もぶら下げておきます。
Telemetry API について
Istio が提供するメトリクス、ログ、トレースの柔軟な構成を提供するのが Telemetry API です。
各種 provider を提供していて istio の meshConfig で設定する様々なテレメトリを利用することができます。
Workload Selector
WorkloadSelectorは、ポリシーをプロキシに適用できるかどうかを判断するための条件を指定します。matchLabels にマッチしたプロキシに対して設定したルールなどを適用させる機能です。
Telemetry API には以下のような形で順番に上の設定にある root configuration から設定を継承したり上書きすることができるようになっています。
- root configuration namespace (example: istio-system)
- local namespace (namespace-scoped resource with no workload selector)
- workload (namespace-scoped resource with a workload selector)
今回はこの設定を利用してメッシュ全体のトレースは無効にしつつ特定のワークロードのみのトレースを有効化していきます。既に istio によるトレースは有効化されているかと思いますので設定に移りたいと思います。
Telemetry の設定
まず親となる設定を適用させます。
istio-system namespace にトレースを無効化させる設定して反映します。
tracing フィールドにある disableSpanReporting
を有効化してトレースのスパンを報告しないようにします。
#telemetry_root.yaml
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: otel-demo
namespace: istio-system
spec:
tracing:
- disableSpanReporting: true
次に istio-ingressgateway のトレースを有効化させる設定をするので逆に disableSpanReporting
を無効にします。
ここで selector として app: istio-ingressgateway を設定することによって特定のワークロードのトレースのみを有効化できるようになります。
#telemetry_istio-system.yaml
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: otel-demo-istio-ingress-gateway
namespace: istio-system
spec:
selector:
matchLabels:
app: istio-ingressgateway
tracing:
- disableSpanReporting: false
同じような形で今回は default namespace にある productpage のプロキシのみ同じ要領でトレースを送れるようにします。
#telemetry_default.yaml
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: otel-demo
namespace: default
spec:
selector:
matchLabels:
app: productpage
tracing:
- randomSamplingPercentage: 100
disableSpanReporting: false
今回も New Relic に対して転送しているので意図した挙動になっているか確認してみましょう。
実際に意図したプロキシのみスパンを送れるようになりました。
本来全部のプロキシから送ることが理想ではありますがこのようにしてクリティカルな箇所のみに絞ってトレースを見れることでデータ量との対比で価値を最大化できる点もありますのでこの記事が参考になれば幸いです。
Discussion