Observability for proxyless gRPC

התכונה 'יכולת תצפית ב-Cloud Service Mesh' ל-gRPC בלי שרת Proxy מבוססת על התוסף הקיים gRPC OpenTelemetry, מתעדת מדדים (זמן אחזור, גודל הודעות וכו') לכל הערוצים והשרתים של gRPC שמופעל בהם Cloud Service Mesh, ומספקת מאפיינים נוספים שמציגים מידע טופולוגי על התנועה ב-Cloud Service Mesh. ערוץ gRPC נחשב כערוץ שמופעל בו Cloud Service Mesh אם הוא מקבל הגדרה ממישור הבקרה של Cloud Service Mesh, בעוד שכל שרתי gRPC נחשבים כשרתים שמופעל בהם Cloud Service Mesh.

מאפייני רשת

המאפיינים הבאים של רשתות זמינים במדדים.

תוויות של סביבה מקומית:

  • csm.mesh_id
    • מזהה הרשת.
  • מאפיינים אחרים של הסביבה המקומית מתקבלים ממשאב OpenTelemetry.
    • אפשר להגדיר את השירות המנוהל ל-Prometheus‏ (GMP) כך שישתמש בתשתית של Google לאחסון מדדים. אם משתמשים בזה, מאפייני משאבים שמתארים את הסביבה המקומית של האפליקציה מתווספים באופן אוטומטי כ-MonitoredResource.
    • אם משתמשים בתשתית שלא שייכת ל-Google לייצוא ולאחסון מדדים, צינור האיסוף צריך להוסיף למדדים מאפיינים שמתארים את הסביבה שבה האפליקציה פועלת.

תוויות של סביבות מרוחקות:

  • csm.remote_workload_type
    • סוג העמית המרוחק. ‫("gcp_kubernetes_engine" ל-GKE).
  • בהתאם לסוג העמית, יוצגו מאפיינים נוספים.
    • עבור עמית שפועל ב-GKE –
    • csm.remote_workload_project_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 חשוף).

תוויות שירות: מידע על שירות לקצה העורפי (אשכול xDS) שאליו מנותב ה-RPC. הערה: האפשרות הזו זמינה רק אם שירות לקצה העורפי הוגדר באמצעות Gateway API.

  • csm.service_name
    • שם השירות.
  • csm.service_namespace_name
    • שם מרחב השמות של השירות.

המונח remote_workload מתייחס ל-peer, כלומר, עבור לקוחות, ל-Pod של השרת שהוא היעד של ה-RPC, ואילו עבור שרתים, ל-Pod של הלקוח שיזם את ה-RPC.

שימו לב שהמאפיינים האלה לא יהיו זמינים ב-grpc.client.attempt.started וב-grpc.server.call.started, כי כל המידע על הרשת הטופולוגית לא זמין בנקודת האיסוף של המדדים האלה.

הוראות להגדרת יכולת התבוננות

בקטע הזה מוסבר איך להפעיל את Cloud Service Mesh Observability עבור gRPC ללא שרת Proxy בהגדרת Service mesh.

C++‎

התמיכה ב-Observability זמינה רק דרך מערכת ה-build של 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 כדי לרשום פלאגין. בדוגמה הבאה מוצג איך להגדיר ניראות (observability) של Cloud Service Mesh באמצעות כלי לייצוא של 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 ב-CsmObservabilityBuilder() מאפשר למשתמשים להגדיר אובייקט MeterProvider שאפשר להגדיר בו רכיבי exporter.

Java

כדי להפעיל את Cloud Service Mesh Observability באפליקציות Java gRPC, מבצעים את השלבים הבאים:

  1. מוודאים שהפרויקט כולל את ארטיפקט grpc-gcp-csm-observability. משתמשים ב-gRPC בגרסה 1.65.0 ואילך.

  2. בשיטה main(), מאתחלים את Cloud Service Mesh Observability על ידי מתן מופע מוגדר של OpenTelemetry SDK עם MeterProvider כדי לאסוף ולייצא מדדים.

    לפני שמבצעים פעולות gRPC כמו הגדרת ערוץ או שרת, חשוב להשתמש ב-API‏ CsmObservability.Builder() כדי לרשום את OpenTelemetry SDK.

    אחרי שיוצרים את מופע CsmObservability, הפעלת registerGlobal() במופע מאפשרת את Cloud Service Mesh Observability לכל הערוצים והשרתים של Cloud Service Mesh.

    בדוגמה הבאה מוסבר איך להגדיר ניראות (observability) של Cloud Service Mesh באמצעות Prometheus exporter.

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 או Server, או אישורים, צריך להגדיר את Cloud Service Mesh Observability באופן גלובלי באמצעות MeterProvider. בדוגמה הבאה אפשר לראות איך מגדירים את יכולות התצפית של Cloud Service Mesh. אחרי שמגדירים את Cloud Service MeshObservability, כל הערוצים של Cloud Service Mesh וכל השרתים יקבלו תוסף סטטיסטיקות של OpenTelemetry שהוגדר עם האפשרויות שסופקו ועם תוויות נוספות של Cloud Service Mesh. ערוצים שלא משתמשים ב-Cloud Service Mesh יקבלו תוסף OpenTelemetry stats בלי תוויות של 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

כדי להשתמש בתכונת ה-Observability של Cloud Service Mesh, צריך את יחסי התלות הבאים של gRPC:

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

לפני כל פעולת gRPC, כולל יצירה של ערוץ, שרת או פרטי כניסה, צריך להשתמש ב-API של CsmOpenTelemetryPlugin כדי ליצור ולרשום תוסף:

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

בדוגמה הבאה אפשר לראות איך מגדירים את Cloud Service Mesh Observability באמצעות Prometheus exporter:

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

בדוגמה הקודמת, אפשר לבצע scraping של localhost:9464/metrics כדי לקבל את המדדים שדווחו על ידי Cloud Service Mesh Observability.

שימו לב: כדי שהמאפיינים של הרשת שנוספו למדדים של gRPC יפעלו, צריך להגדיר את קובצי ה-binary של הלקוח והשרת באמצעות 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 בשם של עומס העבודה, לדוגמה שם הפריסה.