Cloud Trace と Anthos Service Mesh
Cloud Trace は、アプリケーションからレイテンシ データを収集し、ほぼリアルタイムで表示する分散トレース システムです。これにより、分散システムを介してサンプル リクエストを実行できます。また、ネットワーク呼び出しの監視や、エンドツーエンドのシステム プロファイリングを行うことができます。
Cloud Trace は、次のプラットフォームの Anthos Service Mesh インストールでご利用いただけます。
- Google Cloud 上の GKE
- Anthos Service Mesh 認証局(Mesh CA)を使用してインストールした場合の、オンプレミスの GKE エンタープライズ クラスタ
Cloud Trace はデフォルトで無効になっています。有効にすると、Google Cloud コンソールの Anthos Service Mesh ページに Cloud Trace ページのトレースへのリンクが表示されます。料金の詳細については、Cloud Trace の料金ページをご覧ください。
Cloud Trace を有効にする
このセクションでは、Cloud Trace を有効にする方法について説明します。
マネージド
このセクションでは、マネージド Anthos Service Mesh で Cloud Trace を有効にする方法について説明します。
次のコマンドを実行します。
cat <<EOF | kubectl apply -f - apiVersion: v1 data: mesh: |- defaultConfig: tracing: stackdriver: {} kind: ConfigMap metadata: name: istio-release-channel namespace: istio-system EOF
release-channel は、リリース チャンネル(
asm-managed
、asm-managed-stable
またはasm-managed-rapid
)です。次のコマンドを実行して ConfigMap を表示します。
kubectl get configmap istio-release-channel -n istio-system -o yaml
Cloud Trace が有効になっていることを確認するには、次の行が
mesh:
セクションに表示されることを確認します。... apiVersion: v1 data: mesh: | .... defaultConfig: tracing: stackdriver:{} ...
プロキシを再起動します。
トレーサー構成はプロキシ ブートストラップ構成の一部になっているため、トレーサーの更新を取得するためには、各 Pod を再起動して、再挿入する必要があります。たとえば、次のコマンドを使用して Deployment に属する Pod を再起動します。
kubectl rollout restart deployment -n NAMESPACE DEPLOYMENT_NAME
クラスタ内
このセクションでは、クラスタ内 Anthos Service Mesh で Cloud Trace を有効にする方法について説明します。
Cloud Trace を有効にするには、次のオーバーレイ ファイルを使用して顧客管理のコントロール プレーンを再デプロイします。オーバーレイ ファイルの詳細については、オーバーレイ ファイルについてをご覧ください。
デフォルト
次のコマンドを実行して Cloud Trace を有効にします。
./asmcli install \
OTHER_FLAGS \
--option cloud-trace
このコマンドにより、次のオーバーレイ ファイルが適用されて、デフォルトのオプションでトレースが有効になります。デフォルトのサンプリング レートは 1% です。デフォルトをオーバーライドする場合は、代わりに --custom-overlay
を使用してください。
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
meshConfig:
enableTracing: true
values:
global:
proxy:
tracer: stackdriver
オプションの一覧については、anthos-service-mesh
パッケージをご覧ください。
カスタム
デフォルト値は、tracing.sampling
の値を指定してオーバーライドできます。値は、0.0~100.0 の範囲で 0.01 単位で設定してください。たとえば、10,000 件ごとに 5 件のリクエストをトレースするには、0.05 を使用します。
次の例は、100% のサンプリング レートを示しています(この操作は、デモまたはトラブルシューティングの目的に限り行います)。
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
meshConfig:
enableTracing: true
defaultConfig:
tracing:
sampling: 100
values:
global:
proxy:
tracer: stackdriver
次のコマンドを実行して Cloud Trace を有効にします。
./asmcli install \
OTHER_FLAGS \
--custom_overlay PATH_TO_FILE
トレーサー構成はプロキシ ブートストラップ構成の一部になっているため、トレーサーの更新を取得するには、Pod を再起動して、再挿入する必要があります。次のコマンドを使用して、Deployment に属する Pod を再起動します。
kubectl rollout restart deployment -n NAMESPACE DEPLOYMENT_NAME
トレース コンテキストの伝播
サイドカー プロキシは、トレーススパンを自動的に送信できますが、トレース全体を関連付けるにはなんらかの情報が必要になります。このため、プロキシがスパン情報の送信時にスパンを 1 つのトレースに正しく関連付けられるように、適切な HTTP ヘッダーを伝播する必要があります。
これを行うには、受信リクエストから適切なヘッダーを収集し、発信リクエストに反映する必要があります。Anthos Service Mesh Stackdriver のトレース構成は、次のいずれかのヘッダー形式を受け入れ、次のすべての形式を伝播します。
- B3(
x-b3-traceid
、x-b3-spanid
、x-b3parentspanid
、x-b3-sampled
、x-b3-flags
) - W3C TraceContext(
traceparent
) - Google Cloud Trace(
x-cloud-trace-context
) - gRPC TraceBin(
grpc-trace-bin
)
アプリケーションは、これらの形式のいずれかを使用してトレース コンテキストを伝播できます。これにより、トレースを適切に生成して Stackdriver に設定できます。
例
元のリクエストの traceparent
ヘッダーを使用した HTTP-Get リクエストの例を次に示します。プロキシによって追加されたトレース コンテキストのヘッダーに注意してください。
$ kubectl exec -it sleep-557747455f-n6flv -- curl "httpbin:8000/anything?freeform=" -H "accept: application/json" -H "Traceparent: 00-7543d15e09e5d61801d4f74cde1269b8-604ef051d35c5b3f-01" -vv
* Trying 10.12.3.52:8000...
* Connected to httpbin (10.12.3.52) port 8000 (#0)
> GET /anything?freeform= HTTP/1.1
> Host: httpbin:8000
> User-Agent: curl/7.80.0-DEV
> accept: application/json
> Traceparent: 00-7543d15e09e5d61801d4f74cde1269b8-604ef051d35c5b3f-01
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< server: envoy
< date: Wed, 10 Nov 2021 20:36:04 GMT
< content-type: application/json
< content-length: 1032
< access-control-allow-origin: *
< access-control-allow-credentials: true
< x-envoy-upstream-service-time: 5
<
{
"args": {
"freeform": ""
},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "application/json",
"Grpc-Trace-Bin": "AAB1Q9FeCeXWGAHU90zeEmm4AaDHmGRtdM7wAgE",
"Host": "httpbin:8000",
"Traceparent": "00-7543d15e09e5d61801d4f74cde1269b8-a0c798646d74cef0-01",
"User-Agent": "curl/7.80.0-DEV",
"X-B3-Sampled": "1",
"X-B3-Spanid": "a0c798646d74cef0",
"X-B3-Traceid": "7543d15e09e5d61801d4f74cde1269b8",
"X-Cloud-Trace-Context": "7543d15e09e5d61801d4f74cde1269b8/11585396123534413552;o=1",
"X-Envoy-Attempt-Count": "1",
"X-Forwarded-Client-Cert": "<REDACTED>"
},
"json": null,
"method": "GET",
"origin": "127.0.0.6",
"url": "http://httpbin:8000/anything?freeform="
}
返されたリクエスト ヘッダーのセットには、トレース コンテキスト ヘッダーの完全なセットが含まれています。
ヘッダーの伝播例については、トレース コンテキストの伝播をご覧ください。
カスタム ID を使用してクライアントからトレースを作成する
カスタム ID を使用してクライアントからトレースを作成するには、curl
コマンドを使用して外部クライアントを含むリクエストを作成し、強制的にトレースを表示します。次に例を示します。
curl $URL --header "x-client-trace-id: 105445aa7843bc8bf206b12000100000"
x-client-trace-id
の詳細については、Envoy のドキュメントをご覧ください。
アクセスのトレース
Service のトレース サンプルを表示する
アプリ内の Service のトレースのサンプリングを表示するには、次の操作を行います。
Google Cloud コンソールの [Anthos Service Mesh] ページに移動します。
[サービス] で、検査するサービスの名前を選択します。
次のスクリーンショットは、
frontend
Service の例を示しています。[リクエストのトレース] でトレースをクリックすると、詳細が表示されます。
次のスクリーンショットは、トレース リクエストのサブパネルの例を示しています。
すべてのトレースを表示する
Service のすべてのトレースを表示するには、次の手順を実施します。
Google Cloud コンソールの [Anthos Service Mesh] ページに移動します。
[サービス] で、検査するサービスの名前を選択します。
[指標] ページに移動します。
[期間] プルダウン メニューから期間を指定するか、タイムラインを使用してカスタムスパンを設定します。
[トレースを表示] をクリックします。
Anthos Service Mesh のサービスのトレースには、次の情報が含まれます。
- メッシュ内のさまざまなサービス間のリクエストのレイテンシ。
- ID、URL、サイズ、レイテンシ、プロトコルなどの HTTP リクエスト プロパティ。
istio.canonical_service
、istio.namespace
、istio.mesh_id
の各ラベルの一部としてのサービス名、名前空間、メッシュの ID。