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

リモート環境ラベル:

  • csm.remote_workload_type
    • リモートピアのタイプ。(GKE の場合は「gcp_kubernetes_engine」)。
  • ピアのタイプによっては、追加の属性が存在します。
    • GKE で実行されているピアの場合:
    • csm.remote_workload_project_id
      • 「my-project」など、このリソースに関連付けられているプロジェクトの ID。
    • 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 名など)。

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

  • csm.service_name
    • サービス名。
  • csm.service_namespace_name
    • サービス Namespace 名。

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 Observability を設定する方法を示しています。

  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 Observability が有効になります。

    次の例は、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 や Server の作成、認証情報の作成など、gRPC オペレーションを行う前に、MeterProvider を使用して Cloud Service Mesh Observability をグローバルに構成します。次のサンプルは、Cloud Service Mesh オブザーバビリティを設定する方法を示しています。Cloud Service MeshObservability を設定すると、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 Observability を設定する方法を示しています。

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 Observability によって報告された指標を取得できます。

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

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

仕様の変更

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

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 は、ワークロード名(デプロイ名など)に置き換えます。