マイクロサービス オブザーバビリティを使用して Google Cloud で gRPC アプリケーションを設定する

マイクロサービスのオブザーバビリティ ツールを使用すると、アプリケーションを計測して、 Google Cloud やその他の場所にデプロイされた gRPC ワークロードからテレメトリー データを収集し、Cloud Monitoring、Cloud Logging、Cloud Trace で表示できるようになります。マイクロサービス オブザーバビリティは、Microservices API を有効にすることで、Monitoring、Logging、Trace へのアクセスが許可されている Deployment に対応しています。

このチュートリアルでは、Compute Engine を使用して Google Cloud でシンプルな gRPC アプリケーションをビルドすることでマイクロサービス オブザーバビリティ機能を使用し、マイクロサービス オブザーバビリティでアプリケーションを計測して Monitoring と Logging でライブ表示する方法を学習します。

Compute Engine VM を作成して接続する

Compute Engine VM インスタンスを作成して接続する手順は次のとおりです。VM でアプリケーションをデプロイし、マイクロサービス オブザーバビリティを使用してアプリケーションを計測します。

  1. VM インスタンスを作成します。

    gcloud compute instances create grpc-observability-vm \
      --image-family=debian-11 \
      --image-project=debian-cloud \
      --service-account=SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
    
  2. VM インスタンスに接続します:

    gcloud compute ssh --project=$PROJECT_ID grpc-observability-vm
    

アプリケーションを Compute Engine VM にデプロイする

前のステップで作成した Compute Engine VM に任意のアプリケーションをデプロイしてこのステップをスキップするか、サンプルを使用して任意の言語で手順を続行できます。

C++

  1. VM インスタンスに接続したら、次のコマンドを実行します。

    sudo apt-get update -y
    sudo apt-get install -y git build-essential clang
    git clone -b v1.54.0 https://github.com/grpc/grpc.git --depth=1
    

Go

  1. Go がインストールされていることを確認します。

    sudo apt-get install -y git
    sudo apt install wget
    wget https://go.dev/dl/go1.20.2.linux-amd64.tar.gz
    sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf \
    go1.20.2.linux-amd64.tar.gz
    export PATH=$PATH:/usr/local/go/bin
    
  2. gRPC-Go サンプルのクローンを作成します。

    git clone https://github.com/grpc/grpc-go.git
    cd grpc-go/
    git checkout -b run-observability-example
    875c97a94dca8093bf01ff2fef490fbdd576373d
    

Java

  1. VM インスタンスに接続したら、Java 8 以降がインストールされていることを確認します。

    sudo apt update
    sudo apt upgrade
    sudo apt install git
    sudo apt-get install -y openjdk-11-jdk-headless
    
  2. grpc-java リポジトリのクローンを作成します。

    export EXAMPLES_VERSION=v1.54.1
    git clone -b $EXAMPLES_VERSION --single-branch --depth=1 \
    https://github.com/grpc/grpc-java.git
    

gRPC Google Cloud Observability 構成ファイルを作成する

サーバーとクライアントの両方でマイクロサービス オブザーバビリティを有効にするには、個別の gRPC Google Cloud Observability 構成ファイルが必要です。このファイルの場所は、後のステップで GRPC_GCP_OBSERVABILITY_CONFIG_FILE としてエクスポートされます。次の手順で、構成ファイルでさまざまなパラメータを設定します。

GRPC_GCP_OBSERVABILITY_CONFIG_FILE

{
  "project_id": "your-project-here",
  "cloud_logging": {
    "client_rpc_events": [
    {
      "methods": ["google.pubsub.v1.Subscriber/Acknowledge", "google.pubsub.v1.Publisher/CreateTopic"],
      "exclude": true,
    },
    {
      "methods": ["google.pubsub.v1.Subscriber/*", "google.pubsub.v1.Publisher/*"],
      "max_metadata_bytes": 4096,
      "max_message_bytes": 4096,
    }],
    "server_rpc_events": [{
      "methods": ["*"],
      "max_metadata_bytes": 4096,
      "max_message_bytes": 4096
    }],
  },
  "cloud_monitoring": {},
  "cloud_trace": {
    "sampling_rate": 0.5,
  }
  "labels": {
    "SOURCE_VERSION": "J2e1Cf",
    "SERVICE_NAME": "payment-service-1Cf",
    "DATA_CENTER": "us-west1-a"
  }
}

以下の各セクションでは、個別のコンポーネントの構成でデータ収集を有効にする手順について説明します。このチュートリアルで gRPC の例を使用した場合は、この構成をそのまま使用できます(your-project-here を更新した後)。または、アプリケーションのテンプレートとして使用することもできます。環境変数の構成情報を示す例もご覧ください。

指標を有効にする

指標を有効にするには、構成に cloud_monitoring オブジェクトを追加して、値を {} に設定します。

指標の詳細については、指標の定義をご覧ください。

トレースを有効にする

トレースを有効にするには、次の操作を行います。

  1. 構成に cloud_trace オブジェクトを追加します。
  2. cloud_trace.sampling_rate0.5 に設定して、RPC の 50% をランダムにトレースします。

サービス間のトレースを有効にする場合は、アップストリームから受信した(または単独で開始した)トレース コンテキストをダウンストリームに伝播することをサービスでサポートする必要があります。

トレースの詳細については、トレースの定義をご覧ください。

ロギングを有効にする

ロギングを有効にするには、次の操作を行います。

  1. 構成に cloud_logging オブジェクトを追加します。
  2. client_rpc_eventsserver_rpc_events のいずれか、または両方にパターンを追加して、トランスポート レベルのイベントログを生成する一連のサービスとメソッドを指定します。また、ヘッダーとメッセージに記録するバイト数も指定します。

ロギングの詳細については、ログレコードの定義をご覧ください。

オブザーバビリティ プラグイン用にアプリケーションを計測する

アプリケーションを計測してマイクロサービス オブザーバビリティ プラグインを使用できるようにするには、ご使用の言語で次の手順を行います。

C++

gRPC C++ v1.54 では、マイクロサービス オブザーバビリティで C++ を使用できます。サンプル リポジトリは GitHub にあります。

  1. オブザーバビリティのサポートは、Bazel ビルドシステムでのみ使用できます。ターゲット grpcpp_gcp_observability を依存関係として追加します。

  2. マイクロサービス オブザーバビリティを有効にするには、追加の依存関係(オブザーバビリティ モジュール)が必要です。また、既存の gRPC クライアント、サーバー、またはその両方で次のコード変更を行う必要があります。

    #include <grpcpp/ext/gcp_observability.h>
    
    int main(int argc, char** argv) {
      auto observability = grpc::GcpObservability::Init();
      assert(observability.ok());
      
      // Observability data flushed when object goes out of scope
    }
    

    gRPC オペレーション(チャネル、サーバー、認証情報の作成など)を行う前に、次の呼び出しを行います。

    grpc::GcpObservability::Init();
    

    absl::StatusOr<GcpObservability> が返されます。これは保存する必要があります。ステータスは、オブザーバビリティが正常に初期化されたかどうかを判断するのに役立ちます。 付属の GcpObservability オブジェクトはオブザーバビリティの存続期間を制御します。オブザーバビリティ データは対象範囲外になると、自動的に閉じてフラッシュします。

Go

  1. マイクロサービス オブザーバビリティ プラグインは、gRPC Go バージョン v1.54.0 以降でサポートされています。サンプル リポジトリは GitHub にあります。

Go モジュールでマイクロサービス オブザーバビリティを有効にするには、オブザーバビリティ モジュールと次のコードが必要です。

import "google.golang.org/grpc/gcp/observability"

func main() {
  ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  defer cancel()
  if err := observability.Start(ctx); err != nil {
    log.Warning("Unable to start gRPC observability:", err)
  }
  defer observability.End()
  
}

observability.Start 呼び出しは、環境変数から構成を解析し、それに応じてエクスポータを作成します。さらに、呼び出し後に作成されたクライアント接続とサーバーに収集ロジックを挿入します。遅延 observability.End 呼び出しにより、リソースがクリーンアップされ、アプリケーションを閉じる前にバッファ内のデータがフラッシュされます。

アプリケーション コードを更新したら、次のコマンドを実行して go.mod ファイルを更新します。

go mod tidy

Java

Java アプリケーションでマイクロサービス オブザーバビリティを使用するには、ビルドを変更して grpc-gcp-observability アーティファクトを追加します。gRPC バージョン 1.54.1 以降を使用します。

[Gradle] セクションと [Maven build tool] セクションのビルド スニペットで、grpcVersion が値 1.54.1 に設定されています。

サンプル リポジトリは GitHub にあります。

  1. Java アプリケーションをマイクロサービス オブザーバビリティで正しく計測するには、次のコードを main() に追加します。
...
import io.grpc.gcp.observability.GcpObservability;
...

// Main application class
...

public static void main(String[] args) {
...
  // call GcpObservability.grpcInit() to initialize & get observability
  GcpObservability observability = GcpObservability.grpcInit();

...
  // call close() on the observability instance to shutdown observability
  observability.close();
...
}

gRPC チャネルまたはサーバーを作成する前に、GcpObservability.grpcInit() を呼び出す必要があります。GcpObservability.grpcInit() 関数は、マイクロサービス オブザーバビリティ構成を読み取り、読み取った構成を使用して、作成された各チャネルとサーバーのロギング、指標、トレース機能に必要なグローバル インターセプターとトレーサーを設定します。GcpObservability.grpcInit() はスレッドセーフで、1 回だけ呼び出す必要があります。GcpObservability のインスタンスを返します。これは、close() の呼び出しを後で行うために保存する必要があります。

GcpObservability.close() はリソースの割り当てを解除します。それ以降に作成されたチャネルまたはサーバーはロギングを行いません。

GcpObservabilityjava.lang.AutoCloseable を実装します。これは、次のように try-with-resource を使用すると自動的に終了します。

...
import io.grpc.gcp.observability.GcpObservability;
...

// Main application class
...

public static void main(String[] args) {
...
  // call GcpObservability.grpcInit() to initialize & get observability
  try (GcpObservability observability = GcpObservability.grpcInit()) {

...
  } // observability.close() called implicitly
...
}

Gradle ビルドツールを使用する

Gradle ビルドツールを使用する場合は、次のものを含めます。

def grpcVersion = '1.54.1'

...

dependencies {
...
implementation "io.grpc:grpc-gcp-observability:${grpcVersion}"
...
}

Maven ビルドツール(pom.xml)を使用する

Maven ビルドツールを使用する場合は、次のものを含めます。

<properties>
...
<grpc.version>1.54.1</grpc.version>
...
</properties>

...

<dependencies>
...
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-gcp-observability</artifactId>
<version>${grpc.version}</version>
</dependency>
...
</dependencies>

アプリケーションの実行

このセクションの手順は、チュートリアルで gRPC の例を使用した場合のみ行ってください。run コマンドを変更して、アプリケーション バイナリをターゲットにできます。

サーバーを実行する

C++

  1. VM への SSH セッションを作成します。
  2. 環境変数をエクスポートします。上記で定義した手順を使用して server_config.json を作成します。

      export GOOGLE_CLOUD_PROJECT=$PROJECT_ID
      export GRPC_GCP_OBSERVABILITY_CONFIG_FILE="$(pwd)/examples/cpp/gcp_observability/helloworld/server_config.json"
    
  3. サーバー アプリケーション shell cd grpc tools/bazel run examples/cpp/gcp_observability/helloworld:greeter_server を実行します。

Go

  1. VM への SSH セッションを作成します。
  2. 環境変数をエクスポートします。上記で定義した手順を使用して server_config.json を作成します。

    export GRPC_GCP_OBSERVABILITY_CONFIG_FILE=./server/serverConfig.json
    
  3. サーバー アプリケーション shell go run ./server/main.go を実行します。

Java

  1. サンプル ディレクトリで README ファイルを開き、ファイルの指示に従います。
  2. 別のターミナル ウィンドウを開くよう指示された場合は、次のコマンドを実行します。shell gcloud compute ssh --project=$PROJECT_ID grpc-observability-vm

クライアントを実行する

C++

  1. VM への別の SSH セッションを作成します。
  2. 環境変数をエクスポートします。上記で定義した手順に沿って client_config.json ファイルを作成します。

      export GOOGLE_CLOUD_PROJECT=$PROJECT_ID
      export GRPC_GCP_OBSERVABILITY_CONFIG_FILE="$(pwd)/examples/cpp/gcp_observability/helloworld/client_config.json"
    
  3. クライアント アプリケーションを実行する

    cd grpc
    tools/bazel run examples/cpp/gcp_observability/helloworld:greeter_client
    

Go

  1. VM への別の SSH セッションを作成します。
  2. 環境変数をエクスポートします。上記で定義した手順に沿って client_config.json ファイルを作成します。shell export GRPC_GCP_OBSERVABILITY_CONFIG_FILE=./client/clientConfig.json
  3. クライアント アプリケーションを実行する

    cd grpc-go/examples/features/observability
    go run ./client/main.go
    

Java

  1. サンプル ディレクトリで README ファイルを開き、ファイルの指示に従います。
  2. 別のターミナル ウィンドウを開くよう指示された場合は、次のコマンドを実行します。shell gcloud compute ssh --project=$PROJECT_ID grpc-observability-vm