Search

모니터링 툴

Created
2024/11/06 05:03
상태
Done
태그
web service

모니터링

서비스 운영할 때 어플리케이션의 CPU, 메모리, 커넥션 사용, 고객 요청 수 같은 수 많은 지표들을 확인하는 것이 필요하다.
그래야 어디에 어떤 문제가 발생했는지 사전에 대응할 수 있고, 실제 문제가 발생해도 원인을 빠르게 파악해 해결할 수 있다.
우리가 사용할 수 있는 수 많은 모니터링 툴이 있으니, 그 중 적합한 것을 잘 골라서 사용하자.

마이크로 미터

모니터링 툴을 사용하기 위해서는 모니터링 툴마다 애플리케이션 지표(메트릭)를 모니터링 툴 포맷에 맞춰 전달해야한다.
이런 경우 모니터링 툴을 변경하려면 기존에 측정하는 코드를 새로운 툴에 맞춰 전부 변경할 필요가 있었다.
표준 측정 방식 제공하여 각 지표들의 측정 기준 추상화한 마이크로미터를 통해 이런 문제를 해결할 수 있다.
마이크로미터를 사용하면 마이크로미터에서 지원하는 모니터링 툴의 구현체를 가져다가 사용하기만 하면, 지표들을 해당 모니터링 툴의 포맷에 맞춰 바꾸어준다.
마이크로미터는 애플리케이션 메트릭 파사드라고 불리는데, 애플리케이션의 매트릭(측정 지표)를 표준 방법으로 모아서 제공한다.
다시말해서 마이크로미터가 추상화를 통해 모니터링 툴 구현체를 쉽게 갈아끼울 수 있도록 구성되어 있고, 애플리케이션 코드는 모니터링 툴이 변경되어도 그대로 유지할 수 있다.
스프링 부트 엑추에이터는 마이크로미터 라이브러리를 기본으로 내장해서 사용하기 때문에, 해당 라이브러리를 가져다가 사용하기만 된다.

프로메테우스와 그라파나

과거 이력을 보기 위해서는 매트릭을 지속적으로 수집하고 데이터베이스에 저장할 필요가 있다. 이런 역할을 해주는 것이 프로메테우스이다.
프로메테우스가 지표들을 수집하고 데이터베이스에 저장하면, 그라파나가 데이터베이스에 있는 데이터를 불러 사용자가 보기 편하게 대시보드를 만들어준다.
애플리케이션에서 메트릭을 통해 모니터링을 구성하는 과정은 다음과 같다.
1.
스프링 부트 엑추에이터와 마이크로미터를 통해 수 많은 메트릭 데이터를 자동으로 생성(마이크로미터에서 프로메테우스가 읽을 수 있는 포맷으로 데이터 생성됨)
2.
프로메테우스는 위와 같이 생성된 메트릭을 지속적으로 수집 및 저장
3.
사용자가 그라파나 대시보드 툴을 통해 프로메테우스에서 데이터를 조회하여 데이터를 확인

프로메테우스 설정하기

프로메테우스 설치하기
프로메테우스 설치는 홈페이지 다운로드 후 터미널로 설치파일 실행하면 된다.(보안 관련 문제로 설치가 안될 때는 환경 설정에서 허용해주어야 한다.)
프로메테우스 애플리케이션 설정하기
프로메테우스는 json을 이해하지 못하기 때문에 프로메테우스가 메트릭을 가져갈 수 있도록, 애플리케이션에서 프로메테우스 포맷에 맞추어 메트릭 만들게 설정해주어야 한다.
마이크로미터에서 프로메테우스 구현체를 사용하여 해결한다.
implementation "io.micrometer:micrometer-registry-prometheus"
YAML
복사
위 코드처럼 라이브러리만 추가하면 마이크로미터가 자동으로 프로메테우스 구현체를 등록 및 동작하도록 설정하고, 메트릭에 /prometheus 항목이 추가되고 기존 metrics의 값들의 포맷이 프로메테우스에 맞춰 변경되어서 보여진다.
# HELP tomcat_threads_config_max_threads # TYPE tomcat_threads_config_max_threads gauge tomcat_threads_config_max_threads{name="http-nio-8080",| 200.0 # HELP tomcat_sessions_alive_max_seconds # TYPE tomcat_sessions_alive_max_seconds gauge tomcat_sessions_alive_max_seconds 0.0 # HELP tomcat cache access total # TYPE tomcat cache access total counter tomcat cache_access_total 0.0 # HELP jvm_info JVM version info # TYPE jvm_info gauge jvm_info{runtime="OpenJDK Runtime Environment", vendor="JetBrains s.r.o. ",version="17.0.3+7-b469.37", ) 1.0 # HELP logback_events_total Number of events that made it to the logs # TYPE logback_events_total counter logback_events_total{level="warn",} 0.0 logback_events_total{level="debug", } 0.0 logback_events_total{level="error", } 2.0 logback_events_total{level="trace",} 0.0 logback_events_total{level="info",} 47.0 ...
YAML
복사
프로메테우스 포맷에서는 여러 태그를 묶어서 보여주던 엑추에이터 메트릭과 다르게, 각 세부 항목들까지 쪼개서 데이터를 담는다.
프로메테우스에서는 일반적으로 항목 마지막에 메모리 사용량처럼 실시간 정보는 _gauge, 누적해서 숫자를 세는 카운터는 _total을 붙인다.
프로메테우스에 메트릭 추가하기
아래의 prometheus.yml 파일의 추가부분처럼 새로운 메트릭에 대한 설정 값을 추가하여, 프로메테우스가 우리 애플리케이션의 메트릭을 주기적으로 수집하도록 설정한다.
global: scrape_interval: 15s evaluation_interval: 15s alerting: alertmanagers: - static configs: - targets: # - alertmanager: 9093 rule files: scrape_configs: - job_name: "prometheus" static_ configs: - targets: ["localhost:9090"] #추가 - 띄어쓰기 2칸 맞는지 유의 - job_name: "spring-actuator" # 수집하는 이름 metrics_path: '/actuator/prometheus' # 수집할 경로 지정 scrape_interval: 1m # 수집할 주기 static_configs: - targets: ['localhost: 8080'] # 수집할 서버의 IP, Port
YAML
복사
설정이 끝나면 종료 후 다시시작하고, 9090 포트(프로메테우스 기본 포트)로 들어가보면 config와 target 탭에서 우리가 설정했던 값 확인할 수 있다.

프로메테우스 사용하기

태그와 레이블
아래의 error, exception, instance, job, meothod, uri, status 등의 항목들은 각각의 메트릭 정보를 구분하기 위한 태그로, 마이크로미터에서는 태그(Tag)라 하고 프로메테우스에서는 레이블이라 한다.
Table 탭에서 여러 메트릭 정보들을 직접 검색하여 확인 가능하고, Graph 탭에서 해당하는 데이터들의 추세를 그래프로 볼 수 있다.
또한 Graph 탭에서는 시간을 바꿔 과거 시간대의 메트릭 정보도 확인할 수 있다.
필터 적용하기
레이블을 기준으로 { }을 입력하여 필터를 적용할 수 있다. {uri=metrics}처럼 필터를 적용할 수 있고, {uri!=prometheus}와 같이 해당 값만 빼고 볼 수도 있다.
또한 {method=~”GET|POST”}{uri!~"/actuator.*"}처럼 필터 조건에 ~를 넣어 정규식을 넣을 수 있다.
promSQL 입력창에 +, -, *, / 등의 여러 연산자와 sum, sum by, count, topk 등 여러 통계 함수들도 지원한다.
offset으로 현재부터 특정 시간동안의 데이터만 골라볼 수 있다.
[1m]과 같이 promSQL 뒤에 벡터 범위 선택을 지정하여 특정 시간동안 수집한 데이터를 구체적으로 풀어서 볼 수도 있다.

그라파나 설정하기

그라파나 설치하기
그라파나 설치는 홈페이지 다운로드 후 터미널로 server 파일을 실행하면 된다.(보안 관련 문제로 설치가 안될 때는 환경 설정에서 허용해주어야 한다.)
그라파나 실행하기
그라파나를 실행하기 전 먼저 애플리케이션과 프로메테우스를 실행시킨 후에 그라파나 실행해야 한다.
그라파나에서 configuration → add datasource → prometheus → url에 프로메테우스의 url을 입력하여 데이터를 받아오도록 설정할 수 있다.
그라파나의 기본 접속 포트는 3000번으로 접속한다.

그라파나 사용하기

대시보드 만들기
dashboard → new dashboard → save dashboard
add panel → code로 설정 → qeury 입력해서 원하는 모듈 추가
Legend로 출력 범례 이름 변경, pannel option에서 pannel title 변경
하나하나 만들기 귀찮고 어려우니, 그라파나에서 이미 만들어둔 공유 대시보드 사용하기
공유 대시보드 ID 복사 → import로 가져오기 후 원하는 값 수정
그라파나로 메트릭을 통한 문제 확인하기
CPU 사용량 초과
@GetMapping("cpu") public String cpu() { log.info("cpu"); long value = 0; for (long i = 0; i < 100000000000L; i++) value++; return "value : " + value; }
Java
복사
JVM 메모리 사용량 초과
private List<String> list = new ArrayList<>(); @GetMapping("jvm") public String jvm() { log.info("jvm"); for (long i = 0; i < 100000000000L; i++) list.add("hello jvm " + i); return "jvm"; }
Java
복사
커넥션 풀 고갈
@Autowired DataSource dataSource; @GetMapping("jdbc") public String jdbc() throws SQLException { log.info("jdbc"); Connection conn = dataSource.getConnection(); log.info("connection info={}", conn); //conn.close(); //커넥션을 닫지 않는다. return "ok"; }
Java
복사
에러 로그 급증
@GetMapping("error-log") public String erroLog() { log.error("error-log"); return "error-log"; }
Java
복사

모니터링 환경 팁

모니터링 3단계
1.
대시보드
전체를 한눈에 볼 수 있는 가장 높은 뷰
마이크로미터, 프로메테우스, 그라파나 등등
시스템 메트릭, 애플리케이션 메트릭, 비즈니스 메트릭 등 모니터링
2.
애플리케이션 추적
주로 각각의 HTTP 요청을 추적, 일부는 마이크로서비스 환경에서 분산 추적
핀포인트, 스카우트, 와탭, 제니퍼 등등
3.
로그
가장 자세한 추적으로 원하는대로 커스텀 가능
같은 HTTP 요청을 묶어서 확인할 수 있는 방법이 중요
사용자 UUID를 로그에 남겨 사용자별로 묶어서 볼 수 있게 하자.(MDC 적용)
파일로 직접 로그를 남기는 경우
일반 로그와 에러 로그는 파일을 구분해서 남기자.
클라우드에 로그를 저장하는 경우
검색이 잘 되도록 구분하자.
알람
모니터링 툴에서 일정 이상 수치가 넘어가면 슬랙, 디스코드, 이메일, 문자 등을 연동
알람은 경고와 심각 2가지 종류로 꼭 구분해서 관리해야 업무와 일상에 방해가 되지 않도록 해야한다.
경고 : 사람이 하루 한 번정도 들어가서 확인해도 되는 수준
심각 : 즉시 확인해야 하는 수준(슬랙이나 앱으로 알람 받아야함)
예시
디스크 사용량 70% → 경고 / 80% → 심각
CPU 사용량 40% → 경고 / 60% → 심각