Configurando o Elastic APM com NestJS
Configurando o Elastic APM com NestJS
Neste guia, você aprenderá como configurar uma aplicação NestJS para rodar em um container Docker e como adicionar monitoramento a esta aplicação usando o APM (Application Performance Monitoring) da Elastic.
O primeiro passo é criar sua aplicação NestJS e, em seguida instalar o APM da Elastic:
1
2
3
4
5
nest new apm-monitor-nest-example
npm install elastic-apm-node
Agora vamos montar um container bem simples com nossa aplicação NestJs, adicione o arquivo Dockerfile com o conteúdo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM node:18
WORKDIR /usr/src/app
COPY package*.json ./
COPY tsconfig.json ./
COPY src ./src
RUN npm install
RUN npm run build
EXPOSE 3000
CMD [ "npm", "start" ]
obs.: apenas um exemplo de container, o melhor seria utilizar uma imagem menor e adicionar uma estratégia de staging-build
como pode perceber é um container simples, apenas adicionando o workdir copiando as configurações, projeto, instalando e rodando.
para testar nesse ponto basta rodar um build
1
docker build -t app .
Adicionando o APM na Inicialização do NestJS
Agora, vamos adicionar as configurações do APM ao arquivo main.ts do seu aplicativo NestJS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";
import * as apm from "elastic-apm-node";
async function bootstrap() {
apm.start({
serviceName: "apm-monitor-nest",
serverUrl: "http://apm-server:8200",
logLevel: "debug",
active: true,
});
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
Adicionando docker-compose.yml
agora vamos montar nosso docker-compose com os containers do elastic.
No primeiro serviço adicionamos a referência para nosso Dockerfile, em seguida adicionamos o elasticsearch que se trata da ferramenta onde os dados(index) são armazenados, em seguida adicionamos o kibana que se trata de um dashboard onde podemos analisar de forma gráfica varias ferrametas da elastic e por fim temos o apm que é onde vamos capturar os dados de monitoração da nossa aplicação.
Também adicionamos uma rede para conectar todos os containers.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
version: "3.7"
services:
app:
container_name: app
build:
context: ./
dockerfile: ./Dockerfile
ports:
- "3000:3000"
depends_on:
- elasticsearch
environment:
ELASTICSEARCH_URL: "http://elasticsearch:9200"
networks:
- apm-monitor-nest
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.15.0
container_name: elasticsearch
environment:
- discovery.type=single-node
ports:
- "9200:9200"
- "9300:9300"
networks:
- apm-monitor-nest
kibana:
image: kibana:7.14.2
container_name: kibana
links:
- elasticsearch
ports:
- "5601:5601"
networks:
- apm-monitor-nest
apm-server:
image: docker.elastic.co/apm/apm-server:7.15.0
container_name: apm-server
ports:
- "8200:8200"
environment:
- output.elasticsearch.hosts=["elasticsearch:9200"]
networks:
- apm-monitor-nest
networks:
apm-monitor-nest:
driver: bridge
name: apm-monitor-nest
volumes:
es_data: {}
Rodando
Para rodar basta executar:
1
docker-compose up
em seguida você pode fazer um get em: localhost:3000
dessa forma será adicionado a requisição e seus dados dentro do apm que fica em: http://localhost:5601/app/apm/services/apm-monitor-nest/
link para o exemplo: apm-monitor-nest-poc
é isso :)