diff --git a/pkg/tsdb/graphite/resource_handler.go b/pkg/tsdb/graphite/resource_handler.go index 2651c320d65..4a3fe29282c 100644 --- a/pkg/tsdb/graphite/resource_handler.go +++ b/pkg/tsdb/graphite/resource_handler.go @@ -294,7 +294,13 @@ func (s *Service) handleFunctions(ctx context.Context, dsInfo *datasourceInfo, _ _, rawBody, statusCode, err := doGraphiteRequest[map[string]any](ctx, dsInfo, s.logger, req, true) if err != nil { - return nil, statusCode, fmt.Errorf("version request failed: %v", err) + return nil, statusCode, fmt.Errorf("functions request failed: %v", err) + } + + // It's possible that a HTML response may be returned + // This isn't valid so we'll return an error and use the default functions + if strings.HasPrefix(string(*rawBody), "<") { + return []byte{}, http.StatusNotAcceptable, fmt.Errorf("invalid functions response received from Graphite") } if rawBody == nil { diff --git a/pkg/tsdb/graphite/resource_handler_test.go b/pkg/tsdb/graphite/resource_handler_test.go index 66777f95072..c8ee9da1293 100644 --- a/pkg/tsdb/graphite/resource_handler_test.go +++ b/pkg/tsdb/graphite/resource_handler_test.go @@ -735,21 +735,41 @@ func TestHandleFunctions(t *testing.T) { responseBody: `{"error": "internal error"}`, statusCode: 500, expectError: true, - errorContains: "version request failed", + errorContains: "functions request failed", }, { name: "functions request not found", responseBody: `{"error": "not found"}`, statusCode: 404, expectError: true, - errorContains: "version request failed", + errorContains: "functions request failed", }, { name: "network error", responseBody: "", statusCode: 0, expectError: true, - errorContains: "version request failed", + errorContains: "functions request failed", + }, + { + name: "html response", + responseBody: ` +
+