無 Proxy gRPC 的觀測能力

無 Proxy 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 名稱)。

服務標籤:RPC 會導向的後端服務 (xDS 叢集) 相關資訊。請注意,只有在透過 Gateway API 設定後端服務時,才能使用這項功能。

  • csm.service_name
    • 服務名稱。
  • csm.service_namespace_name
    • 服務命名空間名稱。

「remote_workload」一詞是指對等端,也就是對用戶端而言,做為 RPC 目標的伺服器 Pod 就是遠端工作負載;對伺服器而言,啟動 RPC 的用戶端 Pod 就是遠端工作負載。

請注意,由於這些指標的收集點無法提供所有拓樸網格資訊,因此這些屬性無法在 grpc.client.attempt.startedgrpc.server.call.started 上使用。

觀測功能設定操作說明

本節說明如何在服務網格設定中,為無 Proxy gRPC 啟用 Cloud Service Mesh 觀測功能。

C++

觀測功能僅支援 Bazel 建構系統。目標 grpcpp_csm_observability 需要新增為依附元件

必要程式碼變更

您必須將下列程式碼新增至 gRPC 用戶端和伺服器,才能使用 Cloud Service Mesh 的可觀察性。

#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

在執行任何 gRPC 作業 (包括建立 ClientConn、伺服器或憑證) 之前,請使用 MeterProvider 在全球設定 Cloud Service Mesh 觀測功能。以下範例說明如何設定 Cloud Service Mesh 觀測功能。設定 Cloud Service Mesh 可觀察性後,任何 Cloud Service Mesh 管道和所有伺服器都會採用 OpenTelemetry 統計資料外掛程式,並使用提供的選項和額外的 Cloud Service Mesh 標籤進行設定。非 Cloud Service Mesh 管道會取得 OpenTelemetry 統計資料外掛程式,但不會有 Cloud Service Mesh 標籤。

  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 Observability 回報的指標。

請注意,如要將網格屬性新增至 gRPC 指標,用戶端和伺服器二進位檔都必須設定 CsmObservability。

如果使用非 Google 基礎架構匯出及儲存指標,收集管道應在指標中加入屬性,描述應用程式執行的環境。您可以利用這項功能和前面所述的網格屬性,查看在網格上執行的流量。

規格變更

Cloud Service Mesh Observability 會透過需要新增至容器 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 與工作負載名稱 (例如部署名稱)。