temporary switch to alternative jsonpath implementation (#39090)

to work with go1.16 and avoid replace in go.mod
This commit is contained in:
Alexander Emelin 2021-09-10 16:24:31 +03:00 committed by GitHub
parent e68bf87de1
commit 5fcc9fe193
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 70 additions and 22 deletions

5
go.mod
View File

@ -11,9 +11,6 @@ replace github.com/denisenkom/go-mssqldb => github.com/grafana/go-mssqldb v0.0.0
// It's also present on grafana/loki's go.mod so we'll need till it gets updated.
replace k8s.io/client-go => k8s.io/client-go v0.22.1
// Temporary replace till https://github.com/ohler55/ojg/issues/72 solved to fix builds on 32-bit CPU.
replace github.com/ohler55/ojg => github.com/FZambia/ojg v1.12.6-0.20210910083152-5e71da98845c
require (
cloud.google.com/go/storage v1.14.0
cuelang.org/go v0.3.2
@ -73,7 +70,6 @@ require (
github.com/mattn/go-sqlite3 v1.14.7
github.com/matttproud/golang_protobuf_extensions v1.0.1
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f
github.com/ohler55/ojg v1.12.3
github.com/opentracing/opentracing-go v1.2.0
github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/pkg/browser v0.0.0-20210904010418-6d279e18f982 // indirect
@ -87,6 +83,7 @@ require (
github.com/robfig/cron/v3 v3.0.1
github.com/russellhaering/goxmldsig v1.1.0
github.com/smartystreets/goconvey v1.6.4
github.com/spyzhov/ajson v0.4.2
github.com/stretchr/testify v1.7.0
github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf
github.com/timberio/go-datemath v0.1.1-0.20200323150745-74ddef604fff

4
go.sum
View File

@ -160,8 +160,6 @@ github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3
github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
github.com/FZambia/eagle v0.0.1 h1:FN1yTkPihMb5nE8SrlRjoCf7T9H9bTKJFQOm6ach2YU=
github.com/FZambia/eagle v0.0.1/go.mod h1:xq6u/JeNZ5/8mrAQ76MMhzNTodASh9FavQlCgg4j48w=
github.com/FZambia/ojg v1.12.6-0.20210910083152-5e71da98845c h1:V4weFplCUxKfzuWcwDGYbsGA3nKhP+FZwADA93GnhMs=
github.com/FZambia/ojg v1.12.6-0.20210910083152-5e71da98845c/go.mod h1:LBbIVRAgoFbYBXQhRhuEpaJIqq+goSO63/FQ+nyJU88=
github.com/FZambia/sentinel v1.1.0 h1:qrCBfxc8SvJihYNjBWgwUI93ZCvFe/PJIPTHKmlp8a8=
github.com/FZambia/sentinel v1.1.0/go.mod h1:ytL1Am/RLlAoAXG6Kj5LNuw/TRRQrv2rt2FT26vP5gI=
github.com/HdrHistogram/hdrhistogram-go v0.9.0/go.mod h1:nxrse8/Tzg2tg3DZcZjm6qEclQKK70g0KxO61gFFZD4=
@ -1931,6 +1929,8 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
github.com/spyzhov/ajson v0.4.2 h1:JMByd/jZApPKDvNsmO90X2WWGbmT2ahDFp73QhZbg3s=
github.com/spyzhov/ajson v0.4.2/go.mod h1:63V+CGM6f1Bu/p4nLIN8885ojBdt88TbLoSFzyqMuVA=
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
github.com/streadway/amqp v0.0.0-20180528204448-e5adc2ada8b8/go.mod h1:1WNBiOZtZQLpVAyu0iTduoJL9hEsMloAK5XWrtW0xdY=
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=

View File

@ -9,8 +9,7 @@ import (
"time"
"github.com/grafana/grafana-plugin-sdk-go/data"
"github.com/ohler55/ojg/jp"
"github.com/ohler55/ojg/oj"
"github.com/spyzhov/ajson"
)
type ExactJsonConverterConfig struct {
@ -29,10 +28,10 @@ func NewExactJsonConverter(c ExactJsonConverterConfig) *ExactJsonConverter {
}
func (c *ExactJsonConverter) Convert(_ context.Context, vars Vars, body []byte) ([]*ChannelFrame, error) {
obj, err := oj.Parse(body)
if err != nil {
return nil, err
}
//obj, err := oj.Parse(body)
//if err != nil {
// return nil, err
//}
var fields []*data.Field
@ -46,15 +45,17 @@ func (c *ExactJsonConverter) Convert(_ context.Context, vars Vars, body []byte)
if strings.HasPrefix(f.Value, "$") {
// JSON path.
x, err := jp.ParseString(f.Value[1:])
nodes, err := ajson.JSONPath(body, f.Value)
if err != nil {
return nil, err
}
value := x.Get(obj)
if len(value) == 0 {
if len(nodes) == 0 {
field.Set(0, nil)
} else if len(value) == 1 {
val := value[0]
} else if len(nodes) == 1 {
val, err := nodes[0].Value()
if err != nil {
return nil, err
}
switch f.Type {
case data.FieldTypeNullableFloat64:
if val == nil {
@ -81,6 +82,41 @@ func (c *ExactJsonConverter) Convert(_ context.Context, vars Vars, body []byte)
} else {
return nil, errors.New("too many values")
}
//x, err := jp.ParseString(f.Value[1:])
//if err != nil {
// return nil, err
//}
//value := x.Get(obj)
//if len(value) == 0 {
// field.Set(0, nil)
//} else if len(value) == 1 {
// val := value[0]
// switch f.Type {
// case data.FieldTypeNullableFloat64:
// if val == nil {
// field.Set(0, nil)
// } else {
// switch v := val.(type) {
// case float64:
// field.SetConcrete(0, v)
// case int64:
// field.SetConcrete(0, float64(v))
// default:
// return nil, errors.New("malformed float64 type for: " + f.Name)
// }
// }
// case data.FieldTypeNullableString:
// v, ok := val.(string)
// if !ok {
// return nil, errors.New("malformed string type")
// }
// field.SetConcrete(0, v)
// default:
// return nil, fmt.Errorf("unsupported field type: %s (%s)", f.Type, f.Name)
// }
//} else {
// return nil, errors.New("too many values")
//}
} else if strings.HasPrefix(f.Value, "{") {
// Goja script.
script := strings.Trim(f.Value, "{}")
@ -120,18 +156,33 @@ func (c *ExactJsonConverter) Convert(_ context.Context, vars Vars, body []byte)
labels := map[string]string{}
for _, label := range f.Labels {
if strings.HasPrefix(label.Value, "$") {
x, err := jp.ParseString(label.Value[1:])
nodes, err := ajson.JSONPath(body, label.Value)
if err != nil {
return nil, err
}
value := x.Get(obj)
if len(value) == 0 {
if len(nodes) == 0 {
labels[label.Name] = ""
} else if len(value) == 1 {
labels[label.Name] = fmt.Sprintf("%v", value[0])
} else if len(nodes) == 1 {
value, err := nodes[0].Value()
if err != nil {
return nil, err
}
labels[label.Name] = fmt.Sprintf("%v", value)
} else {
return nil, errors.New("too many values for a label")
}
//x, err := jp.ParseString(label.Value[1:])
//if err != nil {
// return nil, err
//}
//value := x.Get(obj)
//if len(value) == 0 {
// labels[label.Name] = ""
//} else if len(value) == 1 {
// labels[label.Name] = fmt.Sprintf("%v", value[0])
//} else {
// return nil, errors.New("too many values for a label")
//}
} else if strings.HasPrefix(label.Value, "{") {
script := strings.Trim(label.Value, "{}")
var err error