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

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

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

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

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

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

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


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

ガイドを表示


始める前に

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

  2. アカウントにログインします Google Cloud を初めて使用する場合は、 アカウントを作成して、実際のシナリオで Google プロダクトのパフォーマンスを評価してください。 Google Cloud新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  3. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  4. If you're using an existing project for this guide, verify that you have the permissions required to complete this guide. If you created a new project, then you already have the required permissions.

  5. Verify that billing is enabled for your Google Cloud project.

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

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  8. If you're using an existing project for this guide, verify that you have the permissions required to complete this guide. If you created a new project, then you already have the required permissions.

  9. Verify that billing is enabled for your Google Cloud project.

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

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

必要なロール

Google Kubernetes Engine クラスタの作成とトレーススパンの表示に必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

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

必要な権限は、カスタム ロールや他の事前定義 ロールから取得することもできます。

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

次のステップ