Post

Prometheus + Grafana 적용기

배경

서버에 올리고 CPU가 급격히 증가하여 멈추는 사태가 발생하였다. t2 micro에서 t2 small로 인스턴스를 변경하면서 해당 이슈를 해결하였다. 이 이슈로 모니터링 툴의 필요성을 느꼈고, 앞으로 서버에 문제가 생길 경우 Scale Up이 필요한지 판단하기 위해 모니터링 툴을 도입하기로 결심하였다. AWS CloudWatch와 Prometheus 중 Prometheus를 선택하였는데 AWS CloudWatch는 비용이 부과되기 때문에..


Prometheus 설치

1
2
3
$ sudo yum update
$ https://github.com/prometheus/prometheus/releases/download/v3.5.0/prometheus-3.5.0.linux-386.tar.gz
$ tar xvf prometheus-3.5.0.linux-386.tar.gz

설치 확인

1
2
$ cd prometheus-3.5.0.linux-386/
$ ./prometheus --version

명령어 등록

1
2
3
4
$ echo 'export PATH=$PATH:/home/ec2-user/prometheus/prometheus-3.5.0.linux-386' | sudo tee -a /etc/profile
$ source /etc/profile
$ prometheus --version #동작 확인

systemctl에 등록하기 전 그룹 생성

1
2
$ sudo groupadd prometheus
$ sudo usermod -aG prometheus ec2-user

systemctl에 등록하기 위해 파일 생성

1
sudo vi /etc/systemd/system/prometheus.service

파일에 해당 내용 입력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Prometheus
After=network-online.target

[Service]
User=ec2-user
Group=prometheus
Type=Simple
ExecStart=/home/ec2-user/prometheus/prometheus-3.5.0.linux-386/prometheus --config.file=/home/ec2-user/prometheus/prometheus-3.5.0.linux-386/prometheus.yml
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

재기동 및 실행, 상태확인

1
2
3
4
$ sudo systemctl daemon-reload
$ sudo systemctl start prometheus
$ sudo systemctl enable prometheus
$ sudo systemctl status prometheus


prometheus-node-exporter 설치

1
2
$ wget https://github.com/prometheus/node_exporter/releases/download/v1.9.1/node_exporter-1.9.1.linux-amd64.tar.gz
$ tar xvf node_exporter-1.9.1.linux-amd64.tar.gz

명령어 등록

1
2
3
$ echo 'export PATH=$PATH:/home/ec2-user/prometheus-node-exporter/node_exporter-1.9.1.linux-amd64' | sudo tee -a /etc/profile
$ source /etc/profile
$ node_exporter --version #동작 확인

systemctl에 등록하기 위해 prometheus-node-exporter.service 생성

1
$ sudo vi /etc/systemd/system/prometheus-node-exporter.service

파일에 해당 내역 입력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=ec2-user
Group=prometheus
Type=simple
ExecStart=/home/ec2-user/prometheus-node-exporter/node_exporter-1.9.1.linux-amd64/node_exporter
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

재기동 및 실행

1
2
3
$ sudo systemctl daemon-reload
$ sudo systemctl start prometheus-node-exporter
$ sudo systemctl enable prometheus-node-exporter


Grafana 설치

1
2
3
4
5
6
7
8
9
$ sudo tee /etc/yum.repos.d/grafana.repo <<EOF
[grafana]
name=Grafana
baseurl=https://packages.grafana.com/oss/rpm
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
EOF
$ sudo yum install grafana

서비스 시작

1
2
3
4
$ sudo systemctl start grafana-server
$ sudo systemctl enable grafana-server

$ grafana-server -v #설치 확인


포트 개방

ec2 보안 그룹 인바운드에서 9090, 3000, 9100번의 포트를 열어주면 된다.


SpringBoot에 Prometheus 추가

1
2
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("io.micrometer:micrometer-registry-prometheus")
1
2
3
4
5
6
7
8
management:
  endpoints:
    web:
      exposure:
        include: health,info,prometheus
  endpoint:
    prometheus:
      enabled: true

그리고 나는 security filter에 걸릴까봐 actuator로 시작하는 엔드포인트는 permitAll 해줬다.


Docker로 변경

그런데 열심히 설치해서 실행시켜놨더니 Docker 컨테이너로 설치하는 방법이 있었다.. 난 이미 Docker 기반으로 서버를 운영하고 있었기 때문에 Docker 방식으로 바꾸기로 결정하였다.

prometheus.yml 작성

1
$ vi prometheus.yml
1
2
3
4
5
6
7
8
9
10
11
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: spring
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['app-blue:8080', 'app-green:8080']
  - job_name: node
    static_configs:
      - targets: ['node-exporter:9100']

docker-compose-monitoring.yml 작성

1
$ vi docker-compose-monitoring.yml
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
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
    ports:
      - "9090:9090"
    networks:
      - monitoring-network

  node_exporter:
    image: prom/node-exporter:latest
    networks:
      - monitoring-network

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    networks:
      - monitoring-network

networks:
  monitoring-network:
    driver: bridge
1
$ docker compose -f docker-compose-monitoring.yml up -d

그 이후 docker-compose.yml에 아래 내용을 추가해주었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
services:
  app-blue:
    ...
    networks:
      - monitoring-network
  
  app-green:
    ...
    networks:
      - monitoring-network

  redis:
    ...
    networks:
      - monitoring-network

networks:
  monitoring-network:
    driver: bridge

http://<ec2-public-ip>:9090/targets에 접속하면 아래와 같은 화면이 떠야한다.

나는 블루 그린 배포를 해놓았기 때문에 블루 컨테이너는 닫혀있는 상태다.


Grafana 구성

Data Source 설정

http://<ec2-public-ip>:3000으로 접속한다. Grafana의 기본 아이디와 비밀번호는 admin/admin이다. 로그인을 성공하면 홈 화면이 뜨는데,

datasource 화면

DATA SOURCES로 들어가주면 된다. Prometheus를 선택한 뒤

Connection에 http://<ec2-public-ip:9090을 입력한다.

아래에서 save & test 버튼을 눌러서

해당 박스가 나오면 성공한 것이다.

Dashboard 설정

이제 대시보드 화면으로 들어가 원하는 대시보드를 만들거나 Import를 해주면 된다. 나는 JVM (Micrometer)Node Exporter Full을 사용하기로 하였다.

id인 4701과 1860을 입력하고 Load 후 Import를 누르면 된다.

적용 화면

This post is licensed under CC BY 4.0 by the author.