DevOps/Monitoring

Prometheus & Grafana 모니터링 시스템 구축하기

KAispread 2023. 10. 12. 23:32
728x90
반응형

개요

서비스를 운영할 때는 애플리케이션의 CPU, 메모리, 커넥션 사용, 고객 요청수 같은 수 많은 지표들을 확인하는 것이 필요하다. 그래야 어디에 어떤 문제가 발생했는지 사전에 대응도 할 수 있고, 실제 문제가 발생해도 원인을 빠르게 파악해서 대처할 수 있다.

지난 포스팅에서 APM 도구인 Scouter를 설치하고 프로젝트에 적용해보는 방법에 대해 다뤘었다. 이후 운영환경에 적용하여 잘 사용하고 있지만 Connection/Thread Pool 등 애플리케이션에 대한 보다 세부적인 지표를 모니터링 할 수 있으면 좋겠다는 생각이 들었다.

Prometheus는 2012년 출시된 오픈소스 모니터링 플랫폼이다. 기존 모니터링 플랫폼과는 다르게 Pull 방식을 사용하여, 각 모니터링 대상의 Exporter 또는 Prometheus client를 통해서 지표를 받아가는 방식으로 데이터를 수집한다. Scouter와 Prometheus 모두 애플리케이션 모니터링에 사용된다는 공통점이 있지만, Scouter는 요청에 대한 메소드 호출을 추적하는 데 특화되어있고 Prometheus는 애플리케이션의 지표를 수집하고 조회하는 데 더 특화되어있다. 

이전에 인프런 강의에서 Prometheus와 이에 대한 시각적 대시보드를 제공하는 Grafana에 대해 간단히 배워본적이 있었는데 이번 기회에 실제 서비스에 적용해보고 그 과정을 기록하려고 한다.

 

구성 순서

Prometheus & Grafana

Prometheus & Grafana를 활용한 모니터링 시스템은 위와 같이 구성된다. 애플리케이션 서버에서 Micrometer 표준 측정 방식으로 액츄에이터가 메트릭을 측정한다. 프로메테우스가 각 서버에 요청을 날려, 지표를 수집하고 수집한 지표를 DB에 저장한다. 수집한 지표를 그라파나로 조회하여 대시보드를 구성한다.

그라파나와 프로메테우스는 같은 리눅스 인스턴스에 구동시키고, API 서버들은 각자 다른 가용영역 사설 IP 대역에 구동시킬 예정이다.

본 모니터링 시스템 구성은 다음의 순서로 진행된다.

  1. Actuator 설정
  2. Prometheus 설정
  3. Grafana 설정

모니터링 시스템을 구축하는 것은 생각보다 간단하다. 구축하는 것보다 어떤 지표를 수집하여 어떤 형태로 시각화 할 것인지가 더 중요하다.

우선, Actuator 설정부터 진행한다.

 

🌈 Actuator 설정

💡 모니터링은 애플리케이션이 현재 살아있는지, 로그 정보는 정상 설정 되었는지, 커넥션 풀은 얼마나 사용되고 있는지 등을 확인할 수 있어야 한다.

스프링 부트가 제공하는 액츄에이터는 이런 프로덕션 준비 기능을 매우 편리하게 사용할 수 있는 다양한 편의 기능들을 제공한다.

더 나아가서 마이크로미터, 프로메테우스, 그라파나 같은 최근 유행하는 모니터링 시스템과 매우 쉽게 연동할 수 있는 기능도 제공한다.

 

bulid.gradle

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-actuator'
}

build.gradle에 액츄에이터 의존성을 추가한다.

 

application.yml 설정 추가

management:
  # Actuator Port
  server:
    port: 9200
  
  # endpoint 활성화/비활성화
  endpoint:
    health:
      enabled: false
      
  # endpoint 노출
  endpoints:
    web:
      exposure:
        include: "*"
        exclude: "env,beans,info,configprops"

# tomcat 관련 지표 활성화
server:
  tomcat:
    mbeanregistry:
      enabled: true
  • Actuator 포트를 지정한다. (9200)
  • 액츄에이터는 다양한 엔드포인트를 제공한다. 각 엔드포인트들은 애플리케이션의 지표를 나타낸다.
  • 엔드포인트는 활성화 - 노출 설정을 해야 활성화된다.
  • 몇몇 엔드포인트는 기본적으로 활성화되어있다.
  • 특정 엔드 포인트를 활성화 하려면
    • management.endpoint.{엔드포인트명}.enabled=true 를 적용하면 된다.

 

💡 전체 엔드포인트 목록은 다음 링크에서 확인할 수 있다.
Production-ready Features
 

Production-ready Features

You can enable recording of HTTP exchanges by providing a bean of type HttpExchangeRepository in your application’s configuration. For convenience, Spring Boot offers InMemoryHttpExchangeRepository, which, by default, stores the last 100 request-response

docs.spring.io

 

 

 

📌 Prometheus

모니터링 툴이 작동하려면 시스템의 다양한 지표들을 각각의 모니터링 툴에 맞도록 만들어서 보내주어야 한다

마이크로미터 (Micrometer)애플리케이션 메트릭 파사드라고 불리는데, 애플리케이션의 metric(측정 지표)을 마이크로미터가 정한 표준 방법으로 모아서 제공해준다. 스프링은 이미 잘 만들어진 마이크로미터라는 추상체가 있기 때문에 이것을 활용한다.

Spring Boot Actuator는 마이크로미터를 기본으로 내장하고 있다. 그리고 스프링 부트 액츄에이터는 마이크로미터가 제공하는 지표 수집을 @AutoConfiguration 을 통해 자동으로 등록해준다.

 

bulid.gradle

dependencies {
	implementation 'io.micrometer:micrometer-registry-prometheus'
}

build.gradle에 마이크로미터 프로메테우스 구현 라이브러리를 추가한다. 이렇게 하면 스프링 부트와 액츄에이터가 자동으로 마이크로미터 프로메테우스 구현체를 등록해서 동작하도록 설정해준다.

액츄에이터에 프로메테우스 메트릭 수집 엔드포인트가 자동으로 추가된다.

  • /actuator/prometheus

 

이제 서버 애플리케이션을 구동시키자.

http://{서버 IP}:9200/actuator/prometheus

다음 url을 통해 모든 메트릭이 프로메테우스 포맷으로 만들어지는지 확인한다.

 

 VM에 프로메테우스 설치

모니터링용 VM에 프로메테우스를 설치한다. 앞서, Actuator 포트를 9200로 설정했으니 9200에 대한 트래픽이 허용되어 있어야한다.

 

Download | Prometheus

An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.

prometheus.io

다음 경로에서 Prometheus 를 다운받는다. MAC의 경우 darwin 을 다운받으면 된다.

필자는 Linux에 설치하므로 prometheus-2.45.1.linux-amd64.tar.gz 을 다운받았다.

### Linux 일 경우
# Prometheus 파일 받기
wget https://github.com/prometheus/prometheus/releases/download/v2.45.1/prometheus-2.45.1.linux-amd64.tar.gz

# 압축 해제
tar -xvf prometheus-2.45.1.linux-amd64.tar.gz

 

압축을 풀고 프로메테우스 파일 경로로 들어가 prometheus.yml 파일을 수정한다.

scrape_configs 아래에 job을 추가해주면 된다.

  • job_name : 수집하는 이름이다. 태그라고 보면 됨
  • metrics_path : 수집할 경로를 지정
  • scrape_interval : 수집할 주기를 설정한다.
  • targets : 수집할 서버의 IP, PORT 를 지정한다.

이렇게 설정하면 프로메테우스는 주어진 경로를 5에 한번씩 호출해서 애플리케이션의 메트릭들을 수집한다.

프로메테우스가 구동될 VM에서 API 서버 9200 포트로 요청을 날릴 수 있도록 방화벽을 풀어주어야함 (보안그룹)

 

프로메테우스를 실행시켜준다. 

# prometheus 실행
./prometheus > /dev/null 2>&1 &

 

http://{VM 공인 IP}:9090/targets 로 접속

다음과 같이 서버의 State가 UP이면 성공이다.

 

📌 Grafana

먼저 다음 2가지를 꼭 수행해두어야 한다.

  • 애플리케이션 실행
  • 프로메테우스 실행

https://grafana.com/grafana/download

Grafana 를 설치한다. 각 OS에 맞게 설치하면 됨.

Grafana 도 실행시켜주자

 

http://{VM 공인 IP}:3000 로 접속하여 Grafana 대시보드를 확인할 수 있다.

그라파나 계정 기본값은 admin / admin 이다.

 

왼쪽 톱니바퀴 아이콘 - Configuration - Data source 클릭 

 

Add data source 클릭

 

Prometheus 선택

 

보안과 요청 관련해서 기본적인 설정 가능. 우선 이름과 URL을 지정해준다.

URL은 프로메테우스가 구동된 VM 의 공인 IP와 9090 포트를 입력한다.

 

하단의 Save & Test 를 클릭한다. 

 

Dashboard 고르기

https://grafana.com/grafana/dashboards/?search=spring+ 

 

Dashboards | Grafana Labs

Thank you! Your message has been received!

grafana.com

위 링크에 누군가가 만들어놓은 대시보드들이 존재한다. 여기서 마음에 드는 대시보드를 골라 ID를 복사한다.

 

dashboard - New - Import 를 클릭한다.

 

ID 를 붙여놓고 Load를 클릭한다.

 

Name을 지정하고 방금 추가한 datasource를 선택하여 추가한다. 이후, Import 클릭

(필자는 Prometheus와 Loki 를 사용하는 대시보드를 고름. Prometheus 만 사용하는 대시보드도 많음)

 

다음과 같이 애플리케이션에 대한 대시보드를 볼 수 있다. 메트릭 속성이 달라서 몇몇 지표는 보여지지 않는 모습이다.

수정을 원하는 지표를 edit 하거나 원하는 지표를 추가할 수 있다.

 

Add 버튼을 통해 새로운 지표를 추가할 수 있다.

  1. 프로메테우스 쿼리를 입력한다.
  2. 그래프의 패널 이름을 설정한다.
  3. 프로메테우스 쿼리를 실행한다.
  4. 새로운 쿼리를 추가한다.

 

대시보드 오른쪽 탭에서 데이터의 단위, 최소, 최대 값 등을 변경할 수 있다.

 

 

마무리

결과적으로 다음과 같이 구축했다

  • CPU 사용량 초과
  • JVM 메모리 사용량 초과
  • 커넥션 풀 고갈
  • 에러 로그 급증

애플리케이션에 장애가 발생하거나 성능이 급격히 느려질 때 다음과 같은 지표들을 통해 원인을 유추해볼 수 있다. 

모니터링 시스템에서 중요한 것은, 어떤 데이터를 어떠한 형태로 시각화 할 것인지인 것 같다. 프로메테우스에서는 애플리케이션의 다양한 지표들을 사용자의 입맛에 맞게 커스터마이징 할 수 있다. 아직은 지표를 다루는 법이 익숙치 않아, 프로메테우스의 PromQL에 대해서도 지속적으로 학습해야겠다는 생각이 들었다.

대강의 모니터링 시스템은 구축했으니 운영중인 서비스를 모니터링하며, 장애 상황을 빠르게 파악하기 위해 어떤 지표가 필요할지 많은 고민이 필요할 것 같다.

728x90
반응형