Zipkin: Improve error source (#99099)
* Zipkin: Improve error source * Revert file name change
This commit is contained in:
@@ -118,7 +118,7 @@ func (z *ZipkinClient) Traces(serviceName string, spanName string) ([][]model.Sp
|
||||
func (z *ZipkinClient) Trace(traceId string) ([]model.SpanModel, error) {
|
||||
trace := []model.SpanModel{}
|
||||
if traceId == "" {
|
||||
return trace, errors.New("invalid/empty traceId")
|
||||
return trace, backend.DownstreamError(errors.New("invalid/empty traceId"))
|
||||
}
|
||||
|
||||
traceUrl, err := url.JoinPath(z.url, "/api/v2/trace", url.QueryEscape(traceId))
|
||||
@@ -128,6 +128,9 @@ func (z *ZipkinClient) Trace(traceId string) ([]model.SpanModel, error) {
|
||||
|
||||
res, err := z.httpClient.Get(traceUrl)
|
||||
if err != nil {
|
||||
if backend.IsDownstreamHTTPError(err) {
|
||||
return trace, backend.DownstreamError(err)
|
||||
}
|
||||
return trace, err
|
||||
}
|
||||
|
||||
@@ -138,6 +141,15 @@ func (z *ZipkinClient) Trace(traceId string) ([]model.SpanModel, error) {
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
if res != nil && res.StatusCode/100 != 2 {
|
||||
err := backend.DownstreamError(fmt.Errorf("request failed: %s", res.Status))
|
||||
if backend.ErrorSourceFromHTTPStatus(res.StatusCode) == backend.ErrorSourceDownstream {
|
||||
return trace, backend.DownstreamError(err)
|
||||
}
|
||||
return trace, err
|
||||
}
|
||||
|
||||
if err := json.NewDecoder(res.Body).Decode(&trace); err != nil {
|
||||
return trace, err
|
||||
}
|
||||
|
||||
@@ -2,11 +2,14 @@ package zipkin
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"net/url"
|
||||
"testing"
|
||||
|
||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||
"github.com/grafana/grafana-plugin-sdk-go/backend/log"
|
||||
"github.com/openzipkin/zipkin-go/model"
|
||||
"github.com/stretchr/testify/assert"
|
||||
@@ -17,29 +20,37 @@ func TestZipkinClient_Services(t *testing.T) {
|
||||
name string
|
||||
mockResponse string
|
||||
mockStatusCode int
|
||||
mockStatus string
|
||||
expectedResult []string
|
||||
expectError bool
|
||||
expectedError error
|
||||
}{
|
||||
{
|
||||
name: "Successful response",
|
||||
mockResponse: `["service1", "service2"]`,
|
||||
mockStatusCode: http.StatusOK,
|
||||
mockStatus: "OK",
|
||||
expectedResult: []string{"service1", "service2"},
|
||||
expectError: false,
|
||||
expectedError: nil,
|
||||
},
|
||||
{
|
||||
name: "Non-200 response",
|
||||
mockResponse: "",
|
||||
mockStatusCode: http.StatusInternalServerError,
|
||||
mockStatus: "Internal Server Error",
|
||||
expectedResult: []string{},
|
||||
expectError: true,
|
||||
expectedError: backend.DownstreamError(fmt.Errorf("request failed: Internal Server Error")),
|
||||
},
|
||||
{
|
||||
name: "Invalid JSON response",
|
||||
mockResponse: `{invalid json`,
|
||||
mockStatusCode: http.StatusOK,
|
||||
mockStatus: "OK",
|
||||
expectedResult: []string{},
|
||||
expectError: true,
|
||||
expectedError: errors.New("invalid character 'i' looking for beginning of value"),
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ func queryData(ctx context.Context, dsInfo *datasourceInfo, req *backend.QueryDa
|
||||
traces, err := dsInfo.ZipkinClient.Trace(query.Query)
|
||||
if err != nil {
|
||||
es := backend.ErrorSourcePlugin
|
||||
if backend.IsDownstreamHTTPError(err) {
|
||||
if backend.IsDownstreamError(err) {
|
||||
es = backend.ErrorSourceDownstream
|
||||
}
|
||||
response.Responses[q.RefID] = backend.DataResponse{
|
||||
|
||||
Reference in New Issue
Block a user