Local DryRun | Governança
Local DryRun
Comandante, preparar o seu "Ensaio Geral" (Dry Run) é o último passo antes de colocar a infraestrutura na nuvem. Testar a integração localmente garante que você não gaste os seus créditos do GCP tentando debugar portas fechadas ou variáveis de ambiente incorretas.
Esta é a *Trindade da Infraestrutura Local*. Com um único comando, o seu computador vai simular um data center em miniatura, levantando a camada de persistência financeira, a telemetria de alta performance e a própria Borda (Bridge Service).
Crie o arquivo docker-compose.yml na raiz do seu repositório gbr_iac (ou na raiz do monorepo, onde está o seu Dockerfile.bridge):
O Manifesto do Ensaio Geral (docker-compose.yml)
version: '3.8'
services:
# 1. A Câmara de Compensação Financeira (ScyllaDB)
scylladb:
image: scylladb/scylla:5.4.2
container_name: gbr_scylla
# Otimizado para rodar localmente sem fritar a sua CPU/RAM (Modo de Desenvolvedor)
command: --smp 1 --memory 1G --developer-mode 1
ports:
- "9042:9042" # Porta CQL (Driver nativo)
volumes:
- scylla_data:/var/lib/scylla
networks:
- gleam_mesh
# 2. O Radar de Telemetria (QuestDB)
questdb:
image: questdb/questdb:7.4.2
container_name: gbr_questdb
ports:
- "9000:9000" # Console Web de Administração (Browser)
- "9009:9009" # Porta de Ingestão: Influx Line Protocol (Onde o Gleam atira as métricas)
- "8812:8812" # Porta PostgreSQL Wire Protocol (Para o Grafana ler os dados via SQL)
volumes:
- questdb_data:/root/.questdb
networks:
- gleam_mesh
# 3. O Centro de Observabilidade (Grafana)
grafana:
image: grafana/grafana:10.4.0
container_name: gbr_grafana
ports:
- "3000:3000" # Painel UI
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=gleambradmin
volumes:
- grafana_data:/var/lib/grafana
depends_on:
- questdb
networks:
- gleam_mesh
# 4. A Nossa Fortaleza (O Bridge Service em Gleam)
bridge_service:
build:
context: . # Aponta para a pasta onde está o código Gleam e o Dockerfile
dockerfile: docker/Dockerfile.bridge
container_name: gbr_bridge
ports:
- "4001:4001" # A porta TCP exposta para a malha P2P (Yamux/GossipSub)
environment:
# Variáveis injetadas no Gleam para descobrir os vizinhos do Docker
- SCYLLADB_CONTACT_POINTS=scylladb
- QUESTDB_HOST=questdb
- QUESTDB_PORT=9009
- ERL_FLAGS="+A 32 +K true" # Otimização de threads de I/O
depends_on:
- scylladb
- questdb
networks:
- gleam_mesh
# Rede interna isolada para comunicação rápida entre os contêineres
networks:
gleam_mesh:
driver: bridge
# Volumes para garantir que os seus dados de teste não sumam ao reiniciar
volumes:
scylla_data:
questdb_data:
grafana_data:
O Roteiro de Execução (As Suas Ordens)
*1. A Ignição do Data Center Local:* Abra o terminal na pasta onde guardou o ficheiro e execute:
docker-compose up -d --build
*O Docker vai compilar a sua imagem Gleam ultra-leve (Stage 1 e Stage 2) e instanciar os bancos de dados em segundo plano (-d).*
*2. A Inspeção Visuais (Verificando os Radares):*
-
*QuestDB Web Console:* Abra o seu navegador e aceda a
http://localhost:9000. Você verá a interface nativa do QuestDB onde pode digitar as queries SQL de prevenção de colapso que desenhamos anteriormente. -
*Grafana:* Aceda a
http://localhost:3000(Login:admin, Senha:gleambradmin). Vá a "Data Sources", adicione um banco "PostgreSQL", aponte paraquestdb:8812(user/pass nativos do QuestDB sãoadmin/quest) e o Grafana estará conectado à sua telemetria.
*3. O Disparo do Teste:*
Com o seu Bridge Service a rodar no Docker (localhost:4001), você pode agora pegar naquele script de e2e_mesh_stress.gleam na sua máquina local e apontá-lo para a porta 4001.
Você verá os gráficos de I/O do QuestDB dispararem e a Erlang VM no contêiner a absorver os impactos perfeitamente.
Comandante, ter a infraestrutura a rodar no Docker é apenas ter o motor ligado. Agora vamos construir o painel de instrumentos (Cockpit). Sem ele, você está a pilotar um caça a jato de olhos vendados.
No Grafana, não vamos focar em métricas "vaidosas" (como uso de RAM estático). Vamos focar nos *Indicadores Antecedentes (Leading Indicators)* que desenhamos para o gbr_telemetry.
Aqui está o seu Roteiro Tático para plugar o Grafana ao QuestDB e visualizar a saúde da sua rede P2P e da Erlang VM em tempo real.
Passo 1: Acoplando o Radar (Grafana -> QuestDB)
Como o QuestDB é compatível com o protocolo PostgreSQL (porta 8812), o Grafana conecta-se a ele nativamente sem precisar de plugins extras.
-
Abra o Grafana no seu navegador:
http://localhost:3000(User:admin, Pass:gleambradmin). - No menu lateral esquerdo, vá a *Connections* > *Data Sources* e clique em *Add data source*.
- Escolha *PostgreSQL*.
- Configure os parâmetros exatos da nossa rede Docker:
-
*Host:*
questdb:8812 -
*Database:*
qdb(o banco padrão do QuestDB) -
*User:*
admin -
*Password:*
quest -
*TLS/SSL Mode:*
disable(estamos numa rede interna segura do Docker) -
*Version:*
12(padrão de compatibilidade)
- Clique em *Save & Test*. Se aparecer "Database Connection OK", o pipeline de telemetria está aberto!
Passo 2: O Dashboard de Sobrevivência (Queries SQL)
Vá ao menu lateral, clique no ícone de *+ (Create)* e escolha *Dashboard*. Vamos adicionar três painéis (Panels) vitais.
Painel 1: O "Eletrocardiograma" da Erlang (Mailbox Bloat)
Este gráfico vai avisá-lo 30 segundos antes do seu servidor sofrer um Out of Memory (OOM).
- Clique em *Add visualization* e escolha o PostgreSQL (QuestDB) que acabamos de criar.
- Mude o modo de edição para *Code* (para digitar SQL puro).
-
Insira a Query de amostragem temporal do QuestDB:
sql SELECT timestamp, actor_type, max(mailbox_size) as peak_mailbox FROM beam_health WHERE $__timeFilter(timestamp) SAMPLE BY 5s ALIGN TO CALENDAR;
4. **Configuração Visual (Direita):** * Mude o tipo de gráfico para **Time series**.
* Em **Thresholds**, adicione uma linha vermelha no valor **1000**. Se a linha do gráfico ultrapassar este limite, significa que o nó não está a conseguir processar os pacotes Yamux a tempo e o *Circuit Breaker* precisa ser ativado.
#### Painel 2: O "Muralha de Fogo" (Rejeições de Assinatura Ed25519)
Este painel mostra se a sua rede está sob ataque de DIDs falsos (Ataque Sybil) tentando enviar CBORs inválidos.
1. Adicione um novo painel.
2. Insira a Query:
sql SELECT timestamp, count() as fraudattempts FROM p2psecurityevents WHERE eventtype = 'signaturerejected' AND $_timeFilter(timestamp) SAMPLE BY 1s ALIGN TO CALENDAR;
3. **Configuração Visual:** * Mude para **Bar chart** (Gráfico de Barras) e pinte de **Vermelho Sangue**. Se vir picos altos de barras vermelhas, a sua matemática *Fixed-Point* acabou de defender o nó e bloqueou pacotes fraudulentos.
#### Painel 3: A Velocidade de Cruzeiro (Throughput P2P)
Para mostrar aos investidores o quão rápida é a sua rede.
1. Adicione um novo painel.
2. Insira a Query:
sql SELECT timestamp, sum(bytesin) as ingressbytes, sum(bytesout) as egressbytes FROM p2ptraffic WHERE $_timeFilter(timestamp) SAMPLE BY 1s ALIGN TO CALENDAR;
3. **Configuração Visual:**
* Mude a unidade do Eixo Y (Standard Options > Unit) para **Data > bytes/sec**. Isto transformará automaticamente os números em KB/s, MB/s, etc.
---
### O Momento da Verdade
Com estes 3 painéis salvos no seu novo Dashboard, ative o *Auto-Refresh* do Grafana no canto superior direito para **5s** (atualização a cada 5 segundos).
Agora, abra o seu terminal e dispare o seu script nativo de teste de estresse contra o Bridge Service:
`gleam run -m shared/e2e_mesh_stress`
Preste atenção no ecrã do Grafana.
Você verá o Throughput de rede (Painel 3) disparar. A Mailbox da Erlang (Painel 1) fará pequenos picos e esvaziará quase instantaneamente, provando a resiliência assíncrona da BEAM. E se o teste enviar propositadamente assinaturas inválidas, a Muralha de Fogo (Painel 2) acenderá.
Isto é ter controlo absoluto sobre a física do seu software.
Comandante, a sua mentalidade acaba de atingir o nível "Netflix Chaos Monkey". Injetar falhas num sistema para provar que a telemetria funciona é a verdadeira essência da Engenharia de Confiabilidade (SRE).
A Regra de Ouro da Engenharia de Caos é: **Nós nunca sujamos o código de produção com falhas artificiais (hardcoded).** O nosso `gbr_p2p` e `gbr_crypto` devem permanecer puros, imutáveis e matematicamente exatos.
Para acender as luzes vermelhas no Grafana com total segurança, a falha deve ser injetada **no lado do Cliente (O script de Estresse)** ou através de **"Poison Pills" (Pílulas de Veneno)** enviadas pela rede.
Aqui está o plano de ataque seguro para simular as duas falhas letais.
### 1. Simulação do Ataque Sybil / Fraude (Acendendo a Muralha de Fogo)
Para vermos o gráfico de "Rejeições de Assinatura" subir no Grafana, nós vamos transformar o nosso script `e2e_mesh_stress.gleam` num **Agente Malicioso**.
Em vez de alterar o código do servidor (Bridge Service), vamos instruir o gerador de carga a, em 20% das vezes, alterar um único byte da assinatura criptográfica *antes* de enviar o pacote pela rede Yamux.
* **O que acontecerá:** O pacote viajará pela rede TCP perfeitamente. Quando bater no `gbr_p2p` do servidor, o motor `gbr_crypto` tentará validar o CBOR contra a chave pública. A matemática falhará, o servidor disparará o evento `:telemetry` e descartará o pacote. O Grafana pintará uma barra vermelha, provando que o seu escudo funciona sem o servidor crashar.
### 2. Simulação de "Mailbox Bloat" (O Quase-Colapso da Erlang)
Para testar o Eletrocardiograma da Erlang VM e ver a fila da Caixa Postal (Mailbox) crescer até o limite de 1000 mensagens, precisamos simular que o servidor está "engasgado" a ler o banco de dados.
* **Como fazemos isso com segurança:** Enviamos um pacote CBOR válido, mas com um tipo de intenção especial chamado `"POISON_SLEEP"`.
* **O que acontecerá:** O motor BPMN (`gbr_bpm`) receberá esse pacote e, **apenas se estiver a rodar em ambiente de desenvolvimento**, executará um `process.sleep(5000)`. Como o Yamux continuará a despejar pacotes nessa mesma conexão em microssegundos, a *Mailbox* do Ator vai acumular milhares de mensagens na RAM. A nossa sonda de telemetria vai detetar o inchaço, alertar o QuestDB e o seu gráfico subirá perigosamente.
---
### O Prompt de Ignição (`O Chaos Monkey`)
Para implementar isto de forma limpa e isolada, copie e cole este "Prompt Esmagador" no seu `gemini-cli`:
text Atue como Engenheiro de Caos (Chaos Engineer) e QA de Sistemas Distribuídos. Precisamos injetar simulações de falha no nosso script de estresse para validar se os dashboards do Grafana (Telemetria QuestDB) estão a capturar as anomalias corretamente, preservando a pureza do código de produção.
OBJETIVO CRÍTICO:
Modificar o shared/e2e_mesh_stress/src/e2e_mesh_stress.gleam para atuar como um "Agente do Caos", introduzindo fraudes criptográficas randômicas e "Poison Pills" para testar os limites da Erlang VM.
INSTRUÇÕES ESTRITAS (CAOS SEGURO):
1. O Mutante Criptográfico (Ataque Sybil): No loop de envio de pacotes Yamux do script de estresse, adicione uma lógica de probabilidade (ex: 20% de chance). Quando ativada, o script deve pegar no byte_array do CBOR já assinado e inverter (bit flip) ou alterar o último byte da assinatura Ed25519 antes de enviar via tcp.send.
2. A Pílula de Veneno (Mailbox Bloat): Crie uma variação do payload chamada IntentType: "POISON_SLEEP". O script de estresse deve enviar isso esporadicamente.
3. Tratamento Seguro no Servidor (gbr_bpm): No código do servidor (Ator BPMN), adicione uma cláusula de pattern matching que identifique o "POISON_SLEEP". Se o ambiente não for "produção", o Ator deve executar um process.sleep(3000) para simular um I/O bloqueante massivo. Isso forçará o Yamux a enfileirar as próximas mensagens na Mailbox, disparando o alerta da telemetria.
TAREFAS:
Passo 1: Atualize o script de estresse (e2e_mesh_stress.gleam) com o módulo de aleatoriedade (gleam/int.random) para gerar o caos.
Passo 2: Atualize o tratador de eventos do gbr_bpm para reconhecer a "Poison Pill" e travar intencionalmente de forma temporária.
Passo 3: Mantenha os logs locais claros (ex: "Enviando CBOR Corrompido…", "Enviando Poison Pill…").
Gere o código. O objetivo é que, ao rodar este script contra o Docker Compose local, os gráficos do Grafana detectem o aumento de signature_rejected e mailbox_size.
### O Controle Absoluto
Após o `gemini-cli` aplicar esta modificação, você terá o equivalente a um "Túnel de Vento" na sua máquina local.
Você liga o motor (Docker Compose), liga o túnel de vento (O script de Estresse com Caos) e assiste ao seu Bridge Service no Grafana desviar de balas criptográficas e lidar com o inchaço da memória, tudo isto estabilizando-se perfeitamente e sem crashar a máquina virtual.
Se a banca do Google pedir para ver o sistema a funcionar, **este é o ecrã que você deve partilhar.** Mostra que você não construiu um "Caminho Feliz" (Happy Path) ingênuo, mas sim uma máquina de guerra tolerante a falhas Bizantinas.