Pular para o conteúdo

Convenções de Nomes

Nomear spans, métricas e atributos de forma consistente é fundamental para manter a observabilidade útil à medida que o sistema cresce. O OpenTelemetry define convenções semânticas (semantic conventions) que padronizam esses nomes. Neste guia, vamos ver como aplicá-las na prática.

Sem convenções:

Equipe A: span name = "query_database"
Equipe B: span name = "db.query"
Equipe C: span name = "mysql_select"

Com convenções:

Todas as equipes: span name = "SELECT minha_tabela"
atributo db.system = "mysql"
atributo db.operation.name = "SELECT"

Convenções consistentes permitem:

  • Dashboards unificados — uma query funciona para todos os serviços
  • Alertas genéricos — “latência de DB > 500ms” funciona em qualquer serviço
  • Correlação entre times — todos falam a mesma língua de observabilidade
  • Ferramentas automáticas — backends podem gerar visualizações automaticamente

O OpenTelemetry mantém um conjunto de convenções semânticas que definem nomes padrão para atributos comuns. Aqui estão as mais importantes:

Identificam quem está emitindo telemetria:

AtributoDescriçãoExemplo
service.nameNome do serviçopedidos-api
service.versionVersão do serviço1.2.3
service.namespaceNamespace/grupoecommerce
deployment.environment.nameAmbienteproduction
host.nameNome do hostpod-abc123
cloud.providerProvedor cloudaws
cloud.regionRegiãosa-east-1

Para operações HTTP (tanto client quanto server):

AtributoDescriçãoExemplo
http.request.methodMétodo HTTPGET, POST
url.pathPath da URL/api/pedidos
http.response.status_codeStatus code200, 500
server.addressHost do servidorapi.exemplo.com
http.routeRota (com template)/api/pedidos/{id}

Nomes de spans HTTP:

Para spans de servidor HTTP, use o formato:

{method} {http.route}

Exemplos:

  • GET /api/pedidos/{id}
  • POST /api/pedidos
  • GET /api/pedidos/12345 (não use IDs no nome do span!)
  • handleRequest (muito genérico)
  • PedidosController.buscar (implementação, não operação)
AtributoDescriçãoExemplo
db.systemTipo do bancopostgresql, mysql, redis
db.operation.nameOperaçãoSELECT, INSERT, findOne
db.collection.nameTabela/collectionpedidos, usuarios
db.namespaceDatabase/schemaecommerce

Nomes de spans de DB:

{db.operation.name} {db.collection.name}

Exemplos:

  • SELECT pedidos
  • INSERT pagamentos
  • database query (muito genérico)
  • SELECT * FROM pedidos WHERE id = 123 (não inclua a query completa no nome!)
AtributoDescriçãoExemplo
messaging.systemSistemakafka, rabbitmq, sqs
messaging.operation.typeOperaçãopublish, receive, process
messaging.destination.nameTópico/filapedidos-criados

Nomes de spans de mensageria:

{messaging.destination.name} {messaging.operation.type}

Exemplos:

  • pedidos-criados publish
  • pagamentos-processados receive

Para instrumentação manual, siga estas regras:

# ✅ Bom — descreve a operação de negócio
with tracer.start_as_current_span("processar_pagamento"):
...
# ✅ Bom — usa hierarquia com ponto
with tracer.start_as_current_span("pedido.validar_estoque"):
...
# ❌ Ruim — muito genérico
with tracer.start_as_current_span("process"):
...
# ❌ Ruim — muito específico (contém dados variáveis)
with tracer.start_as_current_span(f"processar_pagamento_{pedido_id}"):
...
  1. Use snake_case ou dot.notationprocessar_pedido ou pedido.processar
  2. Nunca inclua dados variáveis — IDs, valores, timestamps vão em atributos
  3. Use verbos que descrevem a açãovalidar, processar, enviar, calcular
  4. Mantenha cardinalidade baixa — o nome do span deve ter poucas variações possíveis
# ✅ Correto — dados variáveis como atributos
with tracer.start_as_current_span("processar_pedido") as span:
span.set_attribute("pedido.id", pedido_id)
span.set_attribute("pedido.valor", valor_total)
span.set_attribute("cliente.id", cliente_id)
# ❌ Errado — dados variáveis no nome do span
with tracer.start_as_current_span(f"processar_pedido_{pedido_id}"):
...

Por que isso importa? Backends de observabilidade agrupam spans pelo nome. Se cada span tem um nome único (porque contém um ID), você não consegue agregar métricas como “tempo médio para processar pedidos”.

{namespace}.{objeto}.{ação}

Use pontos como separador e snake_case para cada parte:

  • http.server.request.duration
  • pedidos.processados.total
  • estoque.consultas.latency
  • HttpServerRequestDuration (não use camelCase)
  • pedidos-processados (não use hífens)
Tipo de métricaSufixo sugeridoExemplo
Counter.total ou .countpedidos.processados.total
Histogram (duração).durationhttp.server.request.duration
Histogram (tamanho).sizehttp.server.response.body.size
Gaugesem sufixosystem.cpu.utilization

Sempre use unidades no nome ou como metadado da métrica:

  • Duração: s (segundos) — o OpenTelemetry padroniza em segundos
  • Tamanho: By (bytes)
  • Contagem: sem unidade

Antes de fazer merge de código com instrumentação nova, verifique:

  • service.name está configurado em todos os serviços
  • Nomes de spans não contêm dados variáveis (IDs, valores)
  • Atributos seguem as convenções semânticas quando aplicável
  • Métricas usam snake_case com separador de ponto
  • Atributos de domínio têm prefixo do namespace (pedido.id, não id)
  • Spans HTTP usam {method} {route} como nome
  • Spans de DB usam {operation} {table} como nome

Discussão

Tem alguma dúvida ou quer compartilhar sua experiência? Comente abaixo!