diff --git a/CHANGELOG.md b/CHANGELOG.md index 53099e7..1678a47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Thanks to @yincongcyincong for [the pull request](https://github.com/VictoriaMetrics/victorialogs-datasource/pull/69). * BUGFIX: correctly pass time range filter when querying variable values. Before, time filter wasn't applied for `/field_values` and `/field_names` API calls. See [this](https://github.com/VictoriaMetrics/victorialogs-datasource/issues/71) and [this](https://github.com/VictoriaMetrics/victorialogs-datasource/issues/72) issues. +* BUGFIX: fix the issue with displaying incorrect subfields when requesting logs with different set of fields. See [this issue](https://github.com/VictoriaMetrics/victorialogs-datasource/issues/60). ## v0.4.0 diff --git a/pkg/plugin/response.go b/pkg/plugin/response.go index 3712d49..115c441 100644 --- a/pkg/plugin/response.go +++ b/pkg/plugin/response.go @@ -41,8 +41,6 @@ func parseStreamResponse(reader io.Reader) backend.DataResponse { lineField := data.NewFieldFromFieldType(data.FieldTypeString, 0) lineField.Name = gLineField - labels := data.Labels{} - scanner := bufio.NewScanner(reader) for scanner.Scan() { @@ -63,6 +61,8 @@ func parseStreamResponse(reader io.Reader) backend.DataResponse { } timeFd.Append(getTime) } + + labels := data.Labels{} if value.Exists(streamField) { stream := value.GetStringBytes(streamField) expr, err := metricsql.Parse(string(stream)) diff --git a/pkg/plugin/response_test.go b/pkg/plugin/response_test.go index c799b82..46d4c2e 100644 --- a/pkg/plugin/response_test.go +++ b/pkg/plugin/response_test.go @@ -350,6 +350,70 @@ func Test_parseStreamResponse(t *testing.T) { frame.Meta = &data.FrameMeta{} rsp.Frames = append(rsp.Frames, frame) + return rsp + }, + }, + { + name: "new test", + response: `{"_time": "2024-09-10T12:24:38.124811Z","_stream_id": "00000000000000002e3bd2bdc376279a6418761ca20c417c","_stream": "{path=\"/var/lib/docker/containers/c01cbe414773fa6b3e4e0976fb27c3583b1a5cd4b7007662477df66987f97f89/c01cbe414773fa6b3e4e0976fb27c3583b1a5cd4b7007662477df66987f97f89-json.log\",stream=\"stderr\"}","_msg": "1","path": "/var/lib/docker/containers/c01cbe414773fa6b3e4e0976fb27c3583b1a5cd4b7007662477df66987f97f89/c01cbe414773fa6b3e4e0976fb27c3583b1a5cd4b7007662477df66987f97f89-json.log","stream": "stderr","time": "2024-09-10T12:24:38.124811792Z"} +{"_time": "2024-09-10T12:36:10.664553169Z","_stream_id": "0000000000000000356bfe9e3c71128c750d94c15df6b908","_stream": "{stream=\"stream1\"}","_msg": "2","date": "0","stream": "stream1","log.level": "info"} +{"_time": "2024-09-10T13:06:56.45147Z","_stream_id": "00000000000000002e3bd2bdc376279a6418761ca20c417c","_stream": "{path=\"/var/lib/docker/containers/c01cbe414773fa6b3e4e0976fb27c3583b1a5cd4b7007662477df66987f97f89/c01cbe414773fa6b3e4e0976fb27c3583b1a5cd4b7007662477df66987f97f89-json.log\",stream=\"stderr\"}","_msg": "3","path": "/var/lib/docker/containers/c01cbe414773fa6b3e4e0976fb27c3583b1a5cd4b7007662477df66987f97f89/c01cbe414773fa6b3e4e0976fb27c3583b1a5cd4b7007662477df66987f97f89-json.log","stream": "stderr","time": "2024-09-10T13:06:56.451470093Z"}`, + want: func() backend.DataResponse { + labelsField := data.NewFieldFromFieldType(data.FieldTypeJSON, 0) + labelsField.Name = gLabelsField + + timeFd := data.NewFieldFromFieldType(data.FieldTypeTime, 0) + timeFd.Name = gTimeField + + lineField := data.NewFieldFromFieldType(data.FieldTypeString, 0) + lineField.Name = gLineField + + timeFd.Append(time.Date(2024, 9, 10, 12, 24, 38, 124000000, time.UTC)) + timeFd.Append(time.Date(2024, 9, 10, 12, 36, 10, 664000000, time.UTC)) + timeFd.Append(time.Date(2024, 9, 10, 13, 06, 56, 451000000, time.UTC)) + + lineField.Append("1") + + labels := data.Labels{ + "_stream_id": "00000000000000002e3bd2bdc376279a6418761ca20c417c", + "path": "/var/lib/docker/containers/c01cbe414773fa6b3e4e0976fb27c3583b1a5cd4b7007662477df66987f97f89/c01cbe414773fa6b3e4e0976fb27c3583b1a5cd4b7007662477df66987f97f89-json.log", + "stream": "stderr", + "time": "2024-09-10T12:24:38.124811792Z", + } + + b, _ := labelsToJSON(labels) + labelsField.Append(b) + + lineField.Append("2") + + labels = data.Labels{ + "_stream_id": "0000000000000000356bfe9e3c71128c750d94c15df6b908", + "date": "0", + "stream": "stream1", + "log.level": "info", + } + + b, _ = labelsToJSON(labels) + labelsField.Append(b) + + lineField.Append("3") + + labels = data.Labels{ + "_stream_id": "00000000000000002e3bd2bdc376279a6418761ca20c417c", + "path": "/var/lib/docker/containers/c01cbe414773fa6b3e4e0976fb27c3583b1a5cd4b7007662477df66987f97f89/c01cbe414773fa6b3e4e0976fb27c3583b1a5cd4b7007662477df66987f97f89-json.log", + "stream": "stderr", + "time": "2024-09-10T13:06:56.451470093Z", + } + + b, _ = labelsToJSON(labels) + labelsField.Append(b) + + frame := data.NewFrame("", timeFd, lineField, labelsField) + + rsp := backend.DataResponse{} + frame.Meta = &data.FrameMeta{} + rsp.Frames = append(rsp.Frames, frame) + return rsp }, }, @@ -369,6 +433,7 @@ func Test_parseStreamResponse(t *testing.T) { if len(resp.Frames) != 1 { t.Fatalf("expected for response to always contain 1 Frame; got %d", len(resp.Frames)) } + got := resp.Frames[0] want := w.Frames[0] expFieldsLen := got.Fields[0].Len()