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 を有効にする方法について説明します。

  1. 次のコマンドを実行します。

    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-managedasm-managed-stable または asm-managed-rapid)です。

  2. 次のコマンドを実行して ConfigMap を表示します。

    kubectl get configmap istio-release-channel -n istio-system -o yaml
    
  3. Cloud Trace が有効になっていることを確認するには、次の行が mesh: セクションに表示されることを確認します。

    ...
    apiVersion: v1
    data:
       mesh: |
       ....
       defaultConfig:
          tracing:
             stackdriver:{}
    ...
    
  4. プロキシを再起動します。

    現在、トレーサー構成はプロキシ ブートストラップ構成の一部になっているため、トレーサーの更新を取得するためには、各 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-traceidx-b3-spanidx-b3parentspanidx-b3-sampledx-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 のトレースのサンプリングを表示するには、次の操作を行います。

  1. Google Cloud コンソールで [Cloud Service Mesh] ページに移動します。

    [Cloud Service Mesh] ページに移動

  2. [サービス] で、検査するサービスの名前を選択します。

    次のスクリーンショットは、frontend Service の例を示しています。

    Cloud Service Mesh トレースのグラフ

  3. [リクエストのトレース] でトレースをクリックすると、詳細が表示されます。

    次のスクリーンショットは、トレース リクエストのサブパネルの例を示しています。

    Cloud Service Mesh トレースのサブパネル

すべてのトレースを表示する

Service のすべてのトレースを表示するには、次の手順を実施します。

  1. Google Cloud コンソールで [Cloud Service Mesh] ページに移動します。

    [Cloud Service Mesh] ページに移動

  2. [サービス] で、検査するサービスの名前を選択します。

  3. [指標] ページに移動します。

  4. [期間] プルダウン メニューから期間を指定するか、タイムラインを使用してカスタムスパンを設定します。

  5. [トレースを表示] をクリックします。

Cloud Service Mesh のサービスのトレースには、次の情報が含まれます。

  • メッシュ内のさまざまなサービス間のリクエストのレイテンシ。
  • ID、URL、サイズ、レイテンシ、プロトコルなどの HTTP リクエスト プロパティ。
  • istio.canonical_serviceistio.namespaceistio.mesh_id の各ラベルの一部としてのサービス名、名前空間、メッシュの ID。

次のステップ