Todos los productos
Search
Centro de documentos

Managed Service for Prometheus:Write metrics to Managed Service for Prometheus with the OpenTelemetry Collector

Última actualización: Sep 08, 2026

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.

    1. Asignación de nombres de métricas: convierte los nombres de las métricas de OpenTelemetry a un formato compatible con Prometheus.

    2. Gestión de etiquetas: conserva o renombra las etiquetas para cumplir con las reglas de nomenclatura de Prometheus.

    3. Conversión de tipos de datos:

      • gauge → gauge de Prometheus

      • sum → counter o gauge de Prometheus (según la propiedad Monotonic)

      • histogram → histogram de Prometheus (mediante las submétricas bucket y sum)

      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 Managed Service for Prometheus > Instances. 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

Nota

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
Nota

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

Nota
  • 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 Managed Service for Prometheus > Instances 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 AliyunPrometheusMetricWriteAccess y 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

Paso 3: Verificación