Observability и trace sampling
1) Por que o Observabilidade
Observabilidade (O11y) responde a três perguntas: o que acontece, o porquê, como corrigir isso. Baseia-se no sinal:- Métricas (unidades, reagem rápida);
- Logi (detalhes e forense);
- Trailers (relações de causa e efeito de passagem);
- Os ficheiros (CPU/heap/lock contence em modo prod).
Chave: correlação entre sinais + economia de telemetria (samplicação, reticências, compressão).
2) Mapa de sinais e princípios
2. 1 RED/USE
RED (para API): Rate (RPS), Errors (% 5xx/4xx importantes), Duration (p50/p95/p99).
USE (para recursos): Usilization, Saturation, Errors (NIC, CPU, disco, filas).
2. 2 Invariantes do produto
Defina o SLO (por exemplo, "p95 latência '/v1/payments '≤ 300 ms, orçamento errado 0. 5% em 30 dias"). Os Alerts só devem gritar quando o SLO estiver perturbado ou queimado.
2. 3 Contexto
Implemente o W3C Trace Context ('traceparent', 'tracestate') e o baggage para transferir os atributos/negócios com segurança (como 'tenant', 'region', sem PII).
3) Arquitetura de observabilidade
SDK/instalação automática: OpenTelemetry (OTel) em serviços (HTTP/gRPC/DB/clientes).
OTel Colector como pneu: recepção → enriquecimento → samplicação → exportação (Prometheus, Tempo/Jaeger, Loki/ELK, ClickHouse).
- Métricas: Prometheus/Mimir/VictoriaMetrics;
- Trailers: Tempo/Jaeger/Zipkin;
- Logi: Armazenamento Loki/ELK/Vector→S3+deshevoye;
- Perfil: Pyroscope/Parca.
- Correlação: gráficos de serviços, exemplars, transição do gráfico p99 para um trade específico.
4) Sampling trailing: estratégias
4. 1 Head-based sampling (na entrada, antes do conhecimento do resultado)
Implementação simples e barata (em SDK/ingress).
Contras: pode omitir erros raros ou consultas lentas.
Quando: RPS alto, orçamentos rigorosos, é necessária uma proporção previsível (por exemplo, 1% a 5%).
4. 2 Tail-based sampling (na saída, sabendo o resultado)
A decisão é tomada no Colector após a conclusão do span.
É possível selecionar as anomalias, como erros, p99, rotas e tenentes específicos.
Contras: tampão, mais difícil e mais caro.
Precisamos de trailers «significativos» a um custo moderado.
4. 3 Modelo combinado
Head global 1-5%, além de regras tail: «manter sempre erros/slow-span», «samplicar 50% do tráfego canary», «salvar todos os trailers de rotas de pagamento em um incidente».
5) Samplicação dinâmica e orçamento de telemetria
Budet-aware: reter o volume de ≤ N trails/min; quando excedido - aumentar liminares (por exemplo, selecionar apenas p99. 5+, error-only).
Rulas by rota/tenant: endpoint/tenentes importantes - com maior proporção.
Janelas adaptativas: Os saltos → aumentar temporariamente a proporção de erros/lentidão.
Redução da radicalidade: normalize o usuário-agente, IP/ASN, squash stack traces, disfarce os segredos.
6) Configs (Arbitragens)
6. 1 OpenTelemetry Colector - tail-sampling (yaml-fragmento)
yaml receivers:
otlp: { protocols: { http: {}, grpc: {} } }
processors:
batch: { send_batch_size: 8192, timeout: 2s }
tail_sampling:
decision_wait: 5s num_traces: 100000 expected_new_traces_per_sec: 5000 policies:
- name: always-error type: status_code status_code: { status_codes: [ERROR] }
- name: slow-endpoints type: latency latency: { threshold_ms: 300 } # p95 цель
- name: important-routes type: string_attribute string_attribute: { key: http. target, values: ["/v1/payments", "/v1/payouts"] }
- name: tenant-eu1 type: string_attribute string_attribute: { key: tenant, values: ["eu-1"] }
- name: probabilistic-default type: probabilistic probabilistic: { sampling_percentage: 5. 0 }
exporters:
otlphttp/tempo: { endpoint: http://tempo:4318 }
prometheus: { endpoint: "0. 0. 0. 0:9464" }
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch, tail_sampling]
exporters: [otlphttp/tempo]
6. 2 Prometheus - exemplars (fatia)
No aplicativo ao gravar histogramas, adicione exemplars com 'trace _ id'. No Grafana, os cliques de agulhas são conduzidos a trens.
yaml scrape_configs:
- job_name: api scrape_interval: 10s honor_labels: true static_configs: [{ targets: ["api:9100"] }]
exemplar_limit: 10
6. 3 Loki - redução do custo dos logs
As marcas são apenas estáveis ('service', 'eng', 'region', 'road _ class').
Alta cardealidade (request _ id, user _ id) - em payload, mas com redação.
Sempre em informações de sucesso, guarde todos os erros/avisos.
6. 4 Jaeger/Tempo - Retensio e índice
Guarde trailers crus de 3 a 7 dias, equipamentos/simetria por mais tempo.
Inclua parquet/blocks em armazenamento barato (S3-compatível) e os índices são compactos.
7) Simulação de trailing
7. 1 Denominação e atributos
`service. name`, `service. version`, `deployment. environment`.
`http. method`, `http. route`, `http. target`, `http. status_code`, `net. peer. name`.
Atributos empresariais sem PII: 'tenant', 'region', 'payment _ provider', 'game _ id'.
7. 2 Eventos e ligações
Span events: pontos importantes (início da transação DB, retrai, circuito aberto, cachê miss).
Links: comunicação zapros→vebkhuk/sobytiye; útil para EDA e outbox/inbox.
7. 3 Instâncias (exemplars)
Adicione a histogramas latency/size exemplos com 'trace _ id': navegação «de métrica → para trace» em um clique.
8) Métricas: quais e como
8. 1 Técnico
RED para roteiros/tenantes/provedores (PSP, KYC).
Пулы: `db_connections_in_use`, `http_client_in_flight`, `queue_depth`.
Estabilização: retries, timeouts, circuito open/half-open, rate-limit hits.
Go/Java/Python runtime: pares GC, heap, safepoants, atrasos GIL.
8. 2 Métricas de negócios
Registros/logins/depósitos/conclusões, conversões, falhas 3DS/KYC, chargeback-ratio.
Fichas importantes: time-to-wallet, sucess-rate payout.
8. 3 Cardinalidade e armazenamento
Histogramas com buckets explícitos (por exemplo, '[50,100,200,300,500,1000,2000] ms').
Evite marcas de alta vitalidade (raw user _ id, request _ id) - levar para os logs/trailers.
9) Logs: padrões e correlação
Formato: JSON + chaves necessárias ('timestamp', 'level', 'mensagem', 'trace _ id', 'span _ id', 'service', 'eng').
Editar: disfarce PAN, tokens, PII.
Sempling: 100% para 'erro/warn', 5-20% para 'info' em caminhos 'ruidosos'.
A ligação aos trailers é através de 'trace _ id'. Linhas de logos → «pivot» em trade e vice-versa.
10) Profiling em venda
Inclua o continuous profiling (Pyroscope/Parca) para CPU/heap/alloc/locks.
Correlacione os picos p99 com vidros quentes; Guardem 7-14 dias.
11) Alerting SLO/orçamento errado
Alertas SLO: «Orçamento errado gasto mais rápido que X %/hora» (alertas de previsão).
Sintomas, não razões: alerte para o nível do cliente (RUM/edge ou para-rout), não para o CPU.
Multi-window, multi-burn rate: 2% por 1h e 5% por 6h - duas condições.
Silêncio em degradações programadas - mudança de liminares em bandeiras de fiche/canário.
12) Custo e retenção
Quotas de volume: trailers ≤ N TB/mes, logs - quente 3-7 dias, frio S3 30-90 dias, métricas - downsampling (1 min → 5 min → 1 h).
Tail-rulas reduzem o volume x 10- x 100, mantendo erros/lentos.
Os sinais de menor custo são métricas; Os trailers «certos» e os perfis são os mais valiosos.
13) Antipattern
«100% de trailers sempre» → explosão de custo, barulho e freios.
Logs em formato livre sem chave/disfarce.
Métricas com editoras infinitas (user _ id/ip/full UA).
Não 'traceparent '/' baggage' - a corelação não é possível.
Alertas para CPU/heap em vez de SLO - bate-papo «queimado» sem utilidade.
Samplear «rand 1%» sem prioridade de erro/slow - perde valiosas malas.
14) Exemplos de dashboards (esqueletos)
API Overview: RPS, erro-rate por classe, latency p95/p99 (exemplars clicáveis), top routs.
Release/Canary: comparação entre as métricas da versão antiga/nova, outlier-rate, open-circuits, retries.
PSP/KYC: sucess-rate por provedores, latency e falha, correlação com erros payout.
Infra: USE em recursos, fila de saturação, rede drops.
15) Especificidades do iGaming/Finanças
Caminhos críticos (depósitos/conclusões): Trailing 100% somente em casos de incidentes ou janelas limitadas; em tempo integral - tail «tudo com erro/latência prolongada».
Região/tenante: adicione «tenant», «jurisdicção», «brand» ao baggage; construa o SLO sob jurisdição.
Antifrod/bot filtro: métricas e trailers de soluções Risk API (allow/deny/challenge), challenge-pass-rate, velocity-hits.
Auditoria/Complacência: armazenar o mínimo necessário, sem PII; os registros imutáveis estão em um circuito separado.
16) Folha de cheque pró-prontidão
- Enaltecimento completo ('traceparent', 'baggage'), correlação de logs/métricas/trailers.
- OtTel Captor com tail-sampling (errors/slow/rots importantes) + protabilistic default.
- RED/USE métricas, buckets explícitos, exemplars → transição para trance.
- SLO e alerting de orçamento errado (duas linhas de tempo).
- Regulamentos de retenção e orçamento de telemetria; downsampling métricas; cold armazenamento para logs.
- Logos JSON padrão, redação PII/segredos.
- O perfil da venda está incluído; dashboards de estagiários quentes para o incidente.
- Canários e comparações de versões; uma edição sem «zonas cegas».
- Runbook: como elevar temporariamente a participação do sampleamento no incidente.
- Documentação de naiming atributos/marcas e proibição de high-cardinality.
17) TL; DR
Construa a observabilidade em torno da correlação: métricas RED/USE → exemplars → trails → logs/perfis. Gerencie o custo através do sampleamento combinado: um pequeno head% + regras tail (erros, lentidão, rotas importantes/tenentes). As alertas são para o SLO e para o orçamento dos erros. Mantenha a reticência e a cardinalidade sob controle, use OTel Colector como «sistema nervoso central». Para os caminhos de pagamento/jurisdição - telemetria prioritária e higiene de dados rigorosa.