Beobachtbarkeit für proxyloses gRPC
Die Cloud Service Mesh-Beobachtbarkeit für proxylose gRPC-Dienste basiert auf dem vorhandenen gRPC OpenTelemetry-Plug-in. Sie erfasst Messwerte (Latenz, Nachrichtengrößen usw.) für alle gRPC-Channels und ‑Server, die für Cloud Service Mesh aktiviert sind, und bietet zusätzliche Attribute, die topologische Mesh-Informationen für Cloud Service Mesh-Traffic enthalten. Ein gRPC-Channel gilt als Cloud Service Mesh-fähig, wenn er Konfigurationen von der Cloud Service Mesh-Steuerungsebene erhält. Alle gRPC-Server gelten als Cloud Service Mesh-fähig.
Mesh-Attribute
Die folgenden Mesh-Attribute sind für Messwerte verfügbar.
Umgebungslabels für lokale Produkte:
csm.mesh_id
- Die Mesh-ID.
- Andere Attribute der lokalen Umgebung werden aus der OpenTelemetry-Ressource abgerufen.
- Managed Service for Prometheus (GMP) kann so eingerichtet werden, dass Messwerte in der Google-Infrastruktur gespeichert werden. Wenn Sie diese Methode verwenden, werden Ressourcenattribute, die die lokale Umgebung der Anwendung beschreiben, automatisch als MonitoredResource hinzugefügt.
- Wenn Sie keine Google-Infrastruktur zum Exportieren und Speichern von Messwerten verwenden, sollten der Erfassungspipeline Attribute für die Messwerte hinzugefügt werden, die die Umgebung beschreiben, in der die Anwendung ausgeführt wird.
Umgebungslabels für Remote-Umgebungen:
csm.remote_workload_type
- Der Typ des Remote-Peers. („gcp_kubernetes_engine“ für GKE).
- Je nach Art des Peers sind zusätzliche Attribute vorhanden.
- Für einen Peer, der in GKE ausgeführt wird:
csm.remote_workload_project_id
- Die Kennung des Projekts, das dieser Ressource zugeordnet ist, z. B. „my-project“.
csm.remote_workload_location
* Der physische Standort des Clusters, der den Container enthält.csm.remote_workload_cluster_name
- Der Cluster, in dem der Container ausgeführt wird.
csm.remote_workload_namespace_name
The namespace where the container is running.
csm.remote_workload_name
- Der Name der Remote-Arbeitslast. Dies sollte der Name des Objekts sein, das die Pod-Definition enthält (z. B. ein Deployment, ein ReplicaSet oder einfach der Pod-Name für einen Bare-Pod).
Dienstlabels: Informationen zum Backend-Dienst (xDS-Cluster), an den der RPC weitergeleitet wird. Diese Option ist nur verfügbar, wenn der Backend-Dienst über die Gateway API konfiguriert wurde.
csm.service_name
- Der Dienstname.
csm.service_namespace_name
- Der Name des Dienst-Namespace.
Der Begriff „remote_workload“ bezieht sich auf den Peer. Für Clients ist der Server-Pod, der das Ziel eines RPC ist, die Remote-Arbeitslast. Für Server ist der Client-Pod, der den RPC initiiert hat, die Remote-Arbeitslast.
Diese Attribute sind nicht für grpc.client.attempt.started
und grpc.server.call.started
verfügbar, da alle Informationen zum topologischen Mesh nicht am Erfassungspunkt dieser Messwerte verfügbar sind.
Anleitung zur Einrichtung der Beobachtbarkeit
In diesem Abschnitt wird beschrieben, wie Sie Cloud Service Mesh Observability für proxyloses gRPC in einer Service Mesh-Einrichtung aktivieren.
C++
Die Unterstützung für die Beobachtbarkeit ist nur über das Bazel-Build-System verfügbar. Das Ziel grpcpp_csm_observability
muss als Abhängigkeit hinzugefügt werden.
Erforderliche Codeänderungen
Der folgende Code muss Ihren gRPC-Clients und -Servern hinzugefügt werden, damit Sie die Cloud Service Mesh-Beobachtbarkeit nutzen können.
#include <grpcpp/ext/csm_observability.h>
int main() {
// …
auto observability = grpc::CsmObservabilityBuilder()
.SetMeterProvider(std::move(meter_provider))
.BuildAndRegister();
assert(observability.ok());
// …
}
Bevor Sie gRPC-Vorgänge ausführen, einschließlich des Erstellens eines Channels, Servers oder von Anmeldedaten, verwenden Sie die CsmObservabilityBuilder API, um ein Plug-in zu registrieren. Im folgenden Beispiel wird gezeigt, wie Sie Cloud Service Mesh Observability mit einem Prometheus-Exporter einrichten.
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();
Mit der SetMeterProvider()
API auf CsmObservabilityBuilder()
können Nutzer ein MeterProvider-Objekt festlegen, das mit Exportern konfiguriert werden kann.
Java
So aktivieren Sie Cloud Service Mesh Observability für Java-gRPC-Anwendungen:
Achten Sie darauf, dass das Projekt das
grpc-gcp-csm-observability
-Artefakt enthält. Verwenden Sie gRPC Version 1.65.0 oder höher.Initialisieren Sie in der Methode
main()
Cloud Service Mesh Observability, indem Sie eine konfigurierte OpenTelemetry SDK-Instanz mit einemMeterProvider
bereitstellen, um Messwerte zu erfassen und zu exportieren.Bevor Sie gRPC-Vorgänge wie das Einrichten eines Channels oder Servers ausführen, müssen Sie das OpenTelemetry SDK mit der
CsmObservability.Builder()
API registrieren.Nachdem die CsmObservability-Instanz erstellt wurde, wird durch Aufrufen von
registerGlobal()
für die Instanz Cloud Service Mesh Observability für alle Cloud Service Mesh-Channels und -Server aktiviert.Im folgenden Beispiel wird gezeigt, wie Sie Cloud Service Mesh Observability mit einem Prometheus-Exporter einrichten.
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
Konfigurieren Sie Cloud Service Mesh Observability global mit einem MeterProvider
, bevor Sie gRPC-Vorgänge ausführen, einschließlich des Erstellens einer ClientConn oder eines Servers oder von Anmeldedaten. Im folgenden Beispiel wird gezeigt, wie Sie Cloud Service Mesh Observability einrichten. Nachdem Sie Cloud Service Mesh Observability eingerichtet haben, wird für alle Cloud Service Mesh-Channels und alle Server ein OpenTelemetry-Statistik-Plug-in mit den angegebenen Optionen und zusätzlichen Cloud Service Mesh-Labels konfiguriert. Nicht-Cloud Service Mesh-Channels erhalten ein OpenTelemetry-Statistik-Plug-in ohne Cloud Service Mesh-Labels.
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
Die folgenden gRPC-Abhängigkeiten sind für Cloud Service Mesh-Observability erforderlich:
grpcio>=1.65.0
grpcio-observability>=1.65.0
grpcio-csm-observability>=1.65.0
Bevor Sie gRPC-Vorgänge ausführen, einschließlich des Erstellens eines Kanals, Servers oder Anmeldedaten, verwenden Sie die CsmOpenTelemetryPlugin API, um ein Plug-in zu erstellen und zu registrieren:
import grpc_csm_observability
# ...
csm_plugin = grpc_csm_observability.CsmOpenTelemetryPlugin(
meter_provider=[your_meter_provider],
)
csm_plugin.register_global()
# Create server or client
Verwenden Sie nach allen gRPC-Vorgängen den folgenden Code, um Ressourcen abzumelden und zu bereinigen:
csm_plugin.deregister_global()
Im folgenden Beispiel wird gezeigt, wie Sie Cloud Service Mesh Observability mit einem Prometheus-Exporter einrichten:
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()
Im vorherigen Beispiel können Sie localhost:9464/metrics
abrufen, um die von Cloud Service Mesh Observability gemeldeten Messwerte zu erhalten.
Damit die Mesh-Attribute, die den gRPC-Messwerten hinzugefügt werden, funktionieren, müssen sowohl die Client- als auch die Serverbinärdateien mit CsmObservability eingerichtet werden.
Wenn Sie keine Google-Infrastruktur zum Exportieren und Speichern von Messwerten verwenden, sollten der Erfassungspipeline Attribute für die Messwerte hinzugefügt werden, die die Umgebung beschreiben, in der die Anwendung ausgeführt wird. Zusammen mit den zuvor beschriebenen Mesh-Attributen kann so eine Übersicht über den Traffic im Mesh erstellt werden.
Änderungen der Spezifikationen
Cloud Service Mesh Observability ermittelt die topologischen Informationen des Mesh über Umgebungsvariablen, die sowohl für Clients als auch für Server der Umgebung des Containers hinzugefügt werden müssen. Diese Informationen werden Peers für das Melden von Messwerten über Cloud Service Mesh Observability zur Verfügung gestellt.
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
Ersetzen Sie Folgendes:
- IMAGE_NAME durch den Namen des Bildes.
- CONTAINER_NAME durch den Namen des Containers.
- CSM_WORKLOAD_NAME durch den Namen der Arbeitslast, z. B. den Namen der Bereitstellung.