Distributed Tracing
(Secção Tecnologia e Infraestrutura)
Resumo curto
Os traçados distribuídos respondem a uma pergunta sobre onde e por que é que se perde tempo no caminho de consulta através da entrada, API, filas, banco de dados, provedores externos (PSP/estúdios de jogos). OpenTelemetry (OTel) é um padrão aberto SDK/agentes/protocolo que reúne trailers, métricas e logs. Em iGaming é uma ferramenta básica para manter p95/p99, localizar rapidamente problemas de pagamento e identificar «estreitos» antes dos torneios de pico.
1) Conceitos OTel
Trace é o caminho completo da transação (depósito, taxa, conclusão).
Span é uma área de trabalho (HTTP-handler, consulta SQL, chamada de fila/provedor).
Atributes - valor-chave com detalhes ('net. peer. name`, `db. system`, `psp. route`).
Events - Eventos instantâneos (retrações, timeout, erro de dinheiro).
Links - conexão com outras pistas (importante para async/queue).
Resource - metadados de processo: 'service. name`, `service. version`, `deployment. environment`, `cloud. region`.
2) Divulgação do contexto
Use o W3C Trace Context:
traceparent: 00-<trace_id>-<span_id>-01 tracestate:...
Opcional - baggage para chaves seguras (por exemplo, 'tenant', 'road'), não coloque PII lá.
Onde derrubar o contexto: porta de API → RPC interno → produtor na fila → consoante → HTTP externo (PSP/Provedores).
3) Convenções semânticas (mínimo obrigatório)
HTTP/RPC: `http. method`, `http. route`, `http. status_code`.
DB/dinheiro: 'db. system` (`mysql`/`postgresql`/`redis`), `db. statement '(camuflado),' db. operation`.
Filas de espera: 'mensaging. system` (`kafka`/`rabbitmq`), `messaging. destination`, `messaging. operation` (`send`/`process`).
Pagamentos: 'psp. route`, `psp. provider`, `payment. id '(pseudónimo),' amount ',' currency '.
iGaming domínio é 'game. provider`, `game. session_id` (hash), `player. id_hash`.
Taxonomia unificada → comparabilidade de dashboards e rápida busca de causas.
4) Sampling: como não se afogar nos dados
Head-based (na entrada da consulta)
Simples, barato; adequado para o fluxo geral.
Menos - você pode perder «interessantes» pistas lentas/erradas.
Tail-based (в Collector)
A decisão é tomada após a conclusão dos spans, com apenas erros/segmentos lentos/importantes (pagamentos VIP/pagamentos).
Ideal para carga de prod, reduz muito o custo com alta informabilidade.
- Head: 5-10% para revestimento de fundo.
- Tail: 100% erros + p95 + roteiros de pagamento/canários lentos.
5) Topologias OpenTelemetry Colector
Agente-saidcar (em cada nó/pod): recepção local, tampão mínimo, exportação para agregador.
Gateway (cluster): tail-sampling, roteiro, enriquecimento, exportação para Tempo/Jaeger/Zipkin/OTLP.
Exemplo: tail-sampling (fatia YAML)
yaml processors:
tailsampling:
decision_wait: 5s policies:
- name: errors type: status_code status_code:
status_codes: [ ERROR ]
- name: slow_p95 type: latency latency:
threshold_ms: 250
- name: payments type: string_attribute string_attribute:
key: service. name values: [ "payments-api", "payments-worker" ]
6) Correlação com métricas e logs
Adicione 'trace _ id '/' span _ id' a cada entrada de logs.
Mantenha as métricas de latência como histogramas e inclua exemplars - referência ao representativo 'trace _ id' para «saltar» de um booket p95 para um traço específico.
Anotações de lançamento (Git SHA, versão do elenco) - como events/editoras.
7) Ferramentas (idiomas e agentes automáticos)
Go (manual + auto)
go tp:= sdktrace. NewTracerProvider(
sdktrace. WithBatcher(exporter),
sdktrace. WithResource(resource. NewWithAttributes(
semconv. SchemaURL,
semconv. ServiceName("payments-api"),
)),
)
otel. SetTracerProvider(tp)
ctx, span:= tracer. Start(ctx, "Deposit")
defer span. End()
span. SetAttributes(
attribute. String("psp. route","pspX"),
attribute. String("currency","EUR"),
)
Java
Agente automático '-javaagent: opentelemetry-javaagent. jar ', config por meio de env (' OTEL _ SERVICE _ NAME ',' OTEL _ EXPEDIR _ OTLP _ ENDPOINT ').
Manualmente - Anotações/ferramentas de localização de arco (pool JDBC, em dinheiro).
Node. js / Python
Ferramenta auto com SDK + plugins (Express/FastAPI/celery).
Para as filas, os embrulhos da produtora/consoante para colocar 'mensagens' e links.
8) Filas e async: spans corretos
Produtor ('send'): span para envio para top/fila.
Consumer ('processo'): novo span de processamento de mensagem com link para o produtor span (manter o causal sem 'trace _ id' geral).
Atributos: 'mensaging. kafka. partition`, `messaging. rabbitmq. routing_key`, `messaging. message_id`.
Em retraias, event 'retry', contador de tentativas.
9) BD/dinheiro e N + 1
Ative o driver de trailer do BD, agrupe as solicitações idênticas em batches.
Para Redis/cachê - atributos 'cachê. hit`/`cache. miss`.
Leve os pedidos pesados para spans individuais - vê onde está o p99.
10) Provedores externos: PSP/estúdios de jogos
Vire os clientes HTTP: 'psp. provider`, `psp. route`, `timeout_ms`, `attempt`.
Logue códigos/tipos de erro, mas não PII (número de cartão, tokens).
Compare os estúdios/rotas por 'duration', 'error-rate'.
11) Frontend e RUM
OTel Web SDK: `page_view`, `resource_load`, `xhr`.
Coloque 'traceparent' em um backend para guiar o caminho do usuário de UI → API → BD.
Segmentação por geo/provedor de rede - editoras opcionais.
12) Segurança e PII
Disfarce os campos ('db. statement 'com edição), hasteie' player _ id '.
Zonas de dados: 'pii = true', 'region = EU/TR/LATAM'.
Controle de acesso a trailers de pagamento (rol-baseado).
WORM/Retenção: prazo de armazenamento para vestígios sensíveis, remoção por política.
13) Desempenho e custo
Tail-sampling política: «erros + lentos + pagamentos + lançamentos canários».
Downsampling histograma métricas, dedução agressiva de logs.
Limite de radicalidade: não encaixar 'user _ id' como uma editora de métrica.
Tampões/batches em Colector, compressão OTLP.
14) Dashboards e análise
Serviço map: dependências de serviços, coloração por erro/latência.
Release compare: Revalidação de canário de vs estável (p95, error-rate, payments 1962).
Top slow traces: na rota '/deposit ', corte por PSP/região.
Queue lag: pistas com atraso profundo no consumo.
15) Exemplos de configuração do Captor
Pipelines (métricas/trens/logs, fatia)
yaml receivers:
otlp: { protocols: { http: {}, grpc: {} } }
processors:
batch:
memory_limiter:
limit_mib: 1024 spike_limit_mib: 256 attributes/payments:
actions:
- key: "psp. provider"
action: insert value: "pspX"
exporters:
otlp/traces: { endpoint: tempo:4317, tls: { insecure: true } }
otlp/metrics:{ endpoint: prometheus-otlp:4317, tls: { insecure: true } }
otlp/logs: { endpoint: loki-otlp:4317, tls: { insecure: true } }
service:
pipelines:
traces:
receivers: [ otlp ]
processors: [ memory_limiter, batch, tailsampling ]
exporters: [ otlp/traces ]
metrics:
receivers: [ otlp ]
processors: [ batch ]
exporters: [ otlp/metrics ]
logs:
receivers: [ otlp ]
processors: [ batch ]
exporters: [ otlp/logs ]
16) Runbooks (cenários típicos)
A) Crescimento p99 em 'payments-api'
1. Abrir «Top slow traces» → cair em spans BD/PSP.
2. Se o problema PSP for traduzir a rota, ative os retais/temporizações.
3. Verificar a fila de 'withdrawals' (lag), aumentar os consoantes.
B) Erros 5xx após lançamento
1. Filtro por 'service. version`.
2. Comparar estável/canário; Encontrar espólios em 'psp. route`.
3. Congelar promoções, reverter (ver Estratégias de lançamento/Rolbacks).
C) Suspeita de N + 1
1. Trailers com um grande número de spans DB curtos.
2. Ativar agregação/joyne, adicionar camada de dinheiro.
17) Folha de cheque de implementação
1. Inclua OTel SDK e atributos de Resource unificados ('service. name`, `env`, `region`).
2. Acesse o W3C Trace Context através de todas as camadas e filas.
3. Conjunto mínimo de atributos semânticos (HTTP/DB/queue/PSP).
4. Tail-sampling: erros, p95 +, pagamentos, canhão.
5. Logs com 'trace _ id '/' span _ id', métricas com exemplars.
6. Dashboards: service map, release compare, payments flow.
7. Políticas PII: camuflagem, zonas, papéis, retenções.
8. Teste/carga: verificação de correlação e completeness training antes dos picos.
9. Geração automática de links runbook em alertas.
10. Um relatório sobre o custo da telemetria e da radicalidade.
18) Antipattern
Traçados «só na entrada» sem BB/filas → não são úteis.
A falta de instrução na async → «rompem» as cadeias de causalidade.
Sampling é aleatório 1% sem lógica tail → não apanhamos lentidão/erro.
Logs sem 'trace _ id' → não há correlação de passagem.
PII cru em atributos/logs → os riscos da complacência.
A cardinalidade «para o teto» (user/sessão como editoras métricas) → a explosão de valor.
Resumo
transforma a observabilidade a partir de um conjunto de ferramentas separadas em linguagem de desempenho. Quando o contexto é explorado corretamente, semântica cuidadosa, tail-sampling e ligando «métrica ↔ pista ↔ logi», o comando iGaming mantém o p95/p99 sob controle, isolando rapidamente os pontos estreitos (BD, filas, PSP) e soltando com segurança lançamentos mesmo em picos de tráfego.