Skip to content

Commit bae21d8

Browse files
refactored out code, changed which functions are exported
1 parent 1933990 commit bae21d8

File tree

3 files changed

+44
-36
lines changed

3 files changed

+44
-36
lines changed

internal/cortex/frontend/transport/handler.go

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,14 @@ type Handler struct {
7070
func NewHandler(cfg HandlerConfig, roundTripper http.RoundTripper, log log.Logger, reg prometheus.Registerer) http.Handler {
7171
var (
7272
FailedQueryCache *utils.FailedQueryCache
73-
message string
73+
err error
7474
)
7575

7676
if cfg.FailedQueryCacheCapacity > 0 {
77-
FailedQueryCache, message = utils.NewFailedQueryCache(cfg.FailedQueryCacheCapacity)
78-
level.Warn(log).Log(message)
77+
FailedQueryCache, err = utils.NewFailedQueryCache(cfg.FailedQueryCacheCapacity)
78+
if err != nil {
79+
level.Warn(log).Log(err.Error())
80+
}
7981
}
8082

8183
h := &Handler{
@@ -121,10 +123,9 @@ func NewHandler(cfg HandlerConfig, roundTripper http.RoundTripper, log log.Logge
121123

122124
func (f *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
123125
var (
124-
stats *querier_stats.Stats
125-
queryString url.Values
126-
queryExpressionNormalized string
127-
queryExpressionRangeLength int
126+
stats *querier_stats.Stats
127+
queryString url.Values
128+
urlQuery url.Values
128129
)
129130

130131
// Initialise the stats in the context and make sure it's propagated
@@ -144,17 +145,11 @@ func (f *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
144145
r.Body = http.MaxBytesReader(w, r.Body, f.cfg.MaxBodySize)
145146
r.Body = io.NopCloser(io.TeeReader(r.Body, &buf))
146147

147-
// Check if caching is enabled.
148+
urlQuery = r.URL.Query()
149+
150+
// Check if query is cached
148151
if f.failedQueryCache != nil {
149-
//Store query.
150-
query := r.URL.Query()
151-
// Store query expression.
152-
queryExpressionNormalized = f.failedQueryCache.NormalizeQueryString(query)
153-
// Store query time range length.
154-
queryExpressionRangeLength = utils.GetQueryRangeSeconds(query)
155-
156-
// Check if query in cache and whether value exceeds time range length. Log and increment counter appropriately.
157-
cached, message := f.failedQueryCache.QueryHitCache(queryExpressionNormalized, queryExpressionRangeLength, f.failedQueryCache.LruCache)
152+
cached, message := f.failedQueryCache.CallQueryHitCache(urlQuery)
158153
if cached {
159154
w.WriteHeader(http.StatusForbidden)
160155
level.Info(util_log.WithContext(r.Context(), f.log)).Log(message)
@@ -171,9 +166,15 @@ func (f *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
171166
writeError(w, err)
172167
queryString = f.parseRequestQueryString(r, buf)
173168

174-
// Try to update cache.
175-
_, message := f.failedQueryCache.CallUpdateFailedQueryCache(err, queryExpressionNormalized, queryExpressionRangeLength)
176-
level.Debug(util_log.WithContext(r.Context(), f.log)).Log(message)
169+
// Update cache for failed queries.
170+
if f.failedQueryCache != nil {
171+
success, message := f.failedQueryCache.CallUpdateFailedQueryCache(err, urlQuery)
172+
if success {
173+
level.Info(util_log.WithContext(r.Context(), f.log)).Log(message)
174+
} else {
175+
level.Debug(util_log.WithContext(r.Context(), f.log)).Log(message)
176+
}
177+
}
177178

178179
if f.cfg.LogFailedQueries {
179180
f.reportFailedQuery(r, queryString, err)

internal/cortex/frontend/transport/utils/utils.go

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,26 @@ var (
2222
type FailedQueryCache struct {
2323
regex *regexp.Regexp
2424
errorExtract *regexp.Regexp
25-
LruCache *lru.Cache
25+
lruCache *lru.Cache
2626
}
2727

28-
func NewFailedQueryCache(capacity int) (*FailedQueryCache, string) {
28+
func NewFailedQueryCache(capacity int) (*FailedQueryCache, error) {
2929
regex := regexp.MustCompile(`[\s\n\t]+`)
3030
errorExtract := regexp.MustCompile(`Code\((\d+)\)`)
3131
lruCache, err := lru.New(capacity)
32-
message := ""
3332
if err != nil {
3433
lruCache = nil
35-
message = fmt.Sprintf("Failed to create lru cache: %s", err)
34+
err = fmt.Errorf("Failed to create lru cache: %s", err)
35+
return nil, err
3636
}
37-
return &FailedQueryCache{regex, errorExtract, lruCache}, message
37+
return &FailedQueryCache{
38+
regex: regex,
39+
errorExtract: errorExtract,
40+
lruCache: lruCache}, err
3841
}
3942

4043
// UpdateFailedQueryCache returns true if query is cached so that callsite can increase counter, returns message as a string for callsite to log outcome
41-
func (f *FailedQueryCache) UpdateFailedQueryCache(err error, queryExpressionNormalized string, queryExpressionRangeLength int, lruCache *lru.Cache) (bool, string) {
44+
func updateFailedQueryCache(err error, queryExpressionNormalized string, queryExpressionRangeLength int, lruCache *lru.Cache) (bool, string) {
4245
// Extracting error code from error string.
4346
codeExtract := f.errorExtract.FindStringSubmatch(err.Error())
4447

@@ -100,7 +103,7 @@ func (f *FailedQueryCache) UpdateFailedQueryCache(err error, queryExpressionNorm
100103
}
101104

102105
// QueryHitCache checks if the lru cache is hit and returns whether to increment counter for cache hits along with appropriate message.
103-
func (f *FailedQueryCache) QueryHitCache(queryExpressionNormalized string, queryExpressionRangeLength int, lruCache *lru.Cache) (bool, string) {
106+
func queryHitCache(queryExpressionNormalized string, queryExpressionRangeLength int, lruCache *lru.Cache) (bool, string) {
104107
if value, ok := lruCache.Get(queryExpressionNormalized); ok && value.(int) >= queryExpressionRangeLength {
105108
message := fmt.Sprintf(
106109
`%s: %s, %s: %s, %s: %d`, "msg", "Retrieved query from cache",
@@ -124,7 +127,7 @@ func isCacheableError(statusCode int) bool {
124127
}
125128

126129
// GetQueryRangeSeconds Time range length for queries, if either of "start" or "end" are not present, return 0.
127-
func GetQueryRangeSeconds(query url.Values) int {
130+
func getQueryRangeSeconds(query url.Values) int {
128131
start, err := strconv.Atoi(query.Get("start"))
129132
if err != nil {
130133
return 0
@@ -136,14 +139,20 @@ func GetQueryRangeSeconds(query url.Values) int {
136139
return end - start
137140
}
138141

139-
func (f *FailedQueryCache) NormalizeQueryString(query url.Values) string {
142+
func normalizeQueryString(query url.Values) string {
140143
return f.regex.ReplaceAllString(query.Get("query"), " ")
141144
}
142145

143-
func (f *FailedQueryCache) CallUpdateFailedQueryCache(err error, queryExpressionNormalized string, queryExpressionRangeLength int) (bool, string) {
144-
if f == nil {
145-
return false, "Failed query cache is not enabled"
146-
}
147-
success, message := f.UpdateFailedQueryCache(err, queryExpressionNormalized, queryExpressionRangeLength, f.LruCache)
146+
func (f *FailedQueryCache) CallUpdateFailedQueryCache(err error, query url.Values) (bool, string) {
147+
queryExpressionNormalized := normalizeQueryString(query)
148+
queryExpressionRangeLength := getQueryRangeSeconds(query)
149+
success, message := updateFailedQueryCache(err, queryExpressionNormalized, queryExpressionRangeLength, f.lruCache)
148150
return success, message
149151
}
152+
153+
func (f *FailedQueryCache) CallQueryHitCache(query url.Values) (bool, string) {
154+
queryExpressionNormalized := normalizeQueryString(query)
155+
queryExpressionRangeLength := getQueryRangeSeconds(query)
156+
cached, message := queryHitCache(queryExpressionNormalized, queryExpressionRangeLength, f.lruCache)
157+
return cached, message
158+
}

internal/cortex/frontend/transport/utils/utils_test.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"testing"
1010
)
1111

12-
// TestNewFailedQueryCache tests the NewFailedQueryCache function
1312
func TestNewFailedQueryCache(t *testing.T) {
1413
cache, msg := NewFailedQueryCache(2)
1514
if cache == nil {
@@ -20,7 +19,6 @@ func TestNewFailedQueryCache(t *testing.T) {
2019
}
2120
}
2221

23-
// TestUpdateFailedQueryCache tests the UpdateFailedQueryCache method
2422
func TestUpdateFailedQueryCache(t *testing.T) {
2523
cache, _ := NewFailedQueryCache(2)
2624
lruCache := cache.LruCache

0 commit comments

Comments
 (0)