
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
Spring Boot Actuator는 운영 중인 애플리케이션을 HTTP나 JMX를 이용해서 모니터링하고 관리할 수 있는 기능을 제공한다.
http://localhost:8080/actuator 에 들어가면, 몇개의 링크가 나타나는데 접속해보면 어플리케이션의 상태를 확인할 수 있는 url들이 존재한다.

application.yml에 아래처럼 설정한 뒤, http://localhost:8080/actuator으로 이동하면 더 많은 정보를 확인할 수 있다.
// application.yml
management:
endpoints:
web:
exposure:
include: "*"
http://localhost:8080/actuator/metrics 에 접속한다면 스프링부트 어플리케이션에서 확인 가능한 여러가지 상태를 메트릭으로 받아볼 수있다.

위의 정보를 메트릭을 통해 확인할 수 있고, 우리의 어플리케이션에서 메트릭을 수집하려면 prometheus를 이용해야 한다.
// application.yml
management:
endpoints:
web:
exposure:
include: "prometheus"
프로메테우스를 이용한 메트릭 수집 이외의 기능은 필요없으니, 위처럼 설정하도록 하자.
http://localhost:8080/actuator/prometheus 으로 들어가보면, 우리 스프링부트서버에서 수집된 메트릭이 나타난다. 이것을 Grafana를 이용하여 모니터링 할 것이다.
로컬에서 테스트 한 후, 모니터링이 돌아갈 ec2에 적용하도록 하겠다.
9090포트를 사용하지만, 나는 19090포트를 사용했다.3000포트를 사용하지만, 나는 13030포트를 사용했다.로컬 환경에서 docker-compose를 이용하여 프로메테우스와 그라파나를 띄울 예정이다.
global:
scrape_interval: 10s
evaluation_interval: 10s
scrape_configs:
- job_name: 'prometheus'
metrics_path: /actuator/prometheus
static_configs:
- targets: ['host.docker.internal:8080'] //중요!
targets는 프로메테우스로 메트릭을 수집할 위치이다.
❗️localhost:8080이 아닌 host.docker.internal:8080이다.❗️
그라파나와 프로메테우스가 구동될 도커 환경을 설정한다.
version: '3'
services:
prometheus:
image: prom/prometheus
container_name: prometheus
volumes:
- ./prometheus.yml:/prometheus/prometheus.yml:ro
ports:
- 19090:9090 // 9090이 아닌 19090포트를 사용
command:
- "--web.enable-lifecycle"
restart: always
networks:
- promnet
user: root
grafana:
image: grafana/grafana
container_name: grafana
volumes:
- ./grafana-volume:/var/lib/grafana
restart: always
networks:
- promnet
ports:
- 13030:3000 // 3000 아닌 13030 포트를 사용
user: root
networks:
promnet:
driver: bridge
docker compose -f docker-compose.monitoring.yml up -d
docker compose를 이용하여 실행하자.
http://localhost:19090/targets?search= 으로 접속했을 때 아래 사진처럼 State가 Up이면 성공이다.
prometheus.yml에서 프로메테우스의 위치를 localhost:19090이 아닌 host.docker.internal:19090으로 설정 해 주었다.
처음에 localhost를 이용했다가 수 시간동안 구글을 뒤지며 왜 안되는지 찾았다.

http://localhost:13030/ 으로 접속해준다.

로그인하라는 창이 뜨면, admin/admin이 기본 ID/PW이다.

가운데에 있는 Add your first data source를 눌러 프로메테우스에서 수집된 메트릭를 연동한다.

Save & Test를 눌러 커넥션을 맺으면 메트릭 소스 연결이 완료된다.

Dashboard 탭에서 대시보드를 구축하자.
New Dashboard를 통해 메트릭에서 내가 원하는 값만 시각화 할 수도 있고, 기본적으로 제공하는 템플릿을 쓰는것이 좀 더 편하다.

Import를 눌러 14430번 템플릿을 사용하겠다.

실시간으로 갱신이 되고 있으며, 내가 보냈던 api/finding/info api가 몇 번 호출되었는지도 잘 보인다.
이제 로컬에서 테스트를 완료하였으니 EC2 환경에 적용해보자.
메트릭을 수집하기 위해, EC2 스프링 서버에 node-exporter를 설치해야한다.
우리는 메인 서버에서 Metrics를 수집한 다음 모니터링 서버에 있는 Prometheus에게 전달해주어야 한다. 그러려면 스프링 서버에 Node Exporter를 설치해야 한다.
https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar xvzf node_exporter-1.8.2.linux-amd64.tar.gz
cd node_exporter-1.8.2.linux-amd64
./node_exporter (또는 백그라운드 실행)

이제 {EC2의 IP:9100}으로 접속해보면 다음과 같은 창이 나타난다.
(EC2의 보안그룹을 설정하였다면 인바운드에서 9100포트를 열어줘야한다.)

그럼 우리는 메인서버에 node-exporter를 통해 메트릭을 수집하기 시작한 것이다.
모니터링 서버로 사용할 EC2를 생성한다.
위에서 작성한 prometheus.yml,docker-compose.monitoring.yml을 작성하고 실행한다.
// prometheus.yml
global:
scrape_interval: 10s
evaluation_interval: 10s
scrape_configs:
- job_name: 'prometheus'
metrics_path: /actuator/prometheus
static_configs:
- targets: ['{스프링서버의ip}:8080']
이번엔 host.docker.internal이 아닌 ip를 입력해야한다.


현재는 메인서버에서 돌아가는 스프링부트 어플리케이션에서 수집한 메트릭을 모니터링 하는 것이다.
아까 적용한 node-exporter는 메인서버의 메트릭을 보내는 것이다. 따라서 적용하자
scp -i caecae-spring.pem -r node_exporter-1.8.2.linux-amd64 ubuntu@10.0.2.49:/home/ubuntu/
내 DB서버는 private subnet이다. 보안그룹의 9100번 포트의 인바운드를 열어줘야한다!!



http://localhost:19090
http://localhost:19090/metrics
http://localhost:8080/actuator/prometheus
메트릭이 수집되는 어떤 주소를 입력했는데도 연결이 되지 않았다..
그러다 같은 상황에 놓인 사람들이 만들어 놓은 깃허브 이슈의 댓글에서 힌트를 얻었다.
https://github.com/grafana/grafana/issues/46434


postman을 이용하여 아래의 요청을 여러번 보냈는데, 그라파나에는 실시간으로 나타나지 않았다.
따라서, 뭐가 잘못되었는지 알기 위해 메트릭을 열어 보았다.



3번 보낸 이후, 카운트 값이 16 -> 19로 늘어난 것을 볼 수 있다.
그렇다면 왜 그라파나는 업데이트가 되지 않는 것일까? 현재 시간이 15시인데, 14시24분까지의 api call만 기록에 남아있다.

아래의 코드로 설정하면 그라파나에서 메트릭이 수집되지 않는다.
//prometheus.yml
global:
scrape_interval: 10s
evaluation_interval: 10s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['host.docker.internal:19090']
http://localhost:19090/metrics 과 http://localhost:8080/actuator/prometheus에서 동일한 메트릭을 보여주지만, 스프링부트 어플리케이션에서 보여주는 프로메테우스 url로 연결해야 한다.

위의 사진에서 13:30 부근, 14:30 부근에 수집이 되었던건 환경을 구축하며 prometheus.yml 설정을 이것저것 바꾸면서 순간순간 적용이 되었던 것이고, 위 코드로 설정하고 진행하였더니 실시간 반영이 되지 않았던 것이다.
https://velog.io/@roycewon/Spring-boot-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81Prometheus-Grafana-docker
https://developer-nyong.tistory.com/49
https://lordofkangs.tistory.com/329