본문으로 건너뛰기

[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,
        },
    },
},

왜 이게 좋은가

  1. 일관성: instant 쿼리와 동일한 캐시 제어 메커니즘을 query_range에도 적용하여 API 동작의 일관성을 확보한다.
  2. 디버깅 용이: 캐시된 결과가 아닌 최신 데이터로 쿼리 결과를 확인해야 할 때 유용하다.
  3. 운영 유연성: 특정 대시보드나 알림에서 캐시를 우회하여 정확한 실시간 데이터를 조회할 수 있다.
  4. 최소 변경: 기존 disableCacheReq 로직을 그대로 활용하여 5줄의 코드 추가만으로 기능을 구현했다.

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글