From eaf354088f96ffaa1e2e93dac61a6072af402948 Mon Sep 17 00:00:00 2001 From: Andreas Christou Date: Wed, 14 Jan 2026 16:45:39 +0000 Subject: [PATCH] Ensure we're checking the target correctly --- pkg/tsdb/graphite/healthcheck.go | 4 ++-- pkg/tsdb/graphite/query.go | 33 +++++++++++++++++--------------- pkg/tsdb/graphite/query_test.go | 24 +++++++++++------------ 3 files changed, 32 insertions(+), 29 deletions(-) diff --git a/pkg/tsdb/graphite/healthcheck.go b/pkg/tsdb/graphite/healthcheck.go index fd595fee2a1..85f413002b3 100644 --- a/pkg/tsdb/graphite/healthcheck.go +++ b/pkg/tsdb/graphite/healthcheck.go @@ -39,7 +39,7 @@ func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthReque _, span := tracing.DefaultTracer().Start(ctx, "graphite healthcheck") defer span.End() - graphiteReq, formData, _, err := s.createGraphiteRequest(ctx, healthCheckQuery, dsInfo) + graphiteReq, formData, _, _, err := s.createGraphiteRequest(ctx, healthCheckQuery, dsInfo) if err != nil { span.RecordError(err) span.SetStatus(codes.Error, err.Error()) @@ -81,7 +81,7 @@ func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthReque } }() - _, err = s.toDataFrames(res, healthCheckQuery.RefID, false) + _, err = s.toDataFrames(res, healthCheckQuery.RefID, false, targetStr) if err != nil { span.RecordError(err) span.SetStatus(codes.Error, err.Error()) diff --git a/pkg/tsdb/graphite/query.go b/pkg/tsdb/graphite/query.go index b1acde68751..422f73a2e20 100644 --- a/pkg/tsdb/graphite/query.go +++ b/pkg/tsdb/graphite/query.go @@ -24,15 +24,16 @@ import ( func (s *Service) RunQuery(ctx context.Context, req *backend.QueryDataRequest, dsInfo *datasourceInfo) (*backend.QueryDataResponse, error) { emptyQueries := []string{} graphiteQueries := map[string]struct { - req *http.Request - formData url.Values + req *http.Request + formData url.Values + rawTarget string }{} // FromAlert header is defined in pkg/services/ngalert/models/constants.go fromAlert := req.Headers["FromAlert"] == "true" result := backend.NewQueryDataResponse() for _, query := range req.Queries { - graphiteReq, formData, emptyQuery, err := s.createGraphiteRequest(ctx, query, dsInfo) + graphiteReq, formData, emptyQuery, target, err := s.createGraphiteRequest(ctx, query, dsInfo) if err != nil { result.Responses[query.RefID] = backend.ErrorResponseWithErrorSource(err) return result, nil @@ -44,11 +45,13 @@ func (s *Service) RunQuery(ctx context.Context, req *backend.QueryDataRequest, d } graphiteQueries[query.RefID] = struct { - req *http.Request - formData url.Values + req *http.Request + formData url.Values + rawTarget string }{ - req: graphiteReq, - formData: formData, + req: graphiteReq, + formData: formData, + rawTarget: target, } } @@ -99,7 +102,7 @@ func (s *Service) RunQuery(ctx context.Context, req *backend.QueryDataRequest, d } }() - queryFrames, err := s.toDataFrames(res, refId, fromAlert) + queryFrames, err := s.toDataFrames(res, refId, fromAlert, graphiteReq.rawTarget) if err != nil { span.RecordError(err) span.SetStatus(codes.Error, err.Error()) @@ -147,7 +150,7 @@ func (s *Service) processQuery(query backend.DataQuery) (string, *GraphiteQuery, return target, nil, queryJSON.IsMetricTank, nil } -func (s *Service) createGraphiteRequest(ctx context.Context, query backend.DataQuery, dsInfo *datasourceInfo) (*http.Request, url.Values, *GraphiteQuery, error) { +func (s *Service) createGraphiteRequest(ctx context.Context, query backend.DataQuery, dsInfo *datasourceInfo) (*http.Request, url.Values, *GraphiteQuery, string, error) { /* graphite doc about from and until, with sdk we are getting absolute instead of relative time https://graphite-api.readthedocs.io/en/latest/api.html#from-until @@ -163,12 +166,12 @@ func (s *Service) createGraphiteRequest(ctx context.Context, query backend.DataQ target, emptyQuery, isMetricTank, err := s.processQuery(query) if err != nil { - return nil, formData, nil, err + return nil, formData, nil, "", err } if emptyQuery != nil { s.logger.Debug("Graphite", "empty query target", emptyQuery) - return nil, formData, emptyQuery, nil + return nil, formData, emptyQuery, "", nil } formData["target"] = []string{target} @@ -188,13 +191,13 @@ func (s *Service) createGraphiteRequest(ctx context.Context, query backend.DataQ QueryParams: params, }) if err != nil { - return nil, formData, nil, err + return nil, formData, nil, "", err } - return graphiteReq, formData, emptyQuery, nil + return graphiteReq, formData, emptyQuery, target, nil } -func (s *Service) toDataFrames(response *http.Response, refId string, fromAlert bool) (frames data.Frames, error error) { +func (s *Service) toDataFrames(response *http.Response, refId string, fromAlert bool, rawTarget string) (frames data.Frames, error error) { responseData, err := s.parseResponse(response) if err != nil { return nil, err @@ -204,7 +207,7 @@ func (s *Service) toDataFrames(response *http.Response, refId string, fromAlert frames = data.Frames{} for _, series := range responseData { - aliasMatch := aliasRegex.MatchString(series.Target) + aliasMatch := aliasRegex.MatchString(rawTarget) timeVector := make([]time.Time, 0, len(series.DataPoints)) values := make([]*float64, 0, len(series.DataPoints)) diff --git a/pkg/tsdb/graphite/query_test.go b/pkg/tsdb/graphite/query_test.go index 03dfcfd41d4..d09cec3c351 100644 --- a/pkg/tsdb/graphite/query_test.go +++ b/pkg/tsdb/graphite/query_test.go @@ -182,7 +182,7 @@ func TestConvertResponses(t *testing.T) { expectedFrames := data.Frames{expectedFrame} httpResponse := &http.Response{StatusCode: 200, Body: io.NopCloser(strings.NewReader(body))} - dataFrames, err := service.toDataFrames(httpResponse, refId, false) + dataFrames, err := service.toDataFrames(httpResponse, refId, false, "target") require.NoError(t, err) if !reflect.DeepEqual(expectedFrames, dataFrames) { @@ -196,7 +196,7 @@ func TestConvertResponses(t *testing.T) { body := ` [ { - "target": "aliasedTarget(target)", + "target": "alias(target)", "tags": { "name": "target", "fooTag": "fooValue", "barTag": "barValue", "int": 100, "float": 3.14 }, "datapoints": [[50, 1], [null, 2], [100, 3]] } @@ -211,13 +211,13 @@ func TestConvertResponses(t *testing.T) { "barTag": "barValue", "int": "100", "float": "3.14", - "name": "target", - }, []*float64{&a, nil, &b}).SetConfig(&data.FieldConfig{DisplayNameFromDS: "aliasedTarget(target)"}), + "name": "alias(target)", + }, []*float64{&a, nil, &b}).SetConfig(&data.FieldConfig{DisplayNameFromDS: "alias(target)"}), ).SetMeta(&data.FrameMeta{Type: data.FrameTypeTimeSeriesMulti}) expectedFrames := data.Frames{expectedFrame} httpResponse := &http.Response{StatusCode: 200, Body: io.NopCloser(strings.NewReader(body))} - dataFrames, err := service.toDataFrames(httpResponse, refId, false) + dataFrames, err := service.toDataFrames(httpResponse, refId, false, "alias(target)") require.NoError(t, err) if !reflect.DeepEqual(expectedFrames, dataFrames) { @@ -240,7 +240,7 @@ func TestConvertResponses(t *testing.T) { expectedFrames := data.Frames{} httpResponse := &http.Response{StatusCode: 200, Body: io.NopCloser(strings.NewReader(body))} - dataFrames, err := service.toDataFrames(httpResponse, refId, false) + dataFrames, err := service.toDataFrames(httpResponse, refId, false, "") require.NoError(t, err) if !reflect.DeepEqual(expectedFrames, dataFrames) { @@ -281,7 +281,7 @@ func TestConvertResponses(t *testing.T) { expectedFrames := data.Frames{expectedFrame} httpResponse := &http.Response{StatusCode: 200, Body: io.NopCloser(strings.NewReader(body))} - dataFrames, err := service.toDataFrames(httpResponse, refId, false) + dataFrames, err := service.toDataFrames(httpResponse, refId, false, "target") require.NoError(t, err) if !reflect.DeepEqual(expectedFrames, dataFrames) { @@ -295,7 +295,7 @@ func TestConvertResponses(t *testing.T) { body := ` [ { - "target": "aliasedTarget(target)", + "target": "alias(target)", "tags": { "name": "target", "fooTag": "fooValue", "barTag": "barValue", "int": 100, "float": 3.14 }, "datapoints": [[50, 1], [null, 2], [100, 3]] } @@ -310,13 +310,13 @@ func TestConvertResponses(t *testing.T) { "barTag": "barValue", "int": "100", "float": "3.14", - "name": "aliasedTarget(target)", - }, []*float64{&a, nil, &b}).SetConfig(&data.FieldConfig{DisplayNameFromDS: "aliasedTarget(target)"}), + "name": "alias(target)", + }, []*float64{&a, nil, &b}).SetConfig(&data.FieldConfig{DisplayNameFromDS: "alias(target)"}), ).SetMeta(&data.FrameMeta{Type: data.FrameTypeTimeSeriesMulti}) expectedFrames := data.Frames{expectedFrame} httpResponse := &http.Response{StatusCode: 200, Body: io.NopCloser(strings.NewReader(body))} - dataFrames, err := service.toDataFrames(httpResponse, refId, true) + dataFrames, err := service.toDataFrames(httpResponse, refId, true, "alias(target)") require.NoError(t, err) if !reflect.DeepEqual(expectedFrames, dataFrames) { @@ -833,7 +833,7 @@ func TestAliasMatching(t *testing.T) { ]`, tc.target, tc.tagsName) httpResponse := &http.Response{StatusCode: 200, Body: io.NopCloser(strings.NewReader(body))} - dataFrames, err := service.toDataFrames(httpResponse, "A", tc.fromAlert) + dataFrames, err := service.toDataFrames(httpResponse, "A", tc.fromAlert, tc.target) require.NoError(t, err) require.Len(t, dataFrames, 1)