@luanpdd/kit-mcp 1.35.0 → 1.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +2 -2
- package/bin/mcp.js +6 -6
- package/bin/ui.js +74 -74
- package/gates/ai-prompt-stability.md +120 -120
- package/gates/budget-description.md +68 -68
- package/gates/confidence.md +29 -29
- package/gates/dependency-check.md +33 -33
- package/gates/dept-cycle-prevention.md +179 -179
- package/gates/golden-signals-coverage.md +133 -133
- package/gates/legacy-refactor-safety.md +178 -178
- package/gates/multi-tenant-rls-coverage.md +102 -102
- package/gates/no-personal-uuid.md +72 -72
- package/gates/obs-agents-mcp-supabase.md +86 -86
- package/gates/obs-skills-frontmatter.md +76 -76
- package/gates/observability-coverage.md +151 -151
- package/gates/omm-no-regression.md +83 -83
- package/gates/postmortem-template-required.md +127 -127
- package/gates/prr-checklist-coverage.md +128 -128
- package/gates/regression.md +32 -32
- package/gates/release-pipeline-policy.md +132 -132
- package/gates/secrets-scan.md +33 -33
- package/gates/service-role-not-in-user-facing.md +113 -113
- package/gates/skill-must-include.md +71 -71
- package/gates/sync-idempotent.md +62 -62
- package/gates/verify-phase-goal.md +34 -34
- package/kit/agents/designer-ui.md +216 -216
- package/kit/agents/workflow-generator.md +537 -167
- package/kit/commands/adicionar-backlog.md +1 -1
- package/kit/commands/adicionar-fase.md +1 -1
- package/kit/commands/adicionar-tarefa.md +1 -1
- package/kit/commands/auditar-observabilidade.md +103 -103
- package/kit/commands/auditar-toil.md +129 -129
- package/kit/commands/caracterizar-prompt.md +195 -195
- package/kit/commands/criar-workflow.md +158 -158
- package/kit/commands/definir-perfil.md +1 -1
- package/kit/commands/definir-slo.md +108 -108
- package/kit/commands/fio.md +1 -1
- package/kit/commands/golden-signals.md +142 -142
- package/kit/commands/instrumentar-fase.md +200 -200
- package/kit/commands/investigar-producao.md +162 -162
- package/kit/commands/observabilidade.md +118 -118
- package/kit/commands/postmortem.md +179 -179
- package/kit/commands/prr.md +205 -205
- package/kit/commands/publicar-rapido.md +207 -207
- package/kit/commands/risk-budget.md +220 -220
- package/kit/commands/sre.md +230 -230
- package/kit/file-manifest.json +424 -424
- package/kit/framework/references/output-style.md +22 -22
- package/kit/hooks/post-apply-migration.js +199 -199
- package/kit/hooks/sidecar-tool-publisher.js +210 -210
- package/kit/skills/_shared-dados-distribuidos/glossary.md +224 -224
- package/kit/skills/_shared-legacy/glossary.md +389 -389
- package/kit/skills/_shared-multi-tenant/glossary.md +186 -186
- package/kit/skills/_shared-observability/glossary.md +396 -396
- package/kit/skills/_shared-sre/glossary.md +712 -712
- package/kit/skills/_shared-supabase/glossary.md +234 -234
- package/kit/skills/blameless-postmortems/SKILL.md +340 -340
- package/kit/skills/burn-rate-alerting/SKILL.md +258 -258
- package/kit/skills/cascading-failures/SKILL.md +311 -311
- package/kit/skills/core-analysis-loop/SKILL.md +352 -352
- package/kit/skills/distributed-tracing/SKILL.md +362 -362
- package/kit/skills/dynamic-workflow-authoring/SKILL.md +327 -223
- package/kit/skills/eliminating-toil/SKILL.md +243 -243
- package/kit/skills/event-based-slos/SKILL.md +296 -296
- package/kit/skills/four-golden-signals/SKILL.md +314 -314
- package/kit/skills/hermetic-builds/SKILL.md +323 -323
- package/kit/skills/legacy-monster-methods/SKILL.md +444 -444
- package/kit/skills/llm-as-dependency/SKILL.md +436 -436
- package/kit/skills/load-shedding-graceful-degradation/SKILL.md +396 -396
- package/kit/skills/observability-driven-development/SKILL.md +315 -315
- package/kit/skills/observability-maturity-model/SKILL.md +222 -222
- package/kit/skills/opentelemetry-standard/SKILL.md +351 -351
- package/kit/skills/production-readiness-review/SKILL.md +305 -305
- package/kit/skills/release-engineering/SKILL.md +367 -367
- package/kit/skills/retry-strategies/SKILL.md +372 -372
- package/kit/skills/sre-risk-management/SKILL.md +221 -221
- package/kit/skills/structured-events/SKILL.md +265 -265
- package/kit/skills/supabase-cron-queues/SKILL.md +275 -275
- package/kit/skills/supabase-database-functions/SKILL.md +332 -332
- package/kit/skills/supabase-declarative-schema/SKILL.md +183 -183
- package/kit/skills/supabase-pgvector-rag/SKILL.md +253 -253
- package/kit/skills/supabase-postgres-style/SKILL.md +138 -138
- package/kit/skills/supabase-storage/SKILL.md +234 -234
- package/kit/skills/telemetry-pipelines/SKILL.md +259 -259
- package/kit/skills/telemetry-sampling/SKILL.md +256 -256
- package/kit/skills/ui-anti-padroes-ia/SKILL.md +261 -261
- package/kit/skills/ui-contexto-produto/SKILL.md +248 -248
- package/kit/skills/ui-cor-estrategia/SKILL.md +213 -213
- package/kit/skills/ui-critica-auditoria/SKILL.md +260 -260
- package/kit/skills/ui-motion-funcional/SKILL.md +264 -264
- package/kit/skills/ui-ritmo-espacial/SKILL.md +259 -259
- package/kit/skills/ui-tipografia/SKILL.md +211 -211
- package/package.json +1 -1
- package/src/cli/index.js +1114 -1114
- package/src/cli/render.js +194 -194
- package/src/cli/upgrade-check.js +135 -135
- package/src/core/error-redaction.js +76 -76
- package/src/core/failures.js +153 -153
- package/src/core/gate-runner.js +205 -205
- package/src/core/gates.js +82 -82
- package/src/core/logger.js +170 -170
- package/src/core/manifest-verify.js +174 -174
- package/src/core/metrics.js +268 -268
- package/src/core/notify.js +60 -60
- package/src/core/path-safety.js +141 -141
- package/src/core/replays.js +120 -120
- package/src/core/ui.js +185 -185
- package/src/mcp-server/install.js +149 -149
- package/src/mcp-server/roots.js +124 -124
- package/src/ui/auto-spawn.js +113 -113
- package/src/ui/browser.js +78 -78
- package/src/ui/client.js +130 -130
- package/src/ui/events.js +65 -65
- package/src/ui/lockfile.js +191 -191
- package/src/ui/port.js +67 -67
- package/src/ui/server.js +547 -547
- package/src/ui/wrapper.js +129 -129
|
@@ -1,396 +1,396 @@
|
|
|
1
|
-
# Glossário Observabilidade — Termos, Comandos e Patterns Canônicos
|
|
2
|
-
|
|
3
|
-
> Arquivo de referência compartilhado pelas skills `observability-*` e `*-events`, `*-tracing`, `*-slo*`, `*-sampling`, `*-pipelines`, `*-maturity-model`. **NÃO é skill** — não tem `description:` triggerável; não aparece em `listKit`. Cross-referenciado pelas skills via Markdown link relativo.
|
|
4
|
-
|
|
5
|
-
> **Material-fonte:** *Observability Engineering* — Charity Majors, Liz Fong-Jones, George Miranda (O'Reilly, 2022). ISBN 978-1-492-07644-5.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## (a) Termos PT-BR ↔ EN
|
|
10
|
-
|
|
11
|
-
### Conceitos centrais
|
|
12
|
-
|
|
13
|
-
| EN | PT-BR / Significado |
|
|
14
|
-
|---|---|
|
|
15
|
-
| **observability** | Observabilidade — capacidade de explicar **qualquer** estado novo do sistema sem precisar fazer novo deploy de instrumentação. Contraste com **monitoring**, que requer prever falhas em advance. |
|
|
16
|
-
| **monitoring** | Monitoramento — coleta de métricas pré-definidas para detectar **estados conhecidos** (CPU > 80%, memória < 10%). Insuficiente para distributed systems modernos. |
|
|
17
|
-
| **cardinality** | Cardinalidade — número de valores únicos possíveis em um campo. `user.id` em app com 1M usuários = cardinalidade 1M. **Alta cardinalidade é essencial** para observabilidade. |
|
|
18
|
-
| **dimensionality** | Dimensionalidade — número de campos/atributos em um evento. Wide events têm alta dimensionalidade (100+ campos). |
|
|
19
|
-
| **first principles** | Primeiros princípios — raciocínio do zero sobre o sistema, sem assumir nada. Base do `core-analysis-loop`. |
|
|
20
|
-
| **wide event** | Evento amplo — 1 evento por request com muitos campos (alta dimensionalidade) e alta cardinalidade. **Building block** da observabilidade (cap 5). |
|
|
21
|
-
|
|
22
|
-
### Telemetria
|
|
23
|
-
|
|
24
|
-
| EN | PT-BR / Significado |
|
|
25
|
-
|---|---|
|
|
26
|
-
| **structured event** | Evento estruturado — registro tipado com campos nomeados (JSON ou similar). Contrário de log unstructured (texto livre). |
|
|
27
|
-
| **trace** | Rastro distribuído — coleção de spans relacionados por `trace_id` que descreve o caminho completo de um request através de múltiplos serviços. |
|
|
28
|
-
| **span** | Span — unidade de trabalho dentro de um trace. Identificada por `span_id` único; aponta para `parent_span_id`. |
|
|
29
|
-
| **trace_id** | Identificador único do trace (32 hex chars / 16 bytes). Compartilhado entre todos os spans do mesmo trace. |
|
|
30
|
-
| **span_id** | Identificador único do span (16 hex chars / 8 bytes). |
|
|
31
|
-
| **parent_span_id** | `span_id` do span pai. Null no root span. Define a árvore de spans. |
|
|
32
|
-
| **W3C TraceContext** | Padrão W3C para propagar contexto cross-service via header HTTP `traceparent: 00-{trace_id}-{span_id}-{flags}`. |
|
|
33
|
-
| **B3 / B3M** | Padrão Zipkin de propagação. Headers `X-B3-TraceId`, `X-B3-SpanId`, `X-B3-Sampled`. Suporte secundário em OTel. |
|
|
34
|
-
| **stitching** | Costura — ligar spans relacionados em um trace via `trace_id` + `parent_span_id`. Funciona além de RPCs (batch jobs, lambdas, S3 uploads). |
|
|
35
|
-
| **context propagation** | Propagação de contexto — mecanismo de OTel SDK que serializa/deserializa contexto entre services (header HTTP, gRPC metadata, queue message attrs). |
|
|
36
|
-
| **head-based sampling** | Sampling no início — decisão de sample tomada quando trace é iniciado (no service de entrada). Propagada via flag em `traceparent`. |
|
|
37
|
-
| **tail-based sampling** | Sampling no fim — decisão tomada após trace completar (requer buffer/collector). Permite manter erros + outliers preservando custo. |
|
|
38
|
-
|
|
39
|
-
### OpenTelemetry
|
|
40
|
-
|
|
41
|
-
| EN | PT-BR / Significado |
|
|
42
|
-
|---|---|
|
|
43
|
-
| **OTel** | OpenTelemetry — projeto CNCF, união de OpenTracing + OpenCensus (2019). Padrão vendor-neutral para telemetria. |
|
|
44
|
-
| **OTel API** | Especificação que devs usam para instrumentar (sem implementação). |
|
|
45
|
-
| **OTel SDK** | Implementação concreta da API: state, batching, exportação. |
|
|
46
|
-
| **Tracer** | Componente do SDK que cria/gerencia spans. |
|
|
47
|
-
| **Meter** | Componente do SDK que cria/gerencia métricas. |
|
|
48
|
-
| **Exporter** | Plug-in do SDK que traduz dados in-memory em formato de destino (OTLP, Jaeger, Prometheus, vendor-specific). |
|
|
49
|
-
| **OTLP** | OpenTelemetry Protocol — wire format default. HTTP em porta 4318; gRPC em 4317. Protobuf schema. |
|
|
50
|
-
| **Collector** | Binário standalone (proxy/sidecar) que recebe telemetria, processa e roteia para múltiplos destinos. |
|
|
51
|
-
| **auto-instrumentation** | Instrumentação automática via wrappers/middleware (HTTP, gRPC, DB drivers). Time-to-first-value baixo. |
|
|
52
|
-
| **custom instrumentation** | Instrumentação manual com atributos de business logic (`customer.tier`, `feature_flag`, `experiment_arm`). |
|
|
53
|
-
|
|
54
|
-
### SLOs e Burn Rate
|
|
55
|
-
|
|
56
|
-
| EN | PT-BR / Significado |
|
|
57
|
-
|---|---|
|
|
58
|
-
| **SLI** | Service-Level Indicator — métrica que classifica eventos como "good" ou "bad". Deve ser **event-based**, não time-based. |
|
|
59
|
-
| **SLO** | Service-Level Objective — meta interna de SLI (ex: 99.9% das requests com `result.success = true` em 30 dias). |
|
|
60
|
-
| **SLA** | Service-Level Agreement — acordo externo com cliente/usuário. Geralmente menos rígido que SLO interno. |
|
|
61
|
-
| **error budget** | Orçamento de erro — fração de eventos "bad" tolerável dentro de um SLO (ex: SLO 99.9% → 0.1% de budget). |
|
|
62
|
-
| **burn rate** | Taxa de queima — velocidade com que o error budget está sendo consumido. Burn rate 1 = budget durará a janela exata; burn rate 10 = budget acaba 10× mais rápido. |
|
|
63
|
-
| **sliding window** | Janela deslizante — recorte de tempo que avança continuamente (ex: últimos 30d). Recomendado vs **fixed window** (calendário). |
|
|
64
|
-
| **fixed window** | Janela fixa — recorte alinhado ao calendário (ex: dia 1 a 30 do mês). Anti-pattern: cliente não esquece bug do dia 30 só porque virou mês. |
|
|
65
|
-
| **lookahead window** | Janela de previsão — quanto tempo no futuro o burn alert prevê (ex: alert se vai esgotar em 4h). |
|
|
66
|
-
| **baseline window** | Janela de base — quanto tempo passado é usado para calcular burn atual (ex: últimos 1h). Regra: lookahead ≤ 4× baseline sem ajuste de seasonality. |
|
|
67
|
-
| **predictive burn alert** | Alerta preditivo — dispara quando taxa atual prevê esgotamento dentro do lookahead. Mais cedo que zero-level. |
|
|
68
|
-
| **context-aware burn alert** | Alerta com contexto — leva em conta budget remanescente (10% restante = mais urgente que 90%). Mais caro computacionalmente. |
|
|
69
|
-
| **short-term burn alert** | Alerta de curto prazo — só extrapola baseline recente, ignora budget total. Mais barato. |
|
|
70
|
-
|
|
71
|
-
### Observability-Driven Development (ODD)
|
|
72
|
-
|
|
73
|
-
| EN | PT-BR / Significado |
|
|
74
|
-
|---|---|
|
|
75
|
-
| **ODD** | Observability-Driven Development — análogo a TDD mas para production. Bundle telemetria com feature; valide em prod, não só em testes. |
|
|
76
|
-
| **shift-left observability** | Empurrar observabilidade para a esquerda do SDLC — instrumentar **antes** do PR, não depois do incident. |
|
|
77
|
-
| **production as glass castle** | Anti-pattern — equipes têm medo de mexer em prod porque não conseguem entender o que acontece lá. ODD transforma em "interactive playground". |
|
|
78
|
-
| **auto-page the merger** | Padrão — paginar automaticamente quem mergeou o PR por 30-60min após deploy. Tighten feedback loop. |
|
|
79
|
-
| **decoupling deployments from releases** | Separar deploy de release — feature flags, progressive delivery. Permite observar comportamento antes de expor a 100%. |
|
|
80
|
-
|
|
81
|
-
### Sampling e Pipelines
|
|
82
|
-
|
|
83
|
-
| EN | PT-BR / Significado |
|
|
84
|
-
|---|---|
|
|
85
|
-
| **constant probability sampling** | Sampling com probabilidade fixa (ex: 1 em 1000). Falha em low volume — eventos raros desaparecem. |
|
|
86
|
-
| **dynamic sampling** | Sampling adaptativo — taxa muda com volume de tráfego ou conteúdo do evento. |
|
|
87
|
-
| **by-key sampling** | Sampling por chave — taxa diferente por valor de campo (ex: 100% de erros, 1% de sucessos, 50% de paying customers). |
|
|
88
|
-
| **telemetry pipeline** | Pipeline de telemetria — sequência de stages (receive → process → route → export). OTel Collector é exemplo. |
|
|
89
|
-
| **routing** | Roteamento — mandar telemetria para destinos diferentes baseado em conteúdo (severity, tenant). |
|
|
90
|
-
| **buffering** | Buffer — armazenar temporariamente para tolerar falhas/lentidão downstream. |
|
|
91
|
-
|
|
92
|
-
### Observability Maturity Model (OMM)
|
|
93
|
-
|
|
94
|
-
| EN | PT-BR / Significado |
|
|
95
|
-
|---|---|
|
|
96
|
-
| **OMM** | Observability Maturity Model — framework de 5 capacidades para avaliar maturidade de observabilidade de um time/projeto. |
|
|
97
|
-
| **resilience capability** | Capacidade de resiliência — responder a falhas com recovery mensurável (MTTR, on-call burden). |
|
|
98
|
-
| **code quality capability** | Capacidade de qualidade de código — observability ajuda a fechar feedback loop entre dev e prod. |
|
|
99
|
-
| **complexity capability** | Capacidade de manejar complexidade — encontrar gargalos sem chutes; debugging em sistemas grandes. |
|
|
100
|
-
| **release cadence capability** | Capacidade de cadência de release — métrica chave: tempo do commit ao prod. |
|
|
101
|
-
| **user behavior capability** | Capacidade de entender comportamento de usuário — observability data ≈ behavioral data + technical data. |
|
|
102
|
-
|
|
103
|
-
---
|
|
104
|
-
|
|
105
|
-
## (b) Comandos canônicos
|
|
106
|
-
|
|
107
|
-
### OpenTelemetry CLI
|
|
108
|
-
|
|
109
|
-
```bash
|
|
110
|
-
# Receiver/exporter dev — local OTel Collector via Docker
|
|
111
|
-
docker run -p 4317:4317 -p 4318:4318 \
|
|
112
|
-
-v "$(pwd)/otelcol-config.yaml":/etc/otelcol/config.yaml \
|
|
113
|
-
otel/opentelemetry-collector:latest
|
|
114
|
-
|
|
115
|
-
# Validar config OTLP
|
|
116
|
-
otelcol validate --config=otelcol-config.yaml
|
|
117
|
-
|
|
118
|
-
# Tracegen — gera traces sintéticos para testar pipelines
|
|
119
|
-
telemetrygen traces --otlp-insecure --traces 100 --rate 10
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
### Supabase / Postgres — queries para SLI events
|
|
123
|
-
|
|
124
|
-
```sql
|
|
125
|
-
-- PT-BR: SLI event-based — boa request = HTTP 2xx + duration < 300ms
|
|
126
|
-
-- Materializa contagem em view para alimentar burn rate
|
|
127
|
-
create or replace view obs.sli_endpoint_home as
|
|
128
|
-
select
|
|
129
|
-
date_trunc('minute', created_at) as bucket,
|
|
130
|
-
count(*) filter (where status_code < 400 and duration_ms < 300) as good,
|
|
131
|
-
count(*) filter (where status_code >= 400 or duration_ms >= 300) as bad,
|
|
132
|
-
count(*) as total
|
|
133
|
-
from obs.events
|
|
134
|
-
where event_name = 'http_request' and path = '/home'
|
|
135
|
-
group by bucket;
|
|
136
|
-
|
|
137
|
-
-- PT-BR: burn rate atual com janela deslizante 1h
|
|
138
|
-
select
|
|
139
|
-
sum(bad)::float / nullif(sum(total), 0) as error_rate,
|
|
140
|
-
(sum(bad)::float / nullif(sum(total), 0)) / (1 - 0.999) as burn_rate
|
|
141
|
-
from obs.sli_endpoint_home
|
|
142
|
-
where bucket >= now() - interval '1 hour';
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
### Logflare (Supabase logs platform) — equivalentes
|
|
146
|
-
|
|
147
|
-
```bash
|
|
148
|
-
# CLI logflare — buscar eventos
|
|
149
|
-
supabase logs api --filter "request.path=/home" --limit 100
|
|
150
|
-
|
|
151
|
-
# Via SQL no schema 'logs'
|
|
152
|
-
select metadata->>'request.path', count(*)
|
|
153
|
-
from logs.edge_function_logs
|
|
154
|
-
where timestamp > now() - interval '1h'
|
|
155
|
-
group by 1;
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
### MCP tools Supabase (canônico kit-mcp)
|
|
159
|
-
|
|
160
|
-
```text
|
|
161
|
-
mcp__supabase__get_logs — logs por service (api, postgres, edge-function, auth)
|
|
162
|
-
mcp__supabase__execute_sql — query SQL para validar hipóteses
|
|
163
|
-
mcp__supabase__get_advisors — security/performance lints
|
|
164
|
-
mcp__supabase__list_tables — schema atual
|
|
165
|
-
mcp__supabase__apply_migration — aplicar migration que materializa SLI events
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
---
|
|
169
|
-
|
|
170
|
-
## (c) Patterns canônicos
|
|
171
|
-
|
|
172
|
-
### Pattern: campos canônicos em wide events
|
|
173
|
-
|
|
174
|
-
Convenção de nomes para atributos OTel/JSON estruturado (dot notation). **Use sempre estes nomes** ao instrumentar:
|
|
175
|
-
|
|
176
|
-
| Campo | Tipo | Exemplo | Por quê |
|
|
177
|
-
|---|---|---|---|
|
|
178
|
-
| `user.id` | uuid | `"550e8400-e29b-41d4-..."` | Cardinalidade alta — debug por usuário |
|
|
179
|
-
| `tenant_id` | uuid/text | `"acme"` | Multi-tenancy — debug por tenant |
|
|
180
|
-
| `request.id` | uuid v4 | `"req_abc123"` | Correlação — propagado via header `x-request-id` |
|
|
181
|
-
| `result.success` | bool | `true` / `false` | SLI event-based — bom/mau |
|
|
182
|
-
| `error.type` | enum | `"timeout"`, `"validation"`, `"auth"`, `"rate_limit"`, `"db"` | Categoria de erro — filtragem rápida |
|
|
183
|
-
| `error.message` | text | `"connection refused"` | Debug — não usado em SLI |
|
|
184
|
-
| `duration_ms` | int | `127` | Latência — sempre milissegundos |
|
|
185
|
-
| `build_id` | text | `"abc123f"` ou `"v1.9.0"` | Debug — comparar versões |
|
|
186
|
-
| `feature_flag.<name>` | bool | `feature_flag.new_checkout: true` | Experimentação — slice/dice |
|
|
187
|
-
| `customer.tier` | enum | `"free"`, `"pro"`, `"enterprise"` | Priorização — sample diferente |
|
|
188
|
-
| `endpoint` | text | `"/api/v1/orders"` | Agrupamento — by-route |
|
|
189
|
-
| `http.status_code` | int | `200`, `404`, `503` | SLI — código HTTP |
|
|
190
|
-
|
|
191
|
-
### Pattern: estrutura de span OTel
|
|
192
|
-
|
|
193
|
-
```ts
|
|
194
|
-
// PT-BR: instrumentação canônica de handler com atributos custom
|
|
195
|
-
import { trace } from '@opentelemetry/api'
|
|
196
|
-
|
|
197
|
-
const tracer = trace.getTracer('checkout-service')
|
|
198
|
-
|
|
199
|
-
export async function placeOrder(req: Request) {
|
|
200
|
-
return tracer.startActiveSpan('place_order', async (span) => {
|
|
201
|
-
// PT-BR: atributos canônicos sempre
|
|
202
|
-
span.setAttribute('user.id', req.user.id)
|
|
203
|
-
span.setAttribute('tenant_id', req.tenant)
|
|
204
|
-
span.setAttribute('customer.tier', req.user.tier)
|
|
205
|
-
span.setAttribute('request.id', req.id)
|
|
206
|
-
|
|
207
|
-
try {
|
|
208
|
-
const order = await db.insertOrder(req.body)
|
|
209
|
-
span.setAttribute('result.success', true)
|
|
210
|
-
span.setAttribute('order.id', order.id)
|
|
211
|
-
return order
|
|
212
|
-
} catch (e) {
|
|
213
|
-
span.setAttribute('result.success', false)
|
|
214
|
-
span.setAttribute('error.type', classify(e)) // 'validation' | 'db' | 'rate_limit'
|
|
215
|
-
span.setAttribute('error.message', e.message)
|
|
216
|
-
throw e
|
|
217
|
-
} finally {
|
|
218
|
-
span.end() // PT-BR: SEMPRE em finally — duration_ms calculado aqui
|
|
219
|
-
}
|
|
220
|
-
})
|
|
221
|
-
}
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
### Pattern: SLI event-based vs time-based
|
|
225
|
-
|
|
226
|
-
```ts
|
|
227
|
-
// PT-BR: BAD — time-based SLI (anti-pattern)
|
|
228
|
-
// "p99 latency < 300ms over each 5-minute window"
|
|
229
|
-
// Problema: 5 min de violação no fim de uma janela some quando janela vira
|
|
230
|
-
|
|
231
|
-
// PT-BR: GOOD — event-based SLI
|
|
232
|
-
// "proportion of events with duration < 300ms in last 30d"
|
|
233
|
-
function isGoodEvent(event: HttpEvent): boolean {
|
|
234
|
-
return event.status_code < 400 && event.duration_ms < 300
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// PT-BR: contagem para SLO
|
|
238
|
-
const total = events.length
|
|
239
|
-
const good = events.filter(isGoodEvent).length
|
|
240
|
-
const slo_compliance = good / total // ≥ 0.999 para SLO 99.9%
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
### Pattern: Core Analysis Loop em prosa
|
|
244
|
-
|
|
245
|
-
```text
|
|
246
|
-
1. SINTOMA: alerta dispara — "checkout SLO burn rate = 8 (4× acima de 2)"
|
|
247
|
-
|
|
248
|
-
2. HIPÓTESE inicial (de dados, NÃO intuição):
|
|
249
|
-
- Query 1: GROUP BY error.type — qual erro domina?
|
|
250
|
-
- Resultado: error.type = 'rate_limit' representa 78% dos eventos bad
|
|
251
|
-
|
|
252
|
-
3. VALIDAÇÃO/REFINAMENTO:
|
|
253
|
-
- Query 2: GROUP BY tenant_id WHERE error.type = 'rate_limit'
|
|
254
|
-
- Resultado: tenant_id = 'acme' representa 95% dos rate_limits
|
|
255
|
-
|
|
256
|
-
4. PRÓXIMA ITERAÇÃO:
|
|
257
|
-
- Query 3: GROUP BY endpoint WHERE tenant_id = 'acme' AND error.type = 'rate_limit'
|
|
258
|
-
- Resultado: endpoint = '/api/v1/bulk_orders' = 100%
|
|
259
|
-
- ROOT CAUSE: tenant acme está fazendo bulk orders acima do quota.
|
|
260
|
-
- AÇÃO: aumentar quota OU contactar acme OU adicionar backpressure.
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
---
|
|
264
|
-
|
|
265
|
-
## (d) Anti-patterns explícitos
|
|
266
|
-
|
|
267
|
-
### Dashboard-flipping
|
|
268
|
-
|
|
269
|
-
```text
|
|
270
|
-
ANTI-PATTERN: ver spike num dashboard, abrir 12 outros dashboards, procurar visualmente
|
|
271
|
-
por "shape similar" para identificar correlação.
|
|
272
|
-
|
|
273
|
-
POR QUÊ É RUIM: pattern matching humano não escala; depende de dashboards pré-criados;
|
|
274
|
-
não funciona para emergent failures (Cap 8).
|
|
275
|
-
|
|
276
|
-
CERTO: usar Core Analysis Loop — partir de uma query, refinar com GROUP BY iterativo,
|
|
277
|
-
chegar à root cause via dados.
|
|
278
|
-
```
|
|
279
|
-
|
|
280
|
-
### Cause-based alerts
|
|
281
|
-
|
|
282
|
-
```text
|
|
283
|
-
ANTI-PATTERN: alertar em CPU > 80%, memória < 10%, threads > N, etc.
|
|
284
|
-
Misturar "what" (sintoma) com "why" (causa raiz).
|
|
285
|
-
|
|
286
|
-
POR QUÊ É RUIM: gera false positives (cron job legítimo dispara CPU alta);
|
|
287
|
-
gera false negatives (sistema lento sem CPU alta);
|
|
288
|
-
normalização do desvio (Cap 12 — "Challenger disaster").
|
|
289
|
-
|
|
290
|
-
CERTO: alertar APENAS em SLO burn rate (event-based, customer-impacting).
|
|
291
|
-
Decouple "what" de "why" — alert diz que tem dor, debug descobre porquê.
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
### Fixed-window error budget
|
|
295
|
-
|
|
296
|
-
```text
|
|
297
|
-
ANTI-PATTERN: error budget reseta dia 1 do mês.
|
|
298
|
-
"Tivemos outage dia 31, mas reseta amanhã."
|
|
299
|
-
|
|
300
|
-
POR QUÊ É RUIM: clientes não esquecem outage por causa de calendar reset;
|
|
301
|
-
gera comportamento perverso (postpone fix para depois do reset);
|
|
302
|
-
dificulta planejamento de capacidade.
|
|
303
|
-
|
|
304
|
-
CERTO: sliding window 30d.
|
|
305
|
-
Outage dia 31 ainda conta no budget até dia 30 do mês seguinte (sai gradualmente).
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
### Constant probability sampling em low volume
|
|
309
|
-
|
|
310
|
-
```text
|
|
311
|
-
ANTI-PATTERN: sample rate fixo 1/1000 mesmo para erros.
|
|
312
|
-
|
|
313
|
-
POR QUÊ É RUIM: se você tem 1000 req/min e 1% de erro = 10 erros/min,
|
|
314
|
-
samplados 1/1000 = 0.01 erros/min = perde sinal de erro.
|
|
315
|
-
|
|
316
|
-
CERTO: by-key sampling — 100% de erros, 1% de sucessos.
|
|
317
|
-
Em low volume, prefira capturar tudo ou usar dynamic sampling.
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
### AIOps como solução
|
|
321
|
-
|
|
322
|
-
```text
|
|
323
|
-
ANTI-PATTERN: comprar "AIOps platform" para agrupar/suprimir/processar alertas.
|
|
324
|
-
|
|
325
|
-
POR QUÊ É RUIM: você está pagando para mascarar normalização do desvio (Cap 12).
|
|
326
|
-
ML não cria sinal onde não há — apenas filtra ruído de alertas
|
|
327
|
-
que não deveriam existir em primeiro lugar.
|
|
328
|
-
|
|
329
|
-
CERTO: deletar alertas inúteis. Migrar para SLO-based alerting (Cap 12).
|
|
330
|
-
Investir em observability tooling, não em alert noise reduction.
|
|
331
|
-
```
|
|
332
|
-
|
|
333
|
-
### Time-based SLI
|
|
334
|
-
|
|
335
|
-
```text
|
|
336
|
-
ANTI-PATTERN: "99% das janelas de 5 minutos têm p99 < 300ms"
|
|
337
|
-
|
|
338
|
-
POR QUÊ É RUIM: pre-aggregation perde fidelidade; janela com 1 outlier puxa p99 acima
|
|
339
|
-
mesmo com 99.9% das requests boas; difícil de compor com error budget.
|
|
340
|
-
|
|
341
|
-
CERTO: event-based SLI — "99.9% dos eventos individuais têm duration < 300ms".
|
|
342
|
-
```
|
|
343
|
-
|
|
344
|
-
### Observability como debugger
|
|
345
|
-
|
|
346
|
-
```text
|
|
347
|
-
ANTI-PATTERN: usar observability tool para debugar lógica de função (line-by-line).
|
|
348
|
-
|
|
349
|
-
POR QUÊ É RUIM: scale errado — emitir 1 evento por linha de código gera GB/min e
|
|
350
|
-
custa 10× o sistema observado (Cap 11).
|
|
351
|
-
|
|
352
|
-
CERTO: observability é para ENCONTRAR ONDE debugar (qual service, qual hop, qual versão).
|
|
353
|
-
Para line-level use debugger (gdb, pdb) ou profiler.
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
### Glass castle production
|
|
357
|
-
|
|
358
|
-
```text
|
|
359
|
-
ANTI-PATTERN: equipe tem medo de mexer em produção porque "qualquer mexida quebra tudo".
|
|
360
|
-
|
|
361
|
-
POR QUÊ É RUIM: feature freeze efetivo; rollback automático sem entender;
|
|
362
|
-
deploys raros que batchean N changes (cada deploy é alto risco).
|
|
363
|
-
|
|
364
|
-
CERTO: ODD — bundle telemetria com feature; deploy frequente + observable;
|
|
365
|
-
pequenas mudanças isoladas; auto-page do merger por 30-60min.
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
---
|
|
369
|
-
|
|
370
|
-
## (e) Cross-references
|
|
371
|
-
|
|
372
|
-
Skills que consultam este glossário:
|
|
373
|
-
|
|
374
|
-
- `kit/skills/structured-events/SKILL.md`
|
|
375
|
-
- `kit/skills/distributed-tracing/SKILL.md`
|
|
376
|
-
- `kit/skills/opentelemetry-standard/SKILL.md`
|
|
377
|
-
- `kit/skills/core-analysis-loop/SKILL.md`
|
|
378
|
-
- `kit/skills/observability-driven-development/SKILL.md` *(Phase 30)*
|
|
379
|
-
- `kit/skills/event-based-slos/SKILL.md` *(Phase 32)*
|
|
380
|
-
- `kit/skills/burn-rate-alerting/SKILL.md` *(Phase 32)*
|
|
381
|
-
- `kit/skills/telemetry-sampling/SKILL.md` *(Phase 34)*
|
|
382
|
-
- `kit/skills/telemetry-pipelines/SKILL.md` *(Phase 34)*
|
|
383
|
-
- `kit/skills/observability-maturity-model/SKILL.md` *(Phase 34)*
|
|
384
|
-
|
|
385
|
-
Agentes que consultam este glossário:
|
|
386
|
-
|
|
387
|
-
- `kit/agents/observability-instrumenter.md` *(Phase 30)*
|
|
388
|
-
- `kit/agents/incident-investigator.md` *(Phase 30)*
|
|
389
|
-
- `kit/agents/slo-engineer.md` *(Phase 32)*
|
|
390
|
-
- `kit/agents/burn-rate-forecaster.md` *(Phase 32)*
|
|
391
|
-
- `kit/agents/omm-auditor.md` *(Phase 34)*
|
|
392
|
-
|
|
393
|
-
---
|
|
394
|
-
|
|
395
|
-
*Glossário criado em 2026-05-06 (Phase 29 do milestone v1.9 Observabilidade).*
|
|
396
|
-
*Material-fonte: Observability Engineering — O'Reilly, 2022 (978-1-492-07644-5).*
|
|
1
|
+
# Glossário Observabilidade — Termos, Comandos e Patterns Canônicos
|
|
2
|
+
|
|
3
|
+
> Arquivo de referência compartilhado pelas skills `observability-*` e `*-events`, `*-tracing`, `*-slo*`, `*-sampling`, `*-pipelines`, `*-maturity-model`. **NÃO é skill** — não tem `description:` triggerável; não aparece em `listKit`. Cross-referenciado pelas skills via Markdown link relativo.
|
|
4
|
+
|
|
5
|
+
> **Material-fonte:** *Observability Engineering* — Charity Majors, Liz Fong-Jones, George Miranda (O'Reilly, 2022). ISBN 978-1-492-07644-5.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## (a) Termos PT-BR ↔ EN
|
|
10
|
+
|
|
11
|
+
### Conceitos centrais
|
|
12
|
+
|
|
13
|
+
| EN | PT-BR / Significado |
|
|
14
|
+
|---|---|
|
|
15
|
+
| **observability** | Observabilidade — capacidade de explicar **qualquer** estado novo do sistema sem precisar fazer novo deploy de instrumentação. Contraste com **monitoring**, que requer prever falhas em advance. |
|
|
16
|
+
| **monitoring** | Monitoramento — coleta de métricas pré-definidas para detectar **estados conhecidos** (CPU > 80%, memória < 10%). Insuficiente para distributed systems modernos. |
|
|
17
|
+
| **cardinality** | Cardinalidade — número de valores únicos possíveis em um campo. `user.id` em app com 1M usuários = cardinalidade 1M. **Alta cardinalidade é essencial** para observabilidade. |
|
|
18
|
+
| **dimensionality** | Dimensionalidade — número de campos/atributos em um evento. Wide events têm alta dimensionalidade (100+ campos). |
|
|
19
|
+
| **first principles** | Primeiros princípios — raciocínio do zero sobre o sistema, sem assumir nada. Base do `core-analysis-loop`. |
|
|
20
|
+
| **wide event** | Evento amplo — 1 evento por request com muitos campos (alta dimensionalidade) e alta cardinalidade. **Building block** da observabilidade (cap 5). |
|
|
21
|
+
|
|
22
|
+
### Telemetria
|
|
23
|
+
|
|
24
|
+
| EN | PT-BR / Significado |
|
|
25
|
+
|---|---|
|
|
26
|
+
| **structured event** | Evento estruturado — registro tipado com campos nomeados (JSON ou similar). Contrário de log unstructured (texto livre). |
|
|
27
|
+
| **trace** | Rastro distribuído — coleção de spans relacionados por `trace_id` que descreve o caminho completo de um request através de múltiplos serviços. |
|
|
28
|
+
| **span** | Span — unidade de trabalho dentro de um trace. Identificada por `span_id` único; aponta para `parent_span_id`. |
|
|
29
|
+
| **trace_id** | Identificador único do trace (32 hex chars / 16 bytes). Compartilhado entre todos os spans do mesmo trace. |
|
|
30
|
+
| **span_id** | Identificador único do span (16 hex chars / 8 bytes). |
|
|
31
|
+
| **parent_span_id** | `span_id` do span pai. Null no root span. Define a árvore de spans. |
|
|
32
|
+
| **W3C TraceContext** | Padrão W3C para propagar contexto cross-service via header HTTP `traceparent: 00-{trace_id}-{span_id}-{flags}`. |
|
|
33
|
+
| **B3 / B3M** | Padrão Zipkin de propagação. Headers `X-B3-TraceId`, `X-B3-SpanId`, `X-B3-Sampled`. Suporte secundário em OTel. |
|
|
34
|
+
| **stitching** | Costura — ligar spans relacionados em um trace via `trace_id` + `parent_span_id`. Funciona além de RPCs (batch jobs, lambdas, S3 uploads). |
|
|
35
|
+
| **context propagation** | Propagação de contexto — mecanismo de OTel SDK que serializa/deserializa contexto entre services (header HTTP, gRPC metadata, queue message attrs). |
|
|
36
|
+
| **head-based sampling** | Sampling no início — decisão de sample tomada quando trace é iniciado (no service de entrada). Propagada via flag em `traceparent`. |
|
|
37
|
+
| **tail-based sampling** | Sampling no fim — decisão tomada após trace completar (requer buffer/collector). Permite manter erros + outliers preservando custo. |
|
|
38
|
+
|
|
39
|
+
### OpenTelemetry
|
|
40
|
+
|
|
41
|
+
| EN | PT-BR / Significado |
|
|
42
|
+
|---|---|
|
|
43
|
+
| **OTel** | OpenTelemetry — projeto CNCF, união de OpenTracing + OpenCensus (2019). Padrão vendor-neutral para telemetria. |
|
|
44
|
+
| **OTel API** | Especificação que devs usam para instrumentar (sem implementação). |
|
|
45
|
+
| **OTel SDK** | Implementação concreta da API: state, batching, exportação. |
|
|
46
|
+
| **Tracer** | Componente do SDK que cria/gerencia spans. |
|
|
47
|
+
| **Meter** | Componente do SDK que cria/gerencia métricas. |
|
|
48
|
+
| **Exporter** | Plug-in do SDK que traduz dados in-memory em formato de destino (OTLP, Jaeger, Prometheus, vendor-specific). |
|
|
49
|
+
| **OTLP** | OpenTelemetry Protocol — wire format default. HTTP em porta 4318; gRPC em 4317. Protobuf schema. |
|
|
50
|
+
| **Collector** | Binário standalone (proxy/sidecar) que recebe telemetria, processa e roteia para múltiplos destinos. |
|
|
51
|
+
| **auto-instrumentation** | Instrumentação automática via wrappers/middleware (HTTP, gRPC, DB drivers). Time-to-first-value baixo. |
|
|
52
|
+
| **custom instrumentation** | Instrumentação manual com atributos de business logic (`customer.tier`, `feature_flag`, `experiment_arm`). |
|
|
53
|
+
|
|
54
|
+
### SLOs e Burn Rate
|
|
55
|
+
|
|
56
|
+
| EN | PT-BR / Significado |
|
|
57
|
+
|---|---|
|
|
58
|
+
| **SLI** | Service-Level Indicator — métrica que classifica eventos como "good" ou "bad". Deve ser **event-based**, não time-based. |
|
|
59
|
+
| **SLO** | Service-Level Objective — meta interna de SLI (ex: 99.9% das requests com `result.success = true` em 30 dias). |
|
|
60
|
+
| **SLA** | Service-Level Agreement — acordo externo com cliente/usuário. Geralmente menos rígido que SLO interno. |
|
|
61
|
+
| **error budget** | Orçamento de erro — fração de eventos "bad" tolerável dentro de um SLO (ex: SLO 99.9% → 0.1% de budget). |
|
|
62
|
+
| **burn rate** | Taxa de queima — velocidade com que o error budget está sendo consumido. Burn rate 1 = budget durará a janela exata; burn rate 10 = budget acaba 10× mais rápido. |
|
|
63
|
+
| **sliding window** | Janela deslizante — recorte de tempo que avança continuamente (ex: últimos 30d). Recomendado vs **fixed window** (calendário). |
|
|
64
|
+
| **fixed window** | Janela fixa — recorte alinhado ao calendário (ex: dia 1 a 30 do mês). Anti-pattern: cliente não esquece bug do dia 30 só porque virou mês. |
|
|
65
|
+
| **lookahead window** | Janela de previsão — quanto tempo no futuro o burn alert prevê (ex: alert se vai esgotar em 4h). |
|
|
66
|
+
| **baseline window** | Janela de base — quanto tempo passado é usado para calcular burn atual (ex: últimos 1h). Regra: lookahead ≤ 4× baseline sem ajuste de seasonality. |
|
|
67
|
+
| **predictive burn alert** | Alerta preditivo — dispara quando taxa atual prevê esgotamento dentro do lookahead. Mais cedo que zero-level. |
|
|
68
|
+
| **context-aware burn alert** | Alerta com contexto — leva em conta budget remanescente (10% restante = mais urgente que 90%). Mais caro computacionalmente. |
|
|
69
|
+
| **short-term burn alert** | Alerta de curto prazo — só extrapola baseline recente, ignora budget total. Mais barato. |
|
|
70
|
+
|
|
71
|
+
### Observability-Driven Development (ODD)
|
|
72
|
+
|
|
73
|
+
| EN | PT-BR / Significado |
|
|
74
|
+
|---|---|
|
|
75
|
+
| **ODD** | Observability-Driven Development — análogo a TDD mas para production. Bundle telemetria com feature; valide em prod, não só em testes. |
|
|
76
|
+
| **shift-left observability** | Empurrar observabilidade para a esquerda do SDLC — instrumentar **antes** do PR, não depois do incident. |
|
|
77
|
+
| **production as glass castle** | Anti-pattern — equipes têm medo de mexer em prod porque não conseguem entender o que acontece lá. ODD transforma em "interactive playground". |
|
|
78
|
+
| **auto-page the merger** | Padrão — paginar automaticamente quem mergeou o PR por 30-60min após deploy. Tighten feedback loop. |
|
|
79
|
+
| **decoupling deployments from releases** | Separar deploy de release — feature flags, progressive delivery. Permite observar comportamento antes de expor a 100%. |
|
|
80
|
+
|
|
81
|
+
### Sampling e Pipelines
|
|
82
|
+
|
|
83
|
+
| EN | PT-BR / Significado |
|
|
84
|
+
|---|---|
|
|
85
|
+
| **constant probability sampling** | Sampling com probabilidade fixa (ex: 1 em 1000). Falha em low volume — eventos raros desaparecem. |
|
|
86
|
+
| **dynamic sampling** | Sampling adaptativo — taxa muda com volume de tráfego ou conteúdo do evento. |
|
|
87
|
+
| **by-key sampling** | Sampling por chave — taxa diferente por valor de campo (ex: 100% de erros, 1% de sucessos, 50% de paying customers). |
|
|
88
|
+
| **telemetry pipeline** | Pipeline de telemetria — sequência de stages (receive → process → route → export). OTel Collector é exemplo. |
|
|
89
|
+
| **routing** | Roteamento — mandar telemetria para destinos diferentes baseado em conteúdo (severity, tenant). |
|
|
90
|
+
| **buffering** | Buffer — armazenar temporariamente para tolerar falhas/lentidão downstream. |
|
|
91
|
+
|
|
92
|
+
### Observability Maturity Model (OMM)
|
|
93
|
+
|
|
94
|
+
| EN | PT-BR / Significado |
|
|
95
|
+
|---|---|
|
|
96
|
+
| **OMM** | Observability Maturity Model — framework de 5 capacidades para avaliar maturidade de observabilidade de um time/projeto. |
|
|
97
|
+
| **resilience capability** | Capacidade de resiliência — responder a falhas com recovery mensurável (MTTR, on-call burden). |
|
|
98
|
+
| **code quality capability** | Capacidade de qualidade de código — observability ajuda a fechar feedback loop entre dev e prod. |
|
|
99
|
+
| **complexity capability** | Capacidade de manejar complexidade — encontrar gargalos sem chutes; debugging em sistemas grandes. |
|
|
100
|
+
| **release cadence capability** | Capacidade de cadência de release — métrica chave: tempo do commit ao prod. |
|
|
101
|
+
| **user behavior capability** | Capacidade de entender comportamento de usuário — observability data ≈ behavioral data + technical data. |
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## (b) Comandos canônicos
|
|
106
|
+
|
|
107
|
+
### OpenTelemetry CLI
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# Receiver/exporter dev — local OTel Collector via Docker
|
|
111
|
+
docker run -p 4317:4317 -p 4318:4318 \
|
|
112
|
+
-v "$(pwd)/otelcol-config.yaml":/etc/otelcol/config.yaml \
|
|
113
|
+
otel/opentelemetry-collector:latest
|
|
114
|
+
|
|
115
|
+
# Validar config OTLP
|
|
116
|
+
otelcol validate --config=otelcol-config.yaml
|
|
117
|
+
|
|
118
|
+
# Tracegen — gera traces sintéticos para testar pipelines
|
|
119
|
+
telemetrygen traces --otlp-insecure --traces 100 --rate 10
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Supabase / Postgres — queries para SLI events
|
|
123
|
+
|
|
124
|
+
```sql
|
|
125
|
+
-- PT-BR: SLI event-based — boa request = HTTP 2xx + duration < 300ms
|
|
126
|
+
-- Materializa contagem em view para alimentar burn rate
|
|
127
|
+
create or replace view obs.sli_endpoint_home as
|
|
128
|
+
select
|
|
129
|
+
date_trunc('minute', created_at) as bucket,
|
|
130
|
+
count(*) filter (where status_code < 400 and duration_ms < 300) as good,
|
|
131
|
+
count(*) filter (where status_code >= 400 or duration_ms >= 300) as bad,
|
|
132
|
+
count(*) as total
|
|
133
|
+
from obs.events
|
|
134
|
+
where event_name = 'http_request' and path = '/home'
|
|
135
|
+
group by bucket;
|
|
136
|
+
|
|
137
|
+
-- PT-BR: burn rate atual com janela deslizante 1h
|
|
138
|
+
select
|
|
139
|
+
sum(bad)::float / nullif(sum(total), 0) as error_rate,
|
|
140
|
+
(sum(bad)::float / nullif(sum(total), 0)) / (1 - 0.999) as burn_rate
|
|
141
|
+
from obs.sli_endpoint_home
|
|
142
|
+
where bucket >= now() - interval '1 hour';
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Logflare (Supabase logs platform) — equivalentes
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# CLI logflare — buscar eventos
|
|
149
|
+
supabase logs api --filter "request.path=/home" --limit 100
|
|
150
|
+
|
|
151
|
+
# Via SQL no schema 'logs'
|
|
152
|
+
select metadata->>'request.path', count(*)
|
|
153
|
+
from logs.edge_function_logs
|
|
154
|
+
where timestamp > now() - interval '1h'
|
|
155
|
+
group by 1;
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### MCP tools Supabase (canônico kit-mcp)
|
|
159
|
+
|
|
160
|
+
```text
|
|
161
|
+
mcp__supabase__get_logs — logs por service (api, postgres, edge-function, auth)
|
|
162
|
+
mcp__supabase__execute_sql — query SQL para validar hipóteses
|
|
163
|
+
mcp__supabase__get_advisors — security/performance lints
|
|
164
|
+
mcp__supabase__list_tables — schema atual
|
|
165
|
+
mcp__supabase__apply_migration — aplicar migration que materializa SLI events
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## (c) Patterns canônicos
|
|
171
|
+
|
|
172
|
+
### Pattern: campos canônicos em wide events
|
|
173
|
+
|
|
174
|
+
Convenção de nomes para atributos OTel/JSON estruturado (dot notation). **Use sempre estes nomes** ao instrumentar:
|
|
175
|
+
|
|
176
|
+
| Campo | Tipo | Exemplo | Por quê |
|
|
177
|
+
|---|---|---|---|
|
|
178
|
+
| `user.id` | uuid | `"550e8400-e29b-41d4-..."` | Cardinalidade alta — debug por usuário |
|
|
179
|
+
| `tenant_id` | uuid/text | `"acme"` | Multi-tenancy — debug por tenant |
|
|
180
|
+
| `request.id` | uuid v4 | `"req_abc123"` | Correlação — propagado via header `x-request-id` |
|
|
181
|
+
| `result.success` | bool | `true` / `false` | SLI event-based — bom/mau |
|
|
182
|
+
| `error.type` | enum | `"timeout"`, `"validation"`, `"auth"`, `"rate_limit"`, `"db"` | Categoria de erro — filtragem rápida |
|
|
183
|
+
| `error.message` | text | `"connection refused"` | Debug — não usado em SLI |
|
|
184
|
+
| `duration_ms` | int | `127` | Latência — sempre milissegundos |
|
|
185
|
+
| `build_id` | text | `"abc123f"` ou `"v1.9.0"` | Debug — comparar versões |
|
|
186
|
+
| `feature_flag.<name>` | bool | `feature_flag.new_checkout: true` | Experimentação — slice/dice |
|
|
187
|
+
| `customer.tier` | enum | `"free"`, `"pro"`, `"enterprise"` | Priorização — sample diferente |
|
|
188
|
+
| `endpoint` | text | `"/api/v1/orders"` | Agrupamento — by-route |
|
|
189
|
+
| `http.status_code` | int | `200`, `404`, `503` | SLI — código HTTP |
|
|
190
|
+
|
|
191
|
+
### Pattern: estrutura de span OTel
|
|
192
|
+
|
|
193
|
+
```ts
|
|
194
|
+
// PT-BR: instrumentação canônica de handler com atributos custom
|
|
195
|
+
import { trace } from '@opentelemetry/api'
|
|
196
|
+
|
|
197
|
+
const tracer = trace.getTracer('checkout-service')
|
|
198
|
+
|
|
199
|
+
export async function placeOrder(req: Request) {
|
|
200
|
+
return tracer.startActiveSpan('place_order', async (span) => {
|
|
201
|
+
// PT-BR: atributos canônicos sempre
|
|
202
|
+
span.setAttribute('user.id', req.user.id)
|
|
203
|
+
span.setAttribute('tenant_id', req.tenant)
|
|
204
|
+
span.setAttribute('customer.tier', req.user.tier)
|
|
205
|
+
span.setAttribute('request.id', req.id)
|
|
206
|
+
|
|
207
|
+
try {
|
|
208
|
+
const order = await db.insertOrder(req.body)
|
|
209
|
+
span.setAttribute('result.success', true)
|
|
210
|
+
span.setAttribute('order.id', order.id)
|
|
211
|
+
return order
|
|
212
|
+
} catch (e) {
|
|
213
|
+
span.setAttribute('result.success', false)
|
|
214
|
+
span.setAttribute('error.type', classify(e)) // 'validation' | 'db' | 'rate_limit'
|
|
215
|
+
span.setAttribute('error.message', e.message)
|
|
216
|
+
throw e
|
|
217
|
+
} finally {
|
|
218
|
+
span.end() // PT-BR: SEMPRE em finally — duration_ms calculado aqui
|
|
219
|
+
}
|
|
220
|
+
})
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Pattern: SLI event-based vs time-based
|
|
225
|
+
|
|
226
|
+
```ts
|
|
227
|
+
// PT-BR: BAD — time-based SLI (anti-pattern)
|
|
228
|
+
// "p99 latency < 300ms over each 5-minute window"
|
|
229
|
+
// Problema: 5 min de violação no fim de uma janela some quando janela vira
|
|
230
|
+
|
|
231
|
+
// PT-BR: GOOD — event-based SLI
|
|
232
|
+
// "proportion of events with duration < 300ms in last 30d"
|
|
233
|
+
function isGoodEvent(event: HttpEvent): boolean {
|
|
234
|
+
return event.status_code < 400 && event.duration_ms < 300
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// PT-BR: contagem para SLO
|
|
238
|
+
const total = events.length
|
|
239
|
+
const good = events.filter(isGoodEvent).length
|
|
240
|
+
const slo_compliance = good / total // ≥ 0.999 para SLO 99.9%
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Pattern: Core Analysis Loop em prosa
|
|
244
|
+
|
|
245
|
+
```text
|
|
246
|
+
1. SINTOMA: alerta dispara — "checkout SLO burn rate = 8 (4× acima de 2)"
|
|
247
|
+
|
|
248
|
+
2. HIPÓTESE inicial (de dados, NÃO intuição):
|
|
249
|
+
- Query 1: GROUP BY error.type — qual erro domina?
|
|
250
|
+
- Resultado: error.type = 'rate_limit' representa 78% dos eventos bad
|
|
251
|
+
|
|
252
|
+
3. VALIDAÇÃO/REFINAMENTO:
|
|
253
|
+
- Query 2: GROUP BY tenant_id WHERE error.type = 'rate_limit'
|
|
254
|
+
- Resultado: tenant_id = 'acme' representa 95% dos rate_limits
|
|
255
|
+
|
|
256
|
+
4. PRÓXIMA ITERAÇÃO:
|
|
257
|
+
- Query 3: GROUP BY endpoint WHERE tenant_id = 'acme' AND error.type = 'rate_limit'
|
|
258
|
+
- Resultado: endpoint = '/api/v1/bulk_orders' = 100%
|
|
259
|
+
- ROOT CAUSE: tenant acme está fazendo bulk orders acima do quota.
|
|
260
|
+
- AÇÃO: aumentar quota OU contactar acme OU adicionar backpressure.
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## (d) Anti-patterns explícitos
|
|
266
|
+
|
|
267
|
+
### Dashboard-flipping
|
|
268
|
+
|
|
269
|
+
```text
|
|
270
|
+
ANTI-PATTERN: ver spike num dashboard, abrir 12 outros dashboards, procurar visualmente
|
|
271
|
+
por "shape similar" para identificar correlação.
|
|
272
|
+
|
|
273
|
+
POR QUÊ É RUIM: pattern matching humano não escala; depende de dashboards pré-criados;
|
|
274
|
+
não funciona para emergent failures (Cap 8).
|
|
275
|
+
|
|
276
|
+
CERTO: usar Core Analysis Loop — partir de uma query, refinar com GROUP BY iterativo,
|
|
277
|
+
chegar à root cause via dados.
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Cause-based alerts
|
|
281
|
+
|
|
282
|
+
```text
|
|
283
|
+
ANTI-PATTERN: alertar em CPU > 80%, memória < 10%, threads > N, etc.
|
|
284
|
+
Misturar "what" (sintoma) com "why" (causa raiz).
|
|
285
|
+
|
|
286
|
+
POR QUÊ É RUIM: gera false positives (cron job legítimo dispara CPU alta);
|
|
287
|
+
gera false negatives (sistema lento sem CPU alta);
|
|
288
|
+
normalização do desvio (Cap 12 — "Challenger disaster").
|
|
289
|
+
|
|
290
|
+
CERTO: alertar APENAS em SLO burn rate (event-based, customer-impacting).
|
|
291
|
+
Decouple "what" de "why" — alert diz que tem dor, debug descobre porquê.
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### Fixed-window error budget
|
|
295
|
+
|
|
296
|
+
```text
|
|
297
|
+
ANTI-PATTERN: error budget reseta dia 1 do mês.
|
|
298
|
+
"Tivemos outage dia 31, mas reseta amanhã."
|
|
299
|
+
|
|
300
|
+
POR QUÊ É RUIM: clientes não esquecem outage por causa de calendar reset;
|
|
301
|
+
gera comportamento perverso (postpone fix para depois do reset);
|
|
302
|
+
dificulta planejamento de capacidade.
|
|
303
|
+
|
|
304
|
+
CERTO: sliding window 30d.
|
|
305
|
+
Outage dia 31 ainda conta no budget até dia 30 do mês seguinte (sai gradualmente).
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Constant probability sampling em low volume
|
|
309
|
+
|
|
310
|
+
```text
|
|
311
|
+
ANTI-PATTERN: sample rate fixo 1/1000 mesmo para erros.
|
|
312
|
+
|
|
313
|
+
POR QUÊ É RUIM: se você tem 1000 req/min e 1% de erro = 10 erros/min,
|
|
314
|
+
samplados 1/1000 = 0.01 erros/min = perde sinal de erro.
|
|
315
|
+
|
|
316
|
+
CERTO: by-key sampling — 100% de erros, 1% de sucessos.
|
|
317
|
+
Em low volume, prefira capturar tudo ou usar dynamic sampling.
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### AIOps como solução
|
|
321
|
+
|
|
322
|
+
```text
|
|
323
|
+
ANTI-PATTERN: comprar "AIOps platform" para agrupar/suprimir/processar alertas.
|
|
324
|
+
|
|
325
|
+
POR QUÊ É RUIM: você está pagando para mascarar normalização do desvio (Cap 12).
|
|
326
|
+
ML não cria sinal onde não há — apenas filtra ruído de alertas
|
|
327
|
+
que não deveriam existir em primeiro lugar.
|
|
328
|
+
|
|
329
|
+
CERTO: deletar alertas inúteis. Migrar para SLO-based alerting (Cap 12).
|
|
330
|
+
Investir em observability tooling, não em alert noise reduction.
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
### Time-based SLI
|
|
334
|
+
|
|
335
|
+
```text
|
|
336
|
+
ANTI-PATTERN: "99% das janelas de 5 minutos têm p99 < 300ms"
|
|
337
|
+
|
|
338
|
+
POR QUÊ É RUIM: pre-aggregation perde fidelidade; janela com 1 outlier puxa p99 acima
|
|
339
|
+
mesmo com 99.9% das requests boas; difícil de compor com error budget.
|
|
340
|
+
|
|
341
|
+
CERTO: event-based SLI — "99.9% dos eventos individuais têm duration < 300ms".
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### Observability como debugger
|
|
345
|
+
|
|
346
|
+
```text
|
|
347
|
+
ANTI-PATTERN: usar observability tool para debugar lógica de função (line-by-line).
|
|
348
|
+
|
|
349
|
+
POR QUÊ É RUIM: scale errado — emitir 1 evento por linha de código gera GB/min e
|
|
350
|
+
custa 10× o sistema observado (Cap 11).
|
|
351
|
+
|
|
352
|
+
CERTO: observability é para ENCONTRAR ONDE debugar (qual service, qual hop, qual versão).
|
|
353
|
+
Para line-level use debugger (gdb, pdb) ou profiler.
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### Glass castle production
|
|
357
|
+
|
|
358
|
+
```text
|
|
359
|
+
ANTI-PATTERN: equipe tem medo de mexer em produção porque "qualquer mexida quebra tudo".
|
|
360
|
+
|
|
361
|
+
POR QUÊ É RUIM: feature freeze efetivo; rollback automático sem entender;
|
|
362
|
+
deploys raros que batchean N changes (cada deploy é alto risco).
|
|
363
|
+
|
|
364
|
+
CERTO: ODD — bundle telemetria com feature; deploy frequente + observable;
|
|
365
|
+
pequenas mudanças isoladas; auto-page do merger por 30-60min.
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
## (e) Cross-references
|
|
371
|
+
|
|
372
|
+
Skills que consultam este glossário:
|
|
373
|
+
|
|
374
|
+
- `kit/skills/structured-events/SKILL.md`
|
|
375
|
+
- `kit/skills/distributed-tracing/SKILL.md`
|
|
376
|
+
- `kit/skills/opentelemetry-standard/SKILL.md`
|
|
377
|
+
- `kit/skills/core-analysis-loop/SKILL.md`
|
|
378
|
+
- `kit/skills/observability-driven-development/SKILL.md` *(Phase 30)*
|
|
379
|
+
- `kit/skills/event-based-slos/SKILL.md` *(Phase 32)*
|
|
380
|
+
- `kit/skills/burn-rate-alerting/SKILL.md` *(Phase 32)*
|
|
381
|
+
- `kit/skills/telemetry-sampling/SKILL.md` *(Phase 34)*
|
|
382
|
+
- `kit/skills/telemetry-pipelines/SKILL.md` *(Phase 34)*
|
|
383
|
+
- `kit/skills/observability-maturity-model/SKILL.md` *(Phase 34)*
|
|
384
|
+
|
|
385
|
+
Agentes que consultam este glossário:
|
|
386
|
+
|
|
387
|
+
- `kit/agents/observability-instrumenter.md` *(Phase 30)*
|
|
388
|
+
- `kit/agents/incident-investigator.md` *(Phase 30)*
|
|
389
|
+
- `kit/agents/slo-engineer.md` *(Phase 32)*
|
|
390
|
+
- `kit/agents/burn-rate-forecaster.md` *(Phase 32)*
|
|
391
|
+
- `kit/agents/omm-auditor.md` *(Phase 34)*
|
|
392
|
+
|
|
393
|
+
---
|
|
394
|
+
|
|
395
|
+
*Glossário criado em 2026-05-06 (Phase 29 do milestone v1.9 Observabilidade).*
|
|
396
|
+
*Material-fonte: Observability Engineering — O'Reilly, 2022 (978-1-492-07644-5).*
|