[Loki] query_range 요청에 캐시 비활성화 헤더 지원 추가
PR 링크: grafana/loki#21112 상태: Merged | 변경: +34 / -0
들어가며
Loki는 instant 쿼리에 대해 Cache-Control: no-cache 헤더를 통한 캐시 비활성화를 이미 지원하고 있었다. 하지만 query_range 엔드포인트에서는 이 헤더가 무시되어, 디버깅이나 특정 상황에서 캐시를 우회할 방법이 없었다. 이 PR은 query_range에도 동일한 캐시 제어 기능을 추가한다.
핵심 코드 분석
DecodeRequest에서 CachingOptions 설정
case QueryRangeOp:
req, err := parseRangeQuery(r)
if err != nil {
return nil, httpgrpc.Errorf(http.StatusBadRequest, "%s", err.Error())
}
req.CachingOptions = queryrangebase.CachingOptions{
Disabled: disableCacheReq,
}
return req, nil
disableCacheReq는 HTTP 요청의 Cache-Control 헤더에 no-cache가 포함되어 있는지 확인한 결과값이다.
테스트 추가
{
"query_range",
func() (*http.Request, error) {
req, err := http.NewRequest(
http.MethodGet,
fmt.Sprintf(`/query_range?start=%d&end=%d&query={foo="bar"}&step=10`, ...),
nil,
)
if err == nil {
req.Header.Set(cacheControlHeader, noCacheVal)
}
return req, err
},
&LokiRequest{
// ...
CachingOptions: queryrangebase.CachingOptions{
Disabled: true,
},
},
},
왜 이게 좋은가
- 일관성: instant 쿼리와 동일한 캐시 제어 메커니즘을
query_range에도 적용하여 API 동작의 일관성을 확보한다. - 디버깅 용이: 캐시된 결과가 아닌 최신 데이터로 쿼리 결과를 확인해야 할 때 유용하다.
- 운영 유연성: 특정 대시보드나 알림에서 캐시를 우회하여 정확한 실시간 데이터를 조회할 수 있다.
- 최소 변경: 기존
disableCacheReq로직을 그대로 활용하여 5줄의 코드 추가만으로 기능을 구현했다.
참고 자료
관련 포스트
PR Analysis 의 다른글
- 이전글 [PyTorch] Inductor mixed-order reduction 최적화
- 현재글 : [Loki] query_range 요청에 캐시 비활성화 헤더 지원 추가
- 다음글 [triton] AMD GFX9 AsyncCopy를 위한 Padded Layout 선택 확장
댓글