Skip to content

Commit a8aab0d

Browse files
committed
Fix param_query omitted in query frontend query stats log (#5655)
* fix param_query not logged in query stats log Signed-off-by: Ben Ye <[email protected]> * fix lint Signed-off-by: Ben Ye <[email protected]> * fix unit test of user agent Signed-off-by: Ben Ye <[email protected]> --------- Signed-off-by: Ben Ye <[email protected]>
1 parent e700ebb commit a8aab0d

File tree

3 files changed

+47
-5
lines changed

3 files changed

+47
-5
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
* [BUGFIX] DDBKV: When no change detected in ring, retry the CAS until there is change. #5502
103103
* [BUGFIX] Fix bug on objstore when configured to use S3 fips endpoints. #5540
104104
* [BUGFIX] Ruler: Fix bug on ruler where a failure to load a single RuleGroup would prevent rulers to sync all RuleGroup. #5563
105+
* [BUGFIX] Query Frontend: Fix query string being omitted in query stats log. #5655
105106

106107
## 1.15.3 2023-06-22
107108

pkg/frontend/transport/handler.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ type Handler struct {
9898
}
9999

100100
// NewHandler creates a new frontend handler.
101-
func NewHandler(cfg HandlerConfig, roundTripper http.RoundTripper, log log.Logger, reg prometheus.Registerer) http.Handler {
101+
func NewHandler(cfg HandlerConfig, roundTripper http.RoundTripper, log log.Logger, reg prometheus.Registerer) *Handler {
102102
h := &Handler{
103103
cfg: cfg,
104104
log: log,
@@ -407,17 +407,17 @@ func (f *Handler) parseRequestQueryString(r *http.Request, bodyBuf bytes.Buffer)
407407
}
408408

409409
func formatQueryString(queryString url.Values) (fields []interface{}) {
410-
var queryFields []string
410+
var queryFields []interface{}
411411
for k, v := range queryString {
412412
// If `query` or `match[]` field exists, we always put it as the last field.
413413
if k == "query" || k == "match[]" {
414-
queryFields = []string{fmt.Sprintf("param_%s", k), strings.Join(v, ",")}
414+
queryFields = []interface{}{fmt.Sprintf("param_%s", k), strings.Join(v, ",")}
415415
continue
416416
}
417417
fields = append(fields, fmt.Sprintf("param_%s", k), strings.Join(v, ","))
418418
}
419419
if len(queryFields) > 0 {
420-
fields = append(fields, queryFields)
420+
fields = append(fields, queryFields...)
421421
}
422422
return fields
423423
}

pkg/frontend/transport/handler_test.go

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package transport
22

33
import (
4+
"bytes"
45
"context"
56
"io"
67
"net/http"
78
"net/http/httptest"
9+
"net/url"
810
"strings"
911
"testing"
12+
"time"
1013

1114
"github.com/go-kit/log"
1215
"github.com/pkg/errors"
@@ -16,6 +19,8 @@ import (
1619
"github.com/stretchr/testify/require"
1720
"github.com/weaveworks/common/httpgrpc"
1821
"github.com/weaveworks/common/user"
22+
23+
querier_stats "github.com/cortexproject/cortex/pkg/querier/stats"
1924
)
2025

2126
type roundTripperFunc func(*http.Request) (*http.Response, error)
@@ -274,8 +279,44 @@ func TestHandler_ServeHTTP(t *testing.T) {
274279
assert.Equal(t, tt.expectedMetrics, count)
275280

276281
if tt.additionalMetricsCheckFunc != nil {
277-
tt.additionalMetricsCheckFunc(handler.(*Handler))
282+
tt.additionalMetricsCheckFunc(handler)
278283
}
279284
})
280285
}
281286
}
287+
288+
func TestReportQueryStatsFormat(t *testing.T) {
289+
outputBuf := bytes.NewBuffer(nil)
290+
logger := log.NewSyncLogger(log.NewLogfmtLogger(outputBuf))
291+
handler := NewHandler(HandlerConfig{QueryStatsEnabled: true}, http.DefaultTransport, logger, nil)
292+
293+
userID := "fake"
294+
queryString := url.Values(map[string][]string{"query": {"up"}})
295+
req, err := http.NewRequest(http.MethodGet, "http://localhost:8080/prometheus/api/v1/query", nil)
296+
require.NoError(t, err)
297+
req.Header = http.Header{
298+
"User-Agent": []string{"Grafana"},
299+
}
300+
resp := &http.Response{
301+
ContentLength: 1000,
302+
}
303+
stats := &querier_stats.QueryStats{
304+
Stats: querier_stats.Stats{
305+
WallTime: 3 * time.Second,
306+
FetchedSeriesCount: 100,
307+
FetchedChunksCount: 200,
308+
FetchedSamplesCount: 300,
309+
FetchedChunkBytes: 1024,
310+
FetchedDataBytes: 2048,
311+
},
312+
}
313+
responseErr := errors.New("foo_err")
314+
handler.reportQueryStats(req, userID, queryString, time.Second, stats, responseErr, http.StatusOK, resp)
315+
316+
data, err := io.ReadAll(outputBuf)
317+
require.NoError(t, err)
318+
319+
expectedLog := `level=error msg="query stats" component=query-frontend method=GET path=/prometheus/api/v1/query response_time=1s query_wall_time_seconds=3 fetched_series_count=100 fetched_chunks_count=200 fetched_samples_count=300 fetched_chunks_bytes=1024 fetched_data_bytes=2048 status_code=200 response_size=1000 query_length=2 user_agent=Grafana error=foo_err param_query=up
320+
`
321+
require.Equal(t, expectedLog, string(data))
322+
}

0 commit comments

Comments
 (0)