アプリ リクエストのレイテンシを表示する

アプリケーションからレイテンシ データを収集して表示する方法を学習します。

  1. Google Cloud CLI を使用して Google Kubernetes Engine(GKE)クラスタを作成する。

  2. サンプル アプリケーションをダウンロードして、クラスタにデプロイします。

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

  4. 作成したトレースのレイテンシ情報を表示します。

  5. クリーンアップする。


このタスクを Google Cloud コンソールで直接行う際の順を追ったガイダンスについては、「ガイドを表示」をクリックしてください。

ガイドを表示


始める前に

  1. 組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。

  2. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  3. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  4. Make sure that billing is enabled for your Google Cloud project.

  5. Enable the Google Kubernetes Engine and Cloud Trace APIs.

    Enable the APIs

  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  7. Make sure that billing is enabled for your Google Cloud project.

  8. Enable the Google Kubernetes Engine and Cloud Trace APIs.

    Enable the APIs

  9. GKE クラスタを作成する

    このガイドでは、標準の GKE クラスタを作成します。Google Kubernetes Engine で Autopilot モードを使用している場合、または Workload Identity Federation for GKE を有効にしている場合は、Workload Identity Federation for GKE を使用するようにアプリケーションを構成する必要があります。

    1. ツールバーで、[Cloud Shell をアクティブにする] をクリックして、Cloud Shell で次の操作を行います。

    2. クラスタを作成します。

      gcloud container clusters create cloud-trace-demo --zone us-central1-c
      

      上記のコマンド(完了するまでに数分かかる)により、us-central1-c ゾーンに cloud-trace-demo という名前の標準クラスタが作成されます。

    3. Google Cloud CLI と同じ ID を使用する認証情報を自動的に更新するように kubectl を構成します。

      gcloud container clusters get-credentials cloud-trace-demo --zone us-central1-c
      
    4. クラスタへのアクセスを確認します。

      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
      

    アプリケーションをダウンロードしてデプロイする

    Flask フレームワークと OpenTelemetry パッケージを使用する Python アプリケーションをダウンロードして、デプロイします。このアプリケーションについては、このページのアプリについてのセクションをご覧ください。

    Cloud Shell で次の操作を行います。

    1. GitHub から Python アプリのクローンを作成します。

      git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
      
    2. 次のコマンドを実行して、サンプル アプリケーションをデプロイします。

      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.
      

    トレースデータを作成する

    1 件のトレースは、アプリケーションが 1 つのオペレーションを完了するまでにかかる時間を表します。

    Cloud Shell でトレースを作成するには、次のコマンドを実行します。

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

    上記のコマンドのレスポンスは次のようになります。

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

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

    レイテンシ データを表示する

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

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

      このページは、検索バーを使用して見つけることもできます。

      次のスクリーンショットは、curl コマンドを複数回実行した結果を示しています。グラフには、トレースのサブオペレーションを表すスパンの集計レイテンシ データが表示されます。

      クイックスタート用の [Trace エクスプローラ] ウィンドウ。

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

      次のスクリーンショットに示すように、トレースの詳細ダイアログが開きます。

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

      ガントチャートには、選択したトレースに関する情報が表示されます。ガントチャートの最初の行はトレース用であり、その後の行はトレース内のスパンです。

    3. スパンに関する詳細情報を表示するには、ガントチャートでスパンを選択します。

    アプリケーションの概要

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

    このガイドでは、標準の GKE クラスタを作成します。Google Kubernetes Engine で Autopilot モードを使用している場合、または Workload Identity Federation for GKE を有効にしている場合は、Workload Identity Federation for GKE を使用するようにアプリケーションを構成する必要があります。

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

    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):
          """Configures OpenTelemetry context propagation to use Cloud Trace context
      
          Args:
              exporter: exporter instance to be configured in the OpenTelemetry tracer provider
          """
          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 アカウントに課金されないようにするには、次の手順を実施します。

新しいプロジェクトを作成し、プロジェクトが必要でなくなった場合は、プロジェクトを削除します。

既存のプロジェクトを使用した場合は、次のようにします。

  1. クラスタを削除するには、Cloud Shell で次のコマンドを実行します。

    gcloud container clusters delete cloud-trace-demo --zone us-central1-c

次のステップ