Cloud Trace と Cloud Service Mesh
Cloud Trace は、アプリケーションからレイテンシ データを収集し、ほぼリアルタイムで表示する分散トレース システムです。これにより、分散システムを介してサンプル リクエストを実行できます。また、ネットワーク呼び出しの監視や、エンドツーエンドのシステム プロファイリングを行うことができます。
Cloud Trace は、次のプラットフォームの Cloud Service Mesh インストールでご利用いただけます。
- Google Cloud 上の GKE
- Cloud Service Mesh 認証局を使用してインストールした場合、オンプレミスの GKE Enterprise クラスタ
Cloud Trace はデフォルトで無効になっています。有効にすると、Google Cloud コンソールの [Cloud Service Mesh] ページに [Cloud Trace] ページのトレースへのリンクが表示されます。料金の詳細については、Cloud Trace の料金ページをご覧ください。
Cloud Trace を有効にする
このセクションでは、Cloud Trace を有効にする方法について説明します。
管理対象
このセクションでは、マネージド Cloud 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
クラスタ内
このセクションでは、クラスタ内 Cloud 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.01 単位で、0.0~100.0 の範囲から設定してください。たとえば、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 ヘッダーを伝播する必要があります。
これを行うには、受信リクエストから適切なヘッダーを収集し、発信リクエストに反映する必要があります。Cloud 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 コンソールで [Cloud Service Mesh] ページに移動します。
[サービス] で、検査するサービスの名前を選択します。
次のスクリーンショットは、
frontend
Service の例を示しています。[リクエストのトレース] でトレースをクリックすると、詳細が表示されます。
次のスクリーンショットは、トレース リクエストのサブパネルの例を示しています。
すべてのトレースを表示する
Service のすべてのトレースを表示するには、次の手順を実施します。
Google Cloud コンソールで [Cloud Service Mesh] ページに移動します。
[サービス] で、検査するサービスの名前を選択します。
[指標] ページに移動します。
[期間] プルダウン メニューから期間を指定するか、タイムラインを使用してカスタムスパンを設定します。
[トレースを表示] をクリックします。
Cloud Service Mesh のサービスのトレースには、次の情報が含まれます。
- メッシュ内のさまざまなサービス間のリクエストのレイテンシ。
- ID、URL、サイズ、レイテンシ、プロトコルなどの HTTP リクエスト プロパティ。
istio.canonical_service
、istio.namespace
、istio.mesh_id
の各ラベルの一部としてのサービス名、名前空間、メッシュの ID。