Skip to content

Splinker log table#445

Open
feliperm17 wants to merge 3 commits into
developmentfrom
splinker-log-table
Open

Splinker log table#445
feliperm17 wants to merge 3 commits into
developmentfrom
splinker-log-table

Conversation

@feliperm17
Copy link
Copy Markdown
Contributor

No description provided.

…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.
Comment thread splinker/compose.yml
container_name: splinker
build: .
env_file: .env
env_file: ../.env
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@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.

Comment thread splinker/Dockerfile
tzdata \
curl && \
curl \
nodejs \
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread splinker/Dockerfile
apt-get remove -y curl && \
rm -rf /var/lib/apt/lists/*

RUN npm init -y && npm install pg tsx
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread splinker/Dockerfile

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

COPY save_logs.ts /app/save_logs.ts
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Comment thread splinker/entrypoint.sh

echo "Generating config from environment variables..."

DATABASE_HOST="${DATABASE_HOST:-$PG_HOST}"
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As variáveis com prefixo PG_ não existem no projeto do splinker. Acredito que não precisa nada disso aqui.

Comment thread splinker/save_logs.ts
@@ -0,0 +1,92 @@
/* eslint-disable no-console */
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread splinker/save_logs.ts

import { Client } from 'pg'

const DATABASE_HOST = process.env.DATABASE_HOST ?? process.env.PG_HOST ?? 'hcf_postgres'
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Remove os valores padrão, por favor.
  • As variáveis com prefixo PG_ não existem no projeto do splinker.

Comment thread splinker/save_logs.ts
await client.connect()

const res = await client.query<{ max_hcf: number | null }>(
'SELECT MAX(hcf) as max_hcf FROM tombos'
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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ó.

Comment thread splinker/save_logs.ts
const maxTomboHcf = res.rows[0]?.max_hcf ?? null

const insertQuery = `
INSERT INTO splinker_logs (max_tombo_hcf, sucesso, log_saida)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cara, acho que podemos melhorar um pouco os nomes aqui.

  • A tabela de chama splinker_logs só que log é uma das informações apenas, o que nós estamos guardando é mais uma execução do splinker. O que acha de splinker_execucoes?
  • A coluna max_tombo_hcf poderia ser ultimo_tombo_hcf, que diz que quando a execução foi feita, qual era o último tombo cadastrado.

O restante está okay pra mim.

Comment thread tsconfig.json
"include": [
"src/",
"test/",
"splinker/",
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Não precisa adicionar isso aqui, o projeto do splinker é separado do projeto principal.

Comment thread splinker/run_splinker.sh

# 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
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants