본문 바로가기

WEB개발/Spring

Actuator

Actuator

Spring Actuator는 Spring Boot 애플리케이션의 상태와 동작을 모니터링하거나 관리할 수 있는 다양한 기능을 제공하는 서브 프로젝트입니다. 이를 통해 애플리케이션의 상태를 점검하고, 메트릭(metrics), 애플리케이션 설정, 사용 중인 스레드 정보 등을 노출하거나 조작할 수 있습니다.

 

주요 기능

  1. 모니터링 및 진단
    • 애플리케이션의 상태(health)를 확인하고, 의존성, 데이터베이스, 메시징 시스템 등의 연결 상태를 검사합니다.
    • 메모리 사용량, 활성 스레드 수, CPU 사용량 등 다양한 메트릭을 제공합니다.
  2. 엔드포인트 노출
    • HTTP로 접근 가능한 RESTful 엔드포인트를 통해 애플리케이션의 상태 정보를 제공합니다.
    • 기본적으로 /actuator 경로를 통해 엔드포인트를 접근합니다.
    • 예: /actuator/health, /actuator/metrics
  3. 확장성
    • 커스텀 엔드포인트를 정의하거나, 기본 엔드포인트를 확장할 수 있습니다.
    • 추가적인 모니터링이나 제어 로직을 쉽게 통합할 수 있습니다.
  4. 서드파티 통합
    • Prometheus, Grafana, ELK(Stack), Zipkin, Micrometer 등과 같은 모니터링/분석 도구와 손쉽게 연동할 수 있습니다.

 

주요 Actuator 엔드포인트

 

그 외 endpoint

https://docs.spring.io/spring-boot/reference/actuator/endpoints.html

 

Endpoints :: Spring Boot

If you add a @Bean annotated with @Endpoint, any methods annotated with @ReadOperation, @WriteOperation, or @DeleteOperation are automatically exposed over JMX and, in a web application, over HTTP as well. Endpoints can be exposed over HTTP by using Jersey

docs.spring.io

 

 

 

build.gradle

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

	// Spring Boot Actuator (JMX 지원 포함)
    implementation 'org.springframework.boot:spring-boot-starter-actuator'

	// https://mvnrepository.com/artifact/org.jolokia/jolokia-core
	implementation group: 'org.jolokia', name: 'jolokia-core', version: '1.7.2'
	implementation group: 'org.jolokia', name: 'jolokia-support-spring', version: '2.1.2'

}

 

application.properties

spring.jmx.enabled=true
# Actuator의 Jolokia 엔드포인트 활성화
management.endpoints.web.exposure.include=health,info,jolokia
management.endpoint.health.show-details=always
management.endpoint.jolokia.enabled=true

 

JVMMonitoringService.java

import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.OperatingSystemMXBean;
import java.lang.management.ThreadMXBean;

import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.stereotype.Component;

@Component
@ManagedResource(objectName = "com.example.mxbean.jolokia:type=JVMMonitoringService", description = "Custom MBean for Monitoring")
public class JVMMonitoringService implements JVMMonitoringServiceMBean {

    private final OperatingSystemMXBean osMXBean;
    private final MemoryMXBean memoryMXBean;
    private final ThreadMXBean threadMXBean;

    public JVMMonitoringService() {
        this.osMXBean = ManagementFactory.getOperatingSystemMXBean();
        this.memoryMXBean = ManagementFactory.getMemoryMXBean();
        this.threadMXBean = ManagementFactory.getThreadMXBean();
    }

    // 속성으로 정의
    @ManagedAttribute(description = "System Load Average")
    @Override
    public double getSystemLoadAverage() {
        return osMXBean.getSystemLoadAverage();
    }

    // 속성으로 정의
    @ManagedAttribute(description = "Heap Memory Usage")
    @Override
    public long getHeapMemoryUsage() {
        return memoryMXBean.getHeapMemoryUsage().getUsed();
    }

    // 속성으로 정의
    @ManagedAttribute(description = "Thread Count")
    @Override
    public int getThreadCount() {
        return threadMXBean.getThreadCount();
    }
}

 

 

JVMMonitoringServiceMBean.java

public interface JVMMonitoringServiceMBean {
    double getSystemLoadAverage();
    long getHeapMemoryUsage();
    int getThreadCount();
}

 

 

GET request

http://localhost:8080/actuator/jolokia/read/cohttp://m.example.mxbean.jolokia:type=JVMMonitoringService/HeapMemoryUsage

 

response