🍊

Telemetry API の workload selector を使って任意のサービスのみOpenTelemetryトレースを有効化する

2024/12/05に公開

OpenTelemetry Advent Calendar 2024 3日目に空きがあったのでOpenTelemtry だけのための機能ではないですが OpenTelemetry を利用したので、投稿します。
https://qiita.com/advent-calendar/2024/opentelemetry

本題

Istio で提供されている Telemetry API はメッシュ内のテレメトリがどのように生成されるかを定義するものです。

istio で OpenTelemetry(以降 otel) のトレースをメッシュ全体で有効にしてしまうとそれによって負荷が高まってしまうやデータ量が大量になってしまってコスト面などで負担になってしまう可能性もあります。そこで本記事では workload selector を使って任意のワークロードのみ otel のトレース情報を生成するように制御する方法をご紹介します。

前提知識

  • istio をちょっと触ったことがある
  • kubectl が叩ける

筆者は EKS 上で Bookinfo アプリケーションを利用しています。他の k8s 環境でも利用は可能だと思います。
以前別の記事でotelのトレースを有効化する記事については紹介していますので以下の記事を参照ください。
https://zenn.dev/joe/articles/c3d36f81a7c7be

Bookinfo アプリケーションの情報もぶら下げておきます。
https://istio.io/latest/docs/examples/bookinfo/

Telemetry API について

Istio が提供するメトリクス、ログ、トレースの柔軟な構成を提供するのが Telemetry API です。
各種 provider を提供していて istio の meshConfig で設定する様々なテレメトリを利用することができます。
https://istio.io/latest/docs/tasks/observability/telemetry/

Workload Selector

WorkloadSelectorは、ポリシーをプロキシに適用できるかどうかを判断するための条件を指定します。matchLabels にマッチしたプロキシに対して設定したルールなどを適用させる機能です。

https://istio.io/latest/docs/reference/config/type/workload-selector/#WorkloadSelector

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)

https://istio.io/latest/docs/tasks/observability/telemetry/#scope-inheritance-and-overrides

今回はこの設定を利用してメッシュ全体のトレースは無効にしつつ特定のワークロードのみのトレースを有効化していきます。既に istio によるトレースは有効化されているかと思いますので設定に移りたいと思います。

Telemetry の設定

まず親となる設定を適用させます。
istio-system namespace にトレースを無効化させる設定して反映します。

tracing フィールドにある disableSpanReporting を有効化してトレースのスパンを報告しないようにします。
https://istio.io/latest/docs/reference/config/telemetry/#Tracing

#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