Spring Boot에서 metric을 적용하자!

Karim·2024년 1월 24일
2

SpringBoot

목록 보기
15/15


1.metric이란

  • 메트릭(metric)은 일반적으로 시스템 또는 서버의 성능 및 상태를 측정하고 수집하는 데 사용되는 데이터
  • 서버의 다양한 측면에 대한 정보를 제공하여 개발자나 시스템 관리자가 서버의 동작을 모니터링하고 최적화할 수 있게 도와준다.

💡 확인 정보

  • 요청 수 및 처리 시간 : 서버가 받은 총 요청 수 및 각 요청의 처리 시간을 측정할 수 있습니다. 이는 서버의 부하 및 응답 시간을 평가하는 데 도움이 됩니다.
  • 연결 및 스레드 풀 관련 메트릭 : 서버에 대한 동시 연결 수, 사용 중인 스레드 수, 스레드 풀 크기 등과 관련된 정보를 제공합니다.
  • 에러 및 상태 코드 : 서버에서 발생한 에러 수 및 다양한 HTTP 상태 코드에 대한 통계를 제공합니다.
  • 리소스 사용량 : CPU, 메모리, 디스크 공간 등과 같은 시스템 리소스의 사용량에 대한 메트릭도 포함될 수 있습니다.
  • 애플리케이션 특정 메트릭 : 애플리케이션의 특정 기능이나 커스텀 메트릭도 측정할 수 있습니다.

2. 시작 전 확인사항

💬 version

IntelliJ : 2022.1.3.Ultimate
spring boot : 3.2.2
java jdk : 17

💬 gradle 추가

	// spring boot 애플리케이션을 모니터링하고 관리하는 데 도움이 되는 운영 환경용 기능들
	implementation 'org.springframework.boot:spring-boot-starter-actuator'
    // 애플리케이션 메트릭을 수집하기 위한 간단하고 일관된 API를 제공하는 메트릭 퍼사드 라이브러리
	implementation 'micrometer.io:micrometer-registry-prometheus'

3. metric 환경 구성

✒️ application.yml

# Spring Boot 액추에이터의 웹 엔드포인트 중 어떤 것들을 노출할 것인지 지정
management:
  endpoints:
      web:
        exposure:
          include: '*'
  metrics:
#   Micrometer를 통해 수집된 Metric 데이터를 Prometheus 형식으로 노출할지 여부를 결정
    export:
      prometheus:
        enabled: true
#   HTTP 요청의 처리 시간을 자동으로 측정하여 Metric으로 수집하도록 지정
    web:
      server:
        auto-time-requests: true

4. Actuator metric endpoint

⌨️ /actuator request

http://127.0.0.1:8080/actuator

💻 /actuator response

{
    "_links": {
        "self": { # 현재 Actuator 엔드포인트에 대한 URL
            "href": "http://127.0.0.1:8080/actuator",
            "templated": false
        },
        "beans": { # 애플리케이션 컨텍스트에 등록된 빈(Bean)들의 목록을 조회할 수 있는 URL
            "href": "http://127.0.0.1:8080/actuator/beans",
            "templated": false
        },
        "caches-cache": { # 특정 캐시에 대한 정보를 조회할 수 있는 URL
            "href": "http://127.0.0.1:8080/actuator/caches/{cache}",
            "templated": true
        },
        "caches": { # 애플리케이션에서 사용 중인 캐시의 목록을 조회할 수 있는 URL
            "href": "http://127.0.0.1:8080/actuator/caches",
            "templated": false
        },
        "health-path": { # 특정 경로에 대한 헬스체크 정보를 제공하는 URL
            "href": "http://127.0.0.1:8080/actuator/health/{*path}",
            "templated": true
        },
        "health": { # 애플리케이션의 상태 및 헬스체크 정보를 제공하는 URL
            "href": "http://127.0.0.1:8080/actuator/health",
            "templated": false
        },
        "info": { # 애플리케이션의 추가 정보를 제공하는 URL
            "href": "http://127.0.0.1:8080/actuator/info",
            "templated": false
        },
        "conditions": { # 애플리케이션의 자동 구성 조건에 대한 정보를 제공하는 URL
            "href": "http://127.0.0.1:8080/actuator/conditions",
            "templated": false
        },
        "configprops": { // 플리케이션의 구성 프로퍼티(Config Props)에 대한 정보를 제공하는 URL
            "href": "http://127.0.0.1:8080/actuator/configprops",
            "templated": false
        },
        "configprops-prefix": {
            "href": "http://127.0.0.1:8080/actuator/configprops/{prefix}",
            "templated": true
        },
        "env": { # 애플리케이션의 환경 설정에 대한 정보를 제공하는 URL
            "href": "http://127.0.0.1:8080/actuator/env",
            "templated": false
        },
        "env-toMatch": {
            "href": "http://127.0.0.1:8080/actuator/env/{toMatch}",
            "templated": true
        },
        "loggers": { # 로깅 설정에 대한 정보를 조회하고 변경할 수 있는 UR
            "href": "http://127.0.0.1:8080/actuator/loggers",
            "templated": false
        },
        "loggers-name": {
            "href": "http://127.0.0.1:8080/actuator/loggers/{name}",
            "templated": true
        },
        "heapdump": { # JVM의 힙 덤프를 생성하는 URL
            "href": "http://127.0.0.1:8080/actuator/heapdump",
            "templated": false
        },
        "threaddump": { # 애플리케이션의 스레드 덤프를 생성하는 URL
            "href": "http://127.0.0.1:8080/actuator/threaddump",
            "templated": false
        },
        "metrics": { # 애플리케이션의 Metric 정보를 제공하는 URL
            "href": "http://127.0.0.1:8080/actuator/metrics",
            "templated": false
        },
        "metrics-requiredMetricName": {
            "href": "http://127.0.0.1:8080/actuator/metrics/{requiredMetricName}",
            "templated": true
        },
        "scheduledtasks": { # 스케줄된 작업에 대한 정보를 조회할 수 있는 URL
            "href": "http://127.0.0.1:8080/actuator/scheduledtasks",
            "templated": false
        },
        "mappings": { 애플리케이션의 URL 매핑 정보를 조회할 수 있는 URL
            "href": "http://127.0.0.1:8080/actuator/mappings",
            "templated": false
        }
    }
}

⌨️ /actuator/metrics request

http://127.0.0.1:8080/actuator/metrics

💻 /actuator/metrics response

{
    "names": [
    	# 애플리케이션이 실행되고 Ready 상태가 되기까지 걸린 시간
        "application.ready.time",
        # 애플리케이션이 시작되기 시작한 시간
        "application.started.time",
        # 디스크의 여유 공간
        "disk.free",
        # 디스크의 총 용량
        "disk.total",
        # 현재 활성화된 executor 작업의 수
        "executor.active",
        # 완료된 executor 작업의 수
        "executor.completed",
        # executor 풀의 핵심 크기
        "executor.pool.core",
        # executor 풀의 최대 크기
        "executor.pool.max",
        # executor 풀의 현재 크기
        "executor.pool.size",
        # executor 풀의 큐에 대기 중인 작업의 수
        "executor.queue.remaining",
        # 현재 executor 풀에 대기 중인 작업의 수
        "executor.queued",
        # 총 HTTP 서버 요청의 수
        "http.server.requests",
        # 현재 처리 중인 HTTP 서버 요청의 수
        "http.server.requests.active",
        # JVM 버퍼의 개수.
        "jvm.buffer.count",
        # 사용 중인 JVM 버퍼 메모리 양.
        "jvm.buffer.memory.used",
        # JVM 버퍼의 총 용량.
        "jvm.buffer.total.capacity",
        # 로드된 JVM 클래스의 수
        "jvm.classes.loaded",
        # 언로드된 JVM 클래스의 수
        "jvm.classes.unloaded",
        # JVM에서의 클래스 컴파일 시간
        "jvm.compilation.time",
        # GC(Garbage Collection) 중에 살아있는 객체의 크기
        "jvm.gc.live.data.size",
        # GC 중에 수집될 수 있는 최대 데이터 크기
        "jvm.gc.max.data.size",
        # GC로 할당된 메모리 양
        "jvm.gc.memory.allocated",
        # GC로 프로모션된 메모리 양
        "jvm.gc.memory.promoted",
        # GC 오버헤드.
        "jvm.gc.overhead",
        # GC 일시 정지 시간.
        "jvm.gc.pause",
        # JVM에 대한 일반적인 정보를 포함하는 문자열
        "jvm.info",
        # JVM이 할당한 메모리 중에 현재 커밋된(확보된) 메모리 양
        "jvm.memory.committed",
        # JVM이 최대로 사용할 수 있는 메모리 양
        "jvm.memory.max",
        # 가비지 컬렉션 후의 JVM 메모리 사용률
        "jvm.memory.usage.after.gc",
        # JVM이 현재 사용 중인 메모리 양
        "jvm.memory.used",
        # 현재 실행 중인 데몬(백그라운드) 스레드의 수
        "jvm.threads.daemon",
        # 현재 활성화된 스레드의 수
        "jvm.threads.live",
        # 애플리케이션이 실행되는 동안 최대로 활성화된 스레드의 수
        "jvm.threads.peak",
        # 애플리케이션이 실행되면서 시작된 총 스레드의 수
        "jvm.threads.started",
        # 현재 스레드의 상태를 나타내는 메트릭
        "jvm.threads.states",
        # Logback 로깅 이벤트의 총 수
        #애플리케이션에서 로깅이 발생할 때마다 이 값이 증가
        "logback.events",
        # 현재 프로세스의 CPU 사용률
        "process.cpu.usage",
        # 프로세스가 시작된 시간
        "process.start.time",
        # 프로세스가 실행된 시간
        "process.uptime",
        # 시스템에서 사용 가능한 CPU 코어의 수
        "system.cpu.count",
        # 시스템 전체 CPU 사용률
        "system.cpu.usage",
        # 현재 활성화된 Tomcat 세션의 수
        "tomcat.sessions.active.current",
        # Tomcat 세션의 최대 활성화 수
        "tomcat.sessions.active.max",
        # 유효한 최대 Tomcat 세션 수
        "tomcat.sessions.alive.max",
        # 애플리케이션에서 생성된 총 Tomcat 세션 수
        "tomcat.sessions.created",
        # 만료된 Tomcat 세션의 총 수
        "tomcat.sessions.expired",
        # 거부된 Tomcat 세션의 총 수
        "tomcat.sessions.rejected"
    ]
}

📌 여담

  • custom metric

📚 참고

profile
나도 보기 위해 정리해 놓은 벨로그

0개의 댓글