コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。
クイックスタート: Cloud Trace を使用してアプリのレイテンシをトレースする

Cloud Trace を使用してアプリのレイテンシをトレースする

次の操作を行って、Cloud Trace の使用方法を学習します。

  1. サンプル アプリケーションを Google Kubernetes Engine(GKE)クラスタにデプロイする。

  2. サンプル アプリケーションに HTTP リクエストを送信してトレースを作成する。

  3. Cloud Trace インターフェースを使用して、作成したトレースのレイテンシ情報を表示する。

始める前に

組織が Google Cloud 環境に制約を適用すると、このドキュメントの一部の手順が正しく機能しない場合があります。その場合、パブリック IP アドレスやサービス アカウント キーを作成するようなタスクを完了できない場合があります。制約に関するエラーを返すリクエストを行う場合は、制約がある Google Cloud 環境でアプリケーションを開発する方法をご覧ください。

課金を有効にしてプロジェクトを作成します。

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

  4. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  5. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

アプリケーションのダウンロードとデプロイ

アプリケーションをダウンロードしてデプロイする方法は次のとおりです。

  1. Cloud Shell を開くには、Google Cloud Console のツールバーで [Cloud Shell をアクティブにする] をクリックします。

    Cloud Shell をアクティブにします。

    しばらくすると、Google Cloud コンソール内で Cloud Shell セッションが開きます。

  2. GitHub からソースコードをダウンロードするには、次のコマンドを実行します。

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
    
  3. 次のコマンドを使用して、Google Kubernetes Engine API を有効にします。

    gcloud services enable container.googleapis.com
    
  4. us-central1-c ゾーンに cloud-trace-demo という名前の GKE クラスタを作成するには、Cloud Shell で次のコマンドを実行します。

    ZONE=us-central1-c
    gcloud container clusters create cloud-trace-demo \
       --zone $ZONE
    

    このコマンドが完了するまでに数分かかります。正常に完了すると、Google Cloud プロジェクトに cloud-trace-demo という名前の GKE クラスタが含まれます。Google Cloud プロジェクトで外部アクセス権を持つクラスタを作成する権限が必要です。

  5. 次のコマンドを実行して、GKE クラスタの認証情報を更新します。

    gcloud container clusters get-credentials cloud-trace-demo --zone $ZONE
    
  6. 次のコマンドを実行して、クラスタへのアクセスを確認します。

    kubectl get nodes
    

    このコマンドの出力例は次のとおりです。

    NAME                                              STATUS   ROLES    AGE   VERSION
    gke-cloud-trace-demo-default-pool-063c0416-113s   Ready    <none>   78s   v1.22.12-gke.2300
    gke-cloud-trace-demo-default-pool-063c0416-1n27   Ready    <none>   79s   v1.22.12-gke.2300
    gke-cloud-trace-demo-default-pool-063c0416-frkd   Ready    <none>   78s   v1.22.12-gke.2300
    
  7. 次のコマンドを実行して、サンプル アプリケーションをデプロイします。

    cd python-docs-samples/trace/cloud-trace-demo-app-opentelemetry && ./setup.sh
    

    スクリプト setup.sh は、ビルド済みのイメージを使用してアプリケーションの 3 つのサービスを構成します。ワークロードの名前は cloud-trace-demo-acloud-trace-demo-bcloud-trace-demo-c です。設定スクリプトはすべてのリソースがプロビジョニングされるのを待機するため、構成が完了するまでに数分かかることがあります。

    このコマンドの出力例は次のとおりです。

    deployment.apps/cloud-trace-demo-a is created
    service/cloud-trace-demo-a is created
    deployment.apps/cloud-trace-demo-b is created
    service/cloud-trace-demo-b is created
    deployment.apps/cloud-trace-demo-c is created
    service/cloud-trace-demo-c is created
    
    Wait for load balancer initialization complete......
    Completed. You can access the demo at http://34.82.132.95/
    

トレースを作成する

1 件のトレースは、アプリケーションが 1 つのオペレーションを完了するまでにかかる時間を表します。各トレースは、1 つ以上のスパンから構成されます。1 つのスパンは、1 つのサブオペレーション全体の実行にかかる時間を表します。たとえば、ユーザーから受信リクエストを処理してレスポンスを返すまでにかかる時間を 1 件のトレースで表すことができます。スパンは、特定の RPC 呼び出しに必要な時間を表す場合もあります。詳細については、Cloud Trace のデータモデルをご覧ください。

curl リクエストを cloud-trace-demo-a に送信してトレースを作成するには、次のコマンドを使用します。

curl $(kubectl get svc -o=jsonpath='{.items[?(@.metadata.name=="cloud-trace-demo-a")].status.loadBalancer.ingress[0].ip}')

curl コマンドを複数回実行すると、複数のトレースを生成できます。

出力は次のようになります。

Hello, I am service A
And I am service B
Hello, I am service C

トレースデータを表示する

Google Cloud コンソールで [Cloud Trace] を選択するか、次のボタンをクリックします。

[トレース] に移動

概要ウィンドウ

[概要] ウィンドウが Trace のデフォルト ビューです。 このウィンドウには、分析レポートなどのレイテンシ データとサマリー情報が表示されます。新しいプロジェクトを作成した場合、[概要] ウィンドウの最も興味深いペインは [最近のトレース] というラベルが付いたペインです。

[最近のトレース] ペイン。最新のトレースとそのレイテンシが表示されます。

このペインには、最新のトレースとそのレイテンシが一覧表示されます。トレースの詳細を表示するには、当該トレースのリンクをクリックします。

トレースリスト ウィンドウ

[トレース] ナビゲーション ペインで、[ トレースリスト] をクリックします。

クイックスタートのトレースリスト ウィンドウ。

このウィンドウにはグラフと表が表示されます。グラフ上の各ドットはトレースを表します。各ドットはテーブルの行と対応します。上のスクリーンショットでは、curl コマンドが複数回実行されていることを示す複数のトレースが表示されています。

トレースを詳細に表示するには、グラフ内のドットまたは表内の行を選択します。

5 つのスパンを表示するウォーターフォール ディスプレイ。

ドットを選択すると、各行がスパンに対応するウォーターフォール グラフが表示されます。トレースラベル、メソッド、コマンド レイテンシに関する概要情報など、スパンの詳細が詳細テーブルに表示されます。スパンについての詳細を表示するには、ウォーターフォール グラフで対応する行をクリックします。

各スパンのその他の詳細が詳細ペインに表示されます。

分析レポート ウィンドウ

レポートを表示または作成するには、[トレース] ナビゲーション パネルで [分析レポート] をクリックします。トレースにより日次レポートが自動的に作成されます。このプロジェクトの場合、新しいレポートを作成するのに十分なデータがありません。

アプリケーションの概要

このクイックスタートで使用するサンプル アプリケーションは、GitHub リポジトリで入手できます。このリポジトリには、Cloud Shell 以外の環境でアプリケーションを使用する方法に関する情報が含まれています。サンプル アプリケーションは Python で記述されており、Flask フレームワークと OpenTelemetry パッケージを使用して、Google Kubernetes Engine クラスタ上で実行されます。

インストゥルメンテーション

GitHub リポジトリのファイル app.py には、トレースデータをキャプチャして Google Cloud プロジェクトに送信するために必要なインストゥルメンテーションが含まれています。

  • このアプリケーションは、複数の OpenTelemetry パッケージをインポートします。

    from opentelemetry import trace
    from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
    from opentelemetry.instrumentation.flask import FlaskInstrumentor
    from opentelemetry.instrumentation.requests import RequestsInstrumentor
    from opentelemetry.propagate import set_global_textmap
    from opentelemetry.propagators.cloud_trace_propagator import CloudTraceFormatPropagator
    from opentelemetry.sdk.trace import TracerProvider
    from opentelemetry.sdk.trace.export import BatchSpanProcessor
  • このアプリケーションは、トレース コンテキストを使用してウェブ リクエストをインストゥルメント化し、Flask ハンドラとリクエストを他のサービスに自動的にトレースします。

    app = flask.Flask(__name__)
    FlaskInstrumentor().instrument_app(app)
    RequestsInstrumentor().instrument()
  • このアプリケーションでは、Cloud Trace エクスポータをトレース プロバイダとして構成し、トレース コンテキストを Cloud Trace 形式で伝播します。

    def configure_exporter(exporter):
        set_global_textmap(CloudTraceFormatPropagator())
        tracer_provider = TracerProvider()
        tracer_provider.add_span_processor(BatchSpanProcessor(exporter))
        trace.set_tracer_provider(tracer_provider)
    
    configure_exporter(CloudTraceSpanExporter())
    tracer = trace.get_tracer(__name__)
  • 次のコード スニペットは、Python でリクエストを送信する方法を示しています。OpenTelemetry は、送信リクエストとともにトレース コンテキストを暗黙的に伝播します。

    if endpoint is not None and endpoint != "":
        data = {'body': keyword}
        response = requests.get(
            endpoint,
            params=data,
        )
        return keyword + "\n" + response.text
    else:
        return keyword, 200

アプリケーションの仕組み

わかりやすくするために、このセクションではサービス名から cloud-trace-demo を省略しています。たとえば、サービス cloud-trace-demo-cc として参照されます。

このアプリケーションは、abc という名前の 3 つのサービスを作成します。サービス a はサービス b を呼び出すように構成され、サービス b はサービス c を呼び出すように構成されています。サービスの構成の詳細については、GitHub リポジトリの YAML ファイルをご覧ください。

このクイックスタートでサービス a に HTTP リクエストを発行したときに、次の curl コマンドを使用しました。

curl $(kubectl get svc -o=jsonpath='{.items[?(@.metadata.name=="cloud-trace-demo-a")].status.loadBalancer.ingress[0].ip}')

curl コマンドは次のように動作します。

  1. kubectl によって、cloud-trace-demo-a という名前のサービスの IP アドレスが取得されます。
  2. 次に、curl コマンドによってサービス a に HTTP リクエストが送信されます。
  3. サービス a は HTTP リクエストを受信し、サービス b にリクエストを送信します。
  4. サービス b は HTTP リクエストを受信し、サービス c にリクエストを送信します。
  5. サービス c はサービス b から HTTP リクエストを受信し、文字列 Hello, I am service C をサービス b に返します。
  6. サービス b はサービス c からレスポンスを受信し、それを文字列 And I am service B に追加して、結果をサービス a に返します。
  7. サービス a はサービス b からレスポンスを受信し、それを文字列 Hello, I am service A に追加します。
  8. サービス a からのレスポンスが Cloud Shell に出力されます。

クリーンアップ

このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。

  • このクイックスタートで新しい Google Cloud プロジェクトを作成した場合は、課金が発生しないようにプロジェクトを削除します。プロジェクトを削除するには、次の手順を行います。

    1. Google Cloud Console で [ナビゲーション メニュー] をクリックし、[ホーム] を選択します
    2. [プロジェクト情報] ペインで、[プロジェクト設定に移動] をクリックします。
    3. [設定] ウィンドウで [シャットダウン] をクリックし、残りの手順を完了します。
  • このクイックスタートで新しい Google Cloud プロジェクトを作成しなかった場合は、次のコマンドを実行して cloud-trace-demo という名前の Google Kubernetes Engine クラスタを削除します。

    gcloud container clusters delete cloud-trace-demo --zone $ZONE
    

次のステップ