많이 서비스들을 사용하고 있는 Grafana를 이용해서 서비스 모니터링을 하는 방법을 소개하겠습니다.
서비스 모니터링을 하기 위해서 아래의 것들이 필요합니다.
1. 모니터링용 데이터를 생성하는 라이브러리 : Actuator
2. 모니터링용 데이터를 저장하는 Database : Prometheus
3. 모니터링을 위한 대시보드 : Grafana
워낙 내용이 많아서 간단하게 사용하는 방법만 보고 넘어가겠습니다.
모니터링용 데이터를 생성하는 라이브러리
과거에는 모니터링을 위한 데이터를 각각 만들어서 모니터링 툴의 규격에 맞춰 넣어주었지만 요즘에는 다양한
모니터링 툴들이 나와서 그것들을 다 사용할 수 있는 Micrometer 를 써보겠습니다.
Micrometer 는 규격화된 인터페이스이고 Prometheus, Graphite, Datadog, New Relic, JMX 등 여러 모니터링 툴에 연동 할 수 있습니다.
dependencies {
...
implementation("org.springframework.boot:spring-boot-starter-actuator")
}
spring boot starter actuator를 라이브러리로 추가해주겠습니다.
엑츄에이터는 Micrometer를 포함하고 있습니다.
application.yml 을 아래와 같이 수정하고 서비스를 기동해보겠습니다.
(설정은 설명을 위한 저의 임의 설정이며, 필요 시 각 서비스에 맞게 맞춰 주셔야 합니다.)
management:
server:
port: 9292
endpoint:
shutdown:
enabled: true
health:
show-details: always
info:
java:
enabled: true
os:
enabled: true
endpoints:
web:
exposure:
include: '*'
metrics:
enable:
all: true
tomcat: true
서비스를 기동하고 http://localhost:9292/actuator 를 웹 또는 postman으로 들어가보면 여러 링크들을 볼 수 있습니다.
여기서 서비스 상태, db 상태 및 활성화된 connection pool 등을 확인할 수 있는데
눈 여겨 볼 부분은 "href": "http://localhost:9292/actuator/prometheus" 이 부분입니다.
한번 들어가보시면
JVM CPU/MEM 등 여러 리소스 사용량을 확인할 수 있고, 이 데이터가 모니터링에 사용될 데이터입니다.
그런데 이 데이터는 실시간의 데이터로 모니터링을 위해서 데이터들을 저장할 DB가 필요합니다.
모니터링용 데이터를 저장하는 DataBase
DB가 포함된 Prometheus 라는 이름의 프로그램을 다운로드 받겠습니다.
(DB는 Time Series Database [TSDB] 로 시간에 따른 metric 데이터를 효율적으로 저장하는 DB입니다.)
웹 사이트에서 설치하셔도 되고 저는 편의상 docker-compose를 이용해 Prometheus 를 구성했습니다.
grafana는 아래에서 설명할 내용이라 같이 설치해주었습니다.
version: '3.1'
services:
grafana:
image: grafana/grafana
container_name: grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin # 원하는 비밀번호로 변경
volumes:
- grafana-storage:/var/lib/grafana
depends_on:
- prometheus
prometheus:
image: prom/prometheus
container_name: prometheus
ports:
- "9090:9090"
volumes:
- prometheus-data:/prometheus
- ./prometheus.yml:/etc/prometheus/prometheus.yml
volumes:
grafana-storage:
prometheus-data:
사진의 아래 부분에 prometheus.yml이라는 설정 파일을 생성 또는 수정 해주어야 하는데 저는 다음과 같이 설정했습니다.
global:
scrape_interval: 15s # 기본 스크래핑 간격 (모든 타겟에 적용)
evaluation_interval: 15s # 규칙 평가 간격
scrape_configs:
# Prometheus 자체 모니터링
- job_name: 'prometheus'
static_configs:
- targets: [ 'localhost:9090' ]
# Grafana 서버 모니터링 (필요한 경우)
- job_name: 'grafana'
static_configs:
- targets: [ 'grafana:3000' ]
# Spring boot application 모니터링
- job_name: 'log-center'
metrics_path: '/actuator/prometheus'
scrape_interval: 1s
static_configs:
- targets: [ 'host.docker.internal:9292' ]
여기서 job_name은 아무렇게나 쓰셔도 괜찮습니다.
metrics_path는 동일하게 작성해주세요. Prometheus가 데이터를 가져가려는 경로입니다.
scrape_interval은 Prometheus가 데이터를 가져가는 주기입니다. 10s~1m을 권장하며, 테스트를 위해 저는 1s로 작성했습니다.
targets는 데이터를 가져갈 Host와 Port입니다. 프로그램을 localhost에 설치하셨으면 localhost:{톰켓 PORT} 로 작성하시면 되고,
저처럼 Spring boot는 local에서 돌리고 Prometheus는 Docker conteiner에서 돌린다면 host.docker.internal로 호스트를 맞춰주세요.
이제 프로메테우스를 들어가보겠습니다. 아래 경로로 들어가주세요.
http://localhost:9090/targets
State가 UP이라고 뜬다면 서비스가 정상 연동 된겁니다. 만약 Down으로 표시된다면 prometheus.yml 를 다시 설정해주세요.
저는 3개가 떠있지만, Spring boot 프로젝트를 모니터링 하기 위해서 log-center 하나만 붙여놓아도 괜찮습니다.
이제 DB에 데이터를 적재하는 것까지 되었습니다.
모니터링을 위한 대시보드
화면에 보여주는 프로그램인 Grafana를 설치해서 사용량을 한번 봅시다.
저는 위 docker-compose.yml에 Grafana도 같이 넣어주었기 때문에 설치 방법은 생략하겠습니다.
설치가 되었다면, Grafana와 Prometheus를 연동해야 합니다.
Grafana 홈페이지에서 HOME > Connections > Datasource 로 들어갑니다.
http://localhost:3000/connections/datasources
들어가면 DB를 추가할 수 있는 버튼 'Add new data source' 가 있고 들어가서 Prometheus를 선택해주세요.
설정해야 할 부분은 Connection이라는 부분인데,
만약 Prometheus 설치를 local 에 9090 포트로 설정했다면 http://localhost:9090 으로
docker-compose로 설치를 했다면 http://{container-name}:9090 으로 설정하고
가장 아래 Save&Test를 눌러주세요.
연동이 되었다면 이제 모니터링 창을 만들어볼게요.
https://grafana.com/grafana/dashboards/?search=spring
여기서 Spring Boot 2.1 System Monitor 또는 원하는 디자인인 페이지에 들어가서 'Copy id to clipboard' 를 눌러주세요.
다시 Grafana로 가서 Home > Dashboard > New 버튼을 클릭하고 'Import' 라는 버튼을 눌러주세요.
id를 입력하고 'Load' 버튼을 누르면 아래와 같은 창이 나옵니다. 연동했었던 Prometheus를 선택해주세요.
하시면 대시보드가 생성되고 현재 및 과거 리소스 상태를 볼 수 있습니다.
디자인도 괜찮고 사용중인 리소스가 잘 표시되네요.
우선 간단하게만 알아보았고, 추가로 원하는 대시보드(예: 상품 주문 수, 채팅을 사용하는 사용자 수 등) 를 '프로메테우스 쿼리'를 이용해 만들어 쓸 수 있으나,
쓰기에는 내용이 너무 많아 블로그에 넣지는 않겠습니다.
프로젝트 및 System의 리소스 요청량 Connection 등을 확인하는 모니터링 툴을 알아보았고,
다음 포스팅에서는 ELK를 이용해 서버 로그를 수집하는 방법을 알아보겠습니다.
포스팅 순서
1. Grafana 를 이용한 리소스 모니터링
2. ELK 스택을 이용한 로그 모니터링 및 분석
3. 핀포인트를 이용한 MSA 요청 흐름 모니터링 및 분석
'DevOps' 카테고리의 다른 글
ELK 스택으로 실시간 로그 수집 및 분석하기: Logback, Filebeat, Elasticsearch, Kibana Quick Starter (0) | 2024.08.18 |
---|---|
Kafka의 EOS 보장 및 성능 최적화 전략: Producer, Consumer, Broker 설정 (0) | 2023.08.08 |
반복적인 일을 자동화하자!! .1부 (시스템 점검 자동화) (0) | 2023.04.01 |