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

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

  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

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 件のtraceは、アプリケーションが 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 エクスプローラ] ウィンドウ。

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

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

    ガントチャートには、選択したトレースに関する情報が表示されます。Gantt グラフの最初の行はトレース用であり、トレース内の各スパンにそれぞれ 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

次のステップ