Envíe métricas a Managed Service for Prometheus desde aplicaciones desplegadas en clústeres de Container Service for Kubernetes (ACK) e instrumentadas con el SDK de OpenTelemetry. Unifique la recopilación de métricas nativas de OpenTelemetry (OTel), métricas de negocio personalizadas y métricas convertidas a partir de spans de trazas para lograr una observability completa de la aplicación. Convertir los datos de trazas en métricas reduce de forma significativa el volumen de datos ingeridos.
Descripción general de OpenTelemetry
OpenTelemetry (OTel) es un framework de observability de código abierto. Proporciona API, SDK y herramientas unificadas para generar, recopilar y exportar datos de telemetría desde sistemas distribuidos, lo que incluye métricas, trazas y registros. Su objetivo principal es eliminar la fragmentación de los datos de observability entre distintas herramientas y sistemas.
Las métricas de OpenTelemetry son datos estructurados que cuantifican el comportamiento del sistema para el monitoreo de rendimiento y estado. El origen de las métricas depende de la instrumentación del SDK o del agente para un lenguaje específico. En una aplicación Java, las métricas suelen incluir métricas estándar de Java Virtual Machine (JVM), métricas personalizadas instrumentadas por el usuario y métricas derivadas de los datos de trazas.
Las métricas de OpenTelemetry están diseñadas para ser compatibles con Prometheus. Con OpenTelemetry Collector, puede convertir las métricas al formato de Prometheus para integrarlas sin problemas con Managed Service for Prometheus.
Función de OpenTelemetry Collector
OpenTelemetry Collector es una canalización extensible de procesamiento de datos. Recopila datos de telemetría de aplicaciones y servicios, y los convierte al formato que requiere un sistema de destino como Prometheus.
Recopilación de datos
Las aplicaciones usan el SDK de OpenTelemetry para generar datos de métricas. Luego los envían al Collector mediante OpenTelemetry Protocol (OTLP) u otros protocolos, como el protocolo nativo de Prometheus.
Conversión de datos
Las extensiones comunitarias del Collector proporcionan dos exportadores para convertir las métricas de OTel al formato de Prometheus.
-
El Prometheus Exporter convierte las métricas de OpenTelemetry al formato de Prometheus. Además, proporciona un endpoint para que un agente de Prometheus extraiga los datos.
Asignación de nombres de métricas: convierte los nombres de las métricas de OpenTelemetry a un formato compatible con Prometheus.
Gestión de etiquetas: conserva o renombra las etiquetas para cumplir con las reglas de nomenclatura de Prometheus.
-
Conversión de tipos de datos:
gauge→gaugede Prometheussum→counterogaugede Prometheus (según la propiedadMonotonic)histogram→histogramde Prometheus (mediante las submétricasbucketysum)
A continuación se muestra un ejemplo de configuración que expone un endpoint de extracción de métricas en el puerto
1234.exporters: prometheus: endpoint: "0.0.0.0:1234" namespace: "acs" const_labels: label1: value1 send_timestamps: true metric_expiration: 5m enable_open_metrics: true add_metric_suffixes: false resource_to_telemetry_conversion: enabled: true
-
El Prometheus Remote Write Exporter convierte las métricas de OpenTelemetry al formato de Prometheus. Después las escribe directamente en el servicio de Prometheus de destino mediante el protocolo Remote Write.
Al igual que el Prometheus Exporter, este exportador también convierte el formato de los datos. A continuación se muestra un ejemplo de configuración:
exporters: prometheusremotewrite: endpoint: http://<Prometheus Endpoint>/api/v1/write namespace: "acs" resource_to_telemetry_conversion: enabled: true timeout: 10s headers: Prometheus-Remote-Write-Version: "0.1.0" external_labels: data-mode: metrics
Prácticas recomendadas para aplicaciones en clústeres de ACK
Paso 1: Prepare Managed Service for Prometheus
-
El monitoreo de Prometheus está habilitado para el clúster
Si el monitoreo de Prometheus está habilitado en su clúster de ACK, ya existe una instancia de Prometheus. Inicie sesión en la consola de CloudMonitor. En el panel de navegación izquierdo, elija . Busque la instancia de Prometheus que tenga el mismo nombre que su clúster de ACK. Compruebe que la instancia esté en estado Running dentro de la región especificada.
-
El monitoreo de Prometheus no está habilitado para el clúster
Inicie sesión en la consola de ACK. Haga clic en el nombre del clúster de destino y vaya a la página Add-ons. En la pestaña Logging and Monitoring, busque e instale el componente ack-arms-prometheus. Una vez instalado, el monitoreo de Prometheus se habilita automáticamente para el clúster. Compruebe que el componente esté instalado.
Paso 2: Despliegue el Collector en modo sidecar
Para calcular las métricas con precisión, todas las métricas y trazas de un solo pod deben enviarse al mismo Collector. El despliegue en modo gateway exige configuraciones complejas de balanceo de carga, por lo que se recomienda desplegar el Collector en modo sidecar.
Modo Prometheus Exporter
Este método elimina la necesidad de autenticación en la ruta de escritura de Prometheus. También permite ajustar la configuración de extracción para cambiar el intervalo de recopilación de métricas.
Diagrama de arquitectura
Ejemplo de configuración de despliegue
# Kubernetes Deployment example
apiVersion: apps/v1
kind: Deployment
spec:
template:
metadata:
labels:
# Add a specific label to the pod. The label is usually named after the application to facilitate metric scraping configuration.
observability: opentelemetry-collector
spec:
volumes:
- name: otel-config-volume
configMap:
# This configuration is created based on the following Collector configuration example.
name: otel-config
containers:
- name: app
image: your-app:latest
env:
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://localhost:4317
- name: otel-collector
# You can use the Collector image that we provide. The image includes Prometheus-related extensions.
# Replace in the image name with the ID of your region.
image: registry-<regionId>.ack.aliyuncs.com/acs/otel-collector:v0.128.0-7436f91
args: ["--config=/etc/otel/config/otel-config.yaml"]
ports:
- containerPort: 1234 # Prometheus endpoint
name: metrics
volumeMounts:
- name: otel-config-volume
mountPath: /etc/otel/config
Ejemplo de configuración del Collector
Configure los límites de recursos (CPU y memoria) del Collector según el volumen de solicitudes de su aplicación para que pueda procesar todos los datos.
apiVersion: v1
kind: ConfigMap
metadata:
name: otel-config
namespace: <app-namespace>
data:
otel-config.yaml: |
extensions:
zpages:
endpoint: localhost:55679
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
memory_limiter:
# 75% of maximum memory up to 2 GB
limit_mib: 1536
# 25% of limit up to 2 GB
spike_limit_mib: 512
check_interval: 5s
resource:
attributes:
- key: process.runtime.description
action: delete
- key: process.command_args
action: delete
- key: telemetry.distro.version
action: delete
- key: telemetry.sdk.name
action: delete
- key: telemetry.sdk.version
action: delete
- key: service.instance.id
action: delete
- key: process.runtime.name
action: delete
- key: process.runtime.description
action: delete
- key: process.pid
action: delete
- key: process.executable.path
action: delete
- key: process.command.args
action: delete
- key: os.description
action: delete
- key: instance
action: delete
- key: container.id
action: delete
connectors:
spanmetrics:
histogram:
explicit:
buckets: [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1, 5, 10]
dimensions:
- name: http.method
default: "GET"
- name: http.response.status_code
- name: http.route
# Custom attribute
- name: user.id
metrics_flush_interval: 15s
exclude_dimensions:
metrics_expiration: 3m
events:
enabled: true
dimensions:
- name: default
default: "GET"
exporters:
debug:
verbosity: detailed
prometheus:
endpoint: "0.0.0.0:1234"
namespace: "acs"
const_labels:
label1: value1
send_timestamps: true
metric_expiration: 5m
enable_open_metrics: true
add_metric_suffixes: false
resource_to_telemetry_conversion:
enabled: true
service:
pipelines:
logs:
receivers: [otlp]
exporters: [debug]
traces:
receivers: [otlp]
processors: [resource]
exporters: [spanmetrics]
metrics:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [prometheus]
metrics/2:
receivers: [spanmetrics]
exporters: [prometheus]
extensions: [zpages]
Esta configuración procesa los datos entrantes de Metrics y Traces. Utiliza processors del tipo resource para descartar atributos de entorno irrelevantes y mantener controlable el volumen de datos de métricas. También usa spanmetrics para convertir estadísticas clave de Span en métricas.
Configuración de la tarea de extracción
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: opentelemetry-collector-podmonitor
namespace: default
annotations:
arms.prometheus.io/discovery: "true"
spec:
selector:
matchLabels:
observability: opentelemetry-collector
podMetricsEndpoints:
- port: metrics
interval: 15s
scheme: http
path: /metrics
Modo Prometheus Remote Write Exporter
Este método es adecuado para escenarios con grandes volúmenes de datos o extracciones inestables, donde el Collector escribe directamente en la instancia de Prometheus.
La configuración es más compleja porque debe configurar la ruta de escritura de datos.
Diagrama de arquitectura
Preparación de la ruta de escritura de datos
En este modo, el Collector escribe los datos directamente en la instancia de Prometheus. Obtenga el endpoint de Prometheus y la información de autenticación antes de continuar.
-
Obtenga el endpoint
Inicie sesión en la consola de CloudMonitor. En el panel de navegación izquierdo, elija y busque la instancia de Prometheus correspondiente a su clúster. El ID y el nombre de la instancia de Prometheus suelen coincidir con el ID y el nombre del clúster de ACK. Haga clic en el nombre de la instancia de destino. En la página Settings, busque la Remote Write URL y copie la dirección de red interna para usarla más adelante.
-
Obtenga las credenciales de autenticación
Elija uno de los siguientes métodos:
Las instancias de Prometheus V2 admiten una política sin contraseña que permite escrituras sin contraseña desde la virtual private cloud (VPC) del clúster.
Cree un usuario de RAM para escribir datos de métricas, asígnele la política de sistema
AliyunPrometheusMetricWriteAccessy obtenga su par de AccessKey. El AccessKey ID se utiliza como nombre de usuario y el AccessKey secret como contraseña para escribir los datos.
Ejemplo de configuración de despliegue
La configuración de despliegue del Collector es la misma que en el modo Prometheus Exporter. Para obtener más información, consulte deployment configuration example for the Prometheus Exporter mode.
Ejemplo de configuración del Collector
apiVersion: v1
kind: ConfigMap
metadata:
name: otel-config
namespace: <app-namespace>
data:
otel-config.yaml: |
extensions:
zpages:
endpoint: localhost:55679
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
memory_limiter:
# 75% of maximum memory up to 2 GB
limit_mib: 1536
# 25% of limit up to 2 GB
spike_limit_mib: 512
check_interval: 5s
resource:
attributes:
- key: process.runtime.description
action: delete
- key: process.command_args
action: delete
- key: telemetry.distro.version
action: delete
- key: telemetry.sdk.name
action: delete
- key: telemetry.sdk.version
action: delete
- key: service.instance.id
action: delete
- key: process.runtime.name
action: delete
- key: process.runtime.description
action: delete
- key: process.pid
action: delete
- key: process.executable.path
action: delete
- key: process.command.args
action: delete
- key: os.description
action: delete
- key: instance
action: delete
- key: container.id
action: delete
connectors:
spanmetrics:
histogram:
explicit:
buckets: [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1, 5, 10]
dimensions:
- name: http.method
default: "GET"
- name: http.response.status_code
- name: http.route
# Custom attribute
- name: user.id
metrics_flush_interval: 15s
exclude_dimensions:
metrics_expiration: 3m
events:
enabled: true
dimensions:
- name: default
default: "GET"
exporters:
debug:
verbosity: detailed
prometheusremotewrite:
# Replace this with the internal network address of the Prometheus Remote Write endpoint.
endpoint: http://<Endpoint>/api/v3/write
namespace: "acs"
resource_to_telemetry_conversion:
enabled: true
timeout: 10s
headers:
Prometheus-Remote-Write-Version: "0.1.0"
# This header is required if the password-free policy is not enabled.
Authorization: Basic <base64-encoded-username-password>
external_labels:
data-mode: metrics
service:
pipelines:
logs:
receivers: [otlp]
exporters: [debug]
traces:
receivers: [otlp]
processors: [resource]
exporters: [spanmetrics]
metrics:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [prometheusremotewrite]
metrics/2:
receivers: [spanmetrics]
exporters: [prometheusremotewrite]
extensions: [zpages]
Reemplace la URL del endpoint de Prometheus Remote Write en la configuración por la URL que obtuvo.
-
Para generar el valor de
base64-encoded-username-password, ejecute el siguiente comando:echo -n 'AK:SK' | base64