index

Distribution Summary

Distribution Summary는 여러 개의 이벤트에서 발생한 값들의 분포(distribution)를 측정하고 집계하는 데 사용되는 메트릭 타입이다

주로 작업의 크기, 금액, 바이트 수 등과 같이 단순한 횟수나 시간과는 다른 “양”을 기록할 때 유용하다

실시간 누적 측정

이벤트가 발생할 때마다 실시간으로 해당 이벤트의 “값”을 누적한다

e.g) http 요청의 응답 바이트 수, 거래 금액, 파일 전송 크기 등

카운트 및 총합

이벤트의 총 개수(count)와 모든 이벤트의 합계(total amount)를 집계한다

평균값과 분포 통계

count와 total amount값을 통해 평균값을 계산할 수 있으며 백분위(percentile)나 히스토그램같은 추가 통계를 구성할 수 있다

DistributionSummary.builder

DistributionSummary 인스턴스는 아래와 같이 빌더를 이용하여 생성할 수 있다

public class ResponseSizeTracker {

    private final DistributionSummary responseSizeSummary;

    public ResponseSizeTracker(MeterRegistry registry) {
        responseSizeSummary = DistributionSummary.builder("distribution.summary")
                .description("distribution of http response sizes")
                .baseUnit("bytes")
                .publishPercentiles(0.5, 0.95, 0.99)
                .register(registry);
    }

    public void recordResponseSize(long byteSize) {
        responseSizeSummary.record(byteSize);
    }
}

scaling and histograms

Distribution Summary는 측정한 값들의 분포를 기록하기 위해 여러 히스토그램 버킷을 사용한다

기본적으로 마이크로미터는 미리 선택된 백분위 히스토그램 버킷을 1부터 Long.MAX_VALUE 까지의 정수 값들로 구성한다

만약 측정 대상의 값 범위가 작다면 기본 버킷 범위는 너무 넓어서 의미 있는 분포를 얻기 어렵다

scale 메서드를 통해 미리 버킷의 범위를 조정하여 이러한 문제를 해결할 수 있다

public class ScalingBucketCardinality {

    private final DistributionSummary weightSummary;

    /*
        기본 버킷 범위: 1 ~ Long.MAX_VALUE 
        scale 메서드를 통해 기본 버킷 범위를 조정할 수 있다
        serviceLevelObjectives 메서드로 slo 경계를 설정하여 그 경계에 도달하면 비율을 모니터링할 수 있다
     */
    public ScalingBucketCardinality(MeterRegistry registry) {
        weightSummary = DistributionSummary.builder("distribution.summary.scale")
                .scale(100)
                .baseUnit("kg")
                .serviceLevelObjectives(70, 80, 90)
                .register(registry);
    }

    public void recordWeight(int weight) {
        weightSummary.record(weight);
    }

}