Cloud Trace でインバウンド トラフィックをトレースする

このドキュメントでは、Cloud Trace を使用してアプリケーション ロードバランサの分散トレースを構成する方法について説明します。ロードバランサの転送ルールをターゲットとするテレメトリー ポリシーを作成し、Cloud Trace で結果のトレースを表示します。

このドキュメントの例では、次のアーキテクチャを持つ e コマース アプリケーションを使用します。

  • ウェブ ストアフロントの顧客トラフィックを受信するグローバル外部アプリケーション ロードバランサ。
  • ストアフロントから内部カート、在庫、決済サービスにチェックアウト リクエストをルーティングするリージョン内部アプリケーション ロードバランサ。

サンプリング モードやトレース コンテキスト ヘッダーの処理など、分散トレースの仕組みについては、分散トレースの概要をご覧ください。

始める前に

  1. プロジェクトで Cloud Trace API と Network Services API を有効にします。

    gcloud services enable \
        cloudtrace.googleapis.com \
        networkservices.googleapis.com
    
  2. サポートされているロードバランサがデプロイされていることを確認します。詳しくは以下をご覧ください。

  3. ロードバランサの転送ルールの名前とスコープをメモします。転送ルールのスコープは、ロードバランサの種類によって異なります。

    • グローバル転送ルール: グローバル外部アプリケーション ロードバランサとクロスリージョン内部アプリケーション ロードバランサで使用されます。
    • リージョン転送ルール: リージョン外部アプリケーション ロードバランサとリージョン内部アプリケーション ロードバランサで使用されます。

    プロジェクト内の転送ルールを一覧表示するには、gcloud compute forwarding-rules list コマンドを使用します。

    gcloud compute forwarding-rules list
    

必要なロール

テレメトリー ポリシーの構成とトレースの表示に必要な権限を取得するには、プロジェクトに対する次の Identity and Access Management(IAM)ロールを付与するよう管理者に依頼してください。

ロードバランサがトレーススパンを Cloud Trace に書き込めるようにするには、プロジェクトの Cloud Trace エージェントのロール(roles/cloudtrace.agent)を次のサービス アカウントに付与します。

  • Compute Engine サービス エージェント: service-PROJECT_NUMBER@compute-system.
  • ネットワーク セキュリティ サービス エージェント: service-PROJECT_NUMBER@gcp-sa-networksecurity.
  • バックエンドが独自のスパンを Cloud Trace にエクスポートする場合は、バックエンド ワークロードのサービス アカウント。このロールがないと、Cloud Trace にはロードバランサのスパンのみが表示され、トレースにバックエンド スパンは含まれません。

PROJECT_NUMBER は、使用するGoogle Cloud プロジェクト番号に置き換えます。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

テレメトリー ポリシーの構成

テレメトリー ポリシーは、次の形式の YAML ファイルで定義します。

name: "projects/PROJECT_ID/locations/LOCATION/telemetryPolicies/POLICY_NAME"
displayName: "DISPLAY_NAME"
telemetryTarget:
  resources:
  - "FORWARDING_RULE_URI"
tracingConfiguration:
  samplingRate: SAMPLING_RATE
  parentBasedSampling:
    enabled: ENABLE_PARENT_BASED_SAMPLING
    samplingRate: PARENT_BASED_SAMPLING_RATE

次の表に、テレメトリー ポリシーのフィールドを示します。

フィールド 説明
name

テレメトリー ポリシーのリソース名。次のように置き換えます。

  • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
  • LOCATION: テレメトリー ポリシーのロケーション。ポリシーの対象となる転送ルールのスコープと一致する必要があります。グローバル転送ルールの場合は、global を使用します。リージョン転送ルールの場合は、転送ルールのリージョン(us-central1 など)を使用します。
  • POLICY_NAME: テレメトリー ポリシーの名前。名前は 4 ~ 63 文字で指定し、先頭は英小文字、末尾は英小文字または数字にしてください。使用できるのは英小文字、数字、ハイフンのみです。
displayName 省略可。テレメトリー ポリシーの人が読める形式の名前(DISPLAY_NAME)。
telemetryTarget.resources

ポリシーが適用される転送ルールの完全なリソース名(FORWARDING_RULE_URI)のリスト。最大 50 個のリソースを指定できます。次のいずれかの形式で指定してください。

  • グローバル転送ルール: //compute.googleapis.com/projects/PROJECT_ID/global/forwardingRules/FORWARDING_RULE_NAME
  • リージョン転送ルール: //compute.googleapis.com/projects/PROJECT_ID/regions/REGION/forwardingRules/FORWARDING_RULE_NAME
次のように置き換えます。
  • FORWARDING_RULE_NAME: 転送ルールの名前
  • REGION: 転送ルールのリージョン(例: us-central1)
tracingConfiguration.samplingRate トレースするリクエストの割合(SAMPLING_RATE)。0.0(0%)~1.0(100%)の値で指定します。たとえば、0.01 はリクエストの 1% をサンプリングします。デフォルト値は 0.0 です。
tracingConfiguration.parentBasedSampling.enabled 省略可。ロードバランサが受信 W3C traceparent ヘッダー(ENABLE_PARENT_BASED_SAMPLING)のサンプリング フラグを優先するかどうかは、true または false です。デフォルト値は false です。内部アプリケーション ロードバランサでのみサポートされます。
tracingConfiguration.parentBasedSampling.samplingRate 省略可。トレースするアップストリーム サンプリング リクエストの割合(PARENT_BASED_SAMPLING_RATE)。0.0~1.0 の値で指定します。たとえば、1.0 は、アップストリーム クライアントまたはサービスがすでにサンプリングしたすべてのリクエストをトレースします。

外部ロードバランサのトレースを構成する

この例では、e コマース ストアフロントのグローバル外部アプリケーション ロードバランサの転送ルールで確率的サンプリングを構成します。サンプリング レートを 0.01 にすると、リクエストの 1% がトレースされます。これにより、エッジのレイテンシとエラーをキャプチャしながら、トラフィックが多いときでも Cloud Trace の取り込み費用を予測可能な範囲に抑えることができます。

  1. storefront-tracing-policy.yaml という名前の YAML ファイルを作成します。

    cat <<EOF > storefront-tracing-policy.yaml
    name: "projects/PROJECT_ID/locations/global/telemetryPolicies/storefront-tracing-policy"
    displayName: "Tracing policy for the storefront load balancer"
    telemetryTarget:
      resources:
        - "//compute.googleapis.com/projects/PROJECT_ID/global/forwardingRules/FORWARDING_RULE_NAME"
    tracingConfiguration:
      samplingRate: 0.01
    EOF
    

    次のように置き換えます。

    • PROJECT_ID:Google Cloud プロジェクトの ID
    • FORWARDING_RULE_NAME: ロードバランサのグローバル転送ルールの名前

    リージョン外部アプリケーション ロードバランサの場合は、ポリシー名の global を転送ルールのリージョンに置き換え、リージョン転送ルールの形式を使用します。

  2. gcloud beta network-services telemetry-policies import コマンドを使用して、テレメトリー ポリシーをインポートします。

    gcloud beta network-services telemetry-policies import storefront-tracing-policy \
        --source=storefront-tracing-policy.yaml \
        --location=global
    

内部ロードバランサのトレースを構成する

この例では、内部チェックアウト サービスと決済サービス用にリージョン内部アプリケーション ロードバランサを構成します。このポリシーでは、次のサンプリング設定を使用します。

  • アップストリームのサンプリング決定を伴わないリクエストのベースライン samplingRate は 0.01(1%)です。
  • samplingRate が 1.0(100%)の親ベースのサンプリング。これにより、ストアフロントまたはアップストリーム サービスですでにサンプリングされているすべてのチェックアウト リクエストが、内部ロードバランサを介してトレースされます。

ポリシーを構成する手順は次のとおりです。

  1. checkout-tracing-policy.yaml という名前の YAML ファイルを作成します。

    cat <<EOF > checkout-tracing-policy.yaml
    name: "projects/PROJECT_ID/locations/REGION/telemetryPolicies/checkout-tracing-policy"
    displayName: "Tracing policy for the internal checkout load balancer"
    telemetryTarget:
      resources:
        - "//compute.googleapis.com/projects/PROJECT_ID/regions/REGION/forwardingRules/FORWARDING_RULE_NAME"
    tracingConfiguration:
      samplingRate: 0.01
      parentBasedSampling:
        enabled: true
        samplingRate: 1.0
    EOF
    

    次のように置き換えます。

    • PROJECT_ID:Google Cloud プロジェクトの ID
    • REGION: 転送ルールのリージョン(例: us-central1)
    • FORWARDING_RULE_NAME: ロードバランサのリージョン転送ルールの名前

    クロスリージョン内部アプリケーション ロードバランサの場合は、ポリシー名のロケーションとして global を使用し、グローバル転送ルールの形式を使用します。

  2. テレメトリー ポリシーをインポートします。

    gcloud beta network-services telemetry-policies import checkout-tracing-policy \
        --source=checkout-tracing-policy.yaml \
        --location=REGION
    

テレメトリー ポリシーを確認する

テレメトリー ポリシーが存在し、正しい転送ルールをターゲットにしていることを確認するには、gcloud beta network-services telemetry-policies describe コマンドを使用します。

gcloud beta network-services telemetry-policies describe POLICY_NAME \
    --location=LOCATION

次のように置き換えます。

  • POLICY_NAME: テレメトリー ポリシーの名前
  • LOCATION: global またはテレメトリー ポリシーのリージョン

ロケーション内のすべてのテレメトリー ポリシーを一覧表示するには、gcloud beta network-services telemetry-policies list コマンドを使用します。

gcloud beta network-services telemetry-policies list \
    --location=LOCATION

テレメトリー ポリシーを更新する

サンプリング設定を変更する場合、または同じポリシーを別の転送ルールに適用する場合は、次の操作を行います。

  1. ポリシーの YAML ファイルを編集します。たとえば、ストアフロント ポリシーを複数のグローバル転送ルールに適用するには、各転送ルールを telemetryTarget.resources リストに追加します。

    telemetryTarget:
      resources:
        - "//compute.googleapis.com/projects/PROJECT_ID/global/forwardingRules/storefront-https-fr"
        - "//compute.googleapis.com/projects/PROJECT_ID/global/forwardingRules/cart-https-fr"
    
  2. 更新したポリシーをインポートします。

    gcloud beta network-services telemetry-policies import POLICY_NAME \
        --source=POLICY_FILE \
        --location=LOCATION
    

    POLICY_FILE は、ポリシー YAML ファイルのパスに置き換えます。

トレースを表示

トレースを構成してロードバランサ経由でトラフィックを送信したら、 Google Cloud コンソールでトレースを表示します。

  1. Google Cloud コンソールで、[Trace エクスプローラ] ページに移動します。

    Trace エクスプローラに移動

  2. Google Cloud プロジェクトを選択します。

  3. [フィルタ] フィールドに、検査するトレースを検索するフィルタを入力します。(属性 ID やレイテンシのしきい値など)。

  4. 必要に応じて、特定のトレースを調査するには、ツールバーに移動して [トレース ID] をクリックし、トレース ID を入力します。

  5. トレースをクリックすると、タイムライン ビューとグラフビューにそのスパンが表示されます。

  6. ロードバランサのスパンを調べて、合計時間やリクエストを処理したバックエンドなどの詳細を確認します。

Trace エクスプローラの使用方法について詳しくは、トレースを検索して調査するをご覧ください。

トレースをログおよび指標と関連付ける

ロードバランサのトレーススパンをリクエストログと指標に関連付けることで、レイテンシやエラーの原因を特定できます。

トレースとログを関連付ける

バックエンド サービスでロギングを有効にすると、ロードバランサはサンプリングされたリクエストの各リクエスト ログエントリに trace フィールドを追加します。このフィールドの形式は次のとおりです。

projects/PROJECT_ID/traces/TRACE_ID

ロードバランサのログエントリからトレースを表示する

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. ロードバランサのログエントリを開きます。

  3. ログエントリの概要で、トレース アイコンをクリックします。

    ログ エクスプローラのログエントリの概要の横にあるトレース アイコン。

  4. [トレースの詳細を表示] を選択します。

[Trace エクスプローラ] ページでトレースが開きます。

トレースからロードバランサのログを表示する

  1. Google Cloud コンソールで、[Trace エクスプローラ] ページに移動します。

    Trace エクスプローラに移動

  2. トレースをクリックして [詳細] ペインを開きます。

  3. [ログを表示] をクリックします。

リクエストのロードバランサのログエントリが表示されます。

トレースと指標を関連付ける

ロードバランサの指標のレイテンシ スパイクをトレーススパンの内訳と比較して、レイテンシがロードバランサで発生しているのか、バックエンドで発生しているのかを判断します。これらの指標は、Cloud Monitoring の Metrics Explorer で表示してクエリできます。次の指標を使用します。

  • グローバル外部アプリケーション ロードバランサ: loadbalancing.googleapis.com/https/total_latencies、loadbalancing.googleapis.com/https/backend_latencies
  • リージョン外部アプリケーション ロードバランサ: loadbalancing.googleapis.com/https/external/regional/total_latencies
  • 内部アプリケーション ロードバランサ: loadbalancing.googleapis.com/https/internal/total_latencies

トレースを無効にする

ロードバランサのリクエストのトレースを停止するには、次のいずれかを行います。

  • ポリシーの telemetryTarget.resources リストから転送ルールを削除し、更新されたポリシーをインポートします。
  • gcloud beta network-services telemetry-policies delete コマンドを使用して、テレメトリー ポリシーを削除します。

    gcloud beta network-services telemetry-policies delete POLICY_NAME \
        --location=LOCATION
    

ベスト プラクティス

分散トレースを構成する際は、次のベスト プラクティスを考慮してください。

  • トラフィック量に合わせてサンプリング レートを調整する: トラフィック量の多い本番環境ワークロードでは、samplingRate を 0.01(1%)または 0.001(0.1%)に設定して、オブザーバビリティと Cloud Trace の取り込み費用のバランスを取ります。
  • 多層アーキテクチャに親ベースのサンプリングを使用する: 内部アプリケーション ロードバランサで親ベースのサンプリングを有効にして、アップストリームでサンプリングされたリクエストがすべての内部ホップでトレースされるようにします。
  • バックエンドを計測する: バックエンド サービスで W3C トレース コンテキスト プロパゲータとともに OpenTelemetry SDK を使用して、バックエンド スパンがロードバランサが開始するトレースに参加するようにします。

トラブルシューティング

このセクションでは、一般的な問題とその解決策について説明します。

トレースが Cloud Trace に表示されない

Cloud Trace にトレースが表示されない場合は、次の操作を行います。

  1. プロジェクトで Cloud Trace API が有効になっていることを確認します。

    gcloud services enable cloudtrace.googleapis.com \
        --project=PROJECT_ID
    
  2. 必要なロールに記載されているサービス アカウントに Cloud Trace エージェントのロール(roles/cloudtrace.agent)が付与されていることを確認します。

  3. テレメトリー ポリシーが正しい場所に存在し、正しい転送ルールをターゲットにしていることを確認します。詳細については、テレメトリー ポリシーを確認するをご覧ください。

  4. 構成済みの samplingRate を確認します。トラフィック量またはサンプリング レートが低い場合、ロードバランサはトレースをすぐにキャプチャしないことがあります。トレースが機能することを確認するには、samplingRate を一時的に 1.0 に設定し、テストが完了したら本番環境のレートを復元します。

トレーススパンが切断されているか、不完全である

ロードバランサのスパンがアプリケーションのトレースの一部ではなく、個別のルートトレースとして表示される場合は、次の操作を行います。

  1. 内部アプリケーション ロードバランサの場合、テレメトリー ポリシーで親ベースのサンプリングが有効(parentBasedSampling.enabled: true)になっていることを確認します。

  2. クライアント ワークロードとバックエンド ワークロードのサービス アカウントに Cloud Trace エージェントのロール(roles/cloudtrace.agent)が付与されていることを確認します。これにより、スパンを Cloud Trace にエクスポートできます。

  3. アプリケーションが W3C トレース コンテキストの伝播が有効になっている OpenTelemetry SDK を使用していることを確認します。これにより、traceparent ヘッダーがサービス境界を越えて伝播されます。詳細については、OpenTelemetry コンテキストの伝播に関するドキュメントをご覧ください。

次のステップ