보통 프로젝트를 진행하면 서버 개발이 보통이다.
하지만!! 서버가 어떻게 돌아가고 있는지
모니터링 또한 서버 유지, 보수 측면에 있어서 굉장히 중요한 요소이다.
즉, 서버 VM의 CPU, 메모리, 커넥션 사용, 고객 요청 수 같은 지표들을 확인해야 한다.
예시 : EC2 VM 지표들
오늘은, 프로메테우스와 그라파나를 이용해
스프링 기반 어플리케이션의 메트릭 모니터링을 보려고 한다.
내가 구현하고자 하는 방식은 아래와 같다.
쉽게 설명하면, 액추에이터가 Spring Boot서버의 정보를 수집하고,
micrometer가 해당 정보를 프로메테우스가 알 수 있도록 변경해주고,
그라파나가 프로메테우스의 정보를 받아 해당 정보를 시각화 해준다.
예를 들어,
수신된 HTTP 요청 횟수
요청 처리시 걸린 시간, 현재 진행중인 요청 수를
위의 이벤트 또는 데이터의 측정값 의 예시로 들 수 있다.
메트릭 기반의 오픈소스 모니터링 시스템이다.
풀 기반의 데이터 수집 방법을 사용한다.
풀 기반이란, 말 그대로 pull 이고,
프로메테우스 서버가 주기적으로 감시 대상 시스템에 요청을 보내서 데이터를 수집(pull)하는 방식이다.
pull 방식의 구조를 채택함으로써 모든 메트릭에 대한 데이터를 중앙 서버로 보내지 않아도 된다는 점이 장점이다.
(내 서버가 평소의 상황이라면 상관없지만, 부하가 높은 상황일때도 push 방식은 내 서버가 중앙 감시 서버에 메트릭에 대한 데이터를 보내야 하므로.)
특히 Kubernetes와 Docker환경에서의 서비스의 메트릭을 수집하고 분석할때 많이 사용된다.
오픈소스 메트릭 데이터 시각화 도구로 메트릭 분석 플랫폼이다.
Grafana allows you to query, visualize, alert on and understand your metrics no matter where they are stored. Create, explore, and share dashboards with your team and foster a data-driven culture (출처 : 그라파나 깃허브 소스 https://github.com/grafana/grafana)
위의 공식 문서의 영어를 해석하면, Grafana를 사용하면 메트릭이 저장된 위치에 상관없이 메트릭을 조회, 시각화, 경고 및 이해할 수 있습니다. 대시보드를 만들고 탐색하며 팀과 공유하고 데이터 중심 문화를 조성합니다 라고 공식문서는 이야기한다.
즉,
프로메테우스를 통해 매트릭 정보를 수집하고,
그라파나를 이용해 해당 정보들을 시각화하여 볼 수 있게 되는 것이다.
이제 spring에서 사용해보도록 하겠다.
https://start.spring.io/
웹에 대한 의존성만 추가하고, 나머지는 gradle에서 추가하겠다.
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-core'
implementation 'io.micrometer:micrometer-registry-prometheus'
프로메테우스 이외의 의존성에 대해 설명하자면,
Spring Boot Actuator : 애플리케이션 상태 확인, 모니터링 지원 기능을 제공한다
스프링 부트 액추에이터 말고, 마이크로미터 코어 의존성을 추가한 이유는
Spring Boot Actuator는 마이크로미터를 기본으로 내장해서 사용하기 때문에, 의존성을 추가해준 것이다.
마이크로미터란?
마이크로미터 공식 문서: https://spring.io/blog/2018/03/16/micrometer-spring-boot-2-s-new-application-metrics-collector
메트릭 측정에 대한 측정 결과를 프로메테우스 모니터링 툴의 API에 맞게 전달하기 위해 사용한다.
(프로메테우스가 메트릭 정보를 이해하기 위해서 마이크로미터가 필요하다는 내용)
actuator에서 메트릭을 수집한 후 prometheus와 같은 다른 모니터링 툴이 actuator이 수집한 메트릭을 이해할 수 있도록 해주는 역할이 마이크로미터이다.
액추에이터 : http.server.requests
위에서 아래로 마이크로미터가 변형 ↓
프로메테우스 : http_server_requests
이런 방식이다.
주석을 통해 설명을 달아놓았다.
프로메테우스가 어떤 내용들을 수집할지, 이름은 어떻게 정할지 등을 작성할 수 있다.
spring:
application:
name: monitoring
management:
endpoint:
metrics:
enabled: true
prometheus:
enabled: true
endpoints:
web:
exposure:
include: health, info, metrics, prometheus
metrics:
tags:
application: ${spring.application.name}
메트릭을 수집할 엔드포인트가 존재해야 하기에,
대충의 컨트롤러를 만들어 주었다.
@RestController
public class PrometheusController {
@GetMapping("/end1")
public String end1() {
return "end1";
}
@GetMapping("/end2")
public String end2() {
return "end2";
}
}
도커 설치시 사용할
prometheus.yml을 만들고 다음과 같이 작성했다. (프로메테우스 설정파일)
주석에 설명이 있다.
global:
scrape_interval: 10s # 10초마다 매트릭을 수집 default 1분
evaluation_interval: 1m # 1분마다 규칙을 평가 default 1분
external_labels: # 외부 시스템에 표시할 이 서버의 레이블
monitor: 'ingeon-monitor'
rule_files: # 규칙을 로딩하고 evaluation_interval 설정에 따라 정기적으로 평가한다.
# - "first.rules"
# - "second.rules"
scrape_configs:
- job_name: 'monitoring-app' # 잡 이름
metrics_path: '/metrics' # 메트릭을 수집할 path 설정
static_configs:
- targets: ['host.docker.internal:8080'] # 도커 인스턴스 내부 호스트:8080
이제 도커를 통해 프로메테우스를 설치한다.
docker run -d -p 9090:9090 -v {prometheus.yml 파일 경로}/prometheus.yml --name prometheus prom/prometheus
내 경우는 경로가 아래와 같아서, 아래 명령을 사용했다.
docker run -d -p 9090:9090 -v C:\Users\이인건\Desktop\webApp_prometheus\src\main\resources\prometheus.yml --name prometheus prom\prometheus
위와 같이 도커에 프로메테우스가 설치되었다.
설치 후 어플리케이션(스프링)을 실행하고
http://localhost:9090을 접속해보면
위와 같이 프로메테우스 홈페이지를 볼 수 있다.
위의 Status -> Target을 접속하면,
야믈 파일의 설정대로 활성화된 것을 볼 수 있다.
컨트롤러에서 만들어주었던 엔드포인트에 접속 후 (메트릭 생성을 위해)
http_server_requests_seconds_max 를 검색하면
위와 같이 매트릭이 수집되는 것을 확인할 수 있다.
이제, 수집된 매트릭을
그라파나를 통해 시각화를 이루면 된다!
마찬가지로 도커로 설치한다!
아래 명령어를 사용하여 설치한다.
docker run -d -p 3000:3000 --name grafana grafana/grafana
도커상에서
설치가 완료된 후
http://localhost:3000 를 접속해보면
그라파나 홈페이지를 들어갈 수 있다.
첫 로그인은
admin, admin을 통해 접속한다.
홈페이지 좌측 설정에서, 데이터 소스를 클릭한다.
애드 데이터 소스를 클릭하고
프로메테우스를 클릭한다.
위 사진의 내용대로 설정한 후 (야믈파일에서 설정한 주소에서 포트번호만 바뀜)
세이브 앤 테스트를 눌러 성공적으로 테스트가 된다면
데이터소스가 저장될 수 있다.
이제 저장된 데이터소스를 토대로
대시보드를 만들면 된다.
import 를 검색하여
import dashboard 탭에 들어간다
아래의 사진처럼 4701을 작성후 (남이 만들어놓은 대쉬보드를 가져와서 사용하는것)
로드하고
그다음 창에서 JVM과 Prometheus를 설정한다.
이제 import를 시켜 대시보드를 볼 수 있다.
위의 사진에서 볼 수 있는 것처럼,
JVM의 메모리와 데이터 입출력 상태, 그다음 스크롤을 아래로 내려서 CPU 사용량 등
전반적인 서버의 상태에 대해 알 수 있다.
또한,
메트릭 정보 (그래프, 게이지 등) 가 어떤 메트릭에 대한 정보인지 알고싶다면,
대쉬보드 수정을 통해 프로메테우스에게 날릴 쿼리문으로 알 수 있다.
예를 들어, 아래는
irate(logback_events_total{instance="$instance", application="$application", level="error"}[5m])
어이, 프로메테우스! 에러 로그를 5분마다 수집해줘! 라는 내용의 코드이다.
(아래 사진 아래쪽에 있다.)
https://github.com/ingeon2/webApp_prometheus
레퍼런스
https://brunch.co.kr/@springboot/734
https://kitty-geno.tistory.com/189
https://devbksheen.tistory.com/183
김영한님 pdf