/
cardinality_query_cache.go
82 lines (68 loc) · 2.36 KB
/
cardinality_query_cache.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// SPDX-License-Identifier: AGPL-3.0-only
package querymiddleware
import (
"errors"
"net/http"
"strings"
"time"
"github.com/go-kit/log"
"github.com/grafana/dskit/cache"
"github.com/prometheus/client_golang/prometheus"
apierror "github.com/grafana/mimir/pkg/api/error"
"github.com/grafana/mimir/pkg/cardinality"
"github.com/grafana/mimir/pkg/util"
)
const (
cardinalityLabelNamesQueryCachePrefix = "cn:"
cardinalityLabelValuesQueryCachePrefix = "cv:"
cardinalityActiveSeriesQueryCachePrefix = "ca:"
)
func newCardinalityQueryCacheRoundTripper(cache cache.Cache, generator CacheKeyGenerator, limits Limits, next http.RoundTripper, logger log.Logger, reg prometheus.Registerer) http.RoundTripper {
ttl := &cardinalityQueryTTL{
limits: limits,
}
return newGenericQueryCacheRoundTripper(cache, generator.LabelValuesCardinality, ttl, next, logger, newResultsCacheMetrics(queryTypeCardinality, reg))
}
type cardinalityQueryTTL struct {
limits Limits
}
func (c *cardinalityQueryTTL) ttl(userID string) time.Duration {
return c.limits.ResultsCacheTTLForCardinalityQuery(userID)
}
func (DefaultCacheKeyGenerator) LabelValuesCardinality(r *http.Request) (*GenericQueryCacheKey, error) {
reqValues, err := util.ParseRequestFormWithoutConsumingBody(r)
if err != nil {
return nil, apierror.New(apierror.TypeBadData, err.Error())
}
switch {
case strings.HasSuffix(r.URL.Path, cardinalityLabelNamesPathSuffix):
parsed, err := cardinality.DecodeLabelNamesRequestFromValues(reqValues)
if err != nil {
return nil, err
}
return &GenericQueryCacheKey{
CacheKey: parsed.String(),
CacheKeyPrefix: cardinalityLabelNamesQueryCachePrefix,
}, nil
case strings.HasSuffix(r.URL.Path, cardinalityLabelValuesPathSuffix):
parsed, err := cardinality.DecodeLabelValuesRequestFromValues(reqValues)
if err != nil {
return nil, err
}
return &GenericQueryCacheKey{
CacheKey: parsed.String(),
CacheKeyPrefix: cardinalityLabelValuesQueryCachePrefix,
}, nil
case strings.HasSuffix(r.URL.Path, cardinalityActiveSeriesPathSuffix):
parsed, err := cardinality.DecodeActiveSeriesRequestFromValues(reqValues)
if err != nil {
return nil, err
}
return &GenericQueryCacheKey{
CacheKey: parsed.String(),
CacheKeyPrefix: cardinalityActiveSeriesQueryCachePrefix,
}, nil
default:
return nil, errors.New("unknown cardinality API endpoint")
}
}