Observabilidad para gRPC sin proxy
La observabilidad de Cloud Service Mesh para gRPC sin proxy se basa en el complemento OpenTelemetry de gRPC existente, registra métricas (latencia, tamaños de mensajes, etcétera) para todos los canales y servidores de gRPC que están habilitados para Cloud Service Mesh y proporciona atributos adicionales que muestran información topológica de la malla para el tráfico de Cloud Service Mesh. Se considera que un canal de gRPC está habilitado para Cloud Service Mesh si obtiene la configuración del plano de control de Cloud Service Mesh, mientras que todos los servidores de gRPC se consideran habilitados para Cloud Service Mesh.
Atributos de la malla
Los siguientes atributos de la malla están disponibles en las métricas.
Etiquetas de entorno local:
csm.mesh_id- El ID de la malla
- Otros atributos del entorno local se obtienen del
recurso OpenTelemetry.
- Managed Service para Prometheus (GMP) se puede configurar para usar la infraestructura de Google para almacenar métricas. Si usas esto, los atributos de recursos que describen el entorno local de la aplicación se agregan automáticamente como un MonitoredResource.
- Si usas una infraestructura que no es de Google para exportar y almacenar métricas, la canalización de recopilación debe agregar atributos en las métricas que describan el entorno en el que se ejecuta la aplicación.
Etiquetas de entorno remoto:
csm.remote_workload_type- El tipo de par remoto ("gcp_kubernetes_engine" para GKE)
- Según el tipo de par, habrá atributos adicionales.
- Para un par que se ejecuta en GKE:
csm.remote_workload_project_id- El identificador del proyecto asociado con este recurso, como "mi-proyecto"
csm.remote_workload_location*La ubicación física del clúster que contiene el contenedorcsm.remote_workload_cluster_name- El clúster en el que se ejecuta el contenedor
csm.remote_workload_namespace_nameThe namespace where the container is running.
csm.remote_workload_name- El nombre de la carga de trabajo remota Debe ser el nombre del objeto que contiene la definición del Pod (por ejemplo, un Deployment, ReplicaSet o solo el nombre del Pod para un Pod simple)
Etiquetas de servicio: Información sobre el servicio de backend (clúster xDS) al que se enruta la RPC. Ten en cuenta que esto solo está disponible si el servicio de backend se configuró a través de la API de Gateway.
csm.service_name- El nombre del servicio
csm.service_namespace_name- El nombre del espacio de nombres del servicio
El término remote_workload hace referencia al par, es decir, para los clientes, el Pod del servidor que es el destino de una RPC es la carga de trabajo remota, mientras que, para los servidores, el Pod del cliente que inició la RPC es la carga de trabajo remota.
Ten en cuenta que estos atributos no estarán disponibles en grpc.client.attempt.started y grpc.server.call.started, ya que toda la información topológica de la malla no está disponible en el punto de recopilación de estas métricas.
Instrucciones de configuración de observabilidad
En esta sección, se explica cómo habilitar la observabilidad de Cloud Service Mesh para gRPC sin proxy en una configuración de malla de servicios.
C++
La asistencia de observabilidad solo está disponible a través del sistema de compilación de Bazel. El
destino grpcpp_csm_observability debe
agregarse como una dependencia.
Cambios de código obligatorios
Se debe agregar el siguiente código a tus clientes y servidores de gRPC para usar la observabilidad de Cloud Service Mesh.
#include <grpcpp/ext/csm_observability.h>
int main() {
// …
auto observability = grpc::CsmObservabilityBuilder()
.SetMeterProvider(std::move(meter_provider))
.BuildAndRegister();
assert(observability.ok());
// …
}
Antes de cualquier operación de gRPC, incluida la creación de un canal, un servidor o credenciales, usa la API de CsmObservabilityBuilder para registrar un complemento. En el siguiente ejemplo, se muestra cómo configurar la observabilidad de Cloud Service Mesh con un exportador de 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();
La API de SetMeterProvider() en CsmObservabilityBuilder() permite a los usuarios
establecer un objeto MeterProvider
que se puede configurar con exportadores.
Java
Para habilitar la observabilidad de Cloud Service Mesh para aplicaciones de gRPC de Java, sigue estos pasos:
Asegúrate de que el proyecto incluya el artefacto
grpc-gcp-csm-observability. Usa la versión 1.65.0 o posterior de gRPC.Dentro del método
main(), inicializa la observabilidad de Cloud Service Mesh proporcionando una instancia configurada del SDK de OpenTelemetry con unMeterProviderpara recopilar y exportar métricas.Antes de realizar cualquier operación de gRPC, como configurar un canal o un servidor, asegúrate de usar la API de
CsmObservability.Builder()para registrar el SDK de OpenTelemetry.Una vez que se crea la instancia de CsmObservability, invocar
registerGlobal()en la instancia habilita la observabilidad de Cloud Service Mesh para todos los canales y servidores de Cloud Service Mesh.En el siguiente ejemplo, se muestra cómo configurar la observabilidad de Cloud Service Mesh con un exportador de 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
Antes de cualquier operación de gRPC, incluida la creación de un ClientConn o un servidor, o credenciales, configura la observabilidad de Cloud Service Mesh de forma global con un MeterProvider. En el siguiente ejemplo, se muestra cómo configurar la observabilidad de Cloud Service Mesh. Después de configurar Cloud Service MeshObservability, cualquier canal de Cloud Service Mesh y todos los servidores recogerán un complemento de estadísticas de OpenTelemetry configurado con las opciones proporcionadas y con etiquetas adicionales de Cloud Service Mesh. Los canales que no sean de Cloud Service Mesh obtendrán un complemento de estadísticas de OpenTelemetry sin etiquetas de 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
Se requieren las siguientes dependencias de gRPC para la observabilidad de Cloud Service Mesh:
grpcio>=1.65.0
grpcio-observability>=1.65.0
grpcio-csm-observability>=1.65.0
Antes de cualquier operación de gRPC, incluida la creación de un canal, un servidor o credenciales, usa la API de CsmOpenTelemetryPlugin para crear y registrar un complemento:
import grpc_csm_observability
# ...
csm_plugin = grpc_csm_observability.CsmOpenTelemetryPlugin(
meter_provider=[your_meter_provider],
)
csm_plugin.register_global()
# Create server or client
Después de todas las operaciones de gRPC, usa el siguiente código para anular el registro y limpiar los recursos:
csm_plugin.deregister_global()
En el siguiente ejemplo, se muestra cómo configurar la observabilidad de Cloud Service Mesh con un exportador de 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()
En el ejemplo anterior, puedes extraer localhost:9464/metrics para obtener las métricas que informa la observabilidad de Cloud Service Mesh.
Ten en cuenta que, para que funcionen los atributos de la malla agregados a las métricas de gRPC, los objetos binarios del cliente y del servidor deben configurarse con CsmObservability.
Si usas una infraestructura que no es de Google para exportar y almacenar métricas, la canalización de recopilación debe agregar atributos en las métricas que describan el entorno en el que se ejecuta la aplicación. Esto, junto con los atributos de la malla descritos anteriormente, se puede usar para obtener una vista del tráfico que se ejecuta en la malla.
Cambios en las especificaciones
La observabilidad de Cloud Service Mesh determina la información topológica de la malla a través de variables de entorno que deben agregarse al entorno del contenedor, tanto para clientes como para servidores. Esta información se pone a disposición de los pares para la generación de informes de métricas a través de la observabilidad de 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
Reemplaza lo siguiente:
- IMAGE_NAME por el nombre de la imagen.
- CONTAINER_NAME por el nombre del contenedor.
- CSM_WORKLOAD_NAME por el nombre de la carga de trabajo, por ejemplo, el nombre de la implementación.