トレースサンプリング

Istioは、トレースサンプリングを設定するための複数の方法を提供します。このページでは、サンプリングを設定できるさまざまな方法を学習し、理解します。

始める前に

  1. アプリケーションが、こちらで説明されているように、トレーシングヘッダーを伝播するようにしてください。

利用可能なトレースサンプリング設定

  1. パーセンテージサンプラー:トレース生成のために選択されるリクエストのパーセンテージをランダムにサンプリングするレートです。

  2. カスタムOpenTelemetryサンプラー:OpenTelemetryTracingProviderと組み合わせて使用する必要がある、カスタムのサンプラー実装です。

  3. OpenTelemetryコレクターのデプロイ

    • OpenTelemetryコレクターのための名前空間の作成

      $ kubectl create namespace observability
          
    • OpenTelemetryコレクターをデプロイします。この例の設定を起点として使用できます:otel.yaml

      Zip
      $ kubectl apply -f @samples/open-telemetry/otel.yaml@ -n observability
          

パーセンテージサンプラー

ランダムサンプリングレートのパーセンテージは、指定されたパーセンテージ値を使用して、サンプリングするリクエストを選択します。

サンプリングレートは、0.0~100.0の範囲で、精度は0.01です。たとえば、10000リクエストのうち5リクエストをトレースするには、ここで0.05を値として使用します。

ランダムサンプリングレートを設定するには、3つの方法があります。

MeshConfig経由でのグローバル設定

ランダムパーセンテージサンプリングは、MeshConfigを介してグローバルに設定できます。

$ cat <<EOF | istioctl install -y -f -
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    enableTracing: true
    defaultConfig:
      tracing:
        sampling: 10
    extensionProviders:
    - name: otel-tracing
      opentelemetry:
        port: 4317
        service: opentelemetry-collector.observability.svc.cluster.local
        resource_detectors:
          environment: {}
EOF

次に、テレメトリAPIを介してトレーシングプロバイダーを有効にします。ここではrandomSamplingPercentageは設定しません。

$ kubectl apply -f - <<EOF
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
  name: mesh-default
  namespace: istio-system
spec:
  tracing:
  - providers:
    - name: otel-tracing
EOF

Podアノテーションproxy.istio.io/config

Podメタデータ仕様にproxy.istio.io/configアノテーションを追加して、メッシュ全体のサンプリング設定をオーバーライドできます。

たとえば、上記のメッシュ全体のサンプリングをオーバーライドするには、次のものをPodマニフェストに追加します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: curl
spec:
  ...
  template:
    metadata:
      ...
      annotations:
        ...
        proxy.istio.io/config: |
          tracing:
            sampling: 20
    spec:
      ...

テレメトリAPI

ランダムパーセンテージサンプラーは、テレメトリAPIを介しても設定できます。テレメトリAPIを介して、サンプリングはメッシュ全体、名前空間、ワークロードなど、さまざまなスコープで設定でき、高い柔軟性を提供します。詳細については、テレメトリAPIのドキュメントを参照してください。

defaultConfig内にsamplingを設定せずにIstioをインストールします。

$ cat <<EOF | istioctl install -y -f -
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    enableTracing: true
    extensionProviders:
    - name: otel-tracing
      opentelemetry:
        port: 4317
        service: opentelemetry-collector.observability.svc.cluster.local
        resource_detectors:
          environment: {}
EOF

次に、テレメトリAPIを介してトレーシングプロバイダーを有効にし、randomSamplingPercentageを設定します。

$ kubectl apply -f - <<EOF
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
   name: otel-demo
spec:
  tracing:
  - providers:
    - name: otel-tracing
    randomSamplingPercentage: 10
EOF

カスタムOpenTelemetryサンプラー

OpenTelemetry仕様では、Sampler APIが定義されています。Sampler APIを使用すると、確率サンプリングなど、よりインテリジェントで効率的なサンプリング決定を実行できるカスタムサンプラーを構築できます。

このようなサンプラーは、OpenTelemetryTracingProviderと組み合わせて使用できます。

Istioにおける現在のカスタムサンプラー設定

カスタムサンプラーはMeshconfigを介して設定されます。Dynatraceサンプラーの設定例を以下に示します。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    extensionProviders:
    - name: otel-tracing
      opentelemetry:
        port: 443
        service: abc.live.dynatrace.com/api/v2/otlp
        http:
          path: "/api/v2/otlp/v1/traces"
          timeout: 10s
          headers:
            - name: "Authorization"
              value: "Api-Token dt0c01."
        dynatrace_sampler:
          tenant: "abc"
          cluster_id: 123

優先順位

サンプリングの設定方法は複数あるため、各方法の優先順位を理解することが重要です。

ランダムパーセンテージサンプラーを使用する場合、優先順位は次のとおりです。

テレメトリAPI > Podアノテーション > MeshConfig

つまり、上記すべてに値が定義されている場合、テレメトリAPIの値が選択されます。

カスタムOpenTelemetryサンプラーが設定されている場合、優先順位は次のとおりです。

カスタムOTelサンプラー > (テレメトリAPI | Podアノテーション | MeshConfig)

つまり、カスタムOpenTelemetryサンプラーが設定されている場合、他のすべての方法をオーバーライドします。さらに、ランダムパーセンテージ値は100に設定され、変更できません。これは、カスタムサンプラーが決定を適切に実行するために、100%のスパンを受信する必要があるため重要です。

Bookinfoアプリケーションのデプロイ

Bookinfoサンプルアプリケーションをデプロイします。

Bookinfoサンプルを使用したトレースの生成

  1. Bookinfoアプリケーションが稼働したら、1回以上http://$GATEWAY_URL/productpageにアクセスして、トレース情報を生成します。

    トレースデータを表示するには、サービスにリクエストを送信する必要があります。リクエストの数はIstioのサンプリングレートに依存し、テレメトリAPIを使用して設定できます。デフォルトのサンプリングレートは1%なので、最初のトレースが表示される前に、少なくとも100回のリクエストを送信する必要があります。productpageサービスに100回のリクエストを送信するには、次のコマンドを使用します。

    $ for i in $(seq 1 100); do curl -s -o /dev/null "http://$GATEWAY_URL/productpage"; done
        

クリーンアップ

  1. テレメトリリソースの削除

    $ kubectl delete telemetry otel-demo
    
  2. control-Cまたはを使用して、まだ実行されている可能性のあるすべてのistioctlプロセスを削除します。

    $ istioctl uninstall --purge -y
    
  3. OpenTelemetryコレクターのアンインストール

    Zip
    $ kubectl delete -f @samples/open-telemetry/otel.yaml@ -n observability
    $ kubectl delete namespace observability
    
この情報は役に立ちましたか?
改善のための提案はありますか?

フィードバックありがとうございます!