이전에 했던 Actuator만 가지고는 효율적인 모니터링을 진행할 수 없습니다. 그래서 Prometheus와 Grafana를 이용해서 모니터링을 해보겠습니다. 

 

1. Prometheus란?

 

이벤트 모니터링 및 경고 용도로 사용하는 무료 소프트웨어 응용 프로그램입니다. PromQL이라는 유연한 쿼리와 실시간 경고가 가능합니다. 

 

메트릭 이름 및 Key/Value 형태로 식별되는 시계열 데이터가 있는 다차원 모델입니다. 이것을 PromQL을 이용해서 분석이 가능합니다.

 

다양한 그래프와 대시보드 기능을 지원합니다. (그라파나 사용 예정)

 

저희는 Springboot Application의 메트릭 정보를 수집하여, 시각화를 진행할 예정입니다. 그렇기 위해선 Prometheus를 설치해야 합니다. 하지만 Docker를 이용해서 설치하지 않고 컨테이너 환경으로 진행할 수 있기 때문에 Docker를 이용하겠습니다. 

 

2. Grafana란?

 

시계열 매트릭 데이터를 시각화하는데 가장 최적화된 대시보드를 제공해주는 오픈소스 툴킷입니다.

 

다양한 DB를 연결하여 DB의 데이터를 가져와 시각화할 수 있고, 그래프를 설정도 간편하게 할 수 있습니다. 

 

Grafana는 시계열 매트릭 데이터 수집에 강한 모습을 보이는 만큼, 서버 리소스의 매트릭 정보나 로그 같은 데이터를 시각화는 데 많이 사용합니다.

 

시각화한 그래프에서 특정 수치의 값이 치솟을 때(예를 들어 에러 발생량이 5개 이상일 때, 요청을 처리하지 못한 횟수가 일정량 이상일 때) 알림을 전달받을 수 있는 기능도 제공합니다. 이러한 기능은 인프라 운영 환경에서 필요한 기능이라고 할 수 있습니다. 마찬가지로 설치해야 하지만 Docker의 컨테이너로 진행하겠습니다. 

 

3. Springboot Application 설정

 

프로메테우스를 사용하기 위해선 디펜더 시 추가와 이전에 했었던 Actuator처럼 엔드포인트를 열어줘야 합니다. 하나씩 진행하겠습니다.

 

3-1. build.gradle 디펜더시 추가

 

디펜더시를 추가해줍니다. 프로메테우스 관련 라이브러리가 추가됩니다.  

implementation 'io.micrometer:micrometer-registry-prometheus'

 

 

3-2. application.yml 수정

 

endpoints에 prometheus를 열어줍니다. 또한 metircs.tags.application 태그는 프로메테우스 서비스 단위의 식별자 역할을 해줍니다. 

management:
  info:
    env:
      enabled: true
  endpoints:
    web:
      exposure:
        include: info, health, prometheus
        exclude:
      base-path: /management
  endpoint:
    health:
      show-details: always
    prometheus:
      enabled: true
  metrics:
    tags:
      application: ${spring.application.name}

 

3-3. Prometheus 테스트 

 

프로메테우스 엔드포인트가  활성화됐는지 확인합니다. localhost:8080/management/prometheus로 Get요청을 보냅니다. 

아래와 같은 metric 정보를 얻을 수 있습니다.

 

 

 

 

4. Prometheus 설정

 

Prometheus.yml을 작성해야 합니다. 해당 파일은 프로메테우스의 Configuration이라고 생각하면 됩니다. 설명은 주석으로 달겠습니다. 

 

global:
  scrape_interval: 15s # 15초마다 매트릭을 수집 default 1분
  evaluation_interval: 1m # 1분마다 규칙을 평가 default 1분

  external_labels: # 외부 시스템에 표시할 이 서버의 레이블
    monitor: 'vlog-test-monitor'

scrape_configs:
  - job_name: 'blog-test' # 잡 이름
    metrics_path: '/management/prometheus' # 메트릭을 수집할 path 설정
    static_configs:
      - targets: ['host.docker.internal:8080'] # 도커 호스트 를 나타냄 즉 localhost:8080으로 된다.

 

이제 컨테이너를 기동 하겠습니다. 아래의 명령어로 실행합니다. docker에 대해서는 간단하게 설명하겠습니다. 

 

$ docker run -p 9090:9090 -v /Users/user/work/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml --name prometheus -d prom/prometheus --config.file=/etc/prometheus/prometheus.yml

 

-p: 9090 포트로 요청이 오면 해당 컨테이너 9090으로 보냅니다.(9090이 prometheus의 default 포트입니다.)

-v: 볼륨으로 작성한 prometheus.yml과 컨테이너 내부의 있는 prometheus.yml이 공유합니다. 

-d: 백그라운드로 실행합니다. 

--config.file: 이전에 작성한 prometheus.yml을 config file로 사용하도록 지정합니다. 

 

localhost:9090으로 접속하면 아래와 같이 뜹니다. 

 

 

Status->target으로 이동하면 아래와 같이 정상적으로 프로메테우스가 동작하는 것을 볼 수 있습니다.

 

 

다시 홈 화면으로 돌아와서 http_server_requests_seconds_max PromQL을 날려보면 아래와 같이 메트릭을 얻을 수 있습니다. 여러 개의 패널을 만들 수 있습니다. 

 

위의 시계열 데이터로는 정보를 인식하기 어렵습니다.

 

5. Grafana

 

프로메테우스로 얻은 데이터를 대시보드로 시각화하는 그라 파 나를 설정하겠습니다. 컨테이너를 가동합니다. 

docker run -d --name=grafana -p 3000:3000 grafana/grafana

 

localhost:3000으로 접속합니다. 초기 아이디와 비밀번호는 admin/amdin입니다. 로그인하면 비밀번호를 설정하는 단계가 나타납니다. 설정해줍니다. 

 

 

접속이 되었다면 아래와 같은 화면이 뜨고 Data Sources (Add your first data source)를 클릭해줍니다. 

 

 

프로메테우스를 선택합니다. 

 

 

데이터 소스 이름을 정하고, HTTP URL에 프로메테우스 URL을 적어줍니다. host.docker.internal은 docker의 호스트를 뜻합니다. 외부에 다른 서버에서 동작한다면 해당 IP를 적어주면 됩니다. 

 

 

밑에 내려가서 save&test를 눌러줍니다. 

 

 

이제 대시보드로 가서 Add a new panel을 눌러줍니다. 

 

 

http_server_requests_seconds_max 쿼리를 날리면 위에화 같이 시각화로 볼 수 있습니다. 필요한 것이 적다면 일일이 설정해도 되지만, 다른 사람들이 만들어놓은 template을 import 해서 자신이 필요한 것만 남겨서 사용해도 됩니다. 

 

 

+ (create) 버튼의 Import를 클릭합니다. 

 

 

Json 파일 혹은 dashboard URL or ID를 입력하라고 뜹니다. dashboard URL OR ID는 여기서 확인 가능합니다. 

 

 

해당 사이트를 들어가서 springboot를 검색해줍니다. 5개가 검색이 됩니다. 저는 SpringBoot APM Dashboard를 선택하겠습니다. 

 

 

Copy ID to Clipboard를 눌러 복사하고, 아까의 import에 입력해줍니다. 

 

 

아래의 화면처럼 뜨고, 저희가 만든 Prometheus 데이터 소스를 선택해주고 Import 해줍니다. 

 

 

만들어진 template를 볼 수 있습니다. 여기서 필요 없는 부분은 삭제하고 필요한 부분을 커스텀을 진행해서 자신만의 모니터링을 구축할 수 있습니다. 

 

 

지금까지 Prometheus와 Grafana를 적용해봤습니다. 현재 Local 환경 + Docker로 진행했지만, 다음 포스팅은 AWS 환경에서 진행하는 것을 포스팅하겠습니다. 감사합니다.