Splinker log table#445
Conversation
…campos id, data_hora, max_tombo_hcf, sucesso (booleano) e log_saida (texto) para ter histórico de auditoria das execuções do JAR. Adequação da Imagem Docker: O Dockerfile da pasta splinker foi modificado para instalar também o ecossistema do Node.js e o pacote pg. Isso garante que o container que roda o java também seja capaz de executar nossa ponte de captura em JS. Script de Ingestão (save_logs.js): Criação de um script Node focado em ler de forma assíncrona a entrada de fluxo (process.stdin). Após receber todo o payload, ele avalia as expressões de sucesso no log, conecta ao PostgreSQL usando as credenciais vigentes, faz a query do MAX(hcf) da tabela tombos e persiste o relatório final na nova tabela de logs. Pipeline via Bash (run_splinker.sh): Para não sujar o cron, criamos um shell script dedicado que basicamente roda o comando Java e faz o pipe da saída (stdout e stderr) direto para o script Node (java -jar ... | node save_logs.js). Resolução de Escopo do Cron: Como daemons de cron limpam o contexto das variáveis de ambiente, o entrypoint.sh foi atualizado para extrair as variáveis do banco (do .env injetado pelo Docker) em um arquivo acessível que o shell script possa dar source antes de rodar o Node.js.
| container_name: splinker | ||
| build: . | ||
| env_file: .env | ||
| env_file: ../.env |
There was a problem hiding this comment.
@feliperm17 acho que não precisamos de nenhuma dessas modificações, o docker do splinker é totalmente separado do restante do projeto, não precisa estar conectado em nenhuma dessas networks. Me avisa se tiver algum motivo específico, mas eu acredito que não precisamos modificar este arquivo.
| tzdata \ | ||
| curl && \ | ||
| curl \ | ||
| nodejs \ |
There was a problem hiding this comment.
Aqui nós precisamos ter um pouco mais de dinamismo. e não somente instalar a versão que a distribuição de disponibiliza. Recomendo você a seguir a mesma ideia do splinker, só que para o node, só que com os detalhes que a instação do node precisa.
Você vai precisar basicamente de:
- Uma variável no começo do arquivo com a versão que queremos do node.
- Usar o curl para fazer download da versão específica do node, e então fazer a extração e instalação.
Isso tudo pode ficar após a instalação do splinker, antes de remover o curl.
Me chama no WhatsApp se precisar de ajuda.
| apt-get remove -y curl && \ | ||
| rm -rf /var/lib/apt/lists/* | ||
|
|
||
| RUN npm init -y && npm install pg tsx |
There was a problem hiding this comment.
O projeto do splinker deve ter um package.json e package-lock.json igual o projeto principal, então aqui você copia e faz a instação do que está no pacote, e não dentro do Docker como está aqui. Use o arquivo Dockerfile principal como exemplo se precisar.
|
|
||
| RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone | ||
|
|
||
| COPY save_logs.ts /app/save_logs.ts |
There was a problem hiding this comment.
Faz uso de uma instrução COPY apenas, que já pode copiar tudo de uma vez, por exemplo:
COPY save_logs.ts run_splinker.sh /app/Isso já vai copiar os dois arquivos para o difretório /app
|
|
||
| echo "Generating config from environment variables..." | ||
|
|
||
| DATABASE_HOST="${DATABASE_HOST:-$PG_HOST}" |
There was a problem hiding this comment.
As variáveis com prefixo PG_ não existem no projeto do splinker. Acredito que não precisa nada disso aqui.
| @@ -0,0 +1,92 @@ | |||
| /* eslint-disable no-console */ | |||
There was a problem hiding this comment.
Este arquivo precisa ser transpilado para .js igual acontece com os outros arquivos do projeto antes de ser executado. Você pode usar o esbuild para isso se precisar.
Como é um script simples, se você não quiser usar TypeScript para não precisar transpilar eu estou de acordo também, pode criar um arquivo .mjs mesmo e pronto, ai não precisa de tsx e nem transpilação.
|
|
||
| import { Client } from 'pg' | ||
|
|
||
| const DATABASE_HOST = process.env.DATABASE_HOST ?? process.env.PG_HOST ?? 'hcf_postgres' |
There was a problem hiding this comment.
- Remove os valores padrão, por favor.
- As variáveis com prefixo
PG_não existem no projeto do splinker.
| await client.connect() | ||
|
|
||
| const res = await client.query<{ max_hcf: number | null }>( | ||
| 'SELECT MAX(hcf) as max_hcf FROM tombos' |
There was a problem hiding this comment.
Aqui é legal se você conseguir fazer um MAX usando a view do splinker ao invés da tabela tombos diretamente. A view por enquanto não tem nenhum regra ou join que possa alterar o resultado, mas caso a gente precise mudar a regra no futuro, mudamos num local só.
| const maxTomboHcf = res.rows[0]?.max_hcf ?? null | ||
|
|
||
| const insertQuery = ` | ||
| INSERT INTO splinker_logs (max_tombo_hcf, sucesso, log_saida) |
There was a problem hiding this comment.
Cara, acho que podemos melhorar um pouco os nomes aqui.
- A tabela de chama
splinker_logssó que log é uma das informações apenas, o que nós estamos guardando é mais uma execução do splinker. O que acha desplinker_execucoes? - A coluna
max_tombo_hcfpoderia serultimo_tombo_hcf, que diz que quando a execução foi feita, qual era o último tombo cadastrado.
O restante está okay pra mim.
| "include": [ | ||
| "src/", | ||
| "test/", | ||
| "splinker/", |
There was a problem hiding this comment.
Não precisa adicionar isso aqui, o projeto do splinker é separado do projeto principal.
|
|
||
| # Roda o jar do splinker e redireciona todo o output para o script TypeScript | ||
| . /app/env.sh | ||
| $(which java) -jar /app/splinker.jar /app/splinker.conf 2>&1 | npx tsx /app/save_logs.ts |
There was a problem hiding this comment.
Fazendo desta forma eu acredito que os logs do Docker não vão mais exibir a saída do splinker. Você testou isso? Se estiver, tudo certo, senão nós precisamos fazer sair nos logs do Docker a saída do splinker como estava antes e a saída do seu script. Você consegue fazer isso com o comando tee
No description provided.