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

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

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

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

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

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

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


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

ガイドを表示


始める前に

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

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

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

  4. Google Cloud プロジェクトで課金が有効になっていることを確認します

  5. Google Kubernetes Engine and Cloud Trace API を有効にします。

    API を有効にする

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

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

  7. Google Cloud プロジェクトで課金が有効になっていることを確認します

  8. Google Kubernetes Engine and Cloud Trace API を有効にします。

    API を有効にする

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 エクスプローラ] を選択します。

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

    各トレースは、グラフ上のドットと表内の行で表されます。

    次のスクリーンショットは、複数のトレースを示しています。

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

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

    散布図が更新され、選択したドットが円で囲まれてハイライト表示されます。他のすべてのトレースを表す他のすべてのドットはグレー表示されます。

    ガントチャートには、選択したトレースに関する情報が表示されます。ガントチャートの最初の行はトレース用であり、トレース内の各スパンに対して 1 行が存在します。1 つのスパンは、1 つのサブオペレーション全体の実行にかかる時間を表します。

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

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

アプリケーションの概要

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

次のステップ