14. Monitoring and metrics

버전 4.2부터 스프링 배치는 마이크로미터(Micrometer) 기반의 배치 모니터링 및 메트릭을 지원한다. 이 장에서는 기본적으로 제공되는 메트릭과 커스텀 메트릭을 제공하는 방법을 설명한다.

14.1. Built-in metrics

메트릭 수집에는 특정 구성이 필요하지 않다. 프레임워크에서 제공하는 모든 메트릭은 spring.batch 접두사 아래 마이크로미터의 전역 레지스트리에 등록된다. 다음 테이블에서 모든 메트릭을 자세히 설명한다.

메트릭명타입설명태그
spring.batch.jobTIMER잡 실행 기간name, status
spring.batch.job.activeLONG_TASK_TIMER현재 활성화된 잡name
spring.batch.stepTIMER스텝 실행 기간name, job.name, status
spring.batch.step.activeLONG_TASK_TIMER현재 활성화된 스텝name
spring.batch.item.readTIMER아이템 읽는 기간job.name, step.name, status
spring.batch.item.processTIMER아이템 처리 기간job.name, step.name, status
spring.batch.chunk.writeTIMER청크 작성 기간job.name, step.name, status

status 태그는 SUCCESS 또는 FAILURE일 수 있다.

14.2. Custom metrics

커스텀 컴포넌트에서 자체 메트릭을 사용하려면 마이크로미터 API를 직접 사용하는 것이 좋다. 다음은 태스크릿(Tasklet)의 시간을 측정하는 방법의 예제이다:

    import io.micrometer.core.instrument.Metrics;
    import io.micrometer.core.instrument.Timer;
    import org.springframework.batch.core.StepContribution;
    import org.springframework.batch.core.scope.context.ChunkContext;
    import org.springframework.batch.core.step.tasklet.Tasklet;
    import org.springframework.batch.repeat.RepeatStatus;
    
    public class MyTimedTasklet implements Tasklet {

        @Override
        public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) {
            Timer.Sample sample = Timer.start(Metrics.globalRegistry);
            String status = "success";
            try {
                // 어떤 작업
            } catch (Exception e) {
                // 예외 핸들
                status = "failure";
            } finally {
                sample.stop(
                        Timer.builder("my.tasklet.timer")
                            .description("Duration of MyTimedTasklet")
                            .tag("status", status)
                            .register(Metrics.globalRegistry)
                );
            }
            return RepeatStatus.FINISHED;
        }  
    }

14.3. Disabling Metrics

메트릭 수집은 로깅과 유사한 문제가 있다. 로그 비활성화는 일반적으로 로깅 라이브러리를 구성하여 수행되며, 이는 메트릭에도 다르지 않다. 스프링 배치에는 마이크로미터의 메트릭을 비활성화하는 기능이 없다. 그러므로 이는 마이크로미터 측에서 수행되어야 한다. 스프링 배치는 spring.batch 접두사를 사용하여 마이크로미터의 전역 레지스트리에 메트릭을 저장하므로 다음 스니펫을 사용하여 배치 메트릭을 무시하거나 거부하도록 마이크로미터를 구성할 수 있다:

 Metrics.globalRegistry.config().meterFilter(MeterFilter.denyNameStartsWith("spring.batch"))

자세한 내용은 마이크로미터의 문서를 참고하자.