[Grafana Loki] Thor(V2) 쿼리 엔진에 결과 캐시 미들웨어 추가
PR 링크: grafana/loki#20986 상태: Merged | 변경: +778 / -153
들어가며
Grafana Loki의 Thor(V2) 쿼리 엔진은 기존 chunks 엔진과 달리 결과 캐시가 없었습니다. 동일한 쿼리가 반복될 때마다 오브젝트 스토어에서 데이터를 다시 읽어야 했습니다. 이 PR은 기존 chunks 엔진의 캐시 미들웨어 인프라(ResultsCacheMiddleware, LogResultCache)를 재사용하면서, Thor 전용 캐시 키 생성기를 추가하여 결과 캐시를 구현합니다.
핵심 코드 분석
캐시 미들웨어 구성
func executorHandler(cfg Config, logger log.Logger, exec queryExecutor,
limits Limits, reg prometheus.Registerer) (http.Handler, error) {
var h queryrangebase.Handler = &queryHandler{ ... }
if cache.IsCacheConfigured(cfg.ResultsCache.CacheConfig) {
newCache := func(suffix string, cacheType stats.CacheType) (cache.Cache, error) {
cfgCopy := cfg.ResultsCache.CacheConfig
cfgCopy.Prefix += suffix
c, err := cache.New(cfgCopy, reg, logger, cacheType, constants.Loki)
if err != nil { return nil, err }
if strings.EqualFold(cfg.ResultsCache.Compression, "snappy") {
c = cache.NewSnappy(c, logger)
}
return c, nil
}
// 3개의 독립 캐시: 메트릭, 인스턴트 메트릭, 로그
metricCache, _ := newCache("metric.", stats.ResultCache)
instantMetricCache, _ := newCache("instant-metric.", stats.InstantMetricResultsCache)
logCache, _ := newCache("log.", stats.EngineLogResultCache)
cacheMw, _ := NewCacheMiddleware(logger, limits, metricCache, instantMetricCache, logCache, reg)
h = cacheMw.Wrap(h)
}
return queryrange.NewSerializeHTTPHandler(h, queryrange.DefaultCodec), nil
}
캐시 키 생성 전략
캐시 키는 시간 버킷 간격(EngineResultsCacheTimeBucketInterval, 기본 24시간)을 사용하여, 같은 버킷 내에서 시작하는 동일 쿼리는 같은 캐시 키를 공유합니다.
왜 이게 좋은가
- 기존 인프라 재사용: chunks 엔진의 검증된 캐시 미들웨어를 그대로 활용하여 코드 중복과 버그 위험을 최소화했다.
- 쿼리 유형별 독립 캐시: 메트릭, 인스턴트 메트릭, 로그 3가지 쿼리 유형이 각각 독립된 캐시 프리픽스를 사용하여 캐시 충돌을 방지한다.
- 설정 기반 활성화:
results_cache설정이 없으면 캐시를 사용하지 않아, 기존 배포에 영향을 주지 않는다. - snappy 압축 지원: 캐시 데이터에 snappy 압축을 적용하여 네트워크/메모리 사용량을 줄일 수 있다.
참고 자료
관련 포스트
PR Analysis 의 다른글
- 이전글 [Open WebUI] 채팅 메시지 마이그레이션을 스트리밍+배치 처리로 전환하여 메모리 폭발 방지
- 현재글 : [Grafana Loki] Thor(V2) 쿼리 엔진에 결과 캐시 미들웨어 추가
- 다음글 [PyTorch] Inductor mixed-order reduction 최적화
댓글