Este projeto implementa uma aplicação completa de CRUD (Create, Read, Update, Delete) em Node.js, utilizando PostgreSQL como banco de dados e integrando observabilidade com Prometheus e Grafana.
Tudo roda em containers via Docker Compose, incluindo:
- Aplicação web com API e interface CRUD;
- Banco de dados PostgreSQL;
- Prometheus coletando métricas da aplicação;
- Grafana com dashboards prontos para visualização.
prom-grafana-node-postgres/
│
├── app/ # Código da aplicação Node.js
│ ├── Dockerfile # Build do container da aplicação
│ ├── index.js # Código principal do servidor Express
│ ├── package.json # Dependências Node.js
│ └── static/
│ └── index.html # Interface web do CRUD (frontend simples)
│
├── db/
│ └── init.sql # Script de inicialização do banco de dados (cria tabela 'items')
│
├── grafana/
│ ├── dashboards/
│ │ └── node_dashboard.json # Painel do Grafana com métricas + dados SQL
│ └── provisioning/
│ ├── datasources/
│ │ └── all.yml # Configuração automática das fontes de dados
│ └── dashboards/
│ └── all.yml # Provisionamento automático de dashboards
│
├── prometheus/
│ └── prometheus.yml # Configuração de coleta de métricas da aplicação
│
├── docker-compose.yml # Orquestra todos os serviços na mesma rede
└── README.md # Este arquivo
- Docker e Docker Compose instalados.
No diretório raiz do projeto, execute:
docker compose up --buildO Docker vai:
- Criar o banco de dados
appdbcom a tabelaitems; - Subir o servidor Node.js em
http://localhost:3000; - Subir o Prometheus em
http://localhost:9090; - Subir o Grafana em
http://localhost:3001.
| Serviço | Endereço local | Descrição |
|---|---|---|
| Aplicação (CRUD) | http://localhost:3000 | Interface e API para gerenciar itens |
| Prometheus | http://localhost:9090 | Coleta métricas da aplicação |
| Grafana | http://localhost:3001 | Painéis e visualizações |
| Banco de Dados (PostgreSQL) | localhost:5432 |
Usuário: postgres, Senha: postgres |
O Grafana é configurado automaticamente ao iniciar o container.
- Prometheus (
http://prometheus:9090) - PostgreSQL (
db:5432, comsslmode: disable)
Arquivo:
📁 grafana/provisioning/datasources/all.yml
Painel JSON:
📁 grafana/dashboards/node_dashboard.json
O painel exibe:
- Métricas Prometheus
- Taxa de requisições (
rate(http_requests_total[1m])) - Latência p50/p95 (
histogram_quantile)
- Taxa de requisições (
- Consultas SQL
- Total de registros (
SELECT count(*) FROM items) - Últimos 10 registros (
SELECT ... ORDER BY created_at DESC LIMIT 10)
- Total de registros (
Script de inicialização:
📁 db/init.sql
Cria automaticamente a tabela:
CREATE TABLE IF NOT EXISTS items (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT,
price NUMERIC(12,2) DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT now()
);- Servidor Express (porta 3000)
- API CRUD em
/api/items - Interface web em
/ - Endpoint Prometheus em
/metrics
O Prometheus coleta métricas como:
http_requests_totalhttp_request_duration_seconds
Essas métricas aparecem automaticamente no painel do Grafana.
Todos os containers estão na mesma rede bridge chamada app_network:
db— PostgreSQLapp— Node.jsprometheus— Coleta métricasgrafana— Visualização
Assim, eles se comunicam via nome de serviço (db, app, prometheus, etc.).
➡ Corrigido no arquivo de datasource (db:5432 em vez de postgres:5432)
➡ Corrigido com:
jsonData:
sslmode: "disable"no arquivo grafana/provisioning/datasources/all.yml
Para parar todos os containers:
docker compose downPara limpar volumes e dados:
docker compose down -v📅 Data: Novembro de 2025