웹 개발 심화

j0yy00n0·2025년 12월 2일

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

  • MicroMeter 의 Gauge 를 이용하여 특정 컬렉션의 크기를 실시간으로 측정하는 컴포넌트 클래스
  • 컬렉션의 현재 크기를 Gauge 메트릭으로 노출
  • count, timer 는 보통 증가하는 그래프만 보여지지만 gauge 를 사용하면 감소하는 그래프를 나타낼 수 있다.
  • Gauge 는 중복 등록 시에 충돌이 발생할 가능성이 있다. 따라서 @PostConstruct 를 통해 최초 1회만 등록하여 해당 List 가 변경 시에 Gauge 값이 자동으로 업데이트가 되게 관리한다.
  • ex) UserMetricsRecorder
    public void registerUserListSizeGauge(List<?> users) {
        gauge.registerListSize(MetricNames.USER_TOTAL_GAUGE, users);
    }
  • ex) UserController
/* Gauge 를 통해 관리 할 객체를 넣어 줌 */![](https://velog.velcdn.com/images/n0stress/post/1895d26d-495a-40d2-881a-e79d0f2192a0/image.png)

@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 파일을 열어보면 보고서를 확인할 수 있다.

profile
잔디 속 새싹 하나

0개의 댓글