be_better

[Springboot] 액추에이터 활용하기 - 커스텀 본문

Springboot/이론

[Springboot] 액추에이터 활용하기 - 커스텀

NiceTry 2023. 11. 29. 16:03

목차

    액추에이터에 커스텀 기능 만들기

    액추에이터는 다양한 정보를 가공해서 제공하는데 그 밖에 개발자의 요구사항에 맞춘 커스텀 기능 설정도 제공한다.

     

    커스텀 기능을 개발하는 방식에는 크게 기존 기능에 내용을 추가하는 방식, 새로운 엔드포인트를 개발하는 방식 두가지가 있다.

     

    정보 제공 인터페이스의 구현체 생성

    액추에이터를 커스터마이징하는 가장 간단한 방법은 application.yml 파일 내에 내용을 추가하는 것이다. 이 방법은 많은 내용을 담을 때는 관리 측면에서 좋지 않기 때문에 커스텀 기능을 설정할 때는 별도의 구현체 클래스를 작성해서 내용을 추가하는 방법이 많이 활용된다. 액추에이터에서는 InfoContributor 인터페이스를 제공하고 있는데, 이 인터페이스를 구현하는 클래스를 생성하면 된다.

     

    InfoContributor 인터페이스의 구현체 클래스
    @Component
    public class CustomInfoContributor implements InfoContributor {
        
        @Override
        public void contribute(Info.Builder builder) {
            Map<String, Object> content = new HashMap<>();
            content.put("code-info", "InfoContributor 구현체에서 정의한 정보입니다.");
            builder.withDetail("custom-info-contributor", content);
        }
        
    }

    Builder 객체는 액추에이터 패키지의 Info 클래스 안에 정의되어 있는 클래스로서 Info 엔드포인트에서 보여줄 내용을 담는 역할을 수행한다. Map에 콘텐츠를 담아 builder에 포함하면 엔드포인트 출력 결과에서 확인할 수 있다.

     

    /info 엔드포인트 출력 결과

     

    커스텀 엔드포인트 생성

    @Endpoint 어노테이션으로 빈에 추가된 객체들은 @ReadOperation, @WriteOperation, @DeleteOperation 어노테이션을 사용해 JMX나 HTTP를 통해 커스텀 엔드포인트를 노출시킬 수 있다. 만약 JMX에서만 사용하거나 HTTP에서만 사용하는 것으로 제한하고 싶다면 @JmxEndpoint, @WebEndpoint 어노테이션을 사용하면 된다.

     

    엔드포인트 클래스
    import org.springframework.boot.actuate.endpoint.annotation.DeleteOperation;
    import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
    import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
    import org.springframework.boot.actuate.endpoint.annotation.WriteOperation;
    import org.springframework.stereotype.Component;
    
    import java.util.HashMap;
    import java.util.Map;
    
    @Component
    @Endpoint(id = "note")
    public class NoteEndpoint {
    
        private Map<String, Object> noteContent = new HashMap<>();
    
        @ReadOperation
        public Map<String, Object> getNote() {
            return noteContent;
        }
    
        @WriteOperation
        public Map<String, Object> writeNote(String key, Object value) {
            noteContent.put(key, value);
            return noteContent;
        }
    
        @DeleteOperation
        public Map<String, Object> deleteNote(String key) {
            noteContent.remove(key);
            return noteContent;
        }
    }

    http://localhost:8080/actuator/note 에 접속해보면 아직 값을 넣은 것은 아니기 때문에 비어있는 형태의 JSON 값을 확인할 수 있다.

     

    @Endpoint의 속성값으로 'id'가 없다면 import를 확인하기 바란다.

     

    @WriteOperation 동작 확인 postman test

    정상적인 동작을 확인했다면 다시 http://localhost:8080/actuator/note 에 접속한다.

     

    @DeleteOperation 동작 확인 postman test

    정상적인 동작이 확인되고 다시 접속한다면 비어있는 결과를 확인할수있다.