Kemampuan observasi untuk gRPC tanpa proxy

Kemampuan Observasi Cloud Service Mesh untuk gRPC tanpa proxy dibangun di atas plugin gRPC OpenTelemetry yang ada, mencatat metrik (latensi, ukuran pesan, dll.) untuk semua saluran dan server gRPC yang kompatibel dengan Cloud Service Mesh, dan menyediakan atribut tambahan yang menampilkan informasi mesh topologi untuk traffic Cloud Service Mesh. Channel gRPC dianggap diaktifkan untuk Cloud Service Mesh jika mendapatkan konfigurasi dari bidang kontrol Cloud Service Mesh, sementara semua server gRPC dianggap diaktifkan untuk 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 OpenTelemetry Resource.
    • 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 container berjalan.
    • 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 kosong).

Label Layanan: Informasi tentang layanan backend (cluster xDS) yang menjadi tujuan perutean RPC. Perhatikan bahwa 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 remote workload, sedangkan untuk server, Pod klien yang memulai RPC adalah remote workload.

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 Observabilitas Cloud Service Mesh untuk gRPC tanpa proxy pada penyiapan service mesh.

C++

Dukungan kemampuan observasi hanya tersedia melalui sistem build Bazel. Target grpcpp_csm_observability perlu 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 channel, 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(), inisialisasi Observability Cloud Service Mesh dengan menyediakan instance OpenTelemetry SDK yang dikonfigurasi dengan MeterProvider untuk mengumpulkan dan mengekspor metrik.

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

    Setelah instance CsmObservability dibuat, memanggil registerGlobal() pada instance akan mengaktifkan Observabilitas Cloud Service Mesh untuk semua channel 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 melakukan operasi gRPC apa pun, termasuk membuat ClientConn atau Server, atau kredensial, konfigurasi Observabilitas Cloud Service Mesh secara global dengan MeterProvider. Contoh berikut menunjukkan cara menyiapkan Observabilitas Cloud Service Mesh. Setelah menyiapkan Observabilitas Cloud Service Mesh, semua Channel Cloud Service Mesh dan semua server akan mengambil plugin statistik OpenTelemetry yang dikonfigurasi dengan opsi yang diberikan 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 melakukan operasi gRPC apa pun, 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 Observabilitas 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. Bersama dengan atribut mesh yang dijelaskan sebelumnya, hal ini dapat digunakan untuk mendapatkan tampilan traffic yang berjalan di mesh.

Perubahan spesifikasi

Kemampuan Observasi Cloud Service Mesh menentukan informasi topologi mesh melalui variabel lingkungan yang perlu ditambahkan ke env container, baik untuk klien maupun server. Informasi ini tersedia 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 container.
  • CSM_WORKLOAD_NAME dengan nama workload, misalnya nama deployment.