Objetivo: Detectar causa de comportamento estranho em métrica no Prometheus.

Surgiu no trabalho uma situação curiosa com a monitoração de uma aplicação.

No painel de uso de CPU disponível no dashboard Grafana, aparecia um gráfico subindo sem parar com números absurdos.

A métrica utilizada é process_cpu_seconds_total coletada e disponibilizada pelo client Python do Prometheus.

Esse client coleta a informação do arquivo /proc/[pid]/statstat onde pid é o id do processo monitorado.

Essa métrica pode ser lida como “quantos segundos minha aplicação utilizou na CPU desde que iniciou”. Por isso, faz sentido ela ser um Counter, ou seja, ela só aumenta.

Assim, para calcular a porcentagem uso de CPU, utiliza-se a query abaixo (“myjob” é só um exemplo):

rate(process_cpu_seconds_total{job="myjob"}[5m]) * 100

Essa query pode ser lida como “taxa média de segundos de CPU consumidos por segundo pelo processo nos últimos 5 minutos”.

Considerando que um segundo de CPU consumido por segundo é 100% do uso de um núcleo de CPU, podemos multiplicar esse valor por 100 e então obter a porcentagem de uso de CPU.

Ao investigar o problema, vi que o gráfico da métrica coletada pelo Prometheus estava assim:

Prometheus Counter Errado

O esperado seria algo assim:

Prometheus Counter Certo

Solução:

Após elaborar teorias a respeito da quantidade de cores estar afetando a coleta da aplicação, enfim descobri o problema: outro target estava enviando a mesma métrica com os mesmos labels!

Isso aconteceu porque a aplicação estava sendo monitorada no mesmo job com dois targets diferentes, então a métrica era a mesma, gerando essa bagunça de valores.

O que poderia ter causado também seria um constant restart da aplicação, fazendo com que o gráfico mostrasse o consumo inicial até ser reiniciada e começar tudo de novo.

A solução foi criar jobs separados para coletar as métricas, evitando assim que uma sobrescrevesse a outra.

Referências: