From 6d48fb69427271b91dad402e04e2bba6b78a8620 Mon Sep 17 00:00:00 2001 From: Ed Welch Date: Thu, 4 Mar 2021 16:15:46 -0500 Subject: [PATCH] change ReadStringAsSlice to ReadString so it doesn't parse quotes inside the packed _entry (#3432) --- pkg/logql/log/parser.go | 4 ++-- pkg/logql/log/parser_test.go | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/pkg/logql/log/parser.go b/pkg/logql/log/parser.go index 9dabba488ab0..64136f0e6276 100644 --- a/pkg/logql/log/parser.go +++ b/pkg/logql/log/parser.go @@ -358,11 +358,11 @@ func (u *UnpackParser) unpack(it *jsoniter.Iterator, entry []byte, lbs *LabelsBu case jsoniter.StringValue: // we only unpack map[string]string. Anything else is skipped. if field == PackedEntryKey { - s := iter.ReadStringAsSlice() + s := iter.ReadString() // todo(ctovena): we should just reslice the original line since the property is contiguous // but jsoniter doesn't allow us to do this right now. // https://github.com/buger/jsonparser might do a better job at this. - entry = append(entry[:0], s...) + entry = append(entry[:0], []byte(s)...) isPacked = true return true } diff --git a/pkg/logql/log/parser_test.go b/pkg/logql/log/parser_test.go index 2b3dbcb782ba..c2055eb60fbc 100644 --- a/pkg/logql/log/parser_test.go +++ b/pkg/logql/log/parser_test.go @@ -702,6 +702,19 @@ func Test_unpackParser_Parse(t *testing.T) { }, []byte(`{"bar":1,"app":"foo","namespace":"prod","pod":{"uid":"1"}}`), }, + { + "non json with escaped quotes", + []byte(`{"_entry":"I0303 17:49:45.976518 1526 kubelet_getters.go:178] \"Pod status updated\" pod=\"openshift-etcd/etcd-ip-10-0-150-50.us-east-2.compute.internal\" status=Running"}`), + labels.Labels{ + {Name: "app", Value: "bar"}, + {Name: "cluster", Value: "us-central1"}, + }, + labels.Labels{ + {Name: "app", Value: "bar"}, + {Name: "cluster", Value: "us-central1"}, + }, + []byte(`I0303 17:49:45.976518 1526 kubelet_getters.go:178] "Pod status updated" pod="openshift-etcd/etcd-ip-10-0-150-50.us-east-2.compute.internal" status=Running`), + }, } for _, tt := range tests { j := NewUnpackParser()