Skip to content

Commit d3b4f1f

Browse files
committed
WIP: Initial support for CEL
This adds initial support for queries using the common expression language (CEL).
1 parent 661af08 commit d3b4f1f

File tree

6 files changed

+149
-28
lines changed

6 files changed

+149
-28
lines changed

config/config.go

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
type Metric struct {
2525
Name string
2626
Path string
27+
Cel string
2728
Labels map[string]string
2829
Type ScrapeType
2930
ValueType ValueType

examples/config.yml

+5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ modules:
1010
labels:
1111
environment: beta # static label
1212
location: 'planet-{.location}' # dynamic label
13+
- name: example_cel_global_value
14+
cel: '.counter'
15+
help: Example of a top-level global value scrape in the json
16+
labels:
17+
environment: beta # static label
1318
- name: example_timestamped_value
1419
type: object
1520
path: '{ .values[?(@.state == "INACTIVE")] }'

exporter/collector.go

+107-12
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020

2121
"github.com/go-kit/log"
2222
"github.com/go-kit/log/level"
23+
"github.com/google/cel-go/cel"
2324
"github.com/prometheus-community/json_exporter/config"
2425
"github.com/prometheus/client_golang/prometheus"
2526
"k8s.io/client-go/util/jsonpath"
@@ -35,6 +36,7 @@ type JSONMetric struct {
3536
Desc *prometheus.Desc
3637
Type config.ScrapeType
3738
KeyJSONPath string
39+
KeyCelExpression string
3840
ValueJSONPath string
3941
LabelsJSONPaths []string
4042
ValueType prometheus.ValueType
@@ -51,10 +53,25 @@ func (mc JSONMetricCollector) Collect(ch chan<- prometheus.Metric) {
5153
for _, m := range mc.JSONMetrics {
5254
switch m.Type {
5355
case config.ValueScrape:
54-
value, err := extractValue(mc.Logger, mc.Data, m.KeyJSONPath, false)
55-
if err != nil {
56-
level.Error(mc.Logger).Log("msg", "Failed to extract value for metric", "path", m.KeyJSONPath, "err", err, "metric", m.Desc)
57-
continue
56+
var value string
57+
var err error
58+
if m.KeyJSONPath != "" {
59+
level.Debug(mc.Logger).Log("msg", "Extracting value for metric", "path", m.KeyJSONPath, "err", err, "metric", m.Desc)
60+
61+
value, err = extractValue(mc.Logger, mc.Data, m.KeyJSONPath, false)
62+
if err != nil {
63+
level.Error(mc.Logger).Log("msg", "Failed to extract value for metric", "path", m.KeyJSONPath, "err", err, "metric", m.Desc)
64+
continue
65+
}
66+
} else {
67+
level.Debug(mc.Logger).Log("msg", "Extracting value for metric", "expression", m.KeyCelExpression, "err", err, "metric", m.Desc)
68+
69+
value, err = extractValueCEL(mc.Logger, mc.Data, m.KeyCelExpression)
70+
if err != nil {
71+
level.Error(mc.Logger).Log("msg", "Failed to extract value for metric", "expression", m.KeyCelExpression, "err", err, "metric", m.Desc)
72+
continue
73+
}
74+
5875
}
5976

6077
if floatValue, err := SanitizeValue(value); err == nil {
@@ -66,28 +83,52 @@ func (mc JSONMetricCollector) Collect(ch chan<- prometheus.Metric) {
6683
)
6784
ch <- timestampMetric(mc.Logger, m, mc.Data, metric)
6885
} else {
69-
level.Error(mc.Logger).Log("msg", "Failed to convert extracted value to float64", "path", m.KeyJSONPath, "value", value, "err", err, "metric", m.Desc)
86+
if m.KeyJSONPath != "" {
87+
level.Error(mc.Logger).Log("msg", "Failed to convert extracted value to float64", "path", m.KeyJSONPath, "value", value, "err", err, "metric", m.Desc)
88+
} else {
89+
level.Error(mc.Logger).Log("msg", "Failed to convert extracted value to float64", "expression", m.KeyCelExpression, "value", value, "err", err, "metric", m.Desc)
90+
}
7091
continue
7192
}
7293

7394
case config.ObjectScrape:
74-
values, err := extractValue(mc.Logger, mc.Data, m.KeyJSONPath, true)
75-
if err != nil {
76-
level.Error(mc.Logger).Log("msg", "Failed to extract json objects for metric", "err", err, "metric", m.Desc)
77-
continue
95+
var values string
96+
var err error
97+
if m.KeyJSONPath != "" {
98+
values, err = extractValue(mc.Logger, mc.Data, m.KeyJSONPath, true)
99+
if err != nil {
100+
level.Error(mc.Logger).Log("msg", "Failed to extract json objects for metric", "err", err, "metric", m.Desc)
101+
continue
102+
}
103+
} else {
104+
level.Debug(mc.Logger).Log("msg", "Extracting json objects for metric", "err", err, "metric", m.Desc)
105+
values, err = extractValueCEL(mc.Logger, mc.Data, m.KeyCelExpression)
106+
if err != nil {
107+
level.Error(mc.Logger).Log("msg", "Failed to extract json objects for metric", "err", err, "metric", m.Desc)
108+
continue
109+
}
78110
}
79111

80112
var jsonData []interface{}
81113
if err := json.Unmarshal([]byte(values), &jsonData); err == nil {
82114
for _, data := range jsonData {
83115
jdata, err := json.Marshal(data)
84116
if err != nil {
85-
level.Error(mc.Logger).Log("msg", "Failed to marshal data to json", "path", m.ValueJSONPath, "err", err, "metric", m.Desc, "data", data)
117+
if m.KeyJSONPath != "" {
118+
level.Error(mc.Logger).Log("msg", "Failed to marshal data to json", "path", m.ValueJSONPath, "err", err, "metric", m.Desc, "data", data)
119+
} else {
120+
level.Error(mc.Logger).Log("msg", "Failed to marshal data to json", "expression", m.KeyCelExpression, "err", err, "metric", m.Desc, "data", data)
121+
}
86122
continue
87123
}
88124
value, err := extractValue(mc.Logger, jdata, m.ValueJSONPath, false)
89125
if err != nil {
90-
level.Error(mc.Logger).Log("msg", "Failed to extract value for metric", "path", m.ValueJSONPath, "err", err, "metric", m.Desc)
126+
if m.KeyJSONPath != "" {
127+
level.Error(mc.Logger).Log("msg", "Failed to extract value for metric", "path", m.ValueJSONPath, "err", err, "metric", m.Desc)
128+
} else {
129+
level.Error(mc.Logger).Log("msg", "Failed to extract value for metric", "expression", m.KeyCelExpression, "err", err, "metric", m.Desc)
130+
131+
}
91132
continue
92133
}
93134

@@ -100,7 +141,11 @@ func (mc JSONMetricCollector) Collect(ch chan<- prometheus.Metric) {
100141
)
101142
ch <- timestampMetric(mc.Logger, m, jdata, metric)
102143
} else {
103-
level.Error(mc.Logger).Log("msg", "Failed to convert extracted value to float64", "path", m.ValueJSONPath, "value", value, "err", err, "metric", m.Desc)
144+
if m.KeyJSONPath != "" {
145+
level.Error(mc.Logger).Log("msg", "Failed to convert extracted value to float64", "path", m.KeyJSONPath, "value", value, "err", err, "metric", m.Desc)
146+
} else {
147+
level.Error(mc.Logger).Log("msg", "Failed to convert extracted value to float64", "expression", m.KeyCelExpression, "value", value, "err", err, "metric", m.Desc)
148+
}
104149
continue
105150
}
106151
}
@@ -148,6 +193,56 @@ func extractValue(logger log.Logger, data []byte, path string, enableJSONOutput
148193
return buf.String(), nil
149194
}
150195

196+
// Returns the last matching value at the given json path
197+
func extractValueCEL(logger log.Logger, data []byte, expression string) (string, error) {
198+
199+
var jsonData map[string]any
200+
201+
err := json.Unmarshal(data, &jsonData)
202+
if err != nil {
203+
level.Error(logger).Log("msg", "Failed to unmarshal data to json", "err", err, "data", data)
204+
return "", err
205+
}
206+
207+
inputVars := make([]cel.EnvOption, 0, len(jsonData))
208+
for k := range jsonData {
209+
inputVars = append(inputVars, cel.Variable(k, cel.DynType))
210+
}
211+
212+
env, err := cel.NewEnv(inputVars...)
213+
214+
if err != nil {
215+
level.Error(logger).Log("msg", "Failed to set up CEL environment", "err", err, "data", data)
216+
return "", err
217+
}
218+
219+
ast, issues := env.Compile(expression)
220+
if issues != nil && issues.Err() != nil {
221+
level.Error(logger).Log("CEL type-check error", issues.Err(), "expression", expression)
222+
return "", err
223+
}
224+
prg, err := env.Program(ast)
225+
if err != nil {
226+
level.Error(logger).Log("CEL program construction error", err)
227+
return "", err
228+
}
229+
230+
out, _, err := prg.Eval(jsonData)
231+
if err != nil {
232+
level.Error(logger).Log("msg", "Failed to evaluate cel query", "err", err, "expression", expression, "data", jsonData)
233+
return "", err
234+
}
235+
236+
result := out.ConvertToType(cel.StringType)
237+
238+
// Since we are finally going to extract only float64, unquote if necessary
239+
if res, err := jsonpath.UnquoteExtend(result.Value().(string)); err == nil {
240+
return res, nil
241+
}
242+
243+
return result.Value().(string), nil
244+
}
245+
151246
// Returns the list of labels created from the list of provided json paths
152247
func extractLabels(logger log.Logger, data []byte, paths []string) []string {
153248
labels := make([]string, len(paths))

exporter/util.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ func CreateMetricsList(c config.Module) ([]JSONMetric, error) {
104104
nil,
105105
),
106106
KeyJSONPath: metric.Path,
107+
KeyCelExpression: metric.Cel,
107108
LabelsJSONPaths: variableLabelsValues,
108109
ValueType: valueType,
109110
EpochTimestampJSONPath: metric.EpochTimestamp,
@@ -126,6 +127,7 @@ func CreateMetricsList(c config.Module) ([]JSONMetric, error) {
126127
nil,
127128
),
128129
KeyJSONPath: metric.Path,
130+
KeyCelExpression: metric.Cel,
129131
ValueJSONPath: valuePath,
130132
LabelsJSONPaths: variableLabelsValues,
131133
ValueType: valueType,
@@ -134,7 +136,7 @@ func CreateMetricsList(c config.Module) ([]JSONMetric, error) {
134136
metrics = append(metrics, jsonMetric)
135137
}
136138
default:
137-
return nil, fmt.Errorf("Unknown metric type: '%s', for metric: '%s'", metric.Type, metric.Name)
139+
return nil, fmt.Errorf("unknown metric type: '%s', for metric: '%s'", metric.Type, metric.Name)
138140
}
139141
}
140142
return metrics, nil

go.mod

+11-5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require (
66
github.com/Masterminds/sprig/v3 v3.2.3
77
github.com/alecthomas/kingpin/v2 v2.3.2
88
github.com/go-kit/log v0.2.1
9+
github.com/google/cel-go v0.18.1
910
github.com/prometheus/client_golang v1.16.0
1011
github.com/prometheus/common v0.44.0
1112
github.com/prometheus/exporter-toolkit v0.10.0
@@ -17,6 +18,7 @@ require (
1718
github.com/Masterminds/goutils v1.1.1 // indirect
1819
github.com/Masterminds/semver/v3 v3.2.0 // indirect
1920
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
21+
github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df // indirect
2022
github.com/beorn7/perks v1.0.1 // indirect
2123
github.com/cespare/xxhash/v2 v2.2.0 // indirect
2224
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
@@ -35,13 +37,17 @@ require (
3537
github.com/prometheus/procfs v0.10.1 // indirect
3638
github.com/shopspring/decimal v1.2.0 // indirect
3739
github.com/spf13/cast v1.3.1 // indirect
40+
github.com/stoewer/go-strcase v1.2.0 // indirect
3841
github.com/xhit/go-str2duration/v2 v2.1.0 // indirect
39-
golang.org/x/crypto v0.11.0 // indirect
40-
golang.org/x/net v0.13.0 // indirect
42+
golang.org/x/crypto v0.14.0 // indirect
43+
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect
44+
golang.org/x/net v0.17.0 // indirect
4145
golang.org/x/oauth2 v0.8.0 // indirect
4246
golang.org/x/sync v0.2.0 // indirect
43-
golang.org/x/sys v0.10.0 // indirect
44-
golang.org/x/text v0.11.0 // indirect
47+
golang.org/x/sys v0.13.0 // indirect
48+
golang.org/x/text v0.13.0 // indirect
4549
google.golang.org/appengine v1.6.7 // indirect
46-
google.golang.org/protobuf v1.30.0 // indirect
50+
google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5 // indirect
51+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5 // indirect
52+
google.golang.org/protobuf v1.31.0 // indirect
4753
)

go.sum

+22-10
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWr
88
github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE=
99
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc=
1010
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
11+
github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18=
12+
github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM=
1113
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
1214
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
1315
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
@@ -28,6 +30,8 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
2830
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
2931
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
3032
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
33+
github.com/google/cel-go v0.18.1 h1:V/lAXKq4C3BYLDy/ARzMtpkEEYfHQpZzVyzy69nEUjs=
34+
github.com/google/cel-go v0.18.1/go.mod h1:PVAybmSnWkNMUZR/tEWFUiJ1Np4Hz0MHsZJcgC4zln4=
3135
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
3236
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
3337
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -67,6 +71,8 @@ github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXY
6771
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
6872
github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
6973
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
74+
github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU=
75+
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
7076
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
7177
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
7278
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
@@ -78,16 +84,18 @@ github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5t
7884
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
7985
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
8086
golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
81-
golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
82-
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
87+
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
88+
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
89+
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA=
90+
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA=
8391
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
8492
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
8593
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
8694
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
8795
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
8896
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
89-
golang.org/x/net v0.13.0 h1:Nvo8UFsZ8X3BhAC9699Z1j7XQ3rsZnUUm7jfBEk1ueY=
90-
golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
97+
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
98+
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
9199
golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8=
92100
golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE=
93101
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -101,8 +109,8 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
101109
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
102110
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
103111
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
104-
golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
105-
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
112+
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
113+
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
106114
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
107115
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
108116
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
@@ -111,19 +119,23 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
111119
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
112120
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
113121
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
114-
golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
115-
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
122+
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
123+
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
116124
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
117125
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
118126
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
119127
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
120128
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
121129
google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
122130
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
131+
google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5 h1:nIgk/EEq3/YlnmVVXVnm14rC2oxgs1o0ong4sD/rd44=
132+
google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q=
133+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5 h1:eSaPbMR4T7WfH9FvABk36NBMacoTUKdWCvV0dx+KfOg=
134+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I=
123135
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
124136
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
125-
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
126-
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
137+
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
138+
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
127139
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
128140
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
129141
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

0 commit comments

Comments
 (0)