results cache: add new stat `query_length_served` to measure cache effectiveness (#11589)

**What this PR does / why we need it**:
cache hit rate that is currently being measured using metrics and stats
does not account for the fact that a cache hit could return partial
results. When we query the cache for a key, we get back a list of
extents and these need no cover the entire (split) range of the cache
key.

This pr adds a new cache stat called `query_length_served` to better
measure the cache effectiveness.
```
query_length - sum(length of downstream queries)
```

**Which issue(s) this PR fixes**:
Fixes #<issue number>

**Special notes for your reviewer**:

**Checklist**
- [ ] Reviewed the
[`CONTRIBUTING.md`](https://github.com/grafana/loki/blob/main/CONTRIBUTING.md)
guide (**required**)
- [x] Documentation added
- [x] Tests updated
- [x] `CHANGELOG.md` updated
- [ ] If the change is worth mentioning in the release notes, add
`add-to-release-notes` label
- [ ] Changes that require user attention or interaction to upgrade are
documented in `docs/sources/setup/upgrade/_index.md`
- [ ] For Helm chart changes bump the Helm chart version in
`production/helm/loki/Chart.yaml` and update
`production/helm/loki/CHANGELOG.md` and
`production/helm/loki/README.md`. [Example
PR](d10549e3ec)
- [ ] If the change is deprecating or removing a configuration option,
update the `deprecated-config.yaml` and `deleted-config.yaml` files
respectively in the `tools/deprecated-config-checker` directory.
[Example
PR](0d4416a4b0)
pull/11574/head
Ashwanth 1 year ago committed by GitHub
parent f04d0db434
commit 852becf227
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      CHANGELOG.md
  2. 4
      pkg/logql/metrics.go
  3. 22
      pkg/logql/metrics_test.go
  4. 15
      pkg/logqlmodel/stats/context.go
  5. 10
      pkg/logqlmodel/stats/context_test.go
  6. 209
      pkg/logqlmodel/stats/stats.pb.go
  7. 1
      pkg/logqlmodel/stats/stats.proto
  8. 21
      pkg/querier/queryrange/codec_test.go
  9. 21
      pkg/querier/queryrange/prometheus_test.go
  10. 7
      pkg/storage/chunk/cache/resultscache/cache.go
  11. 74
      pkg/storage/chunk/cache/resultscache/cache_test.go
  12. 21
      pkg/util/marshal/legacy/marshal_test.go
  13. 21
      pkg/util/marshal/marshal_test.go

@ -45,6 +45,7 @@
* [11284](https://github.com/grafana/loki/pull/11284) **ashwanthgoli** Config: Adds `frontend.max-query-capacity` to tune per-tenant query capacity.
* [11539](https://github.com/grafana/loki/pull/11539) **kaviraj,ashwanthgoli** Support caching /series and /labels query results
* [11545](https://github.com/grafana/loki/pull/11545) **dannykopping** Force correct memcached timeout when fetching chunks.
* [11589](https://github.com/grafana/loki/pull/11589) **ashwanthgoli** Results Cache: Adds `query_length_served` cache stat to measure the length of the query served from cache.
##### Fixes
* [11074](https://github.com/grafana/loki/pull/11074) **hainenber** Fix panic in lambda-promtail due to mishandling of empty DROP_LABELS env var.

@ -163,6 +163,7 @@ func RecordRangeAndInstantQueryMetrics(
"cache_result_req", stats.Caches.Result.EntriesRequested,
"cache_result_hit", stats.Caches.Result.EntriesFound,
"cache_result_download_time", stats.Caches.Result.CacheDownloadTime(),
"cache_result_query_length_served", stats.Caches.Result.CacheQueryLengthServed(),
}...)
logValues = append(logValues, tagsToKeyValues(queryTags)...)
@ -228,6 +229,7 @@ func RecordLabelQueryMetrics(
"cache_label_results_hit", stats.Caches.LabelResult.EntriesFound,
"cache_label_results_stored", stats.Caches.LabelResult.EntriesStored,
"cache_label_results_download_time", stats.Caches.LabelResult.CacheDownloadTime(),
"cache_label_results_query_length_served", stats.Caches.LabelResult.CacheQueryLengthServed(),
)
execLatency.WithLabelValues(status, queryType, "").Observe(stats.Summary.ExecTime)
@ -341,6 +343,7 @@ func RecordSeriesQueryMetrics(ctx context.Context, log log.Logger, start, end ti
"cache_series_results_hit", stats.Caches.SeriesResult.EntriesFound,
"cache_series_results_stored", stats.Caches.SeriesResult.EntriesStored,
"cache_series_results_download_time", stats.Caches.SeriesResult.CacheDownloadTime(),
"cache_series_results_query_length_served", stats.Caches.SeriesResult.CacheQueryLengthServed(),
)
if shard != nil {
@ -428,6 +431,7 @@ func RecordVolumeQueryMetrics(ctx context.Context, log log.Logger, start, end ti
"cache_volume_results_hit", stats.Caches.VolumeResult.EntriesFound,
"cache_volume_results_stored", stats.Caches.VolumeResult.EntriesStored,
"cache_volume_results_download_time", stats.Caches.VolumeResult.CacheDownloadTime(),
"cache_volume_results_query_length_served", stats.Caches.VolumeResult.CacheQueryLengthServed(),
)
execLatency.WithLabelValues(status, queryType, "").Observe(stats.Summary.ExecTime)

@ -108,16 +108,17 @@ func TestLogLabelsQuery(t *testing.T) {
},
Caches: stats.Caches{
LabelResult: stats.Cache{
EntriesRequested: 2,
EntriesFound: 1,
EntriesStored: 1,
DownloadTime: 80,
EntriesRequested: 2,
EntriesFound: 1,
EntriesStored: 1,
DownloadTime: 80,
QueryLengthServed: 10,
},
},
})
require.Regexp(t,
fmt.Sprintf(
"level=info org_id=foo traceID=%s sampled=true latency=slow query_type=labels splits=0 start=.* end=.* start_delta=1h0m0.* end_delta=.* length=1h0m0s duration=25.25s status=200 label=foo query= query_hash=2166136261 total_entries=12 cache_label_results_req=2 cache_label_results_hit=1 cache_label_results_stored=1 cache_label_results_download_time=80ns\n",
"level=info org_id=foo traceID=%s sampled=true latency=slow query_type=labels splits=0 start=.* end=.* start_delta=1h0m0.* end_delta=.* length=1h0m0s duration=25.25s status=200 label=foo query= query_hash=2166136261 total_entries=12 cache_label_results_req=2 cache_label_results_hit=1 cache_label_results_stored=1 cache_label_results_download_time=80ns cache_label_results_query_length_served=10ns\n",
sp.Context().(jaeger.SpanContext).SpanID().String(),
),
buf.String())
@ -142,16 +143,17 @@ func TestLogSeriesQuery(t *testing.T) {
},
Caches: stats.Caches{
SeriesResult: stats.Cache{
EntriesRequested: 2,
EntriesFound: 1,
EntriesStored: 1,
DownloadTime: 80,
EntriesRequested: 2,
EntriesFound: 1,
EntriesStored: 1,
DownloadTime: 80,
QueryLengthServed: 10,
},
},
})
require.Regexp(t,
fmt.Sprintf(
"level=info org_id=foo traceID=%s sampled=true latency=slow query_type=series splits=0 start=.* end=.* start_delta=1h0m0.* end_delta=.* length=1h0m0s duration=25.25s status=200 match=\"{container_name=.*\"}:{app=.*}\" query_hash=23523089 total_entries=10 cache_series_results_req=2 cache_series_results_hit=1 cache_series_results_stored=1 cache_series_results_download_time=80ns\n",
"level=info org_id=foo traceID=%s sampled=true latency=slow query_type=series splits=0 start=.* end=.* start_delta=1h0m0.* end_delta=.* length=1h0m0s duration=25.25s status=200 match=\"{container_name=.*\"}:{app=.*}\" query_hash=23523089 total_entries=10 cache_series_results_req=2 cache_series_results_hit=1 cache_series_results_stored=1 cache_series_results_download_time=80ns cache_series_results_query_length_served=10ns\n",
sp.Context().(jaeger.SpanContext).SpanID().String(),
),
buf.String())

@ -231,12 +231,17 @@ func (c *Cache) Merge(m Cache) {
c.BytesSent += m.BytesSent
c.BytesReceived += m.BytesReceived
c.DownloadTime += m.DownloadTime
c.QueryLengthServed += m.QueryLengthServed
}
func (c *Cache) CacheDownloadTime() time.Duration {
return time.Duration(c.DownloadTime)
}
func (c *Cache) CacheQueryLengthServed() time.Duration {
return time.Duration(c.QueryLengthServed)
}
func (r *Result) MergeSplit(m Result) {
m.Summary.Splits = 1
r.Merge(m)
@ -429,6 +434,16 @@ func (c *Context) AddCacheRequest(t CacheType, i int) {
atomic.AddInt32(&stats.Requests, int32(i))
}
// AddCacheQueryLengthServed measures the length of the query served from cache
func (c *Context) AddCacheQueryLengthServed(t CacheType, i time.Duration) {
stats := c.getCacheStatsByType(t)
if stats == nil {
return
}
atomic.AddInt64(&stats.QueryLengthServed, int64(i))
}
func (c *Context) AddSplitQueries(num int64) {
atomic.AddInt64(&c.result.Summary.Splits, num)
}

@ -210,7 +210,8 @@ func TestResult_Merge(t *testing.T) {
EntriesFound: 2,
},
Result: Cache{
EntriesStored: 3,
EntriesStored: 3,
QueryLengthServed: int64(3 * time.Hour),
},
},
Summary: Summary{
@ -272,7 +273,8 @@ func TestResult_Merge(t *testing.T) {
EntriesFound: 2 * 2,
},
Result: Cache{
EntriesStored: 2 * 3,
EntriesStored: 2 * 3,
QueryLengthServed: int64(2 * 3 * time.Hour),
},
},
Summary: Summary{
@ -325,6 +327,7 @@ func TestCaches(t *testing.T) {
statsCtx.AddCacheRequest(ChunkCache, 5)
statsCtx.AddCacheEntriesStored(ResultCache, 3)
statsCtx.AddCacheQueryLengthServed(ResultCache, 3*time.Hour)
statsCtx.AddCacheEntriesRequested(IndexCache, 22)
statsCtx.AddCacheBytesRetrieved(ChunkCache, 1024)
statsCtx.AddCacheBytesSent(ChunkCache, 512)
@ -341,7 +344,8 @@ func TestCaches(t *testing.T) {
EntriesFound: 2,
},
Result: Cache{
EntriesStored: 3,
EntriesStored: 3,
QueryLengthServed: int64(time.Hour * 3),
},
}, statsCtx.Caches())
}

@ -661,13 +661,14 @@ func (m *Chunk) GetDecompressedStructuredMetadataBytes() int64 {
}
type Cache struct {
EntriesFound int32 `protobuf:"varint,1,opt,name=entriesFound,proto3" json:"entriesFound"`
EntriesRequested int32 `protobuf:"varint,2,opt,name=entriesRequested,proto3" json:"entriesRequested"`
EntriesStored int32 `protobuf:"varint,3,opt,name=entriesStored,proto3" json:"entriesStored"`
BytesReceived int64 `protobuf:"varint,4,opt,name=bytesReceived,proto3" json:"bytesReceived"`
BytesSent int64 `protobuf:"varint,5,opt,name=bytesSent,proto3" json:"bytesSent"`
Requests int32 `protobuf:"varint,6,opt,name=requests,proto3" json:"requests"`
DownloadTime int64 `protobuf:"varint,7,opt,name=downloadTime,proto3" json:"downloadTime"`
EntriesFound int32 `protobuf:"varint,1,opt,name=entriesFound,proto3" json:"entriesFound"`
EntriesRequested int32 `protobuf:"varint,2,opt,name=entriesRequested,proto3" json:"entriesRequested"`
EntriesStored int32 `protobuf:"varint,3,opt,name=entriesStored,proto3" json:"entriesStored"`
BytesReceived int64 `protobuf:"varint,4,opt,name=bytesReceived,proto3" json:"bytesReceived"`
BytesSent int64 `protobuf:"varint,5,opt,name=bytesSent,proto3" json:"bytesSent"`
Requests int32 `protobuf:"varint,6,opt,name=requests,proto3" json:"requests"`
DownloadTime int64 `protobuf:"varint,7,opt,name=downloadTime,proto3" json:"downloadTime"`
QueryLengthServed int64 `protobuf:"varint,8,opt,name=queryLengthServed,proto3" json:"queryLengthServed"`
}
func (m *Cache) Reset() { *m = Cache{} }
@ -751,6 +752,13 @@ func (m *Cache) GetDownloadTime() int64 {
return 0
}
func (m *Cache) GetQueryLengthServed() int64 {
if m != nil {
return m.QueryLengthServed
}
return 0
}
func init() {
proto.RegisterType((*Result)(nil), "stats.Result")
proto.RegisterType((*Caches)(nil), "stats.Caches")
@ -765,82 +773,83 @@ func init() {
func init() { proto.RegisterFile("pkg/logqlmodel/stats/stats.proto", fileDescriptor_6cdfe5d2aea33ebb) }
var fileDescriptor_6cdfe5d2aea33ebb = []byte{
// 1193 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0xcf, 0x6f, 0xdc, 0xc4,
0x17, 0x5f, 0x67, 0xbf, 0xde, 0x4d, 0xa7, 0xf9, 0xd5, 0x49, 0xfa, 0xed, 0x16, 0x24, 0x3b, 0x2c,
0x54, 0x04, 0x81, 0xb2, 0xe2, 0x87, 0x84, 0x40, 0x54, 0x42, 0x4e, 0x89, 0x14, 0xa9, 0x15, 0xe1,
0x05, 0x2e, 0xdc, 0xbc, 0xf6, 0x64, 0xd7, 0x8a, 0xd7, 0xde, 0xf8, 0x47, 0x69, 0x4e, 0xf0, 0x27,
0xf0, 0x67, 0x70, 0xe1, 0xc4, 0x09, 0x09, 0x71, 0xee, 0x31, 0xc7, 0x9e, 0x2c, 0xb2, 0xb9, 0x20,
0x9f, 0x2a, 0x71, 0x47, 0x68, 0xde, 0xcc, 0xda, 0x1e, 0xaf, 0xb7, 0xcd, 0x65, 0x3d, 0xef, 0xf3,
0x3e, 0x9f, 0x37, 0x3f, 0xdf, 0x9b, 0x59, 0xb2, 0x3b, 0x3d, 0x1b, 0x0d, 0xfc, 0x70, 0x74, 0xee,
0x4f, 0x42, 0x97, 0xf9, 0x83, 0x38, 0xb1, 0x93, 0x58, 0xfc, 0xee, 0x4f, 0xa3, 0x30, 0x09, 0xa9,
0x8e, 0xc6, 0x1b, 0x3b, 0xa3, 0x70, 0x14, 0x22, 0x32, 0xe0, 0x2d, 0xe1, 0xec, 0xff, 0xa3, 0x91,
0x0e, 0xb0, 0x38, 0xf5, 0x13, 0xfa, 0x19, 0xe9, 0xc6, 0xe9, 0x64, 0x62, 0x47, 0x17, 0x3d, 0x6d,
0x57, 0xdb, 0xbb, 0xfd, 0xd1, 0xc6, 0xbe, 0x08, 0x73, 0x22, 0x50, 0x6b, 0xf3, 0x79, 0x66, 0xb6,
0xf2, 0xcc, 0x9c, 0xd3, 0x60, 0xde, 0xe0, 0xd2, 0xf3, 0x94, 0x45, 0x1e, 0x8b, 0x7a, 0x2b, 0x8a,
0xf4, 0x1b, 0x81, 0x96, 0x52, 0x49, 0x83, 0x79, 0x83, 0x3e, 0x24, 0xab, 0x5e, 0x30, 0x62, 0x71,
0xc2, 0xa2, 0x5e, 0x1b, 0xb5, 0x9b, 0x52, 0x7b, 0x24, 0x61, 0x6b, 0x4b, 0x8a, 0x0b, 0x22, 0x14,
0x2d, 0xfa, 0x09, 0xe9, 0x38, 0xb6, 0x33, 0x66, 0x71, 0xef, 0x7f, 0x28, 0x5e, 0x97, 0xe2, 0x03,
0x04, 0xad, 0x75, 0x29, 0xd5, 0x91, 0x04, 0x92, 0xdb, 0xff, 0xb3, 0x4d, 0x3a, 0x82, 0x41, 0x3f,
0x24, 0xba, 0x33, 0x4e, 0x83, 0x33, 0x39, 0xe7, 0xb5, 0xaa, 0xbe, 0x22, 0xe7, 0x14, 0x10, 0x1f,
0x2e, 0xf1, 0x02, 0x97, 0x3d, 0x93, 0x73, 0x5d, 0x22, 0x41, 0x0a, 0x88, 0x0f, 0x1f, 0x66, 0x84,
0xab, 0x2c, 0xe7, 0xa8, 0x6a, 0x36, 0xa4, 0x46, 0x72, 0x40, 0x7e, 0xe9, 0x01, 0xb9, 0x8d, 0x34,
0xb1, 0x41, 0x72, 0x86, 0xaa, 0x74, 0x5b, 0x4a, 0xab, 0x44, 0xa8, 0x1a, 0xf4, 0x90, 0xac, 0x3d,
0x0d, 0xfd, 0x74, 0xc2, 0x64, 0x14, 0xbd, 0x21, 0xca, 0x8e, 0x8c, 0xa2, 0x30, 0x41, 0xb1, 0x78,
0x9c, 0x98, 0x6f, 0xd9, 0x7c, 0x34, 0x9d, 0x57, 0xc5, 0xa9, 0x32, 0x41, 0xb1, 0xf8, 0xa4, 0x7c,
0x7b, 0xc8, 0x7c, 0x19, 0xa6, 0xfb, 0xaa, 0x49, 0x55, 0x88, 0x50, 0x35, 0xfa, 0xbf, 0x77, 0x48,
0x57, 0x1e, 0x4b, 0xfa, 0x1d, 0xb9, 0x37, 0xbc, 0x48, 0x58, 0x7c, 0x1c, 0x85, 0x0e, 0x8b, 0x63,
0xe6, 0x1e, 0xb3, 0xe8, 0x84, 0x39, 0x61, 0xe0, 0xe2, 0x9e, 0xb6, 0xad, 0x37, 0xf3, 0xcc, 0x5c,
0x46, 0x81, 0x65, 0x0e, 0x1e, 0xd6, 0xf7, 0x82, 0xc6, 0xb0, 0x2b, 0x65, 0xd8, 0x25, 0x14, 0x58,
0xe6, 0xa0, 0x47, 0x64, 0x3b, 0x09, 0x13, 0xdb, 0xb7, 0x94, 0x6e, 0xf1, 0x58, 0xb4, 0xad, 0x7b,
0x79, 0x66, 0x36, 0xb9, 0xa1, 0x09, 0x2c, 0x42, 0x3d, 0x56, 0xba, 0xc2, 0x63, 0x52, 0x0d, 0xa5,
0xba, 0xa1, 0x09, 0xa4, 0x7b, 0x64, 0x95, 0x3d, 0x63, 0xce, 0xb7, 0xde, 0x84, 0xe1, 0x01, 0xd1,
0xac, 0x35, 0x9e, 0x70, 0x73, 0x0c, 0x8a, 0x16, 0x7d, 0x9f, 0xdc, 0x3a, 0x4f, 0x59, 0xca, 0x90,
0xda, 0x41, 0xea, 0x7a, 0x9e, 0x99, 0x25, 0x08, 0x65, 0x93, 0xee, 0x13, 0x12, 0xa7, 0x43, 0x91,
0xea, 0x31, 0x6e, 0x75, 0xdb, 0xda, 0xc8, 0x33, 0xb3, 0x82, 0x42, 0xa5, 0x4d, 0x1f, 0x93, 0x1d,
0x1c, 0xdd, 0x57, 0x41, 0x22, 0x4e, 0x4c, 0x92, 0x46, 0x01, 0x73, 0x7b, 0xab, 0xa8, 0xec, 0xe5,
0x99, 0xd9, 0xe8, 0x87, 0x46, 0x94, 0xf6, 0x49, 0x27, 0x9e, 0xfa, 0x5e, 0x12, 0xf7, 0x6e, 0xa1,
0x9e, 0xf0, 0x14, 0x13, 0x08, 0xc8, 0x2f, 0x72, 0xc6, 0x76, 0xe4, 0xc6, 0x3d, 0x52, 0xe1, 0x20,
0x02, 0xf2, 0x5b, 0x8c, 0xea, 0x38, 0x8c, 0x93, 0x43, 0xcf, 0x4f, 0x58, 0x84, 0xab, 0xd7, 0xbb,
0x5d, 0x1b, 0x55, 0xcd, 0x0f, 0x8d, 0x28, 0xfd, 0x91, 0x3c, 0x40, 0xfc, 0x24, 0x89, 0x52, 0x27,
0x49, 0x23, 0xe6, 0x3e, 0x61, 0x89, 0xed, 0xda, 0x89, 0x5d, 0x3b, 0x12, 0x6b, 0x18, 0xfe, 0xbd,
0x3c, 0x33, 0x6f, 0x26, 0x80, 0x9b, 0xd1, 0xfa, 0x5f, 0x90, 0xae, 0x2c, 0xcb, 0xbc, 0x92, 0xc5,
0x49, 0x18, 0xb1, 0x5a, 0xf1, 0x3b, 0xe1, 0x58, 0x59, 0xc9, 0x90, 0x02, 0xe2, 0xd3, 0xff, 0x75,
0x85, 0xac, 0x1e, 0x95, 0xd5, 0x77, 0x0d, 0xfb, 0x04, 0xc6, 0xf3, 0x56, 0xe4, 0x9b, 0x6e, 0x6d,
0xf1, 0x0a, 0x50, 0xc5, 0x41, 0xb1, 0xe8, 0x21, 0xa1, 0x68, 0x1f, 0xf0, 0x6a, 0x1a, 0x3f, 0xb1,
0x13, 0xd4, 0x8a, 0xa4, 0xfa, 0x7f, 0x9e, 0x99, 0x0d, 0x5e, 0x68, 0xc0, 0x8a, 0xde, 0x2d, 0xb4,
0x63, 0x99, 0x43, 0x65, 0xef, 0x12, 0x07, 0xc5, 0xa2, 0x9f, 0x93, 0x8d, 0x32, 0x03, 0x4e, 0x58,
0x90, 0xc8, 0x84, 0xa1, 0x79, 0x66, 0xd6, 0x3c, 0x50, 0xb3, 0xcb, 0xf5, 0xd2, 0x6f, 0xbc, 0x5e,
0x7f, 0xb4, 0x89, 0x8e, 0xfe, 0xa2, 0x63, 0x31, 0x09, 0x60, 0xa7, 0xb2, 0x3c, 0x95, 0x1d, 0x17,
0x1e, 0xa8, 0xd9, 0xf4, 0x6b, 0x72, 0xb7, 0x82, 0x3c, 0x0a, 0x7f, 0x08, 0xfc, 0xd0, 0x76, 0x8b,
0x55, 0xbb, 0x9f, 0x67, 0x66, 0x33, 0x01, 0x9a, 0x61, 0xbe, 0x07, 0x8e, 0x82, 0x61, 0x3e, 0xb7,
0xcb, 0x3d, 0x58, 0xf4, 0x42, 0x03, 0x46, 0x1d, 0x72, 0x9f, 0x27, 0xef, 0x05, 0xb0, 0x53, 0x16,
0xb1, 0xc0, 0x61, 0x6e, 0x79, 0xfe, 0x7a, 0xeb, 0xbb, 0xda, 0xde, 0xaa, 0xf5, 0x20, 0xcf, 0xcc,
0xb7, 0x96, 0x92, 0xe6, 0x87, 0x14, 0x96, 0xc7, 0x29, 0xef, 0xe8, 0xda, 0x0d, 0xc8, 0xb1, 0x25,
0x77, 0xf4, 0x7c, 0x7e, 0xc0, 0x4e, 0xe3, 0x43, 0x96, 0x38, 0xe3, 0xa2, 0xb4, 0x55, 0xe7, 0xa7,
0x78, 0xa1, 0x01, 0xeb, 0xff, 0xa6, 0x13, 0x1d, 0xfb, 0xe1, 0xdb, 0x37, 0x66, 0xb6, 0x2b, 0x3a,
0xe5, 0x19, 0x55, 0x3d, 0x37, 0xaa, 0x07, 0x6a, 0xb6, 0xa2, 0x15, 0xb5, 0x43, 0x6f, 0xd0, 0x8a,
0xaa, 0x51, 0xb3, 0xe9, 0x01, 0xb9, 0xe3, 0x32, 0x27, 0x9c, 0x4c, 0x23, 0x4c, 0x5f, 0xd1, 0x75,
0x07, 0xe5, 0x77, 0xf3, 0xcc, 0x5c, 0x74, 0xc2, 0x22, 0x54, 0x0f, 0x22, 0xc6, 0xd0, 0x6d, 0x0e,
0x22, 0x86, 0xb1, 0x08, 0xd1, 0x87, 0x64, 0xb3, 0x3e, 0x0e, 0x51, 0x98, 0xb7, 0xf3, 0xcc, 0xac,
0xbb, 0xa0, 0x0e, 0x70, 0x39, 0x9e, 0xc5, 0x47, 0xe9, 0xd4, 0xf7, 0x1c, 0x9b, 0xcb, 0x6f, 0x95,
0xf2, 0x9a, 0x0b, 0xea, 0x00, 0x97, 0x4f, 0x6b, 0x05, 0x98, 0x94, 0xf2, 0x9a, 0x0b, 0xea, 0x00,
0x9d, 0x92, 0xdd, 0x62, 0x61, 0x97, 0x94, 0x48, 0x59, 0xd0, 0xdf, 0xc9, 0x33, 0xf3, 0xb5, 0x5c,
0x78, 0x2d, 0x83, 0x5e, 0x90, 0xb7, 0xab, 0x6b, 0xb8, 0xac, 0x53, 0x51, 0xe6, 0xdf, 0xcd, 0x33,
0xf3, 0x26, 0x74, 0xb8, 0x09, 0xa9, 0xff, 0xef, 0x0a, 0xd1, 0xf1, 0x29, 0xc5, 0x6b, 0x24, 0x13,
0xd7, 0xe2, 0x61, 0x98, 0x06, 0x4a, 0x85, 0xae, 0xe2, 0xa0, 0x58, 0xf4, 0x4b, 0xb2, 0xc5, 0xe6,
0x97, 0xe9, 0x79, 0xca, 0x6b, 0xbd, 0xa8, 0x34, 0xba, 0xb5, 0x93, 0x67, 0xe6, 0x82, 0x0f, 0x16,
0x10, 0xfa, 0x29, 0x59, 0x97, 0x18, 0x16, 0x3f, 0xf1, 0xc0, 0xd1, 0xad, 0x3b, 0x79, 0x66, 0xaa,
0x0e, 0x50, 0x4d, 0x2e, 0xc4, 0x17, 0x19, 0x30, 0x87, 0x79, 0x4f, 0x8b, 0xe7, 0x0c, 0x0a, 0x15,
0x07, 0xa8, 0x26, 0x7f, 0x98, 0x20, 0x80, 0x25, 0x5d, 0xa4, 0x17, 0x3e, 0x4c, 0x0a, 0x10, 0xca,
0x26, 0x7f, 0xef, 0x44, 0x62, 0xac, 0x22, 0x97, 0x74, 0xf1, 0xde, 0x99, 0x63, 0x50, 0xb4, 0xf8,
0x02, 0xba, 0xd5, 0x12, 0xd9, 0x2d, 0x2f, 0x99, 0x2a, 0x0e, 0x8a, 0x65, 0x0d, 0x2f, 0xaf, 0x8c,
0xd6, 0x8b, 0x2b, 0xa3, 0xf5, 0xf2, 0xca, 0xd0, 0x7e, 0x9a, 0x19, 0xda, 0x2f, 0x33, 0x43, 0x7b,
0x3e, 0x33, 0xb4, 0xcb, 0x99, 0xa1, 0xfd, 0x35, 0x33, 0xb4, 0xbf, 0x67, 0x46, 0xeb, 0xe5, 0xcc,
0xd0, 0x7e, 0xbe, 0x36, 0x5a, 0x97, 0xd7, 0x46, 0xeb, 0xc5, 0xb5, 0xd1, 0xfa, 0xfe, 0x83, 0x91,
0x97, 0x8c, 0xd3, 0xe1, 0xbe, 0x13, 0x4e, 0x06, 0xa3, 0xc8, 0x3e, 0xb5, 0x03, 0x7b, 0xe0, 0x87,
0x67, 0xde, 0xa0, 0xe9, 0x3f, 0xde, 0xb0, 0x83, 0xff, 0xe0, 0x3e, 0xfe, 0x2f, 0x00, 0x00, 0xff,
0xff, 0x99, 0x60, 0xf2, 0x04, 0x02, 0x0e, 0x00, 0x00,
// 1215 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0x4d, 0x6f, 0xe3, 0x54,
0x17, 0x8e, 0x27, 0xaf, 0x93, 0xce, 0xed, 0xe7, 0xdc, 0x76, 0xde, 0xc9, 0x80, 0x64, 0x97, 0xc0,
0x88, 0x22, 0x50, 0x23, 0x3e, 0x24, 0x04, 0x62, 0x24, 0xe4, 0x0e, 0x95, 0x2a, 0x75, 0x44, 0x39,
0x81, 0x0d, 0x3b, 0xc7, 0xbe, 0x4d, 0xa2, 0x3a, 0x76, 0x6a, 0x5f, 0x97, 0xe9, 0x0a, 0x7e, 0x02,
0x3f, 0x83, 0x0d, 0x2b, 0x56, 0x48, 0x88, 0x0d, 0x9b, 0x59, 0x76, 0x39, 0x2b, 0x8b, 0xa6, 0x1b,
0xe4, 0xd5, 0x48, 0xfc, 0x01, 0x74, 0xcf, 0xbd, 0xf1, 0x57, 0x9c, 0x99, 0x6e, 0xe2, 0x7b, 0x9e,
0xf3, 0x3c, 0xe7, 0x7e, 0x9e, 0x73, 0x6f, 0xc8, 0xee, 0xf4, 0x6c, 0xd8, 0xf3, 0x82, 0xe1, 0xb9,
0x37, 0x09, 0x5c, 0xe6, 0xf5, 0x22, 0x6e, 0xf3, 0x48, 0xfe, 0xee, 0x4f, 0xc3, 0x80, 0x07, 0x54,
0x47, 0xe3, 0x8d, 0x9d, 0x61, 0x30, 0x0c, 0x10, 0xe9, 0x89, 0x96, 0x74, 0x76, 0xff, 0xd5, 0x48,
0x0b, 0x58, 0x14, 0x7b, 0x9c, 0x7e, 0x46, 0xda, 0x51, 0x3c, 0x99, 0xd8, 0xe1, 0x65, 0x47, 0xdb,
0xd5, 0xf6, 0x56, 0x3f, 0xda, 0xd8, 0x97, 0x61, 0xfa, 0x12, 0xb5, 0x36, 0x9f, 0x27, 0x66, 0x23,
0x4d, 0xcc, 0x39, 0x0d, 0xe6, 0x0d, 0x21, 0x3d, 0x8f, 0x59, 0x38, 0x66, 0x61, 0xe7, 0x4e, 0x49,
0xfa, 0x8d, 0x44, 0x73, 0xa9, 0xa2, 0xc1, 0xbc, 0x41, 0x1f, 0x93, 0x95, 0xb1, 0x3f, 0x64, 0x11,
0x67, 0x61, 0xa7, 0x89, 0xda, 0x4d, 0xa5, 0x3d, 0x52, 0xb0, 0xb5, 0xa5, 0xc4, 0x19, 0x11, 0xb2,
0x16, 0xfd, 0x84, 0xb4, 0x1c, 0xdb, 0x19, 0xb1, 0xa8, 0xf3, 0x3f, 0x14, 0xaf, 0x2b, 0xf1, 0x01,
0x82, 0xd6, 0xba, 0x92, 0xea, 0x48, 0x02, 0xc5, 0xed, 0xfe, 0xd9, 0x24, 0x2d, 0xc9, 0xa0, 0x1f,
0x12, 0xdd, 0x19, 0xc5, 0xfe, 0x99, 0x9a, 0xf3, 0x5a, 0x51, 0x5f, 0x90, 0x0b, 0x0a, 0xc8, 0x8f,
0x90, 0x8c, 0x7d, 0x97, 0x3d, 0x53, 0x73, 0x5d, 0x22, 0x41, 0x0a, 0xc8, 0x8f, 0x18, 0x66, 0x88,
0xab, 0xac, 0xe6, 0x58, 0xd6, 0x6c, 0x28, 0x8d, 0xe2, 0x80, 0xfa, 0xd2, 0x03, 0xb2, 0x8a, 0x34,
0xb9, 0x41, 0x6a, 0x86, 0x65, 0xe9, 0xb6, 0x92, 0x16, 0x89, 0x50, 0x34, 0xe8, 0x21, 0x59, 0xbb,
0x08, 0xbc, 0x78, 0xc2, 0x54, 0x14, 0xbd, 0x26, 0xca, 0x8e, 0x8a, 0x52, 0x62, 0x42, 0xc9, 0x12,
0x71, 0x22, 0xb1, 0x65, 0xf3, 0xd1, 0xb4, 0x5e, 0x15, 0xa7, 0xc8, 0x84, 0x92, 0x25, 0x26, 0xe5,
0xd9, 0x03, 0xe6, 0xa9, 0x30, 0xed, 0x57, 0x4d, 0xaa, 0x40, 0x84, 0xa2, 0xd1, 0xfd, 0xbd, 0x45,
0xda, 0xea, 0x58, 0xd2, 0xef, 0xc8, 0x83, 0xc1, 0x25, 0x67, 0xd1, 0x49, 0x18, 0x38, 0x2c, 0x8a,
0x98, 0x7b, 0xc2, 0xc2, 0x3e, 0x73, 0x02, 0xdf, 0xc5, 0x3d, 0x6d, 0x5a, 0x6f, 0xa6, 0x89, 0xb9,
0x8c, 0x02, 0xcb, 0x1c, 0x22, 0xac, 0x37, 0xf6, 0x6b, 0xc3, 0xde, 0xc9, 0xc3, 0x2e, 0xa1, 0xc0,
0x32, 0x07, 0x3d, 0x22, 0xdb, 0x3c, 0xe0, 0xb6, 0x67, 0x95, 0xba, 0xc5, 0x63, 0xd1, 0xb4, 0x1e,
0xa4, 0x89, 0x59, 0xe7, 0x86, 0x3a, 0x30, 0x0b, 0x75, 0x5c, 0xea, 0x0a, 0x8f, 0x49, 0x31, 0x54,
0xd9, 0x0d, 0x75, 0x20, 0xdd, 0x23, 0x2b, 0xec, 0x19, 0x73, 0xbe, 0x1d, 0x4f, 0x18, 0x1e, 0x10,
0xcd, 0x5a, 0x13, 0x09, 0x37, 0xc7, 0x20, 0x6b, 0xd1, 0xf7, 0xc9, 0xdd, 0xf3, 0x98, 0xc5, 0x0c,
0xa9, 0x2d, 0xa4, 0xae, 0xa7, 0x89, 0x99, 0x83, 0x90, 0x37, 0xe9, 0x3e, 0x21, 0x51, 0x3c, 0x90,
0xa9, 0x1e, 0xe1, 0x56, 0x37, 0xad, 0x8d, 0x34, 0x31, 0x0b, 0x28, 0x14, 0xda, 0xf4, 0x98, 0xec,
0xe0, 0xe8, 0xbe, 0xf2, 0xb9, 0x3c, 0x31, 0x3c, 0x0e, 0x7d, 0xe6, 0x76, 0x56, 0x50, 0xd9, 0x49,
0x13, 0xb3, 0xd6, 0x0f, 0xb5, 0x28, 0xed, 0x92, 0x56, 0x34, 0xf5, 0xc6, 0x3c, 0xea, 0xdc, 0x45,
0x3d, 0x11, 0x29, 0x26, 0x11, 0x50, 0x5f, 0xe4, 0x8c, 0xec, 0xd0, 0x8d, 0x3a, 0xa4, 0xc0, 0x41,
0x04, 0xd4, 0x37, 0x1b, 0xd5, 0x49, 0x10, 0xf1, 0xc3, 0xb1, 0xc7, 0x59, 0x88, 0xab, 0xd7, 0x59,
0xad, 0x8c, 0xaa, 0xe2, 0x87, 0x5a, 0x94, 0xfe, 0x48, 0x1e, 0x21, 0xde, 0xe7, 0x61, 0xec, 0xf0,
0x38, 0x64, 0xee, 0x53, 0xc6, 0x6d, 0xd7, 0xe6, 0x76, 0xe5, 0x48, 0xac, 0x61, 0xf8, 0xf7, 0xd2,
0xc4, 0xbc, 0x9d, 0x00, 0x6e, 0x47, 0xeb, 0x7e, 0x41, 0xda, 0xaa, 0x2c, 0x8b, 0x4a, 0x16, 0xf1,
0x20, 0x64, 0x95, 0xe2, 0xd7, 0x17, 0x58, 0x5e, 0xc9, 0x90, 0x02, 0xf2, 0xd3, 0xfd, 0xf5, 0x0e,
0x59, 0x39, 0xca, 0xab, 0xef, 0x1a, 0xf6, 0x09, 0x4c, 0xe4, 0xad, 0xcc, 0x37, 0xdd, 0xda, 0x12,
0x15, 0xa0, 0x88, 0x43, 0xc9, 0xa2, 0x87, 0x84, 0xa2, 0x7d, 0x20, 0xaa, 0x69, 0xf4, 0xd4, 0xe6,
0xa8, 0x95, 0x49, 0xf5, 0xff, 0x34, 0x31, 0x6b, 0xbc, 0x50, 0x83, 0x65, 0xbd, 0x5b, 0x68, 0x47,
0x2a, 0x87, 0xf2, 0xde, 0x15, 0x0e, 0x25, 0x8b, 0x7e, 0x4e, 0x36, 0xf2, 0x0c, 0xe8, 0x33, 0x9f,
0xab, 0x84, 0xa1, 0x69, 0x62, 0x56, 0x3c, 0x50, 0xb1, 0xf3, 0xf5, 0xd2, 0x6f, 0xbd, 0x5e, 0x7f,
0x34, 0x89, 0x8e, 0xfe, 0xac, 0x63, 0x39, 0x09, 0x60, 0xa7, 0xaa, 0x3c, 0xe5, 0x1d, 0x67, 0x1e,
0xa8, 0xd8, 0xf4, 0x6b, 0x72, 0xbf, 0x80, 0x3c, 0x09, 0x7e, 0xf0, 0xbd, 0xc0, 0x76, 0xb3, 0x55,
0x7b, 0x98, 0x26, 0x66, 0x3d, 0x01, 0xea, 0x61, 0xb1, 0x07, 0x4e, 0x09, 0xc3, 0x7c, 0x6e, 0xe6,
0x7b, 0xb0, 0xe8, 0x85, 0x1a, 0x8c, 0x3a, 0xe4, 0xa1, 0x48, 0xde, 0x4b, 0x60, 0xa7, 0x2c, 0x64,
0xbe, 0xc3, 0xdc, 0xfc, 0xfc, 0x75, 0xd6, 0x77, 0xb5, 0xbd, 0x15, 0xeb, 0x51, 0x9a, 0x98, 0x6f,
0x2d, 0x25, 0xcd, 0x0f, 0x29, 0x2c, 0x8f, 0x93, 0xdf, 0xd1, 0x95, 0x1b, 0x50, 0x60, 0x4b, 0xee,
0xe8, 0xf9, 0xfc, 0x80, 0x9d, 0x46, 0x87, 0x8c, 0x3b, 0xa3, 0xac, 0xb4, 0x15, 0xe7, 0x57, 0xf2,
0x42, 0x0d, 0xd6, 0xfd, 0x4d, 0x27, 0x3a, 0xf6, 0x23, 0xb6, 0x6f, 0xc4, 0x6c, 0x57, 0x76, 0x2a,
0x32, 0xaa, 0x78, 0x6e, 0xca, 0x1e, 0xa8, 0xd8, 0x25, 0xad, 0xac, 0x1d, 0x7a, 0x8d, 0x56, 0x56,
0x8d, 0x8a, 0x4d, 0x0f, 0xc8, 0x3d, 0x97, 0x39, 0xc1, 0x64, 0x1a, 0x62, 0xfa, 0xca, 0xae, 0x5b,
0x28, 0xbf, 0x9f, 0x26, 0xe6, 0xa2, 0x13, 0x16, 0xa1, 0x6a, 0x10, 0x39, 0x86, 0x76, 0x7d, 0x10,
0x39, 0x8c, 0x45, 0x88, 0x3e, 0x26, 0x9b, 0xd5, 0x71, 0xc8, 0xc2, 0xbc, 0x9d, 0x26, 0x66, 0xd5,
0x05, 0x55, 0x40, 0xc8, 0xf1, 0x2c, 0x3e, 0x89, 0xa7, 0xde, 0xd8, 0xb1, 0x85, 0xfc, 0x6e, 0x2e,
0xaf, 0xb8, 0xa0, 0x0a, 0x08, 0xf9, 0xb4, 0x52, 0x80, 0x49, 0x2e, 0xaf, 0xb8, 0xa0, 0x0a, 0xd0,
0x29, 0xd9, 0xcd, 0x16, 0x76, 0x49, 0x89, 0x54, 0x05, 0xfd, 0x9d, 0x34, 0x31, 0x5f, 0xcb, 0x85,
0xd7, 0x32, 0xe8, 0x25, 0x79, 0xbb, 0xb8, 0x86, 0xcb, 0x3a, 0x95, 0x65, 0xfe, 0xdd, 0x34, 0x31,
0x6f, 0x43, 0x87, 0xdb, 0x90, 0xba, 0x7f, 0x35, 0x89, 0x8e, 0x4f, 0x29, 0x51, 0x23, 0x99, 0xbc,
0x16, 0x0f, 0x83, 0xd8, 0x2f, 0x55, 0xe8, 0x22, 0x0e, 0x25, 0x8b, 0x7e, 0x49, 0xb6, 0xd8, 0xfc,
0x32, 0x3d, 0x8f, 0x45, 0xad, 0x97, 0x95, 0x46, 0xb7, 0x76, 0xd2, 0xc4, 0x5c, 0xf0, 0xc1, 0x02,
0x42, 0x3f, 0x25, 0xeb, 0x0a, 0xc3, 0xe2, 0x27, 0x1f, 0x38, 0xba, 0x75, 0x2f, 0x4d, 0xcc, 0xb2,
0x03, 0xca, 0xa6, 0x10, 0xe2, 0x8b, 0x0c, 0x98, 0xc3, 0xc6, 0x17, 0xd9, 0x73, 0x06, 0x85, 0x25,
0x07, 0x94, 0x4d, 0xf1, 0x30, 0x41, 0x00, 0x4b, 0xba, 0x4c, 0x2f, 0x7c, 0x98, 0x64, 0x20, 0xe4,
0x4d, 0xf1, 0xde, 0x09, 0xe5, 0x58, 0x65, 0x2e, 0xe9, 0xf2, 0xbd, 0x33, 0xc7, 0x20, 0x6b, 0x89,
0x05, 0x74, 0x8b, 0x25, 0xb2, 0x9d, 0x5f, 0x32, 0x45, 0x1c, 0x4a, 0x96, 0xc8, 0x37, 0x2c, 0x67,
0xc7, 0xcc, 0x1f, 0xf2, 0x51, 0x9f, 0x85, 0x17, 0xd9, 0x2b, 0x06, 0xf3, 0x6d, 0xc1, 0x09, 0x8b,
0x90, 0x35, 0xb8, 0xba, 0x36, 0x1a, 0x2f, 0xae, 0x8d, 0xc6, 0xcb, 0x6b, 0x43, 0xfb, 0x69, 0x66,
0x68, 0xbf, 0xcc, 0x0c, 0xed, 0xf9, 0xcc, 0xd0, 0xae, 0x66, 0x86, 0xf6, 0xf7, 0xcc, 0xd0, 0xfe,
0x99, 0x19, 0x8d, 0x97, 0x33, 0x43, 0xfb, 0xf9, 0xc6, 0x68, 0x5c, 0xdd, 0x18, 0x8d, 0x17, 0x37,
0x46, 0xe3, 0xfb, 0x0f, 0x86, 0x63, 0x3e, 0x8a, 0x07, 0xfb, 0x4e, 0x30, 0xe9, 0x0d, 0x43, 0xfb,
0xd4, 0xf6, 0xed, 0x9e, 0x17, 0x9c, 0x8d, 0x7b, 0x75, 0x7f, 0x14, 0x07, 0x2d, 0xfc, 0x1b, 0xf8,
0xf1, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa8, 0xe8, 0xef, 0xe7, 0x47, 0x0e, 0x00, 0x00,
}
func (this *Result) Equal(that interface{}) bool {
@ -1162,6 +1171,9 @@ func (this *Cache) Equal(that interface{}) bool {
if this.DownloadTime != that1.DownloadTime {
return false
}
if this.QueryLengthServed != that1.QueryLengthServed {
return false
}
return true
}
func (this *Result) GoString() string {
@ -1275,7 +1287,7 @@ func (this *Cache) GoString() string {
if this == nil {
return "nil"
}
s := make([]string, 0, 11)
s := make([]string, 0, 12)
s = append(s, "&stats.Cache{")
s = append(s, "EntriesFound: "+fmt.Sprintf("%#v", this.EntriesFound)+",\n")
s = append(s, "EntriesRequested: "+fmt.Sprintf("%#v", this.EntriesRequested)+",\n")
@ -1284,6 +1296,7 @@ func (this *Cache) GoString() string {
s = append(s, "BytesSent: "+fmt.Sprintf("%#v", this.BytesSent)+",\n")
s = append(s, "Requests: "+fmt.Sprintf("%#v", this.Requests)+",\n")
s = append(s, "DownloadTime: "+fmt.Sprintf("%#v", this.DownloadTime)+",\n")
s = append(s, "QueryLengthServed: "+fmt.Sprintf("%#v", this.QueryLengthServed)+",\n")
s = append(s, "}")
return strings.Join(s, "")
}
@ -1773,6 +1786,11 @@ func (m *Cache) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if m.QueryLengthServed != 0 {
i = encodeVarintStats(dAtA, i, uint64(m.QueryLengthServed))
i--
dAtA[i] = 0x40
}
if m.DownloadTime != 0 {
i = encodeVarintStats(dAtA, i, uint64(m.DownloadTime))
i--
@ -2030,6 +2048,9 @@ func (m *Cache) Size() (n int) {
if m.DownloadTime != 0 {
n += 1 + sovStats(uint64(m.DownloadTime))
}
if m.QueryLengthServed != 0 {
n += 1 + sovStats(uint64(m.QueryLengthServed))
}
return n
}
@ -2158,6 +2179,7 @@ func (this *Cache) String() string {
`BytesSent:` + fmt.Sprintf("%v", this.BytesSent) + `,`,
`Requests:` + fmt.Sprintf("%v", this.Requests) + `,`,
`DownloadTime:` + fmt.Sprintf("%v", this.DownloadTime) + `,`,
`QueryLengthServed:` + fmt.Sprintf("%v", this.QueryLengthServed) + `,`,
`}`,
}, "")
return s
@ -3720,6 +3742,25 @@ func (m *Cache) Unmarshal(dAtA []byte) error {
break
}
}
case 8:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field QueryLengthServed", wireType)
}
m.QueryLengthServed = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowStats
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.QueryLengthServed |= int64(b&0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipStats(dAtA[iNdEx:])

@ -163,4 +163,5 @@ message Cache {
int64 bytesSent = 5 [(gogoproto.jsontag) = "bytesSent"];
int32 requests = 6 [(gogoproto.jsontag) = "requests"];
int64 downloadTime = 7 [(gogoproto.jsontag) = "downloadTime"];
int64 queryLengthServed = 8 [(gogoproto.jsontag) = "queryLengthServed"];
}

@ -1592,7 +1592,8 @@ var (
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"index": {
"entriesFound": 0,
@ -1601,7 +1602,8 @@ var (
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"statsResult": {
"entriesFound": 0,
@ -1610,7 +1612,8 @@ var (
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"seriesResult": {
"entriesFound": 0,
@ -1619,7 +1622,8 @@ var (
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"labelResult": {
"entriesFound": 0,
@ -1628,7 +1632,8 @@ var (
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"volumeResult": {
"entriesFound": 0,
@ -1637,7 +1642,8 @@ var (
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"result": {
"entriesFound": 0,
@ -1646,7 +1652,8 @@ var (
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
}
},
"summary": {

@ -65,7 +65,8 @@ var emptyStats = `"stats": {
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"index": {
"entriesFound": 0,
@ -74,7 +75,8 @@ var emptyStats = `"stats": {
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"statsResult": {
"entriesFound": 0,
@ -83,7 +85,8 @@ var emptyStats = `"stats": {
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"seriesResult": {
"entriesFound": 0,
@ -92,7 +95,8 @@ var emptyStats = `"stats": {
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"labelResult": {
"entriesFound": 0,
@ -101,7 +105,8 @@ var emptyStats = `"stats": {
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"volumeResult": {
"entriesFound": 0,
@ -110,7 +115,8 @@ var emptyStats = `"stats": {
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"result": {
"entriesFound": 0,
@ -119,7 +125,8 @@ var emptyStats = `"stats": {
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
}
},
"summary": {

@ -19,6 +19,7 @@ import (
"github.com/grafana/dskit/tenant"
"github.com/grafana/loki/pkg/logqlmodel/stats"
"github.com/grafana/loki/pkg/storage/chunk/cache"
"github.com/grafana/loki/pkg/util/math"
"github.com/grafana/loki/pkg/util/spanlogger"
@ -187,7 +188,11 @@ func (s ResultsCache) handleHit(ctx context.Context, r Request, extents []Extent
if err != nil {
return nil, nil, err
}
queryLenFromCache := r.GetEnd().Sub(r.GetStart())
st := stats.FromContext(ctx)
if len(requests) == 0 {
st.AddCacheQueryLengthServed(s.cache.GetCacheType(), queryLenFromCache)
response, err := s.merger.MergeResponse(responses...)
// No downstream requests so no need to write back to the cache.
return response, nil, err
@ -204,6 +209,7 @@ func (s ResultsCache) handleHit(ctx context.Context, r Request, extents []Extent
}
for _, reqResp := range reqResps {
queryLenFromCache -= reqResp.Request.GetEnd().Sub(reqResp.Request.GetStart())
responses = append(responses, reqResp.Response)
if s.shouldCacheRes != nil && !s.shouldCacheRes(ctx, r, reqResp.Response, maxCacheTime) {
continue
@ -267,6 +273,7 @@ func (s ResultsCache) handleHit(ctx context.Context, r Request, extents []Extent
return nil, nil, err
}
st.AddCacheQueryLengthServed(s.cache.GetCacheType(), queryLenFromCache)
response, err := s.merger.MergeResponse(responses...)
return response, mergedExtents, err
}

@ -370,6 +370,7 @@ func TestHandleHit(t *testing.T) {
} {
t.Run(tc.name, func(t *testing.T) {
sut := ResultsCache{
cache: cache.NewMockCache(),
extractor: MockExtractor{},
minCacheExtent: 10,
limits: mockLimits{},
@ -391,6 +392,62 @@ func TestHandleHit(t *testing.T) {
}
}
func TestHandleHit_queryLengthServed(t *testing.T) {
rc := ResultsCache{
cache: &mockResultsCache{},
extractor: MockExtractor{},
limits: mockLimits{},
merger: MockMerger{},
parallelismForReq: func(_ context.Context, tenantIDs []string, r Request) int { return 1 },
next: HandlerFunc(func(_ context.Context, req Request) (Response, error) {
return mkAPIResponse(req.GetStart().UnixMilli(), req.GetEnd().UnixMilli(), req.GetStep()), nil
}),
}
statsCtx, ctx := stats.NewContext(context.Background())
ctx = user.InjectOrgID(ctx, "1")
input := &MockRequest{
Start: time.UnixMilli(100),
End: time.UnixMilli(130),
Step: 5,
}
// no cached response
_, _, err := rc.handleHit(ctx, input, nil, 0)
require.NoError(t, err)
require.Equal(t, int64(0), statsCtx.Caches().Result.QueryLengthServed)
// partial hit
extents := []Extent{
mkExtentWithStep(60, 80, 5),
mkExtentWithStep(90, 105, 5),
}
statsCtx, ctx = stats.NewContext(ctx)
_, _, err = rc.handleHit(ctx, input, extents, 0)
require.NoError(t, err)
require.Equal(t, int64(5*time.Millisecond), statsCtx.Caches().Result.QueryLengthServed)
extents = []Extent{
mkExtentWithStep(90, 105, 5),
mkExtentWithStep(110, 120, 5),
}
statsCtx, ctx = stats.NewContext(ctx)
_, _, err = rc.handleHit(ctx, input, extents, 0)
require.NoError(t, err)
require.Equal(t, int64(15*time.Millisecond), statsCtx.Caches().Result.QueryLengthServed)
// entire query served from cache
extents = []Extent{
mkExtentWithStep(90, 110, 5),
mkExtentWithStep(110, 130, 5),
}
statsCtx, ctx = stats.NewContext(ctx)
_, _, err = rc.handleHit(ctx, input, extents, 0)
require.NoError(t, err)
require.Equal(t, int64(30*time.Millisecond), statsCtx.Caches().Result.QueryLengthServed)
}
func TestResultsCacheMaxFreshness(t *testing.T) {
modelNow := model.Now()
for i, tc := range []struct {
@ -603,3 +660,20 @@ type mockLimits struct {
func (m mockLimits) MaxCacheFreshness(context.Context, string) time.Duration {
return m.maxCacheFreshness
}
type mockResultsCache struct{}
func (m mockResultsCache) Store(context.Context, []string, [][]byte) error {
panic("not implemented")
}
func (m mockResultsCache) Fetch(context.Context, []string) ([]string, [][]byte, []string, error) {
panic("not implemented")
}
func (m mockResultsCache) Stop() {
panic("not implemented")
}
func (m mockResultsCache) GetCacheType() stats.CacheType {
// returning results cache since we do not support storing stats for "mock" cache
return stats.ResultCache
}

@ -108,7 +108,8 @@ var queryTests = []struct {
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"index": {
"entriesFound": 0,
@ -117,7 +118,8 @@ var queryTests = []struct {
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"statsResult": {
"entriesFound": 0,
@ -126,7 +128,8 @@ var queryTests = []struct {
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"seriesResult": {
"entriesFound": 0,
@ -135,7 +138,8 @@ var queryTests = []struct {
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"labelResult": {
"entriesFound": 0,
@ -144,7 +148,8 @@ var queryTests = []struct {
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"volumeResult": {
"entriesFound": 0,
@ -153,7 +158,8 @@ var queryTests = []struct {
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"result": {
"entriesFound": 0,
@ -162,7 +168,8 @@ var queryTests = []struct {
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
}
},
"summary": {

@ -76,7 +76,8 @@ const emptyStats = `{
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"index": {
"entriesFound": 0,
@ -85,7 +86,8 @@ const emptyStats = `{
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"statsResult": {
"entriesFound": 0,
@ -94,7 +96,8 @@ const emptyStats = `{
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"seriesResult": {
"entriesFound": 0,
@ -103,7 +106,8 @@ const emptyStats = `{
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"labelResult": {
"entriesFound": 0,
@ -112,7 +116,8 @@ const emptyStats = `{
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"volumeResult": {
"entriesFound": 0,
@ -121,7 +126,8 @@ const emptyStats = `{
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
},
"result": {
"entriesFound": 0,
@ -130,7 +136,8 @@ const emptyStats = `{
"bytesReceived": 0,
"bytesSent": 0,
"requests": 0,
"downloadTime": 0
"downloadTime": 0,
"queryLengthServed": 0
}
},
"summary": {

Loading…
Cancel
Save