Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ It is recommend to upgrade the storage components first (Receive, Store, etc.) a
- [#8714](https://github.com/thanos-io/thanos/pull/8714): Tracing: Fix `tls_config` fields (`ca_file`, `cert_file`, `key_file`) being silently ignored when using the OTLP gRPC exporter. Previously, deployments using a private CA or mTLS client certificates had to work around this via `OTEL_EXPORTER_OTLP_CERTIFICATE` and related environment variables.
- [#8128](https://github.com/thanos-io/thanos/issues/8128): Query-Frontend: Fix panic in `AnalyzesMerge` caused by indexing the wrong slice variable, leading to an out-of-range access when merging more than two query analyses.
- [#8720](https://github.com/thanos-io/thanos/issues/8720): Receive: Fix 503 errors during restarts in some cases.
- [#8762](https://github.com/thanos-io/thanos/pull/8762): Query-Frontend: Fix trace ID missing from slow query logs, regression from #8618.

### Added

Expand Down
8 changes: 2 additions & 6 deletions internal/cortex/frontend/transport/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ func (f *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {

// Ensure we log slow queries and query statistics regardless of how the request completes.
defer func() {
f.reportQueryStatsAndSlowQueries(r, resp, buf, startTime, stats)
f.reportQueryStatsAndSlowQueries(r, w.Header(), buf, startTime, stats)
}()

var err error
Expand All @@ -153,7 +153,7 @@ func (f *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
}

// reportQueryStatsAndSlowQueries handles logging of slow queries and query statistics.
func (f *Handler) reportQueryStatsAndSlowQueries(r *http.Request, resp *http.Response, buf bytes.Buffer, startTime time.Time, stats *querier_stats.Stats) {
func (f *Handler) reportQueryStatsAndSlowQueries(r *http.Request, responseHeaders http.Header, buf bytes.Buffer, startTime time.Time, stats *querier_stats.Stats) {
queryResponseTime := time.Since(startTime)

shouldReportSlowQuery := f.cfg.LogQueriesLongerThan != 0 &&
Expand All @@ -164,10 +164,6 @@ func (f *Handler) reportQueryStatsAndSlowQueries(r *http.Request, resp *http.Res
queryString := f.parseRequestQueryString(r, buf)

if shouldReportSlowQuery {
var responseHeaders http.Header
if resp != nil {
responseHeaders = resp.Header
}
f.reportSlowQuery(r, responseHeaders, queryString, queryResponseTime, stats)
}
if f.cfg.QueryStatsEnabled {
Expand Down
15 changes: 13 additions & 2 deletions internal/cortex/frontend/transport/handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ func TestHandler_SlowQueryLog(t *testing.T) {
"param_query=absent(up)",
"param_start=1714262400",
"param_end=1714266000",
"trace_id=test-trace-id-123",
},
},
{
Expand Down Expand Up @@ -114,7 +115,9 @@ func TestHandler_SlowQueryLog(t *testing.T) {

handler := NewHandler(cfg, fakeRoundTripper, logger, prometheus.NewRegistry())

handler.ServeHTTP(httptest.NewRecorder(), httptest.NewRequest("GET", tt.url, nil))
recorder := httptest.NewRecorder()
recorder.Header().Set("X-Thanos-Trace-Id", "test-trace-id-123")
handler.ServeHTTP(recorder, httptest.NewRequest("GET", tt.url, nil))

for _, part := range tt.logParts {
require.Contains(t, logWriter.String(), part)
Expand All @@ -141,11 +144,19 @@ func TestHandler_SlowQueryLogOnError(t *testing.T) {
logger := log.NewLogfmtLogger(log.NewSyncWriter(logWriter))

handler := NewHandler(cfg, fakeRT, logger, prometheus.NewRegistry())
handler.ServeHTTP(httptest.NewRecorder(), httptest.NewRequest("GET", "/api/v1/query?query=up", nil))

// Simulate tracing middleware setting the trace ID on the ResponseWriter
// before the handler runs. The slow query log must include this trace ID
// even when the round-tripper returns an error (resp is nil).
recorder := httptest.NewRecorder()
recorder.Header().Set("X-Thanos-Trace-Id", "test-trace-abc123")

handler.ServeHTTP(recorder, httptest.NewRequest("GET", "/api/v1/query?query=up", nil))

// Verify slow query is logged even when round-tripper returns an error
require.Contains(t, logWriter.String(), "slow query detected")
require.Contains(t, logWriter.String(), "time_taken=")
require.Contains(t, logWriter.String(), "path=/api/v1/query")
require.Contains(t, logWriter.String(), "param_query=up")
require.Contains(t, logWriter.String(), "test-trace-abc123")
}
Loading