티스토리 뷰

개요

  • Spirng Boot 기반의 웹 애플리케이션을 구동하다 보면 JVM의 상태라던가, 사용 가능한 디스크 용량 등의 정보를 실시간으로 확인할 필요가 있다. Spring Boot에서는 이런 요구사항을 충족시킬 수 있는 Spirng Boot Actuator 모듈을 제공한다.

build.gralde 추가

dependencies {
    ...
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator'
}
  • 기존의 Spring Boot 프로젝트에 spring-boot-starter-actuator 아티팩트를 추가하면 별다른 추가 설정 없이 바로 Spirng Boot Actuator 기능이 활성화 된다.

애플리케이션 호출

  • Spirng Boot Actuator가 제공하는 각 EndPointHTTP, JMX 등 다양한 접근 방식을 지원한다. 아래는 애플리케이션의 내부 로직에서 각 Endpoint에 접근하는 방법을 간단히 설명한 예제이다.
@Service
public class HealthCheckScheduler {

    @Autowired
    private MetricsEndpoint metricsEndpoint;

    @Autowired
    private HealthEndpoint healthEndpoint;

    @Scheduled(initialDelay = 60000, fixedDelay = 60000)
    public void healthCheck() {

        MDC.clear();

        Map<String, Object> metrics = metricsEndpoint.invoke();
        Health health = healthEndpoint.invoke();

        float memJvmUsedMb = Float.valueOf((long) metrics.get("mem")) / 1024;
        float memJvmFreeMb = Float.valueOf((long) metrics.get("mem.free")) / 1024;
        float heapCommittedMb = Float.valueOf((long) metrics.get("heap.committed")) / 1024;
        float heapInitMb = Float.valueOf((long) metrics.get("heap.init")) / 1024;
        float heapUsedMb = Float.valueOf((long) metrics.get("heap.used")) / 1024;
        float heapMb = Float.valueOf((long) metrics.get("heap")) / 1024;
        float nonheapCommittedMb = Float.valueOf((long) metrics.get("nonheap.committed")) / 1024;
        float nonheapInitMb = Float.valueOf((long) metrics.get("nonheap.init")) / 1024;
        float nonheapUsedMb = Float.valueOf((long) metrics.get("nonheap.used")) / 1024;
        float nonheapMb = Float.valueOf((long) metrics.get("nonheap")) / 1024;

        MDC.put("mem_jvm_used_mb", String.valueOf(memJvmUsedMb));
        MDC.put("mem_jvm_free_mb", String.valueOf(memJvmFreeMb));
        MDC.put("processors", String.valueOf(metrics.get("processors")));
        MDC.put("systemload_average", String.valueOf(metrics.get("systemload.average")));
        MDC.put("heap_committed_mb", String.valueOf(heapCommittedMb));
        MDC.put("heap_init_mb", String.valueOf(heapInitMb));
        MDC.put("heap_used_mb", String.valueOf(heapUsedMb));
        MDC.put("heap_mb", String.valueOf(heapMb));
        MDC.put("nonheap_committed_mb", String.valueOf(nonheapCommittedMb));
        MDC.put("nonheap_init_mb", String.valueOf(nonheapInitMb));
        MDC.put("nonheap_used_mb", String.valueOf(nonheapUsedMb));
        MDC.put("nonheap_mb", String.valueOf(nonheapMb));
        MDC.put("threads_peak", String.valueOf(metrics.get("threads.peak")));
        MDC.put("threads_daemon", String.valueOf(metrics.get("threads.daemon")));
        MDC.put("threads_total_started", String.valueOf(metrics.get("threads.totalStarted")));
        MDC.put("threads", String.valueOf(metrics.get("threads")));
        MDC.put("classes", String.valueOf(metrics.get("classes")));
        MDC.put("classes_loaded", String.valueOf(metrics.get("classes.loaded")));
        MDC.put("classes_unloaded", String.valueOf(metrics.get("classes.unloaded")));

        float diskSpaceTotalGb = Float.valueOf((long) ((Health) health.getDetails().get("diskSpace")).getDetails().get("total")) / 1024 / 1024 / 1024;
        float diskSpaceFreeGb = Float.valueOf((long) ((Health) health.getDetails().get("diskSpace")).getDetails().get("free")) / 1024 / 1024 / 1024;

        MDC.put("disk_space_total_gb", String.valueOf(diskSpaceTotalGb));
        MDC.put("disk_space_free_gb", String.valueOf(diskSpaceFreeGb));

        log.info("API_SCHEDULE_FINISHED");
    }
}
  • Endpoint는 스프링 빈으로 제공되므로 @Authwired 어노테이션으로 손쉽게 접근할 수 있다. invoke() 메써드의 응답 데이터는 HTTP로 요청할 때의 응답 데이터와 일치한다. 적절히 가공하여 1분 단위 로깅 등에 활용할 수 있다.

참고 글

댓글
댓글쓰기 폼