MCPcopy Create free account
hub / github.com/cortexproject/cortex / Do

Method Do

pkg/querier/tripperware/queryrange/results_cache.go:224–291  ·  view source on GitHub ↗
(ctx context.Context, r tripperware.Request)

Source from the content-addressed store, hash-verified

222}
223
224func (s resultsCache) Do(ctx context.Context, r tripperware.Request) (tripperware.Response, error) {
225 tenantIDs, err := users.TenantIDs(ctx)
226 respWithStats := r.GetStats() != "" && s.cacheQueryableSamplesStats
227 if err != nil {
228 return nil, httpgrpc.Errorf(http.StatusBadRequest, "%s", err.Error())
229 }
230
231 // If cache_queryable_samples_stats is enabled we always need request the status upstream
232 if s.cacheQueryableSamplesStats {
233 r = r.WithStats("all")
234 } else {
235 r = r.WithStats("")
236 }
237
238 if s.shouldCache != nil && !s.shouldCache(r) {
239 level.Debug(util_log.WithContext(ctx, s.logger)).Log("msg", "should not cache", "start", r.GetStart(), "spanID", jaegerSpanID(ctx))
240 return s.next.Do(ctx, r)
241 }
242
243 key := s.splitter.GenerateCacheKey(ctx, users.JoinTenantIDs(tenantIDs), r)
244
245 var (
246 extents []tripperware.Extent
247 response tripperware.Response
248 )
249
250 maxCacheFreshness := validation.MaxDurationPerTenant(tenantIDs, s.limits.MaxCacheFreshness)
251 maxCacheTime := int64(model.Now().Add(-maxCacheFreshness))
252 if r.GetStart() > maxCacheTime {
253 level.Debug(util_log.WithContext(ctx, s.logger)).Log("msg", "cache miss", "start", r.GetStart(), "spanID", jaegerSpanID(ctx))
254 return s.next.Do(ctx, r)
255 }
256
257 cached, ok := s.get(ctx, key)
258 if ok {
259 response, extents, err = s.handleHit(ctx, r, cached, maxCacheTime)
260 } else {
261 response, extents, err = s.handleMiss(ctx, r, maxCacheTime)
262 }
263
264 if err == nil && len(extents) > 0 {
265 extents, err := s.filterRecentExtents(r, maxCacheFreshness, extents)
266 if err != nil {
267 return nil, err
268 }
269 // Make sure we only cache old response format for backward compatibility.
270 // TODO: expose a flag to switch to write new format.
271 for i, ext := range extents {
272 resp, err := extentToResponse(ext)
273 if err != nil {
274 return nil, err
275 }
276 // Convert response in extent to old format.
277 resp = convertFromTripperwarePrometheusResponse(resp)
278 any, err := types.MarshalAny(resp)
279 if err != nil {
280 return nil, err
281 }

Callers

nothing calls this directly

Calls 15

getMethod · 0.95
handleHitMethod · 0.95
handleMissMethod · 0.95
filterRecentExtentsMethod · 0.95
putMethod · 0.95
TenantIDsFunction · 0.92
JoinTenantIDsFunction · 0.92
MaxDurationPerTenantFunction · 0.92
jaegerSpanIDFunction · 0.85
extentToResponseFunction · 0.85
GetStatsMethod · 0.65

Tested by

no test coverage detected