GCM: Correctly mark errors as downstream (#97196)

* Correctly mark query type error as downstream

* Correctly mark Prom parsing failures as downstream errors

* Rename function for clarity
This commit is contained in:
Andreas Christou 2024-12-05 15:41:52 +00:00 committed by GitHub
parent 3838fa5e55
commit addbdb0545
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 68 additions and 67 deletions

View File

@ -443,7 +443,7 @@ func (s *Service) buildQueryExecutors(logger log.Logger, req *backend.QueryDataR
} }
queryInterface = cmp queryInterface = cmp
default: default:
return nil, fmt.Errorf("unrecognized query type %q", query.QueryType) return nil, backend.DownstreamError(fmt.Errorf("unrecognized query type %q", query.QueryType))
} }
cloudMonitoringQueryExecutors = append(cloudMonitoringQueryExecutors, queryInterface) cloudMonitoringQueryExecutors = append(cloudMonitoringQueryExecutors, queryInterface)

View File

@ -23,8 +23,8 @@ type Options struct {
Dataplane bool Dataplane bool
} }
func rspErr(e error) backend.DataResponse { func rspDownstreamErr(e error) backend.DataResponse {
return backend.DataResponse{Error: e} return backend.DataResponse{Error: e, ErrorSource: backend.ErrorSourceDownstream}
} }
// ReadPrometheusStyleResult will read results from a prometheus or loki server and return data frames // ReadPrometheusStyleResult will read results from a prometheus or loki server and return data frames
@ -39,38 +39,38 @@ func ReadPrometheusStyleResult(jIter *jsoniter.Iterator, opt Options) backend.Da
l1Fields: l1Fields:
for l1Field, err := iter.ReadObject(); ; l1Field, err = iter.ReadObject() { for l1Field, err := iter.ReadObject(); ; l1Field, err = iter.ReadObject() {
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
switch l1Field { switch l1Field {
case "status": case "status":
if status, err = iter.ReadString(); err != nil { if status, err = iter.ReadString(); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
case "data": case "data":
rsp = readPrometheusData(iter, opt) rsp = readPrometheusData(iter, opt)
if rsp.Error != nil { if rsp.Error != nil {
return rsp return rspDownstreamErr(err)
} }
case "error": case "error":
if promErrString, err = iter.ReadString(); err != nil { if promErrString, err = iter.ReadString(); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
case "errorType": case "errorType":
if errorType, err = iter.ReadString(); err != nil { if errorType, err = iter.ReadString(); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
case "warnings": case "warnings":
if warnings, err = readWarnings(iter); err != nil { if warnings, err = readWarnings(iter); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
case "": case "":
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
break l1Fields break l1Fields
@ -86,7 +86,8 @@ l1Fields:
if status == "error" { if status == "error" {
return backend.DataResponse{ return backend.DataResponse{
Error: fmt.Errorf("%s: %s", errorType, promErrString), Error: fmt.Errorf("%s: %s", errorType, promErrString),
ErrorSource: backend.ErrorSourceDownstream,
} }
} }
@ -141,7 +142,7 @@ func readPrometheusData(iter *sdkjsoniter.Iterator, opt Options) backend.DataRes
var rsp backend.DataResponse var rsp backend.DataResponse
t, err := iter.WhatIsNext() t, err := iter.WhatIsNext()
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
if t == sdkjsoniter.ArrayValue { if t == sdkjsoniter.ArrayValue {
@ -163,27 +164,27 @@ func readPrometheusData(iter *sdkjsoniter.Iterator, opt Options) backend.DataRes
l1Fields: l1Fields:
for l1Field, err := iter.ReadObject(); ; l1Field, err = iter.ReadObject() { for l1Field, err := iter.ReadObject(); ; l1Field, err = iter.ReadObject() {
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
switch l1Field { switch l1Field {
case "encodingFlags": case "encodingFlags":
for ok, err := iter.ReadArray(); ok; ok, err = iter.ReadArray() { for ok, err := iter.ReadArray(); ok; ok, err = iter.ReadArray() {
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
encodingFlag, err := iter.ReadString() encodingFlag, err := iter.ReadString()
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
encodingFlags = append(encodingFlags, encodingFlag) encodingFlags = append(encodingFlags, encodingFlag)
} }
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
case "resultType": case "resultType":
resultType, err = iter.ReadString() resultType, err = iter.ReadString()
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
resultTypeFound = true resultTypeFound = true
@ -206,7 +207,7 @@ l1Fields:
case "stats": case "stats":
v, err := iter.Read() v, err := iter.Read()
if err != nil { if err != nil {
rspErr(err) rspDownstreamErr(err)
} }
if len(rsp.Frames) > 0 { if len(rsp.Frames) > 0 {
meta := rsp.Frames[0].Meta meta := rsp.Frames[0].Meta
@ -221,17 +222,17 @@ l1Fields:
case "": case "":
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
if !resultTypeFound { if !resultTypeFound {
return rspErr(fmt.Errorf("no resultType found")) return rspDownstreamErr(fmt.Errorf("no resultType found"))
} }
break l1Fields break l1Fields
default: default:
v, err := iter.Read() v, err := iter.Read()
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
logf("[data] TODO, support key: %s / %v\n", l1Field, v) logf("[data] TODO, support key: %s / %v\n", l1Field, v)
} }
@ -269,7 +270,7 @@ func readResult(resultType string, rsp backend.DataResponse, iter *sdkjsoniter.I
} }
default: default:
if err := iter.Skip(); err != nil { if err := iter.Skip(); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
rsp = backend.DataResponse{ rsp = backend.DataResponse{
Error: fmt.Errorf("unknown result type: %s", resultType), Error: fmt.Errorf("unknown result type: %s", resultType),
@ -289,19 +290,19 @@ func readArrayData(iter *sdkjsoniter.Iterator) backend.DataResponse {
stringField.Name = "Value" stringField.Name = "Value"
for more, err := iter.ReadArray(); more; more, err = iter.ReadArray() { for more, err := iter.ReadArray(); more; more, err = iter.ReadArray() {
if err != nil { if err != nil {
rspErr(err) rspDownstreamErr(err)
} }
next, err := iter.WhatIsNext() next, err := iter.WhatIsNext()
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
switch next { switch next {
case sdkjsoniter.StringValue: case sdkjsoniter.StringValue:
s, err := iter.ReadString() s, err := iter.ReadString()
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
stringField.Append(s) stringField.Append(s)
@ -309,7 +310,7 @@ func readArrayData(iter *sdkjsoniter.Iterator) backend.DataResponse {
case sdkjsoniter.ObjectValue: case sdkjsoniter.ObjectValue:
exemplar, labelPairs, err := readLabelsOrExemplars(iter) exemplar, labelPairs, err := readLabelsOrExemplars(iter)
if err != nil { if err != nil {
rspErr(err) rspDownstreamErr(err)
} }
if exemplar != nil { if exemplar != nil {
rsp.Frames = append(rsp.Frames, exemplar) rsp.Frames = append(rsp.Frames, exemplar)
@ -349,7 +350,7 @@ func readArrayData(iter *sdkjsoniter.Iterator) backend.DataResponse {
{ {
ext, err := iter.ReadAny() ext, err := iter.ReadAny()
if err != nil { if err != nil {
rspErr(err) rspDownstreamErr(err)
} }
v := fmt.Sprintf("%v", ext) v := fmt.Sprintf("%v", ext)
stringField.Append(v) stringField.Append(v)
@ -505,25 +506,25 @@ func readString(iter *sdkjsoniter.Iterator) backend.DataResponse {
_, err := iter.ReadArray() _, err := iter.ReadArray()
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
var t float64 var t float64
if t, err = iter.ReadFloat64(); err != nil { if t, err = iter.ReadFloat64(); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
if _, err = iter.ReadArray(); err != nil { if _, err = iter.ReadArray(); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
var v string var v string
if v, err = iter.ReadString(); err != nil { if v, err = iter.ReadString(); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
if _, err = iter.ReadArray(); err != nil { if _, err = iter.ReadArray(); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
tt := timeFromFloat(t) tt := timeFromFloat(t)
@ -578,7 +579,7 @@ func readMatrixOrVectorMulti(iter *sdkjsoniter.Iterator, resultType string, opt
for more, err := iter.ReadArray(); more; more, err = iter.ReadArray() { for more, err := iter.ReadArray(); more; more, err = iter.ReadArray() {
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
timeField := data.NewFieldFromFieldType(data.FieldTypeTime, 0) timeField := data.NewFieldFromFieldType(data.FieldTypeTime, 0)
timeField.Name = data.TimeSeriesTimeFieldName timeField.Name = data.TimeSeriesTimeFieldName
@ -590,18 +591,18 @@ func readMatrixOrVectorMulti(iter *sdkjsoniter.Iterator, resultType string, opt
for l1Field, err := iter.ReadObject(); l1Field != ""; l1Field, err = iter.ReadObject() { for l1Field, err := iter.ReadObject(); l1Field != ""; l1Field, err = iter.ReadObject() {
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
switch l1Field { switch l1Field {
case "metric": case "metric":
if err = iter.ReadVal(&valueField.Labels); err != nil { if err = iter.ReadVal(&valueField.Labels); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
case "value": case "value":
t, v, err := readTimeValuePair(iter) t, v, err := readTimeValuePair(iter)
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
timeField.Append(t) timeField.Append(t)
valueField.Append(v) valueField.Append(v)
@ -610,11 +611,11 @@ func readMatrixOrVectorMulti(iter *sdkjsoniter.Iterator, resultType string, opt
case "values": case "values":
for more, err := iter.ReadArray(); more; more, err = iter.ReadArray() { for more, err := iter.ReadArray(); more; more, err = iter.ReadArray() {
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
t, v, err := readTimeValuePair(iter) t, v, err := readTimeValuePair(iter)
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
timeField.Append(t) timeField.Append(t)
valueField.Append(v) valueField.Append(v)
@ -626,7 +627,7 @@ func readMatrixOrVectorMulti(iter *sdkjsoniter.Iterator, resultType string, opt
} }
err = readHistogram(iter, histogram) err = readHistogram(iter, histogram)
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
case "histograms": case "histograms":
@ -635,16 +636,16 @@ func readMatrixOrVectorMulti(iter *sdkjsoniter.Iterator, resultType string, opt
} }
for more, err := iter.ReadArray(); more; more, err = iter.ReadArray() { for more, err := iter.ReadArray(); more; more, err = iter.ReadArray() {
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
if err = readHistogram(iter, histogram); err != nil { if err = readHistogram(iter, histogram); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
} }
default: default:
if err = iter.Skip(); err != nil { if err = iter.Skip(); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
logf("readMatrixOrVector: %s\n", l1Field) logf("readMatrixOrVector: %s\n", l1Field)
} }
@ -874,13 +875,13 @@ func readStream(iter *sdkjsoniter.Iterator) backend.DataResponse {
for more, err := iter.ReadArray(); more; more, err = iter.ReadArray() { for more, err := iter.ReadArray(); more; more, err = iter.ReadArray() {
if err != nil { if err != nil {
rspErr(err) rspDownstreamErr(err)
} }
l1Fields: l1Fields:
for l1Field, err := iter.ReadObject(); ; l1Field, err = iter.ReadObject() { for l1Field, err := iter.ReadObject(); ; l1Field, err = iter.ReadObject() {
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
switch l1Field { switch l1Field {
case "stream": case "stream":
@ -888,11 +889,11 @@ func readStream(iter *sdkjsoniter.Iterator) backend.DataResponse {
// only appends to it // only appends to it
labels := data.Labels{} labels := data.Labels{}
if err = iter.ReadVal(&labels); err != nil { if err = iter.ReadVal(&labels); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
if labelJson, err = labelsToRawJson(labels); err != nil { if labelJson, err = labelsToRawJson(labels); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
case "values": case "values":
@ -903,30 +904,30 @@ func readStream(iter *sdkjsoniter.Iterator) backend.DataResponse {
} }
if _, err = iter.ReadArray(); err != nil { if _, err = iter.ReadArray(); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
ts, err := iter.ReadString() ts, err := iter.ReadString()
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
if _, err = iter.ReadArray(); err != nil { if _, err = iter.ReadArray(); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
line, err := iter.ReadString() line, err := iter.ReadString()
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
if _, err = iter.ReadArray(); err != nil { if _, err = iter.ReadArray(); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
t, err := timeFromLokiString(ts) t, err := timeFromLokiString(ts)
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
labelsField.Append(labelJson) labelsField.Append(labelJson)
@ -936,7 +937,7 @@ func readStream(iter *sdkjsoniter.Iterator) backend.DataResponse {
} }
case "": case "":
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
break l1Fields break l1Fields
} }
@ -973,13 +974,13 @@ func readCategorizedStream(iter *sdkjsoniter.Iterator) backend.DataResponse {
for more, err := iter.ReadArray(); more; more, err = iter.ReadArray() { for more, err := iter.ReadArray(); more; more, err = iter.ReadArray() {
if err != nil { if err != nil {
rspErr(err) rspDownstreamErr(err)
} }
l1Fields: l1Fields:
for l1Field, err := iter.ReadObject(); ; l1Field, err = iter.ReadObject() { for l1Field, err := iter.ReadObject(); ; l1Field, err = iter.ReadObject() {
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
switch l1Field { switch l1Field {
case "stream": case "stream":
@ -987,7 +988,7 @@ func readCategorizedStream(iter *sdkjsoniter.Iterator) backend.DataResponse {
// only appends to it // only appends to it
indexedLabels = data.Labels{} indexedLabels = data.Labels{}
if err = iter.ReadVal(&indexedLabels); err != nil { if err = iter.ReadVal(&indexedLabels); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
case "values": case "values":
@ -998,39 +999,39 @@ func readCategorizedStream(iter *sdkjsoniter.Iterator) backend.DataResponse {
} }
if _, err = iter.ReadArray(); err != nil { if _, err = iter.ReadArray(); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
ts, err := iter.ReadString() ts, err := iter.ReadString()
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
if _, err = iter.ReadArray(); err != nil { if _, err = iter.ReadArray(); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
line, err := iter.ReadString() line, err := iter.ReadString()
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
if _, err = iter.ReadArray(); err != nil { if _, err = iter.ReadArray(); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
parsedLabelsMap, structuredMetadataMap, err := readCategorizedStreamField(iter) parsedLabelsMap, structuredMetadataMap, err := readCategorizedStreamField(iter)
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
if _, err = iter.ReadArray(); err != nil { if _, err = iter.ReadArray(); err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
t, err := timeFromLokiString(ts) t, err := timeFromLokiString(ts)
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
typeMap := data.Labels{} typeMap := data.Labels{}
@ -1054,12 +1055,12 @@ func readCategorizedStream(iter *sdkjsoniter.Iterator) backend.DataResponse {
labelJson, err := labelsToRawJson(clonedLabels) labelJson, err := labelsToRawJson(clonedLabels)
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
labelTypesJson, err := labelsToRawJson(typeMap) labelTypesJson, err := labelsToRawJson(typeMap)
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
labelsField.Append(labelJson) labelsField.Append(labelJson)
@ -1070,7 +1071,7 @@ func readCategorizedStream(iter *sdkjsoniter.Iterator) backend.DataResponse {
} }
case "": case "":
if err != nil { if err != nil {
return rspErr(err) return rspDownstreamErr(err)
} }
break l1Fields break l1Fields
} }