Loki: Fix a bug when reading frames without values but warnings (#97197)

* Loki: Fix a bug when reading frames without values but warnings

* Loki: Better bail if fields are less than 2
This commit is contained in:
Sven Grossmann
2024-11-29 15:34:59 +01:00
committed by GitHub
parent 0def6f2bce
commit b544b8afff
7 changed files with 110 additions and 11 deletions
+1 -10
View File
@@ -10,19 +10,10 @@ import (
"github.com/grafana/grafana-plugin-sdk-go/data"
)
// we adjust the dataframes to be the way frontend & alerting
// wants them.
func adjustFrame(frame *data.Frame, query *lokiQuery, setMetricFrameName bool, logsDataplane bool) error {
fields := frame.Fields
if len(fields) < 2 {
return fmt.Errorf("missing fields in frame")
}
// metric-fields have "timefield, valuefield"
// logs-fields have "labelsfield, timefield, ..."
secondField := fields[1]
secondField := frame.Fields[1]
if secondField.Type() == data.FieldTypeFloat64 {
return adjustMetricFrame(frame, query, setMetricFrameName)
+2
View File
@@ -54,6 +54,8 @@ func TestSuccessResponse(t *testing.T) {
{name: "parse structured metadata", filepath: "streams_structured_metadata", query: streamsQuery},
{name: "parse structured metadata different labels each log line", filepath: "streams_structured_metadata_2", query: streamsQuery},
{name: "parse warnings", filepath: "warning", query: streamsQuery},
}
runTest := func(folder string, path string, query lokiQuery, responseOpts ResponseOpts) {
+5 -1
View File
@@ -289,8 +289,12 @@ func runQuery(ctx context.Context, api *LokiAPI, query *lokiQuery, responseOpts
}
for _, frame := range res.Frames {
err = adjustFrame(frame, query, false, responseOpts.logsDataplane)
// Skip frames without fields
if len(frame.Fields) < 2 {
continue
}
err = adjustFrame(frame, query, false, responseOpts.logsDataplane)
if err != nil {
plog.Error("Error adjusting frame", "error", err)
return res, err
@@ -0,0 +1,47 @@
// 🌟 This was machine generated. Do not edit. 🌟
//
// Frame[0] {
// "typeVersion": [
// 0,
// 0
// ],
// "notices": [
// {
// "severity": "warning",
// "text": "Some logs may have been dropped by Adaptive Logs sampling"
// }
// ]
// }
// Name: Warnings
// Dimensions: 0 Fields by 0 Rows
// +
// +
//
//
// 🌟 This was machine generated. Do not edit. 🌟
{
"status": 200,
"frames": [
{
"schema": {
"name": "Warnings",
"meta": {
"typeVersion": [
0,
0
],
"notices": [
{
"severity": "warning",
"text": "Some logs may have been dropped by Adaptive Logs sampling"
}
]
},
"fields": []
},
"data": {
"values": []
}
}
]
}
@@ -0,0 +1,4 @@
{
"status": "success",
"warnings": ["Some logs may have been dropped by Adaptive Logs sampling"]
}
@@ -0,0 +1,47 @@
// 🌟 This was machine generated. Do not edit. 🌟
//
// Frame[0] {
// "typeVersion": [
// 0,
// 0
// ],
// "notices": [
// {
// "severity": "warning",
// "text": "Some logs may have been dropped by Adaptive Logs sampling"
// }
// ]
// }
// Name: Warnings
// Dimensions: 0 Fields by 0 Rows
// +
// +
//
//
// 🌟 This was machine generated. Do not edit. 🌟
{
"status": 200,
"frames": [
{
"schema": {
"name": "Warnings",
"meta": {
"typeVersion": [
0,
0
],
"notices": [
{
"severity": "warning",
"text": "Some logs may have been dropped by Adaptive Logs sampling"
}
]
},
"fields": []
},
"data": {
"values": []
}
}
]
}
@@ -0,0 +1,4 @@
{
"status": "success",
"warnings": ["Some logs may have been dropped by Adaptive Logs sampling"]
}