모니터링 구축 시리즈
- Spring Boot Actuator & micrometer
단순히 모니터링 서버를 구축하기 위한 방법과 간단한 설명만 있습니다.
🍃 스프링 부트 의존성 추가
//build.gradle
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
- 스프링 부트 액츄레이터 (Spring Boot Actuator):
- 스프링 부트 액츄레이터는 스프링 부트 애플리케이션의 상태를 모니터링하고 관리하는 데 사용됩니다.
- 이는 여러 엔드포인트를 제공하여 애플리케이션의 다양한 측면을 모니터링할 수 있습니다 (예: 건강 상태, 메트릭, 환경 설정 등).
- 마이크로미터 (Micrometer):
- 마이크로미터는 모니터링 툴을 변경하게 되면 기존에 측정했던 코드를 변경한 툴에 맞도록 다시 변경해야 하는데 측정하는 코드까지 모두 변경해야 하는 문제를 줄이기 위해 나온 메트릭을 수집하는 데 사용되는 메트릭 수집 라이브러리 입니다.
- 즉, 추상화를 통해 메트릭을 수집하는 인터페이스만 만들어두고 구현체를 통해 애플리케이션의 메트릭을 모아서 제공합니다. 스프링 부트 2 버전 이후부터는
스프링에 통합
되었습니다.
🐘 Gradle Reroad & 환경 설정
gradle에 의존성을 추가하고 reroad한 후 프로젝트를 시작한 뒤 http://localhost:8080/actuator
로 요청을 보내게 되면 아래와 같
은 정보를 확인 할 수 있습니다.
프로젝트의 헬스체크도 http://localhost:8080/actuator/health
로 확인 가능합니다.
하지만 아직은 많은 부분을 확인할 수 없다는 아쉬움이 존재합니다. 그래서 application.yml에 좀 더 많은 엔드 포인트를 열어주겠습니다.
//application.yml
management:
endpoints:
web:
exposure:
include: "*" // 모든 엔드포인트 노출
exclude: // 제외할 엔드포인트cn
위에 설정을 추가
하고 프로젝트를 재시작하게 되면 더 많은 정보를 얻을 수 있습니다.
{
"_links": {
"self": {
"href": "http://localhost:8080/actuator",
"templated": false
},
"beans": {
"href": "http://localhost:8080/actuator/beans",
"templated": false
},
"caches-cache": {
"href": "http://localhost:8080/actuator/caches/{cache}",
"templated": true
},
"caches": {
"href": "http://localhost:8080/actuator/caches",
"templated": false
},
"health": {
"href": "http://localhost:8080/actuator/health",
"templated": false
},
"health-path": {
"href": "http://localhost:8080/actuator/health/{*path}",
"templated": true
},
...
추가로 아래와 같은 설정을 통해 자바 런타임 정보
를 확인할 수도 있습니다. 기본으로는 비활성화
되어 있어 결과를 보고 싶다면 직접 설정을 추가해 줘야 합니다.
management:
info:
java:
enabled: true
// http://localhost:8080/actuator/info
"java": {
"version": "17.0.9",
"vendor": {
"name": "Amazon.com Inc.",
"version": "Corretto-17.0.9.8.1"
},
"runtime": {
"name": "OpenJDK Runtime Environment",
"version": "17.0.9+8-LTS"
},
"jvm": {
"name": "OpenJDK 64-Bit Server VM",
"vendor": "Amazon.com Inc.",
"version": "17.0.9+8-LTS"
}
}
}
🕵️ 액추에이터 보안
위에 설정처럼 모든 엔드 포인트를 공개하게 되면 외부 인터넷망을 통해 접근할 수 있을 때 서비스의 정보를 불필요하게 노출
하게 된다는 문제점이 존재
합니다.
그래서 외부에서 접근하지 못하게 하는 것이 좋으나 로컬에서도 접근하기 위해 열어둬야 한다면 액추에이터를 서비스와 다른 포트에서 실행되게 변경
할 수 있습니다.
추가로 엔드 포인트의 경로를 변경하는 설정 방법도 있으나 생략하겠습니다.
🎙️ 마이크로미터
마이크로미터(Micrometer)는 자바(JVM) 애플리케이션을 위한 메트릭(metrics) 수집 라이브러리
입니다. 이는 "SLF4J"가 로깅을 위한 표준 인터페이스로 사용되는 것과 유사하게, 애플리케이션 메트릭을 위한 표준 인터페이스를 제공
합니다.
그렇다면 마이크로미터의 특징은 무엇이고 어떻게 활용할 수 있을까요?
📱주요 특징
- 다양한 메트릭 수집: 마이크로미터는 HTTP 요청 처리 시간, 데이터베이스 쿼리 성능, 캐시 히트율, 시스템 CPU 사용량, JVM 메모리 사용량 등 다양한 종류의 메트릭을 수집가능 하게 합니다.
- 통합된 인터페이스: 위에서도 말 했다 싶이 표준 인터페이스를 구현한 구현체를 통해 모니터링 툴에 맞게 수집하기 용이합니다.
- 다차원 데이터 모델: 메트릭에 태그(Tagging)를 추가하여, 같은 메트릭 유형 내에서도 다양한 차원(예: 서비스 이름, 호스트 이름)으로 데이터를 분류하고 분석할 수 있습니다.
마이크로미터를 통한 메트릭 수집과 모니터링
은 애플리케이션 운영에서 필수적인 부분
으로 여겨집니다. 개발자와 운영 팀이 애플리케이션의 성능과 상태를 효과적으로 관리
하고, 사용자 경험을 향상
시키는 데 기여합니다.
🎬 마이크로미터 엔드포인트
http://localhost:8080/actuator/metrics
로 시작하는 엔드포인트는 스프링 부트 애플리케이션에서 마이크로미터를 사용하여 메트릭을 수집하고 노출하는 데 사용됩니다.
metircs
에서 대표적인 몇개만 살펴보겠습니다.
- HTTP 서버 요청 관련 메트릭 (
http.server.requests
,http.server.requests.active
): 이 메트릭은 HTTP 요청의 수, 응답 시간, 오류율 등을 포함하여 웹 애플리케이션의 성능과 가용성을 평가하는 데 중요합니다. - JVM 메모리 관련 메트릭 (
jvm.memory.used
,jvm.memory.committed
,jvm.memory.max
): JVM의 메모리 사용량과 상태를 모니터링하여 메모리 누수와 같은 문제를 식별하고, GC 성능을 분석하는 데 중요합니다. - JVM GC(Garbage Collection) 관련 메트릭 (
jvm.gc.live.data.size
,jvm.gc.max.data.size
,jvm.gc.memory.allocated
): GC 작업과 관련된 메트릭으로, 애플리케이션의 메모리 관리 효율성을 평가하는 데 사용됩니다. - 톰캣(Tomcat) 세션 관련 메트릭 (
tomcat.sessions.active.current
,tomcat.sessions.active.max
): 웹 서버의 세션 상태를 모니터링하여 사용자 경험과 서버의 부하를 평가합니다.
위에 엔드포인트 뿐만 아니라 모니터링에 필요한 대부분의 지표를 제공해주고 있기때문에 모니터링을 하면서 필요한 지표를 찾아봐도 무관합니다.
'BE' 카테고리의 다른 글
캐시를 통한 성능개선 - 이론편 (0) | 2023.12.26 |
---|---|
N+1문제와 인덱스를 통한 조회 성능 개선 (0) | 2023.12.12 |
Promtail & Loki (0) | 2023.12.09 |
프로메테우스 & 그라파나 (0) | 2023.11.29 |
SSL/TLS & Nginx Certbot 적용 (0) | 2023.09.25 |