Kemampuan observasi untuk gRPC tanpa proxy

Observabilitas Cloud Service Mesh untuk gRPC tanpa proxy dibuat berdasarkan plugin OpenTelemetry gRPC yang ada, mencatat metrik (latensi, ukuran pesan, dll.) untuk semua saluran dan server gRPC yang mengaktifkan Cloud Service Mesh, dan memberikan atribut tambahan yang menampilkan informasi mesh topologi untuk traffic Cloud Service Mesh. Saluran gRPC dianggap mengaktifkan Cloud Service Mesh jika mendapatkan konfigurasi dari bidang kontrol Cloud Service Mesh, sedangkan semua server gRPC dianggap mengaktifkan Cloud Service Mesh.

Atribut Mesh

Atribut mesh berikut tersedia di metrik.

Label Lingkungan Lokal:

  • csm.mesh_id
    • ID mesh.
  • Atribut lingkungan lokal lainnya diperoleh dari Resource OpenTelemetry.
    • Managed Service for Prometheus (GMP) dapat disiapkan untuk menggunakan infrastruktur Google guna menyimpan metrik. Jika menggunakan ini, atribut resource yang mendeskripsikan lingkungan lokal aplikasi akan otomatis ditambahkan sebagai MonitoredResource.
    • Jika menggunakan infrastruktur non-Google untuk mengekspor dan menyimpan metrik, pipeline pengumpulan harus menambahkan atribut pada metrik yang menjelaskan lingkungan tempat aplikasi berjalan.

Label Lingkungan Jarak Jauh:

  • csm.remote_workload_type
    • Jenis peer jarak jauh. ("gcp_kubernetes_engine" untuk GKE).
  • Berdasarkan jenis peer, atribut tambahan akan ada.
    • Untuk peer yang berjalan di GKE -
    • csm.remote_workload_project_id
      • ID project yang terkait dengan resource ini, seperti "my-project".
    • csm.remote_workload_location *Lokasi fisik cluster yang berisi penampung.
    • csm.remote_workload_cluster_name
      • Cluster tempat penampung berjalan.
    • csm.remote_workload_namespace_name
      • The namespace where the container is running.
    • csm.remote_workload_name
      • Nama beban kerja jarak jauh. Ini harus berupa nama objek yang berisi definisi Pod (misalnya, Deployment, ReplicaSet, atau hanya nama Pod untuk Pod biasa).

Label Layanan: Informasi tentang layanan backend (cluster xDS) yang menjadi tujuan RPC. Perhatikan bahwa opsi ini hanya tersedia jika layanan backend telah dikonfigurasi melalui Gateway API.

  • csm.service_name
    • Nama layanan.
  • csm.service_namespace_name
    • Nama namespace layanan.

Istilah remote_workload mengacu pada peer, yaitu, untuk klien, Pod server yang menjadi target RPC adalah workload jarak jauh, sedangkan untuk server, Pod klien yang memulai RPC adalah workload jarak jauh.

Perhatikan bahwa atribut ini tidak akan tersedia di grpc.client.attempt.started dan grpc.server.call.started karena semua informasi mesh topologi tidak tersedia di titik pengumpulan metrik ini.

Petunjuk penyiapan kemampuan observasi

Bagian ini menjelaskan cara mengaktifkan Observasi Cloud Service Mesh untuk gRPC tanpa proxy pada penyiapan mesh layanan.

C++

Dukungan observasi hanya tersedia melalui sistem build Bazel. grpcpp_csm_observability target harus ditambahkan sebagai dependensi.

Perubahan kode yang diperlukan

Kode berikut perlu ditambahkan ke klien dan server gRPC Anda untuk menggunakan kemampuan observasi Cloud Service Mesh.

#include <grpcpp/ext/csm_observability.h>

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

Sebelum operasi gRPC apa pun, termasuk membuat saluran, server, atau kredensial, gunakan CsmObservabilityBuilder API untuk mendaftarkan plugin. Contoh berikut menunjukkan cara menyiapkan Observabilitas Cloud Service Mesh dengan eksportir Prometheus.

  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();

SetMeterProvider() API di CsmObservabilityBuilder() memungkinkan pengguna menetapkan objek MeterProvider yang dapat dikonfigurasi dengan eksportir.

Java

Untuk mengaktifkan Observabilitas Cloud Service Mesh untuk aplikasi gRPC Java, lakukan langkah-langkah berikut:

  1. Pastikan project menyertakan artefak grpc-gcp-csm-observability. Gunakan gRPC versi 1.65.0 atau yang lebih baru.

  2. Dalam metode main(), lakukan inisialisasi Observabilitas Cloud Service Mesh dengan menyediakan instance OpenTelemetry SDK yang dikonfigurasi dengan MeterProvider untuk mengumpulkan dan mengekspor metrik.

    Sebelum Anda melakukan operasi gRPC seperti menyiapkan saluran atau server, pastikan untuk menggunakan CsmObservability.Builder() API untuk mendaftarkan OpenTelemetry SDK.

    Setelah instance CsmObservability dibuat, memanggil registerGlobal() pada instance akan mengaktifkan Observasi Cloud Service Mesh untuk semua saluran dan server Cloud Service Mesh.

    Contoh berikut menunjukkan cara menyiapkan Observabilitas Cloud Service Mesh menggunakan eksportir Prometheus.

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

Sebelum operasi gRPC, termasuk membuat ClientConn atau Server, atau kredensial, konfigurasikan Observabilitas Cloud Service Mesh secara global dengan MeterProvider. Contoh berikut menunjukkan cara menyiapkan Observabilitas Cloud Service Mesh. Setelah menyiapkan Cloud Service MeshObservability, semua Cloud Service Mesh Channel dan semua server akan mengambil plugin statistik OpenTelemetry yang dikonfigurasi dengan opsi yang disediakan dan dengan Label Cloud Service Mesh tambahan. Saluran Non-Cloud Service Mesh akan mendapatkan plugin statistik OpenTelemetry tanpa Label 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

Dependensi gRPC berikut diperlukan untuk Observabilitas Cloud Service Mesh:

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

Sebelum operasi gRPC, termasuk membuat saluran, server, atau kredensial, gunakan CsmOpenTelemetryPlugin API untuk membuat dan mendaftarkan plugin:

import grpc_csm_observability

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

# Create server or client 

Setelah semua operasi gRPC, gunakan kode berikut untuk membatalkan pendaftaran dan membersihkan resource:

csm_plugin.deregister_global()

Contoh berikut menunjukkan cara menyiapkan Observabilitas Cloud Service Mesh dengan eksportir Prometheus:

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()

Pada contoh sebelumnya, Anda dapat meng-scrape localhost:9464/metrics untuk mendapatkan metrik yang dilaporkan oleh Observasi Cloud Service Mesh.

Perhatikan bahwa agar atribut mesh yang ditambahkan ke metrik gRPC berfungsi, biner klien dan server harus disiapkan dengan CsmObservability.

Jika menggunakan infrastruktur non-Google untuk mengekspor dan menyimpan metrik, pipeline pengumpulan harus menambahkan atribut pada metrik yang menjelaskan lingkungan tempat aplikasi berjalan. Hal ini beserta atribut mesh yang dijelaskan sebelumnya dapat digunakan untuk mendapatkan tampilan traffic yang berjalan di mesh.

Perubahan spesifikasi

Observabilitas Cloud Service Mesh menentukan informasi topologi mesh melalui variabel lingkungan yang perlu ditambahkan ke env penampung, baik untuk klien maupun server. Informasi ini disediakan untuk peer untuk pelaporan metrik melalui Kemampuan Observasi 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

Mengganti kode berikut:

  • IMAGE_NAME dengan nama image.
  • CONTAINER_NAME dengan nama penampung.
  • CSM_WORKLOAD_NAME dengan nama beban kerja, misalnya nama deployment.