トレースサンプリング
Istioは、トレースサンプリングを設定するための複数の方法を提供します。このページでは、サンプリングを設定できるさまざまな方法を学習し、理解します。
始める前に
- アプリケーションが、こちらで説明されているように、トレーシングヘッダーを伝播するようにしてください。
利用可能なトレースサンプリング設定
パーセンテージサンプラー:トレース生成のために選択されるリクエストのパーセンテージをランダムにサンプリングするレートです。
カスタムOpenTelemetryサンプラー:
OpenTelemetryTracingProvider
と組み合わせて使用する必要がある、カスタムのサンプラー実装です。OpenTelemetryコレクターのデプロイ
OpenTelemetryコレクターのための名前空間の作成
$ kubectl create namespace observability
OpenTelemetryコレクターをデプロイします。この例の設定を起点として使用できます:
otel.yaml
$ 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サンプルを使用したトレースの生成
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
クリーンアップ
テレメトリリソースの削除
$ kubectl delete telemetry otel-demo
control-Cまたはを使用して、まだ実行されている可能性のあるすべての
istioctl
プロセスを削除します。$ istioctl uninstall --purge -y
OpenTelemetryコレクターのアンインストール
$ kubectl delete -f @samples/open-telemetry/otel.yaml@ -n observability $ kubectl delete namespace observability