장애는 언제든지 발생할 수 있으므로 모니터링을 잘 하는 것은 중요하다.
서비스를 운영할 때는 애플리케이션의 CPU, 메모리, 커넥션 사용, 고객 요청 수 같은 지표들을 확인하는 것이 필요하다.
마이크로미터는 애플리케이션 메트릭 파사드라고 불리는데, 애플리케이션의 메트릭(측정 지표)를 마이크로미터가 정한 표준 방법으로 모아서 제공해준다.
쉽게 이야기해서 마이크로미터가 추상화를 통해서 구현체를 쉽게 갈아끼울 수 있도록 해두었다.
마이크로미터라는 이미 잘 만들어진 추상화가 있기 때문에, 스프링은 이것을 활용한다.
스프링 부트 액츄에이터는 마이크로미터를 기본으로 내장해서 사용한다.
개발자는 마이크로미터가 정한 표준 방법으로 메트릭(측정지표)를 전달하면 된다. 그리고 사용하는 모니터링 툴에 맞는 구현체를 선택하면 된다. 이후에 모니터링 툴이 변경되어도 해당 구현체만 변경하면 된다.
애플리케이션 코드는 모니터링 툴이 변경되어도 그대로 유지할 수 있다.
------
메트릭 확인하기
마이크로미터는 다양한 지표 수집 기능을 이미 만들어서 제공하고, 스프링 부트 액츄에이터는 마이크로미터가 제공하는 지표 수집을 @AutoConfiguration을 통해 자동으로 등록해준다.
→ 스프링 부트 액츄에이터를 사용하면 수 많은 메트릭(지표)를 편리하게 사용할 수 있다.
metrics 엔드포인트
http://localhost:8080/actuator/metrics
자세히 확인하기
metrics의 엔드포인트는 아래 패턴을 사용해서 더 자세히 확인할 수 있다.
http://localhost:8080/actuator/metrics/{name}
http://localhost:8080/actuator/metrics/jvm.memory.used
http://localhost:8080/actuator/metrics/jvm.memory.used?tag=area:heap
http://localhost:8080/actuator/metrics/http.server.request?tag=uri:/log&tag=status:200
server:
tomcat:
mbeanregistry:
enabled: true
아래 톰캣 관련 메트릭은 위 설정 추가해야 나옴
http://localhost:8080/actuator/metrics/tomcat.threads.config.max
http://localhost:8080/actuator/metrics/tomcat.threads.busy
아래는 문제 확인 예제 코드 & 스프링 프로젝트 설정
package hello.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@RestController
public class TrafficController {
@GetMapping("cpu")
public String cpu(){
log.info("cpu");
long value = 0;
for(long i=0; i<10000000000000000L; i++){
value++;
}
return "ok value=" + value;
}
private List<String> list = new ArrayList<>();
@GetMapping("jvm")
public String jvm(){
log.info("jvm");
for(int i=0; i< 100000000; i++){
list.add("hello jvm!" + i);
}
return "ok";
}
@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";
}
@GetMapping("/error-log")
public String errorLog(){
log.error("error log");
return "error";
}
}
테스트 위한 프로젝트 build.gradle 정보
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.10'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
runtimeOnly 'io.micrometer:micrometer-registry-prometheus'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
management:
info:
java:
enabled: true
os:
enabled: true
env:
enabled: true
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
shutdown:
enabled: true
프로메테우스 설치
https://prometheus.io/download/
그라파나 설치
https://grafana.com/grafana/download?platform=windows
프로메테우스, 그라파나란?
프로메테우스
- 애플리케이션에서 발생하는 메트릭을 과거 이력까지 함께 확인하려면 메트릭을 보관하는 DB가 필요함.
- 프로메테우스가 애플리케이션에서 메트릭을 지속해서 수집하고 DB에 저장하는 역할을 수행한다.
그라파나
- 프로메테우스는 메트릭을 저장하는 DB이고, DB에 있는 데이터를 읽어서 사용자가 보기 편한게 보여주는 대시보드를 만드는 역할을 수행하는 툴
전체 구조
1. 스프링 부트 엑츄에이터와 마이크로미터를 사용해서 메트릭 자동으로 생성 진행한다. ( 마이크로미터 프로메테우스 구현체 넣으면 프로메테우스가 읽을 수 있는 포멧으로 메트릭 생성함)
2. 프로메테우스는 앱에서 프로메테우스 구현체를 통하여 메트릭을 지속 수집 진행하고, 수집된 메트릭을 내부 DB에 저장한다.
3. 그라파나는 프로메테우스의 데이터를 통해 메트릭을 조회하고 대시보드로 그래프를 보여준다.
프로메테우스 - 애플리케이션 연동 위해 설정 필요 항목
2가지 설정 필요
- 애플리케이션 설정 : 애플리케이션에서 프로메테우스 포멧에 맞추어 메트릭 만들도록 설정 필요
- 메트릭들은 마이크로미터 표준 방식으로 측정되고 있기 때문에, 어떤 구현체를 사용할지 지정만 해주면 됨.
- build.gradle에 프로메테우스 구현 라이브러리 추가하면, 스프링부트 액츄에이터가 마이크로미터 프로메테우스 구현체 등록해서 동작하도록 자동으로 설정을 해준다.
- implementation 'org.springframework.boot:spring-boot-starter-actuator' //actuator 추가
- 액츄에이터에 프로메테우스 메트릭 수집 엔드포인트도 자동으로 추가해줌
- /actuator/prometheus
- 프로메테우스 설정 : 프로메테우스 yml 설정파일에서 '/actuator/prometheus' 호출해서 메트릭을 주기적으로 수집하도록 설정해야 함
프로메테우스 동작 확인 URL : http://localhost:9090
그라파나 연동
그라파나 서버 on 확인 URL : http://localhost:3000
add data source 하고, URL에 프로메테우스 URL만 입력하고 저장하면 연결됨 (save/test)
대시보드 임포트할 id 입력하고, 프로메테우스 데이터 소스 설정하고 import하면 공유 대시보드 만들어진다.
공유 대시보드 ID : 11378, 4701
댓글