プロキシレス gRPC のオブザーバビリティ

プロキシレス gRPC の Cloud Service Mesh オブザーバビリティは、既存の gRPC OpenTelemetry プラグイン上に構築され、Cloud Service Mesh が有効なすべての gRPC チャネルとサーバーの指標(レイテンシ、メッセージ サイズなど)を記録します。そして、Cloud Service Mesh トラフィックのトポロジ メッシュ情報を示す追加属性を提供します。gRPC チャネルは、Cloud Service Mesh コントロール プレーンから構成を取得した場合に Cloud Service Mesh が有効になっていると見なされます。一方、すべての gRPC サーバーは Cloud Service Mesh が有効になっていると見なされます。

メッシュ属性

指標では、次のメッシュ属性を使用できます。

ローカル環境ラベル:

  • csm.mesh_id
    • メッシュ ID。
  • 他のローカル環境属性は、OpenTelemetry リソースから取得されます。
    • Managed Service for Prometheus(GMP)では、Google インフラストラクチャを使用して指標を保存するように設定できます。これを使用すると、アプリケーションのローカル環境を記述するリソース属性が MonitoredResource として自動的に追加されます。
    • 指標のエクスポートと保存に Google 以外のインフラストラクチャを使用する場合は、収集パイプラインで、アプリケーションが実行されている環境を記述する属性を指標に追加する必要があります。

リモート環境ラベル:

  • csm.remote_workload_type
    • リモートピアのタイプ。(GKE の場合は「gcp_kubernetes_engine」)。
  • ピアのタイプに応じて、追加の属性が存在します。
    • GKE 上で動作しているピアの場合:
    • csm.remote_workload_project_id
      • このリソースに関連付けられているプロジェクトの ID(「my-project」など)。
    • csm.remote_workload_location *コンテナを含むクラスタの物理的な場所。
    • csm.remote_workload_cluster_name
      • コンテナが実行されているクラスタ。
    • csm.remote_workload_namespace_name
      • The namespace where the container is running.
    • csm.remote_workload_name
      • リモート ワークロードの名前。これは、Pod 定義を含むオブジェクトの名前にする必要があります(Deployment、ReplicaSet、または単にベア Pod の Pod 名など)。

Service ラベル: RPC が転送されるバックエンド サービス(xDS クラスタ)に関する情報。これは、バックエンド サービスが Gateway API で構成されている場合にのみ使用できます。

  • csm.service_name
    • サービス名。
  • csm.service_namespace_name
    • サービスの名前空間名。

remote_workload という用語はピアを指します。つまり、クライアントの場合、RPC のターゲットであるサーバー Pod がリモート ワークロードである一方、サーバーの場合、RPC を開始したクライアント Pod がリモート ワークロードです。

これらの指標の収集ポイントですべてのトポロジ メッシュ情報を取得できないため、これらの属性は、grpc.client.attempt.startedgrpc.server.call.started では使用できません。

オブザーバビリティの設定手順

このセクションでは、サービス メッシュ設定でプロキシレス gRPC 用に Cloud Service Mesh オブサーバビリティを有効にする方法について説明します。

C++

オブザーバビリティのサポートは、Bazel ビルドシステムでのみ使用できます。ターゲット grpcpp_csm_observability依存関係として追加する必要があります。

必要なコードの変更

Cloud Service Mesh オブザーバビリティを利用するには、次のコードを gRPC クライアントとサーバーに追加する必要があります。

#include <grpcpp/ext/csm_observability.h>

int main() {
  // …
  auto observability = grpc::CsmObservabilityBuilder()
                          .SetMeterProvider(std::move(meter_provider))
                          .BuildAndRegister();
  assert(observability.ok());
  // …
}

チャネル、サーバー、認証情報の作成など、gRPC オペレーションを行う前に、CsmObservabilityBuilder API を使用してプラグインを登録します。次のサンプルは、Prometheus エクスポータを使用して Cloud Service Mesh オブザーバビリティを設定する方法を示しています。

  opentelemetry::exporter::metrics::PrometheusExporterOptions opts;
  opts.url = "0.0.0.0:9464";
  auto prometheus_exporter =
      opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts);
  auto meter_provider =
      std::make_shared<opentelemetry::sdk::metrics::MeterProvider>();
  meter_provider->AddMetricReader(std::move(prometheus_exporter));
  auto observability = grpc:::CsmObservabilityBuilder()
                          .SetMeterProvider(std::move(meter_provider))
                          .BuildAndRegister();

CsmObservabilityBuilder()SetMeterProvider() API を使用すると、エクスポータで構成できる MeterProvider オブジェクトを設定できます。

Java

Java gRPC アプリケーションで Cloud Service Mesh オブザーバビリティを有効にするには、次の操作を行います。

  1. プロジェクトに grpc-gcp-csm-observability アーティファクトが含まれていることを確認します。gRPC バージョン 1.65.0 以降を使用します。

  2. main() メソッド内で、構成済みの OpenTelemetry SDK インスタンスに MeterProvider を指定して、指標を収集してエクスポートし、Cloud Service Mesh オブザーバビリティを初期化します。

    チャネルやサーバーの設定などの gRPC オペレーションを実行する前に、CsmObservability.Builder() API を使用して OpenTelemetry SDK を登録してください。

    CsmObservability インスタンスが作成されたら、インスタンスで registerGlobal() を呼び出すと、すべての Cloud Service Mesh チャネルとサーバーで Cloud Service Mesh オブザーバビリティが有効になります。

    次の例は、Prometheus エクスポータを使用して Cloud Service Mesh オブザーバビリティを設定する方法を示しています。

import io.grpc.gcp.csm.observability.CsmObservability;
...

public static void main(String[] args) {
    ...

    int prometheusPort = 9464;

    SdkMeterProvider sdkMeterProvider = SdkMeterProvider.builder()
        .registerMetricReader(
            PrometheusHttpServer.builder().setPort(prometheusPort).build())
        .build();

    OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder()
        .setMeterProvider(sdkMeterProvider)
        .build();

    CsmObservability observability = new CsmObservability.Builder()
        .sdk(openTelemetrySdk)
        .build();
    observability.registerGlobal();

    // ... (continue with channel and server configuration)
}

Go

ClientConn やサーバーの作成、認証情報の作成など、gRPC オペレーションを行う前に、MeterProvider を使用して Cloud Service Mesh オブザーバビリティをグローバルに構成します。次のサンプルは、Cloud Service Mesh オブザーバビリティを設定する方法を示しています。Cloud Service Mesh オブザーバビリティを設定すると、Cloud Service Mesh チャネルとすべてのサーバーが、指定されたオプションと追加の Cloud Service Mesh ラベルで構成された OpenTelemetry 統計情報プラグインを取得します。Cloud Service Mesh 以外のチャネルには、Cloud Service Mesh ラベルのない OpenTelemetry 統計情報プラグインが提供されます。

  import (
  "context"

  "google.golang.org/grpc/stats/opentelemetry"
  "google.golang.org/grpc/stats/opentelemetry/csm"

  "go.opentelemetry.io/otel/sdk/metric"
)

func main() {
  reader := metric.NewManualReader()
  provider := metric.NewMeterProvider(metric.WithReader(reader))
  opts := opentelemetry.Options{
    MetricsOptions: opentelemetry.MetricsOptions{
        MeterProvider: provider,
    },
  }
  cleanup := csm.EnableObservability(context.Background(), opts)
  defer cleanup()
  // Any created ClientConns and servers will be configured with an
  // OpenTelemetry stats plugin configured with provided options.

}

Python

Cloud Service Mesh オブザーバビリティには、次の gRPC 依存関係が必要です。

grpcio>=1.65.0
grpcio-observability>=1.65.0
grpcio-csm-observability>=1.65.0

チャネル、サーバー、認証情報の作成などの gRPC オペレーションを行う前に、CsmOpenTelemetryPlugin API を使用してプラグインの作成と登録を行います。

import grpc_csm_observability

# ...
csm_plugin = grpc_csm_observability.CsmOpenTelemetryPlugin(
    meter_provider=[your_meter_provider],
)
csm_plugin.register_global()

# Create server or client 

すべての gRPC オペレーションの完了後に、次のコードを使用してリソースの登録解除とクリーンアップを行います。

csm_plugin.deregister_global()

次のサンプルは、Prometheus エクスポータを使用して Cloud Service Mesh オブザーバビリティを設定する方法を示しています。

import grpc_csm_observability
from opentelemetry.exporter.prometheus import PrometheusMetricReader
from prometheus_client import start_http_server

start_http_server(port=9464, addr="0.0.0.0")
reader = PrometheusMetricReader()
meter_provider = MeterProvider(metric_readers=[reader])
csm_plugin = CsmOpenTelemetryPlugin(
    meter_provider=meter_provider,
)
csm_plugin.register_global()

# Clean up after use

csm_plugin.deregister_global()

上のサンプルでは、localhost:9464/metrics をスクレイピングして、Cloud Service Mesh オブザーバビリティによって報告された指標を取得できます。

gRPC 指標に追加されたメッシュ属性が機能するには、クライアント バイナリとサーバー バイナリの両方を CsmObservability で設定する必要があります。

指標のエクスポートと保存に Google 以外のインフラストラクチャを使用する場合は、収集パイプラインで、アプリケーションが実行されている環境を記述する属性を指標に追加する必要があります。これは、前述のメッシュ属性とともに、メッシュ上で実行されているトラフィックのビューを取得するために使用できます。

仕様の変更

Cloud Service Mesh オブザーバビリティは、クライアントとサーバーの両方のコンテナの env に追加する必要がある環境変数を使用して、メッシュのトポロジ情報を決定します。この情報は、Cloud Service Mesh オブザーバビリティを介して指標レポート用にピアに提供されます。

spec:
  containers:
  - image: IMAGE_NAME
    name: CONTAINER_NAME
    env:
    - name: GRPC_XDS_BOOTSTRAP
      value: "/tmp/grpc-xds/td-grpc-bootstrap.json" #created by td-grpc-bootstrap
    - name: POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
    - name: NAMESPACE_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
     - name: CSM_WORKLOAD_NAME
       value: CSM_WORKLOAD_NAME
     - name: CONTAINER_NAME
       value: CONTAINER_NAME
     - name: OTEL_RESOURCE_ATTRIBUTES
       value: k8s.pod.name=$(POD_NAME),k8s.namespace.name=$(NAMESPACE_NAME),k8s.container.name=CONTAINER_NAME

以下を置き換えます。

  • IMAGE_NAME は、イメージの名前に置き換えます。
  • CONTAINER_NAME は、コンテナの名前に置き換えます。
  • CSM_WORKLOAD_NAME は、ワークロード名(デプロイ名など)に置き換えます。