Envie métricas para o Managed Service for Prometheus de aplicações implantadas em clusters do Container Service for Kubernetes (ACK) e instrumentadas com o SDK do OpenTelemetry. Unifique a coleta de métricas nativas do OpenTelemetry (OTel), métricas personalizadas de negócios e métricas convertidas de spans de rastreamento para obter observabilidade completa da aplicação. Converter dados de rastreamento em métricas reduz significativamente o volume de ingestão de dados.
Visão geral do OpenTelemetry
O OpenTelemetry (OTel) é um framework de observabilidade open-source que fornece APIs, SDKs e ferramentas unificados para gerar, coletar e exportar dados de telemetria de sistemas distribuídos, incluindo métricas, rastreamentos e logs. Seu objetivo principal é eliminar a fragmentação dos dados de observabilidade entre diferentes ferramentas e sistemas.
As métricas do OpenTelemetry são dados estruturados que quantificam o comportamento do sistema para monitoramento de desempenho e integridade. A origem das métricas depende da instrumentação do SDK ou agente para uma linguagem específica. Em uma aplicação Java, por exemplo, as métricas geralmente incluem métricas padrão da Java Virtual Machine (JVM), métricas personalizadas instrumentadas pelo usuário e métricas derivadas de dados de rastreamento.
As métricas do OpenTelemetry foram projetadas para serem compatíveis com o Prometheus. Com o OpenTelemetry Collector, você converte métricas para o formato Prometheus, permitindo integração perfeita com o Managed Service for Prometheus.
Função do OpenTelemetry Collector
O OpenTelemetry Collector é um pipeline de processamento de dados extensível que coleta dados de telemetria de aplicações e serviços e os converte no formato exigido por um sistema de destino, como o Prometheus.
Coleta de dados
As aplicações usam o SDK do OpenTelemetry para gerar dados de métricas e enviá-los ao Collector usando o OpenTelemetry Protocol (OTLP) ou outros protocolos, como o protocolo nativo do Prometheus.
Conversão de dados
Extensões do Collector mantidas pela comunidade fornecem dois exporters para converter métricas OTel para o formato Prometheus.
-
O Prometheus Exporter converte métricas do OpenTelemetry para o formato Prometheus e disponibiliza um endpoint para que um agente do Prometheus faça o scrape dos dados.
Mapeamento de nomes de métricas: Converte os nomes das métricas do OpenTelemetry para um formato compatível com o Prometheus.
Tratamento de rótulos: Preserva ou renomeia rótulos para cumprir as regras de nomenclatura do Prometheus.
-
Conversão de tipos de dados:
gauge→ Prometheusgaugesum→ Prometheuscounterougauge(com base na propriedadeMonotonic)histogram→ Prometheushistogram(usando as submétricasbucketesum)
O exemplo de configuração a seguir expõe um endpoint de scrape de métricas na porta
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
-
O Prometheus Remote Write Exporter converte métricas do OpenTelemetry para o formato Prometheus e as grava diretamente no service Prometheus de destino usando o protocolo Remote Write.
Assim como o Prometheus Exporter, este exporter também converte o formato de dados. O código a seguir apresenta um exemplo de configuração:
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
Melhores práticas para aplicações em clusters ACK
Etapa 1: Preparar o Managed Service for Prometheus
-
Monitoramento Prometheus ativado para o cluster
Se o monitoramento Prometheus estiver ativado para seu cluster ACK, já existe uma instância do Prometheus. Faça login no console do CloudMonitor. No painel de navegação à esquerda, escolha . Localize a instância do Prometheus com o mesmo nome do seu cluster ACK e confirme se ela está no status Running na região especificada.
-
Monitoramento Prometheus não ativado para o cluster
Faça login no console do ACK. Clique no nome do cluster desejado e acesse a página Add-ons. Na aba Logging and Monitoring, localize e instale o componente ack-arms-prometheus. Após a instalação, o monitoramento Prometheus é ativado automaticamente para o cluster. Verifique se o componente foi instalado corretamente.
Etapa 2: Implantar o Collector no modo sidecar
Para garantir cálculos precisos de métricas, todas as métricas e rastreamentos de um único pod devem ser enviados ao mesmo Collector. A implantação no modo gateway exige configurações complexas de balanceamento de carga; portanto, recomendamos a implantação do Collector no modo sidecar.
Modo Prometheus Exporter
Este método elimina a necessidade de autenticação no caminho de escrita do Prometheus. Você também pode ajustar a configuração de scrape para alterar o intervalo de coleta de métricas.
Diagrama de arquitetura
Exemplo de configuração de implantação
# 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
Exemplo de configuração do Collector
Configure os limites de recursos (CPU e memória) para o Collector com base no volume de requisições da sua aplicação, garantindo que ele consiga processar todos os dados.
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 configuração processa dados de Métricas e Rastreamentos recebidos. Ela utiliza processors do tipo resource para descartar atributos de ambiente irrelevantes, mantendo o volume de dados de métricas sob controle. Além disso, usa spanmetrics para converter estatísticas importantes de Spans em métricas.
Configuração da tarefa de scrape
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
Indicado para cenários com grandes volumes de dados ou scrape instável, nos quais o Collector grava diretamente na instância do Prometheus.
A configuração é mais complexa, pois exige a definição do caminho de escrita de dados.
Diagrama de arquitetura
Preparação do caminho de escrita de dados
Neste modo, o Collector grava dados diretamente na instância do Prometheus. Obtenha o endpoint do Prometheus e as informações de autenticação antes de prosseguir.
-
Obter o endpoint
Faça login no console do CloudMonitor. No painel de navegação à esquerda, escolha e localize a instância do Prometheus correspondente ao seu cluster. O ID e o nome da instância do Prometheus geralmente correspondem ao ID e nome do cluster ACK. Clique no nome da instância desejada. Na página Settings, localize a Remote Write URL e copie o endereço de rede interna para uso posterior.
-
Obter credenciais de autenticação
Escolha um dos métodos a seguir:
Instâncias do Prometheus V2 suportam uma política sem senha que permite escritas sem autenticação dentro da virtual private cloud (VPC) do cluster.
Crie um usuário RAM para gravar dados de métricas, conceda a política de sistema
AliyunPrometheusMetricWriteAccessa esse usuário e obtenha seu par de AccessKey. O AccessKey ID serve como nome de usuário e o AccessKey secret como senha para a escrita de dados.
Exemplo de configuração de implantação
A configuração de implantação do Collector é idêntica à do modo Prometheus Exporter. Para mais informações, consulte o exemplo de configuração de implantação para o modo Prometheus Exporter.
Exemplo de configuração do 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]
Substitua a URL do endpoint Prometheus Remote Write na configuração pela URL obtida anteriormente.
-
Para gerar o valor de
base64-encoded-username-password, execute o comando abaixo:echo -n 'AK:SK' | base64