22.10.2025

Como nomear corretamente as métricas no OpenTelemetry

Métricas são a base quantitativa da observabilidade - os números que mostram como o sistema está funcionando.
Este é o terceiro artigo da série sobre convenções de nomenclatura no OpenTelemetry - nas partes anteriores, já vimos como nomear corretamente os spans e como enriquecê-los com atributos. Agora é hora de falar sobre como nomear métricas de forma clara e útil.

Ao contrário dos spans, que contam histórias sobre eventos, as métricas mostram dados quantitativos: quanto, com que frequência, com que rapidez.
Mas - e isso é importante - nomes bem pensados para métricas são tão cruciais quanto para spans. E os mesmos princípios se aplicam: o “quem” pertence aos atributos, não ao nome.

O que podemos aprender com sistemas tradicionais

Antes de falar sobre o OpenTelemetry, vejamos como as métricas eram nomeadas anteriormente.
Por exemplo, no Kubernetes, é comum encontrar padrões como:

apiserver_request_total
scheduler_schedule_attempts_total
container_cpu_usage_seconds_total
kubelet_volume_stats_used_bytes

Há um padrão claro aqui: componente + recurso + ação + unidade.
Ou seja, o nome da métrica já inclui o nome do serviço. Isso fazia sentido em modelos de dados antigos, com pouco contexto disponível.

No entanto, esse método traz vários problemas:

Erro principal: nome do serviço dentro do nome da métrica

A principal regra do OpenTelemetry:
não inclua o nome do serviço no nome da métrica.

Por exemplo, imagine que você tem um serviço de pagamentos. É tentador criar métricas como:

payment.transaction.count
payment.latency.p95
payment.error.rate

Mas isso está errado.
O nome do serviço já está disponível no contexto - no atributo service.name.

Forma correta:

transaction.count (service.name=payment)
http.server.request.duration (service.name=payment)
error.rate (service.name=payment)

Por que isso é melhor?
Porque agora você pode agregar dados de todos os serviços facilmente:

sum(transaction.count) # Todas as transações em todos os serviços
sum(transaction.count{service.name="payment"}) # Apenas do serviço payment

Se o nome do serviço estivesse “embutido” na métrica, seria necessário criar consultas separadas para cada serviço.

O modelo de contexto do OpenTelemetry

No OpenTelemetry, o contexto não fica escondido no nome - ele é estruturado em múltiplos níveis:
recursos, escopo (instrumentation scope) e atributos.

Abordagem tradicional (estilo Prometheus):

payment_service_transaction_total{method="credit_card",status="success"}
user_service_auth_latency_milliseconds{endpoint="/login",region="us-east"}
inventory_service_db_query_seconds{table="products",operation="select"}

Abordagem OpenTelemetry:

transaction.count
- Resource: service.name=payment, deployment.environment.name=prod
- Attributes: method=credit_card, status=success

auth.duration
- Resource: service.name=user
- Attributes: endpoint=/login, region=us-east
- Unit: ms

db.client.operation.duration
- Resource: service.name=inventory
- Attributes: db.sql.table=products, db.operation=select
- Unit: s

Esse formato segue a especificação do OpenTelemetry, onde o contexto é distribuído entre camadas em vez de ser “achatado” no nome.

Unidades de medida não fazem parte do nome

Da mesma forma: unidades de medida não devem aparecer no nome da métrica.

Antes era assim:

response_time_milliseconds
memory_usage_bytes
throughput_requests_per_second

No OpenTelemetry, as unidades são especificadas separadamente:

http.server.request.duration {unit: ms}
system.memory.usage {unit: By}
http.server.request.rate {unit: {request}/s}

Vantagens:

Boas práticas de nomenclatura

Ao definir um nome de métrica, use o formato {verbo}.{objeto} - o mesmo usado para spans.

Correto Incorreto
http.server.request.duration payment_http_requests_ms
db.client.operation.duration user_service_db_queries_seconds
transaction.count payment_transaction_total
messaging.client.sent.messages order_service_messages_sent_total

Vantagens de nomes limpos

Erros comuns

O contexto variável (versão, ambiente, instância) deve estar em atributos, não no nome.

Conclusão

Uma métrica bem nomeada é um presente para o seu “eu” do futuro.
Ela torna os dados observáveis, os dashboards reutilizáveis e os incidentes mais fáceis de compreender.

O princípio é simples:

o nome da métrica descreve o que está sendo medido - não quem mede ou onde.

Todo o resto - versão, serviço, ambiente - deve estar nos atributos.

Perguntas frequentes (FAQ)