2025.05.19 ~ 05.22
웹 개발 심화
모니터링
제품(Product) 테스트 및 유지보수 단계
프로그램 사용자의 편의성과 유지 및 보수는 필수적이다.
유지보수해야 하는 부분을 선정을 하는 것이 관건이다.
- 어떤 클라이언트를 타겟으로 프로덕트를 구성했는지, 어떤 기능이 메인인지에 따라서 접목해야하는 기술이 다르다
- MSA를 접목 시키는 것도 모니터링을 기반으로 적용을 해야 타당성이 부여된다.
프로덕트에 어떤 기능을 접목시킬지, 어떤 부분을 리팩토링을 해야할까?
- 개발은 현실세계에서 미리 확인을 해볼 수 없기 때문에 사용자들의 클레임을 어떤 식으로 도출해 낼지가 관건이다
-> Actuator로 해결!
Actuator
제품을 개발하고 있는 환경에서 모니터링과 관리를 할 수 있는 라이브러리
- 서비스(제품)을 운영하는 개발자에게 서비스에 문제가 없는 지 지표로써 나타냄
- 그 외에 Application의 상태, 성능, 환경, 메트릭, 헬스 체크 등에 대한 정보를 제공하고 제어할 수 있게 하는 라이브러리
Actuator 를 통해 할 수 있는 일
- Application의 성능 측정, 상태 확인
- 유지보수
- 성능 최적화
- 메모리 누수 파악
- 로그 추적
-> 지표에 의한 Refactoring이 가능!
Actuator 가 중요한 이유
정확한 지표에 의한 결과로 인해 성능에 차이를 판단할 수 있을 때 좋은 코드와 수정이 필요한 코드로 나뉘어지게 되기 때문이다
Actuator 의 주요 요소
지표(Metric)
시스템의 성능, 상태, 동작을 수치로 표현하는 데이터
- CPU 사용률, 메모리 사용량, 응답 시간, 요청 수 등등
- 시스템의 상태를 실시간으로 모니터링 및 문제 사항을 파악할 수 있다
추적(Trace)
하나의 요청이 여러 시스템(MSA) 을 거치며 처리되는 경로 혹은 여러 비즈니스 로직 단계에 따른 세부 정보 데이터
- MSA 환경에서의 요청 흐름 파악 및 병목 구간, 오류 발생 위치 등을 파악하는데 사용된다
감사(Auditing)
비즈니스에서 발생하는 이벤트에 대한 기록을 통해 누가, 언제, 어떻게 무엇을 했는 지 추적하는 데이터
- 보안 및 책임에 대한 추적, 이력 관리 등에 대해 사용된다
- JPA Auditing 기능 : 날짜 자동 등록, 인스턴스 이벤트 발생(create, update, delete 등) 등 시간을 추적해서 지표로 남기거나 시간을 기록
Actuator의 주요 end-point
postman이나 url에 작성해서 확인해볼 수 있다.
.yml / .properties 파일에서 약간의 수정이 필요하다.
- /actuator : 모든 Actuator 엔드포인트의 개요 제공
- /actuator/health : 애플리케이션 및 컴포넌트의 헬스 체크 상태를 반환
- /actuator/info : 애플리케이션의 사용자 정의 정보를 반환
- /actuator/metrics : 애플리케이션의 메트릭 데이터를 제공
- /actuator/prometheus : Prometheus 서버가 수집할 수 있는 형식으로 메트릭을 제공
- /actuator/env : 애플리케이션의 환경 변수 및 설정 정보를 반환
- /actuator/loggers : 로거 설정을 조회하고 동적으로 변경할 수 있다.
Actuator의 다양한 End-Point를 활용하여 모니터링
- 실제 서비스 운영하다 장애가 발생했을 때 알림 서비스를 받아야 되거나 신속하게 성능을 분석하거나 하는 등 복잡한 네트워크를 추적(감시)하고 관리하는 기능을 필요로 하게 된다
- 실시간 네트워크 문제해결을 위해 표, 차트, 그래프, 대시보드 및 보고서 형태의 데이터를 제공하면 손쉽게 확인할 수 있다.
- 전체적인 모니터링 시스템은 데이터 수집, 통합, 시각화의 단계로 구성
Monitoring
Prometheus
- 애플리케이션에서 발생하는 데이터들을 Actuator가 추출해서 지표들(Metrics)을 나타낸다.
이 지표들을 저장할 데이터베이스 서버
- 오픈 소스 모니터링 및 경고 도구, 주로 시스템 및 서비스 모니터링에 사용
Prometheus 특징
- 데이터 수집 : 시간에 따른 데이터 수집(시계열)을 지원하며, 주로 메트릭 형태로 정보를 수집한다.
메트릭은 서버의 CPU 사용량, 메모리 사용, 네트워크 트래픽 등 다양한 시스템 지표를 포함
- 경고 : 문제가 감지되었을 때 사용자에게 알림을 보내는 경고 시스템을 제공
- 쿼리 및 분석 : Prometheus의 강력한 쿼리 언어(PromQL)를 사용하여 저장된데이터를 쿼리하고 분석할 수 있다.
Prometheus 동작원리

Micrometer
- 다양한 형태의 Metric을 하나의 표준으로 정한 것
- 애플리케이션의 메트릭(측정 지표) 퍼사드(상위 수준 인터페이스)로 마이크로미터가 정한 표준 모니터링 툴을 사용할 때 제공
- 어떤 모니터링 툴에서도 적용가능하게 변환해주는 툴
- springboot의 actuator가 제공하는 기능
- JVM 기반의 애플리케이션 Metrics를 제공하고 처리
- Micrometer가 지원하는 모니터링 시스템(Atlas, Datadog, Graphite, Influx, JMX, Prometheus ...)
- JDBC를 생각하면 유사하다. PSA(Portable Service Abstraction)에서 정보 은닉하는 경우 처럼 새로운 표준측정방식이 나올 때 유연성이 높아서 확장 가능성이 뛰어나다.
Prometheus
- Prometheus 는 MicroMeter 로 표준화 된 Metric 들을 저장하는 DataBase의 역할을 하게 된다.
Grafana
- Metric 들을 시각화한 오픈 소스 분석 및 시각화 플랫폼
- 대시보드 생성과 데이터 시각화에 주로 사용, 다양한 데이터 소스와 호환
- MySQL 데이터베이스 서버를 사용하기 위해서 시각화가 되어있는 MySQL Workbench 를 이용하게 된다.
이때 MySQL을 Prometheus라고 생각하고 MySQL Workbench 를 Grafana 라고 생각하면 이해하기 편하다.
Grafana 특징
- 다양한 데이터 소스 지원 : Prometheus, MySQL, PostqreSQL 등 다양한 데이터 소스와 연동할 수 있다.
- 대시보드 : 사용자는 여러 형태의 차트, 그래프 및 알림을 포함한 사용자 정의 대시보드를 생성
- 시각적 디스플레이 : 복잡한 데이터를 쉽게 이해할 수 있도록 돕는 강력한 시각적 도구를 제공
Grafana 원리

1. 타겟을 지정
2. 타겟 중 Metrics 를 추출
3. Prometheus 하드디스크에 Metrics 저장
4. 저장해 놓은 Metrics를 PromQL을 통해서 대시보드인 Grafana로 시각화. 데이터를 다양한 통계치나 수많은 그래프 형태로 보여준다.
모니터링 그래프 항목 추천
Tomcat / Java 관련
- GC Count(Garbage Collection 횟수) : 메모리 관리 상태를 파악할 수 있고 횟수 상 너무 자주 발생하면 애플리케이션 성능에 영향을 줄 수 있다.
- GC Time(Garbage Collection에 소요된 시간) : GC 시간 증가를 모니터링 해서 메모리 튜닝의 필요성을 확인할 수 있고 GC에 소요되는 시간이 길면 애플리케이션 성능이 저하될 수 있다.
STW(Stop the Word) 추척할 수 있다.
- Heap Used / Heap Memory : 힙 메모리 사용량을 모니터링하여 메모리 누수나 메모리 사용 패턴을 파악할 수 있다.
- TPS(Transactions Per Second) : 초당 처리되는 트랜잭션 수를 나타내는 그래프. 애플리케이션의 처리 성능을 측정하는 주요 지표, TPS가 낮으면 성능문제가 있을 수 있다.
- Active Service EQ(Execution Queue) : 활성화된 서비스 실행 큐의 상태를 나타내는 그래프. 실행 대기 중인 요청 수를 모니터링하여 서버 부하를 파악할 수 있다.
- Active Speed : 활성화된 서비스의 처리 속도를 나타내는 그래프. 요청 처리 속도가 느려지면 성능 문제를 의심할 수 있다.
- XLog : 확장 로그를 나타내는 그래프. 다양한 성능지표를 포함할 수 있고 분석할 수 있으며 요청별 상세 정보와 성능 데이터를 확인
서버 관련
- CPU : 서버의 전반적인 부하를 파악하는 데 중요한 지표. 높은 CPU 사용률은 성능 병목을 의미할 수 있다. -> 스케일 아웃 필요
- Memory : 메모리 사용 상태를 모니터링하여 메모리 누수나 부족현상을 파악할 수 있다.
- Network TX Bytes / RX Bytes : 전송(TX) 및 수신(RX)된 네트워크 병목이나 대역폭 문제를 확인할 수 있다.
Actuator, Prometheus, Grafana 는 전반적인 운영 모니터링이다.
성능 테스트보단 단순 상태, 운영 확인을 할 수 있는 모니터링이다.
Jmeter
아파치 소프트웨어 재단이 개발한 오픈 소스 성능 테스트 도구
웹 애플리케이션의 성능을 테스트, 다양한 서비스의 스트레스 테스트(부하 테스트)를 수행하는 데 사용
- 성능 테스트 : 웹 서버, 데이터 베이스 서버 등 다양한 유형의 서비스에 대한 부하 테스트 및 성능 측정을 지원한다.
- 멀티 스레드 디자인 : 멀티 스레드로 동작하며, 여러 요청을 병렬로 처리할 수 있어 실제 사용자 환경을 모방할 수 있다.
- 확장성 : 다양한 플러그인을 통해 기능을 확장할 수 있으며, 사용자 정의 테스트 시나리오를 작성할 수 있다.
모니터링 개발
Actuator 관련 설정





/info 는 atuator 커스터마이징을 하게 되면 어플리케이션 정보를 추가적으로 나타낼 수 있다.



절대 경로 안에 로그 파일을 만들어 저장할 수도 있다.



기본 주소를 변경하게 되면 이전 /actuator 에서 직접 지정한 경로로 검색해야 actuator 값들이 나올 수 있게 된다.

메트릭 태그를 설정한다.
http metrics 관련 설정 - Bean 방법

http 관련 요청 응답에 대한 기록을 하는 역할을 하게 된다.
/test 요청을 보냈을 경우


요청과 응답이 뜨게 된다.
http metrics 관련 설정 - .properties 방법
Prometheus 설치
Prometheus 사이트에서 download로 들어가서 설치를 한다.
그 뒤 다운로드한 폴더를 압축을 푼다.
애플리케이션과 prometheus 서버 간의 연결이 필요하다. prometheus 의 .yml 파일을 확인한다.
scrape_configs 안에 하위 값을 추가한다.
- job_name: "spring-actuator"
metrics_path: '/actuator/prometheus'
scrape_interval: 1s
static_configs:
- targets: ['localhost:8080']
자신의 spring 서버에서 타켓들을 prometheus 가 수집하게 만드는 설정이다. 이 설정을 넣은 후 저장을 .exe 파일을 실행하면 된다.
윈도우 환경에서는 실행을 하여 창을 띄운 뒤 최소화 시켜 놓는다.
애플리케이션에서 build 설정을 추가해야 한다. Prometheus 의존성을 추가한다.
애플리케이션을 실행한 뒤 prometheus 주소에 들어가서 서버 연결이 잘 되었는지 확인한다.
status > target health 으로 들어가서 다음과 같은 화면이 나오면 연결이 성공한 것이다.

Application 에서 발생하는 메트릭의 키값 표시법은 disk.free 이런 식으로 발생하게 되는데 prometheus가 알아들을 수 있게 micrometer 표준으로 변환한 것은 disk_free 형식으로 변환이 되게 된다.
Prometheus 사용 예시
이전 만들어 놓았던 /test 를 여러번 실행 시킨 뒤 해당하는 metric 의 키 값를 실행 시킨다.
그래프로 들어가게 되면 지표화를 확인할 수 있다.
Prometheus 관련 PromQL
key = value 형식으로 데이터 저장
key는 tag / label로 불린다. 해당 메트릭 정보를 식별할 수 있는 구분자의 역할
필터
- 레이블 값을 기준으로 필터링을 할 수 있으며 {} 중괄호 문법을 사용하게 된다.
- = : value 와 동일한 레이블 선택 기호
- != : value 와 동일하지 않은 레이블 선택 기호
- =~ : value와 정규식이 일치하는 레이블 선택 기호
- !~ : 제공된 문자열과 정규식 일치하지 않는 레이블 선택
연산자
- '+ - * / %' 등의 연산을 진행할 수 있다.
- DB의 Group by 절처럼 묶을 수 있으며 묶은 메트릭에 대해 sum, count 등의 함수를 적용할 수 있다.

이렇게 원하는 값만 추출할 수도 있다.
Prometheus 기능
Gauge
- 특정 시점에 대한 단일 값
- 현재 Application을 이용하는 이용자수, Queue 크기, 메모리 사용량 등을 측정하는 레코더
Timer
- 특정 작업의 소요 시간을 측정하고 통계(평균치, 최대치, 백분위) 등을 제공하는 레코더
Counter
- 특정 이벤트 발생 횟수를 누적하여 측정하는 레코더
- Http 요청에 대한 횟수, 특정 작업에 대한 횟수
increase()
- 벡터값을 통해서 해당 메트릭에 대한 범위를 지정할 수 있다.
- ex) increase(http_server_requests_seconds_count{uri="/test"}[1m])
rate()
- 지정한 벡터값을 통해서 초당 평균 증가율을 계산할 수 있다.
- ex) rate(http_server_requests_seconds_count{uri="/test"}[1m])
Grafana 설치
압축을 푼 파일을 접속한다.
bin > grafana-server.exe 을 실행한다.


설치 한 뒤 3000 port에 접속한다. 로그인 초기값은 admin에 admin이다.
로그인 한 화면에서 중요하게 봐야할 것은 DATA SOURCES, DASHBOARDS 이다.
- DATA SOURCES 는 데이터 소스를 어디서 가지고 올 지 설정을 해야한다. 즉, Prometheus 에 있는 데이터를 사용한다.

DATA SOURCES 를 누르고 Prometheus 를 선택한다.
URL에 prometheus의 주소를 작성한다.
save and point를 누르면 된다.
연결이 되면 DATA SOURCES로 되어 있던 부분은 COMPLELE으로 변경된 것을 확인할 수 있다.
DASHBOARDS 에 Add a new panel 를 누른다.
Enter a PromQL query 부분에 작성을 하면 되고 Code / Builder 형식 선택할 수 있다.
작성한 뒤 Run queries 를 누르면 실행된다.
쿼리를 추가해서 비교할 수도 있다.
디스크 제목까지 작성한 뒤 Apply를 눌러서 커스텀 할 수 있다.
저장하면 폴더 안에 생성된다.
매번 대시보드를 만들지 않고 미리 만들어 놓은 것을 가져와서 커스텀할 수도 있다.
Import를 눌러서 URL 이나 ID를 누른다.
grafana.com/dashboards
그라파나 공식 사이트에 있는 대시보드
검색 창에 검색해서 원하는 대시보드를 찾는다.
원하는 대시보드 안으로 들어간 다음 copy ID to clipboard를 누른다.


직접 부하를 넣어서 테스트 해볼 수 있다.
모니터링 커스터마이징
metrics 의 이름의 집합과 태그의 집합을 만든다.
보통 Counter, Timer, Gauge 를 사용한다.
MeterRegistry
- MicroMeter 의 핵심 인터페이스
- App 의 매트릭을 등록하고 관리하는 역할
- 다양한 메트릭 타입(Counter, Gauge, Timer)를 생성 및 등록
- 등록 된 메트릭들은 Prometheus 로 전송하는 것에 사용된다.
Counter
- MicroMter 의 Counter를 사용해서 특정 이벤트의 발생 횟수를 기록하는 컴포넌트 클래스
- 다양한 태그를 사용하여 Counter 를 세분화하여 추적할 수 있다.

Timer
- MicroMeter 의 Timer 를 사용해서 특정 작업에 대한 소요 시간 측정 및 기록을 하는 컴포넌트 클래스
- 특정 작업의 시작 시간과 종료 시간을 측정하여 평균, 최대 작업 시간, 백분위 등을 수집할 수 있다.

Gauge
/* Gauge 를 통해 관리 할 객체를 넣어 줌 */
@PostConstruct
public void initGauge() {
// 인메모리 데이터인 user 의 크기를 실시간 추적하여 size 를 반환
userMetricsRecorder.registerUserListSizeGauge(users);
}



커스텀한 메트릭이 나오게 된다.
Jmeter 설치
window 는 zip 파일을 다운로드 받는다.
압축을 풀고 한글이 깨지는 것을 방지하기 위해서는 인코딩을 진행해야한다. bin > jmeter.properties 파일 안으로 들어간다.
해당 encoding 설정이 주석 처리 되어있는데 해제하고 저장한다.
sampleresult.default.encoding=UTF-8
다음으로 jmeter플러그를 설치한다.
버전을 확인하고 다운로드를 한 뒤 lib 폴더까지 이동한다.
.jar파일을 오려서 jmeter 의 lib 폴더로 옮긴다.
다시 플러그인 다운로드 파일로 간뒤 lib > ext 폴더 안으로 들어간다.
두 .jar 파일을 오려서 jmeter > lib > ext 폴더에 붙여 넣는다.
이제 jmeter > bin > ApacheJMeter.jar 를 실행하면 된다.

Jmeter 사용하기
Jmeter 를 사용하기 위해서 저장할 위치를 지정해 주고 쓰레드 그룹을 만든다.


쓰레드들의 수(사용자 수) : 가상의 사용자를 세팅하는 것이다.
Ramp-up 시간 : 사용자 수만큼 로딩 되는 시간
루프 카운트 : 반복의 횟수
HTTP 요청에서 기본 설정을 한 뒤 시작한다.

리스너 들을 추가한다.이때 플러그인 설치해서 추가한 리스너들도 확인할 수 있다.





부하테스트 결과들을 시각화할 수 있다.
결과가 나왔으면 결과를 따로 저장을 한다. 이때 파일 이름은 영어로 작성하고 확장자는 .jtl 로 저장을 해야한다
파일 선택을 눌러서 해당 결과를 연다.
그 뒤 설정까리 열어서 완료를 누르면 HTML 보고서 생성을 할 수 있다.
도구 > HTML 보고서 생성을 누른다.
결과 파일 -> 테스트 결과를 저장한 .jtl 파일을 넣는다.
user.properties 파일 -> apache-jmeter > bin > jmeter.properties 를 넣는다.
출력 디렉토리 -> html 파일을 저장할 폴더를 선택하는데 비어있는 새폴더를 지정해야한다.

저장한 해당 위치에 가서 .html 파일을 열어보면 보고서를 확인할 수 있다.
