[Grafana Loki] 오브젝트 스토어 클라이언트에 요청 레이턴시 히스토그램 메트릭 추가
PR 링크: grafana/loki#20948 상태: Merged | 변경: +22 / -2
들어가며
Grafana Loki의 오브젝트 스토어 클라이언트에는 기존 Thanos 클라이언트가 제공하는 메트릭이 있었지만, 이는 요청 전송부터 ReadCloser 소비 완료까지의 전체 e2e 시간을 측정합니다. 요청 헤징(request hedging) 기능을 도입하면서, 실제 HTTP 라운드트립 레이턴시만을 측정하는 별도 메트릭이 필요했습니다. 이 PR은 instrumentedRoundTripper에 Prometheus 네이티브 히스토그램 메트릭을 추가합니다.
핵심 코드 분석
Before: 요청 카운트만 기록
var bucketRequestsTotal = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "loki",
Name: "objstore_bucket_transport_requests_total",
},
[]string{"status_code", "method"},
)
func (i *instrumentedRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
resp, err := i.next.RoundTrip(req)
if err != nil { return resp, err }
bucketRequestsTotal.WithLabelValues(strconv.Itoa(resp.StatusCode), req.Method).Inc()
return resp, nil
}
After: 레이턴시 히스토그램 추가
var bucketRequestsDuration = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Namespace: constants.Loki,
Name: "objstore_bucket_transport_hedged_requests_duration_seconds",
Help: "Time spent doing requests after request hedging.",
NativeHistogramBucketFactor: 1.1,
NativeHistogramMaxBucketNumber: 100,
NativeHistogramMinResetDuration: 1 * time.Hour,
},
[]string{"status_code", "method"},
)
func (i *instrumentedRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
start := time.Now()
resp, err := i.next.RoundTrip(req)
if err != nil { return resp, err }
statusCode := strconv.Itoa(resp.StatusCode)
bucketRequestsTotal.WithLabelValues(statusCode, req.Method).Inc()
bucketRequestsDuration.WithLabelValues(statusCode, req.Method).Observe(
time.Since(start).Seconds(),
)
return resp, nil
}
왜 이게 좋은가
- 네이티브 히스토그램 사용: Prometheus 네이티브 히스토그램은 기존 고정 버킷 히스토그램 대비 카디널리티 비용이 낮고 정밀도가 높다.
- 헤징 효과 측정: 요청 헤징 후의 실제 라운드트립 시간을 측정하므로, 헤징 전략의 효과를 정량적으로 평가할 수 있다.
- 기존 메트릭과 분리: Thanos의 e2e 메트릭과 별개로 HTTP 트랜스포트 계층의 레이턴시만 측정하여 병목 지점을 정확히 파악할 수 있다.
참고 자료
관련 포스트
PR Analysis 의 다른글
- 이전글 [faster-qwen3-tts] nano-parakeet으로 참조 오디오 자동 전사 기능 추가
- 현재글 : [Grafana Loki] 오브젝트 스토어 클라이언트에 요청 레이턴시 히스토그램 메트릭 추가
- 다음글 [Triton] AsyncCompileMode 에러 발생 시 active_mode 초기화 보장
댓글