diff --git a/pkg/tsdb/jaeger/client.go b/pkg/tsdb/jaeger/client.go index 653c0463892..d858aa48f56 100644 --- a/pkg/tsdb/jaeger/client.go +++ b/pkg/tsdb/jaeger/client.go @@ -115,11 +115,15 @@ func (j *JaegerClient) Operations(s string) ([]string, error) { } func (j *JaegerClient) Search(query *JaegerQuery, start, end int64) ([]TraceResponse, error) { - jaegerURL, err := url.Parse(j.url) + u, err := url.JoinPath(j.url, "/api/traces") if err != nil { - return []TraceResponse{}, fmt.Errorf("failed to parse Jaeger URL: %w", err) + return []TraceResponse{}, backend.DownstreamError(fmt.Errorf("failed to join url path: %w", err)) + } + + jaegerURL, err := url.Parse(u) + if err != nil { + return []TraceResponse{}, backend.DownstreamError(fmt.Errorf("failed to parse Jaeger URL: %w", err)) } - jaegerURL.Path = "/api/traces" var queryTags string if query.Tags != "" { @@ -135,7 +139,7 @@ func (j *JaegerClient) Search(query *JaegerQuery, start, end int64) ([]TraceResp marshaledTags, err := json.Marshal(tagMap) if err != nil { - return []TraceResponse{}, fmt.Errorf("failed to convert tags to JSON: %w", err) + return []TraceResponse{}, backend.DownstreamError(fmt.Errorf("failed to convert tags to JSON: %w", err)) } queryTags = string(marshaledTags) diff --git a/pkg/tsdb/jaeger/client_test.go b/pkg/tsdb/jaeger/client_test.go index afabdc4bccc..eceb103ab82 100644 --- a/pkg/tsdb/jaeger/client_test.go +++ b/pkg/tsdb/jaeger/client_test.go @@ -186,6 +186,19 @@ func TestJaegerClient_Search(t *testing.T) { expectError bool expectedError error }{ + { + name: "Preserves base path in Jaeger URL", + query: &JaegerQuery{ + Service: "test-service", + }, + start: 1735689600000000, + end: 1738368000000000, + mockResponse: `{"data":[{"traceID":"test-trace-id"}]}`, + mockStatusCode: http.StatusOK, + expectedURL: "/abc/api/traces?end=1738368000000000&service=test-service&start=1735689600000000", + expectError: false, + expectedError: nil, + }, { name: "Successful search with all parameters", query: &JaegerQuery{ @@ -245,6 +258,11 @@ func TestJaegerClient_Search(t *testing.T) { settings := backend.DataSourceInstanceSettings{ URL: server.URL, } + + if tt.name == "Preserves base path in Jaeger URL" { + settings.URL = server.URL + "/abc" + } + client, err := New(server.Client(), log.NewNullLogger(), settings) assert.NoError(t, err) traces, err := client.Search(tt.query, tt.start, tt.end)