(ctx context.Context, r tripperware.Request)
| 222 | } |
| 223 | |
| 224 | func (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 | } |
nothing calls this directly
no test coverage detected