Este repositório é o resultado de um estudo que fiz em busca de entender como monitorar uma aplicação em Nodejs (express) com prometheus
- Buildar a imagem da aplicação usando Docker
$ cd app/
$ docker build -t "laboratory/tag" ./
- Subir os conteiners via docker-compose
$ docker-compose up -d
Pronto. Acesso os serviços via:
- Prometheus - http://localhost:9090/
- Grafana - http://localhost:3000/
- API - http://localhost:5000/
- Métricas - http://localhost:5000/metrics
Endpoints:
- /api
- /slow
- /error
- /metrics
Usando a express-prom-bundle foi possível exportar algumas métricas da aplicação e do nodejs em si.
Por default, as métricas são exportadas em um endpoint /metrics
. Há uma forma para configurar essa biblioteca, onde é possível até passar uma configuração pro prom-client (biblioteca 'padrão' de exportação de métricas para Nodejs).
Utilizei uma configuração para incluir o método e o caminho nas métricas, assim como pedi pro prom-client
para exportar as métricas do Nodejs (essas estão comentadas)
promBundle({
includeMethod: true,
includePath: true,
promClient: {
// collectDefaultMetrics: {
// timeout: 1000
// }
}
});
Criei uma imagem utilizando o docker. O dockerfile está simples e comentado. Mas os steps são:
- Seleciona o node na vestão 12.16.1
- Cria um diretório de trabalho chamado
/laboratory/app
- Instala o Yarn
- Copia o package.json para a pasta de trabalho
- Copia o yarn.lock para a pasta de trabalho
- Instala as dependências da aplicação
- Expõe a porta 5000 (porta da aplicação, vide app.js)
- Executo o script
start
do projeto, dando start na aplicação
Para buildar a imagem (vá para a pasta /app antes):
$ docker build -t "laboratory/app" ./
A configuração do penas informei um scrape_config
, informando ao Prometheus realizar um scrape no target informado, obtendo as métricas, a cada 10 segundos.
scrape_configs:
- job_name: "nodejsApp"
scrape_interval: 10s
static_configs:
- targets: ["nodejs:5000"]
Observação, nodejs:5000
é o serviço que eu dei UP via docker-compose (mais info abaixo).
Tecnicamente não fiz nenhuma configuração ao Grafana em si. Criei e deixei fixo o Prometheus como um datasource. Dessa forma, agiliza o processo de setup de um datasource dentro do grafana.
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
orgId: 1
url: http://prometheus:9090
basicAuth: false
isDefault: true
editable: true
Via docker-compose, orquestrei os serviços de forma que eles estejam na mesma rede (mesmo que em um caso real não funcionará assim muita das vezes).
Para subir os serviços, basta rodar: $ docker-compose up -d
OBS: O compose precisa da imagem da aplicação criada visto que a mesma é citada na linha 48 do docker-compose: image: laboratory/app
MIT