Implementación de una puerta de enlace autohospedada en Kubernetes con la integración de OpenTelemetry
SE APLICA A: Desarrollador | Premium
En este artículo se describen los pasos para implementar el componente de puerta de enlace autohospedada de Azure API Management en un clúster de Kubernetes y enviar automáticamente todas las métricas a OpenTelemetry Collector.
Importante
La compatibilidad de OpenTelemetry con la puerta de enlace autohospedada de Azure API Management está actualmente en versión preliminar y requiere etiqueta 2.0.0
o superior.
Aprenderá a:
- Configuración e implementación de un OpenTelemetry Collector independiente en Kubernetes
- Implemente la puerta de enlace autohospedada con métricas de OpenTelemetry.
- Genere métricas mediante el consumo de API en la puerta de enlace autohospedada.
- Use las métricas de OpenTelemetry Collector.
Requisitos previos
- Creación de una instancia de Azure API Management
- Cree un clúster de Azure Kubernetes mediante la CLI de Azure, Azure PowerShell o Azure Portal.
- Aprovisione un recurso de puerta de enlace autohospedada en la instancia de API Management.
Introducción a OpenTelemetry
OpenTelemetry es un conjunto de herramientas y marcos de código abierto para el registro, las métricas y el seguimiento de una manera neutral del proveedor.
Importante
La compatibilidad de OpenTelemetry con la puerta de enlace autohospedada de Azure API Management está actualmente en versión preliminar y requiere etiqueta 2.0.0
o superior.
La puerta de enlace auto hospedada se puede configurar para recopilar y enviar métricas automáticamente a un OpenTelemetry Collector. Esto le permite traer su propia solución de recopilación de métricas e informes para la puerta de enlace autohospedada.
Nota
OpenTelemetry es un proyecto de resumen del ecosistema de Cloud Native Computing Foundation (CNCF).
Métricas
La puerta de enlace autohospedada comenzará automáticamente a medir las siguientes métricas:
- Requests
- DurationInMs
- BackendDurationInMs
- ClientDurationInMs
- GatewayDurationInMs
Se exportan automáticamente al OpenTelemetry Collector configurado cada 1 minuto con dimensiones adicionales.
Implementación de OpenTelemetry Collector
Comenzaremos por implementar un OpenTelemetry Collector independiente en Kubernetes mediante Helm.
Sugerencia
Aunque usaremos el gráfico de Collector Helm, también proporcionan un Operador de OpenTelemetry Collector
Para empezar, tenemos que agregar el repositorio de gráficos de Helm:
Adición del repositorio de Helm
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
Actualice el repositorio para capturar los gráficos de Helm más recientes.
helm repo update
Compruebe la configuración de Helm enumerando todos los gráficos disponibles.
$ helm search repo open-telemetry NAME CHART VERSION APP VERSION DESCRIPTION open-telemetry/opentelemetry-collector 0.8.1 0.37.1 OpenTelemetry Collector Helm chart for Kubernetes open-telemetry/opentelemetry-operator 0.4.0 0.37.0 OpenTelemetry Operator Helm chart for Kubernetes
Ahora que tenemos configurado el repositorio de gráficos, podemos implementar OpenTelemetry Collector en nuestro clúster:
Cree un archivo de configuración local denominado
opentelemetry-collector-config.yml
con la siguiente configuración:mode: deployment config: exporters: prometheus: endpoint: "0.0.0.0:8889" namespace: azure_apim send_timestamps: true service: pipelines: metrics: exporters: - prometheus service: type: LoadBalancer ports: jaeger-compact: enabled: false prom-exporter: enabled: true containerPort: 8889 servicePort: 8889 protocol: TCP
Esto nos permite usar un recopilador independiente con el exportador Prometheus expuesto en el puerto 8889
. Para exponer las métricas de Prometheus, se pide al gráfico de Helm que configure un servicio LoadBalancer
.
Nota:
Estamos deshabilitando el puerto de Jaeger compacto dado que usa UDP y el servicio LoadBalancer
no permite tener varios protocolos al mismo tiempo.
Instale el gráfico de Helm con nuestra configuración:
helm install opentelemetry-collector open-telemetry/opentelemetry-collector --values .\opentelemetry-collector-config.yml
Compruebe la instalación obteniendo todos los recursos de nuestro gráfico de Helm
$ kubectl get all -l app.kubernetes.io/instance=opentelemetry-collector NAME READY STATUS RESTARTS AGE pod/opentelemetry-collector-58477c8c89-dstwd 1/1 Running 0 27m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/opentelemetry-collector LoadBalancer 10.0.175.135 20.103.18.53 14250:30982/TCP,14268:32461/TCP,4317:31539/TCP,4318:31581/TCP,8889:32420/TCP,9411:30003/TCP 27m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/opentelemetry-collector 1/1 1 1 27m NAME DESIRED CURRENT READY AGE replicaset.apps/opentelemetry-collector-58477c8c89 1 1 1 27m
Tome nota de la IP externa del servicio para poder consultarla más adelante.
Con OpenTelemetry Collector instalado, ahora podemos implementar la puerta de enlace autohospedada en nuestro clúster.
Implementación de la puerta de enlace autohospedada
Importante
Para obtener información general detallada sobre cómo implementar la puerta de enlace autohospedada con Helm y cómo obtener la configuración necesaria, se recomienda leer este artículo.
En esta sección, implementaremos la puerta de enlace autohospedada en nuestro clúster con Helm y la configuraremos para enviar métricas de OpenTelemetry a OpenTelemetry Collector.
Instale el gráfico de Helm y configúrelo para usar las métricas de OpenTelemetry:
helm install azure-api-management-gateway \ --set gateway.configuration.uri='<your configuration url>' \ --set gateway.auth.key='<your auth token>' \ --set observability.opentelemetry.enabled=true \ --set observability.opentelemetry.collector.uri=http://opentelemetry-collector:4317 \ --set service.type=LoadBalancer \ azure-apim-gateway/azure-api-management-gateway
Nota
opentelemetry-collector
en el comando anterior es el nombre de OpenTelemetry Collector. Actualice el nombre si el servicio tiene otro nombre.
Compruebe la instalación obteniendo todos los recursos de nuestro gráfico de Helm
$ kubectl get all -l app.kubernetes.io/instance=apim-gateway NAME READY STATUS RESTARTS AGE pod/apim-gateway-azure-api-management-gateway-fb77c6d49-rffwq 1/1 Running 0 63m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/apim-gateway-azure-api-management-gateway LoadBalancer 10.0.67.177 20.71.82.110 8080:32267/TCP,8081:32065/TCP 63m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/apim-gateway-azure-api-management-gateway 1/1 1 1 63m NAME DESIRED CURRENT READY AGE replicaset.apps/apim-gateway-azure-api-management-gateway-fb77c6d49 1 1 1 63m
Tome nota de la IP externa del servicio de puerta de enlace autohospedada para poder consultarla más adelante.
Generación y consumo de las métricas de OpenTelemetry
Ahora que tanto OpenTelemetry Collector como la puerta de enlace autohospedada están implementadas, podemos empezar a consumir las API para generar métricas.
Nota
Vamos a consumir la "API de Echo" predeterminada para este tutorial.
Asegúrese de que está configurado para:
- Permitir solicitudes HTTP
- Permitir que la puerta de enlace autohospedada la exponga
Consulta de la API de Echo en la puerta de enlace autohospedada:
$ curl -i "http://<self-hosted-gateway-ip>:8080/echo/resource?param1=sample&subscription-key=abcdef0123456789" HTTP/1.1 200 OK Date: Mon, 20 Dec 2021 12:58:09 GMT Server: Microsoft-IIS/8.5 Content-Length: 0 Cache-Control: no-cache Pragma: no-cache Expires: -1 Accept: */* Host: echoapi.cloudapp.net User-Agent: curl/7.68.0 X-Forwarded-For: 10.244.1.1 traceparent: 00-3192030c89fd7a60ef4c9749d6bdef0c-f4eeeee46f770061-01 Request-Id: |3192030c89fd7a60ef4c9749d6bdef0c.f4eeeee46f770061. Request-Context: appId=cid-v1:00001111-aaaa-2222-bbbb-3333cccc4444 X-Powered-By: Azure API Management - http://api.azure.com/,ASP.NET X-AspNet-Version: 4.0.30319
La puerta de enlace autohospedada ahora medirá la solicitud y enviará las métricas a OpenTelemetry Collector.
Consulta del punto de conexión de Prometheus en el recopilador en
http://<collector-service-ip>:8889/metrics
. Se mostrarán métricas similares a los siguientes:# HELP azure_apim_BackendDurationInMs # TYPE azure_apim_BackendDurationInMs histogram azure_apim_BackendDurationInMs_bucket{Hostname="20.71.82.110",le="5"} 0 1640093731340 [...] azure_apim_BackendDurationInMs_count{Hostname="20.71.82.110"} 22 1640093731340 # HELP azure_apim_ClientDurationInMs # TYPE azure_apim_ClientDurationInMs histogram azure_apim_ClientDurationInMs_bucket{Hostname="20.71.82.110",le="5"} 22 1640093731340 [...] azure_apim_ClientDurationInMs_count{Hostname="20.71.82.110"} 22 1640093731340 # HELP azure_apim_DurationInMs # TYPE azure_apim_DurationInMs histogram azure_apim_DurationInMs_bucket{Hostname="20.71.82.110",le="5"} 0 1640093731340 [...] azure_apim_DurationInMs_count{Hostname="20.71.82.110"} 22 1640093731340 # HELP azure_apim_GatewayDurationInMs # TYPE azure_apim_GatewayDurationInMs histogram azure_apim_GatewayDurationInMs_bucket{Hostname="20.71.82.110",le="5"} 0 1640093731340 [...] azure_apim_GatewayDurationInMs_count{Hostname="20.71.82.110"} 22 1640093731340 # HELP azure_apim_Requests # TYPE azure_apim_Requests counter azure_apim_Requests{BackendResponseCode="200",BackendResponseCodeCategory="2xx",Cache="None",GatewayId="Docs",Hostname="20.71.82.110",LastErrorReason="None",Location="GitHub",ResponseCode="200",ResponseCodeCategory="2xx",Status="Successful"} 22 1640093731340
Limpieza
Ahora que el tutorial ha terminado, puede limpiar fácilmente el clúster como se muestra a continuación:
Desinstalación del gráfico de Helm de la puerta de enlace autohospedada:
helm uninstall apim-gateway
Desinstalación del recopilador de OpenTelemetry Collector:
helm uninstall opentelemetry-collector
Pasos siguientes
- Para obtener más información sobre la puerta de enlace autohospedada, consulte Introducción a la puerta de enlace autohospedada.
- Obtenga más información sobre las funcionalidades de observabilidad de las puertas de enlace de Azure API Management.