티스토리 뷰
최근 친구들과 스터디를 시작하면서, 첫번째 과제로 Grafana, Prometheus를 활용한 모니터링 시스템을 구축하게 되어서, 이와 관련된 글을 작성해보려 한다.
구축할 시스템 아키텍처는 위의 그림과 같다.
Springboot의 metric 데이터를 Prometheus가 가져가고, Prometheus가 모은 데이터를 Grafana가 시각화해준다.
여기서 Prometheus를 굳이 끼워야하나? 하는 의문을 가질 수 있는데 다음과 같은 장점이 있기 때문에 Prometheus를 사용하는 것이 좋다.
Prometheus는 Spring Boot 외에도 여러 언어와 애플리케이션 프레임워크를 지원한다. 그리고 여러개의 애플리케이션을 Prometheus가 모니터링하면 동일한 Prometheus 서버에서 여러 메트릭 정보를 수집 할 수 있다. 따라서 Grafana에서 하나의 Prometheus와 통신하는 것만으로 다양한 메트릭을 수집하여 시각화 할 수 있다는 장점이 있다.
이제 이 세가지 기술을 결합하여 모니터링 시스템을 구축해자.
Springboot 설정
Prometheus가 Springboot Application의 리소스 사용량을 알아야 하기 때문에 관련 metric 정보를 알려줄 수 있는 방법이 필요하다. 이를 위해 먼저 아래와 같은 의존성을 추가하자.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
runtimeOnly 'io.micrometer:micrometer-registry-prometheus'
}
위의 의존성을 추가한 후, application.yml 설정을 아래와 같이 추가하자.
management:
endpoints:
web:
exposure:
include: prometheus
그리고 http://localhost:8080/actuator에 접속해보면 아래와 같은 response를 받을 수 있다.
{
"_links": {
"self": {
"href": "http://localhost:8080/actuator",
"templated":false
},
"prometheus": {
"href": "http://localhost:8080/actuator/prometheus",
"templated" : false
}
}
}
위의 response는 Actuator가 제공하고 있는 Endpoint를 나타낸다. 여기서 /actuator/prometheus Endpoint는 application.yml에 추가한 설정으로 인해 생긴 Endpoint이다. 접속해보면 아래와 같은 Response를 받을 수 있다.
현재 실행중인 Springboot Application의 metrics 정보를 반환하는 것을 알 수 있다. 이제 Prometheus가 이 정보들을 가져가도록 설정파일을 만들어야한다.
Prometheus 설정
global:
scrape_interval: 5s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets:
- "localhost:9090"
- job_name: "springboot"
metrics_path: "/actuator/prometheus"
static_configs:
- targets:
- "host.docker.internal:8082"
위와 같은 prometheus.yaml 파일을 만들어보자. 이 설정이 의미하는 것은 아래와 같다.
- global:scrape_interval : Prometheus가 Metric 정보를 수집하는 주기를 나타낸다. 위의 설정은 5초마다 pull 하게 된다.
- scrape_configs:job_name : 수행할 작업의 이름을 명시한다.
- scrape_configs:metrics_path : metric 정보를 가져올 경로를 명시한다.
- scrape_configs:target : 요청을 보낼 host 정보를 명시한다.
docker run \
-p 9090:9090 \
-v "설정 파일 경로":/etc/prometheus/prometheus.yaml prom/prometheus --config.file=/etc/prometheus/prometheus.yaml
이제 설정 파일을 활용해 Prometheus Container를 띄워보자. 위의 명령어를 수행하면 된다.
성공적으로 container를 띄웠다면 http://localhost:9090/targets에 접속해보자.
prometheus.yaml에서 명시한 설정이 잘 적용된 것을 볼 수 있다. 그리고 springboot에서 열어놓은 /actuator/prometheus 에서 metric 데이터를 잘 불러오는 것을 볼 수 있다.
혹시 그래도 궁금하니, Prometheus에 접속해서 http://localhost:8080/actuator/prometheus에 있는 목록 중 하나를 검색해보자.
정상적으로 데이터를 가져오고 있는 것을 볼 수 있다. 이제 Grafana와 Prometheus를 연결해서 Prometheus가 모은 metric data를 시각화 해보자.
Grafana 설정
Grafana는 직접 컨테이너에 접속해서 연결하면 되기 때문에 따로 설정 파일을 생성하지 않아도 된다.
docker run -p 3000:3000 grafana/grafana -name grafana
위의 명령어를 실행해서 grafana container를 띄워보자. 그리고 컨테이너가 정상적으로 띄워졌으면 http://localhost:3000에 접속해보자.
초기 username과 password는 admin, admin이다. 정상적으로 로그인 하면 아래와 같은 화면으로 바뀐다.
이제 grafana에 접속한 것이다. 이제 grafana와 prometheus를 연결하기 위해 톱니 -> Data Sources로 들어가야 한다.
새로운 DataSources 만들기를 클릭하고, Prometheus를 선택하자.
그리고 URL에 Prometheus 주소와 포트를 명시하고 Save & Test를 했을때 Connection이 되면 된다.
그 후, Dashboards에서 import를 선택하고
https://grafana.com/grafana/dashboards/4701-jvm-micrometer/
위의 Dashboard template 주소를 넣은 후 Load 버튼을 클릭하자.
그 후, 아래와 같이 앞서 만든 Prometheus DataSources를 추가한 후 import 하면 된다.
이제 모든 설정이 끝이 났다. 아래와 같이 metric data가 그래프로 나타난다면 모든 설정이 끝난 것이다. 이제 요청이 들어올때 서버의 리소스 사용량을 시각화 할 수 있게 된 것이다.
테스트
뭔가 눈으로 그래프를 볼 수 있으니 연결된 것 같긴 한데.. 과연 제대로 동작하는 것일까? 이를위해 서버에 트래픽을 보내는 테스트용 코드를 만들고, 직접 트래픽을 생성해봤다.
약 10개의 스레드가 30초동안 계속해서 서버로 요청을 보내는 코드를 작성했고, 테스트 코드를 돌린 결과 grafana는 아래와 같은 그래프를 보여줬다.
트래픽을 발생시킬 때마다 서버의 리소스 사용량이 변화하는 것을 눈으로 직접 확인할 수 있었다.
따라서 성공적으로 springboot - prometheus - grafana가 연동된 것을 알 수 있다.
Ref:
- Total
- Today
- Yesterday
- GORM
- cs
- network
- go
- java
- fiber
- Operating System
- Database
- effective
- mmu
- 공지
- Effective Java
- spring
- soft delete
- ARP
- OS
- paging
- algorithm
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |