Skip to content

Traces

Distributed tracing é o terceiro backend L1 depois de Prom e Loki. Como eles, segue o ADR-014: edges fazem push direto, manager só consulta.

O data plane

text
your apps (OTLP gRPC/HTTP)


edge:
  otelcol (subprocess plugin)
    └─ remote OTLP → tempo:4317

                          ├─ trace storage (S3-compatible blob)

                          └─ metrics_generator → traces_spanmetrics_*


                                                 prometheus:9090

otelcol roda como um plugin sob o edge agent (mesmo modelo de supervisão de promtail — veja Logs). O collector aceita tanto gRPC (:4317) quanto HTTP (:4318) no host, faz batch, e encaminha para o Tempo do cloud via HTTPS.

Apps não precisam saber do Ongrid

Configure o exporter OTel da sua aplicação para apontar a http://localhost:4318 (ou o equivalente gRPC). O otelcol local trata auth + batch + a viagem ao cloud. Remover o Ongrid significa remover uma única variável de env — seu código fica intacto.

O gerador spanmetrics

O deployment Tempo no compose tem metrics_generator habilitado. Cada batch de spans produz três métricas derivadas emitidas de volta no mesmo Prom:

SérieFonte
traces_spanmetrics_calls_totalum counter por (service, operation, status_code)
traces_spanmetrics_latency_buckethistograma de duração de span
traces_spanmetrics_size_bucketopcional, off por padrão

Esse é o truque load-bearing que faz alertas de trace parecerem alertas de metric: o evaluator de alerta consulta o Prom, o dado vive no Tempo.

Categorias de alerta

trace_latency

json
{
  "kind": "trace_latency",
  "scope_type": "global",
  "conditions_json": {
    "service": "payments-api",
    "operation": "POST /v1/charge",
    "quantile": "p95",
    "window": "5m",
    "threshold_ms": 800
  }
}

Compila para:

promql
histogram_quantile(
  0.95,
  sum by (le) (rate(traces_spanmetrics_latency_bucket{
    service_name="payments-api", span_name="POST /v1/charge"
  }[5m]))
) * 1000 > 800

operation é opcional — descarte para latência a nível de serviço. Veja compileTraceLatencyRule.

Quantis suportados: p50 / p95 (padrão) / p99. A forma string existe para o picker do form da UI ficar curto; o compiler mapeia para o float que histogram_quantile quer.

trace_error_rate

json
{
  "kind": "trace_error_rate",
  "scope_type": "global",
  "conditions_json": {
    "service": "payments-api",
    "window": "5m",
    "operator": ">",
    "threshold_pct": 1.0
  }
}

Compila para:

promql
100 * (
  sum by (service_name) (rate(traces_spanmetrics_calls_total{
    service_name="payments-api", status_code="STATUS_CODE_ERROR"
  }[5m]))
  / sum by (service_name) (rate(traces_spanmetrics_calls_total{
    service_name="payments-api"
  }[5m]))
) > 1.0

O literal STATUS_CODE_ERROR é o que o gerador spanmetrics emite; convenções alternativas de status de span precisam do próprio kind.

Tools

query_traceql

Passthrough direto ao endpoint TraceQL do Tempo (query_traceql_basetool.go). Usado pela persona investigator quando o operador pede IDs de trace específicos — ex.: "encontre um trace lento para payments-api nos últimos 30 minutos".

text
{ resource.service.name="payments-api" } | duration > 800ms

O client subjacente é internal/pkg/tracequery; nome de pacote desacoplado do backend de propósito — clients Jaeger / Zipkin podem entrar depois sem renomear a superfície.

correlate_incident

A tool composta com que a persona investigator começa. Puxa sinais de Prom + Loki + Tempo em torno da janela de disparo do incidente em uma única chamada de fan-out. Reduz 4-5 chamadas de tool sequenciais a uma — importante quando o budget por investigação é de 10 chamadas de tool.

Veja correlate_incident_basetool.go.

Veja também