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

  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

クラスタ内

このセクションでは、クラスタ内 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-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 コンソールの [Anthos Service Mesh] ページに移動します。

    [Anthos Service Mesh] ページに移動

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

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

    Anthos Service Mesh トレースグラフ

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

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

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

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

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

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

    [Anthos Service Mesh] ページに移動

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

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

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

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

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

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

次のステップ