Kemampuan observasi untuk gRPC tanpa proxy

Kemampuan Cloud Service Mesh Observability untuk build gRPC tanpa proxy berdasarkan plugin OpenTelemetry gRPC yang sudah ada, mencatat metrik (latensi, ukuran pesan, dll.) untuk semua saluran dan server gRPC yang mendukung Cloud Service Mesh, dan memberikan atribut tambahan yang menampilkan informasi mesh topologi untuk traffic Cloud Service Mesh. gRPC saluran layanan dianggap telah diaktifkan Cloud Service Mesh jika mendapat dari bidang kontrol Cloud Service Mesh, sementara semua gRPC server dianggap telah mengaktifkan Cloud Service Mesh.

Atribut Jaring

Atribut mesh berikut tersedia di metrik.

Label Lingkungan Lokal:

  • csm.mesh_id
    • ID mesh.
  • Atribut lingkungan lokal lainnya diperoleh dari Resource OpenTelemetry.
    • Layanan Terkelola untuk Prometheus (GMP) dapat disiapkan untuk menggunakan infrastruktur Google untuk menyimpan metrik. Jika menggunakan ini, atribut sumber daya yang menggambarkan lingkungan lokal aplikasi secara otomatis ditambahkan sebagai MonitoredResource.
    • Jika menggunakan infrastruktur non-Google untuk mengekspor dan menyimpan metrik, pengumpulan data harus menambahkan atribut pada metrik yang lingkungan tempat aplikasi berjalan.

Label Lingkungan Jarak Jauh:

  • csm.remote_workload_type
    • Jenis peer jarak jauh. ("gcp_kubernetes_engine" untuk GKE).
  • Berdasarkan jenis pembanding, atribut tambahan akan ada.
    • Untuk peer yang berjalan di GKE -
    • csm.remote_workload_project_id
      • ID project yang terkait dengan resource ini, misalnya "my-project".
    • csm.remote_workload_location *Lokasi fisik cluster yang berisi container.
    • csm.remote_workload_cluster_name
      • Cluster tempat container dijalankan.
    • csm.remote_workload_namespace_name
      • The namespace where the container is running.
    • csm.remote_workload_name
      • Nama workload 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 oleh RPC menjadi rute yang paling umum. Perhatikan bahwa ini hanya tersedia jika layanan backend memiliki telah dikonfigurasi melalui Gateway API.

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

Istilah {i>remote_workload<i} mengacu pada {i>peer<i}, yaitu, untuk klien, server Pod 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 yang tersedia di titik pengumpulan metrik ini.

Petunjuk penyiapan kemampuan observasi

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

C++

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

Perubahan kode yang diperlukan

Kode berikut perlu ditambahkan ke klien dan server gRPC Anda di untuk memanfaatkan 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, menggunakan CsmObservabilityBuilder API untuk mendaftarkan plugin. Contoh berikut menunjukkan cara menyiapkan Cloud Service Mesh Observability dengan Prometheus pengekspor.

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

API SetMeterProvider() di CsmObservabilityBuilder() memungkinkan pengguna untuk menetapkan MeterProvider yang dapat dikonfigurasi dengan pengekspor.

Java

Guna mengaktifkan Cloud Service Mesh Observability untuk aplikasi Java gRPC, 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(), inisialisasi Cloud Service Mesh Observability dengan menyediakan mengonfigurasi instance OpenTelemetry SDK dengan MeterProvider untuk mengumpulkan dan mengekspor metrik.

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

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

    Contoh berikut menunjukkan cara menyiapkan Cloud Service Mesh Observability menggunakan pengekspor 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, konfigurasi Cloud Service Mesh Observability secara global dengan MeterProvider. Contoh berikut menunjukkan cara menyiapkan Cloud Service Mesh Kemampuan observasi. Setelah menyiapkan Cloud Service MeshObservability, setiap Saluran Mesh Layanan Cloud dan semua server akan mengambil OpenTelemetry plugin yang dikonfigurasi dengan opsi yang disediakan dan dengan Label Mesh Layanan Cloud. Saluran Mesh Layanan Non-Cloud 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 Cloud Service Mesh Kemampuan observasi:

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

Sebelum operasi gRPC apa pun, termasuk membuat saluran, server, atau pribadi, gunakan API CsmOpenTelemetryPlugin 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 menghapus referensi:

csm_plugin.deregister_global()

Contoh berikut menunjukkan cara menyiapkan Kemampuan Observasi Cloud Service Mesh dengan pengekspor 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 melakukan scraping localhost:9464/metrics untuk mendapatkan metrik yang dilaporkan oleh Cloud Service Mesh Observability.

Perhatikan bahwa agar atribut mesh yang ditambahkan ke metrik gRPC berfungsi, baik komputer klien dan server perlu diatur dengan kemampuan CsmObservability.

Jika menggunakan infrastruktur non-Google untuk mengekspor dan menyimpan metrik, pengumpulan data harus menambahkan atribut pada metrik yang menggambarkan lingkungan tempat aplikasi berjalan. Ini beserta {i>mesh<i} yang dijelaskan sebelumnya dapat digunakan untuk mendapatkan gambaran lalu lintas yang berjalan di jala.

Perubahan spesifikasi

Kemampuan Cloud Service Mesh Observability menentukan informasi topologi mesh variabel lingkungan yang perlu ditambahkan ke env kontainer, untuk klien dan server. Informasi ini disediakan bagi rekan-rekan untuk metrik pelaporan melalui kemampuan Observasi Mesh Layanan Cloud.

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 hal berikut:

  • IMAGE_NAME dengan nama gambar.
  • CONTAINER_NAME dengan nama container.
  • CSM_WORKLOAD_NAME dengan nama workload, misalnya deployment nama.