DevOps

Grafana로 실시간 서비스 모니터링: Actuator와 Prometheus Quick Starter

백엔드 유성 2024. 8. 15. 21:35

많이 서비스들을 사용하고 있는 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으로 들어가보면 여러 링크들을 볼 수 있습니다.

http://localhost:9292/actuator

 

여기서 서비스 상태, 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

 

Grafana dashboards | Grafana Labs

No results found. Please clear one or more filters.

grafana.com

여기서 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 요청 흐름 모니터링 및 분석