fixed label values decoding for pushgateway compatibility (#4727)

Fixed decoding of label values with slash for pushgateway and prometheus golang client compatibility + added some tests. (#4962)
This commit is contained in:
Alexander Marshalov 2023-07-27 17:09:28 +02:00 committed by Aliaksandr Valialkin
parent 775fbe0c30
commit 4bbf8692c3
No known key found for this signature in database
GPG key ID: A72BEC6CD3D0DED1
3 changed files with 5 additions and 1 deletions

View file

@ -18,6 +18,7 @@ The following tip changes can be tested by building VictoriaMetrics components f
* SECURITY: upgrade Go builder from Go1.20.4 to Go1.21.0.
* SECURITY: upgrade base docker image (Alpine) from 3.18.2 to 3.18.3. See [alpine 3.18.3 release notes](https://alpinelinux.org/posts/Alpine-3.15.10-3.16.7-3.17.5-3.18.3-released.html).
* BUGFIX: vminsert: fixed decoding of label values with slash for pushgateway and prometheus golang client compatibility. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4692).
* BUGFIX: [vmagent](https://docs.victoriametrics.com/vmagent.html): properly apply `if` filters during [relabeling](https://docs.victoriametrics.com/vmagent.html#relabeling-enhancements). Previously the `if` filter could improperly work. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4806) and [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4816).
* BUGFIX: [vmagent](https://docs.victoriametrics.com/vmagent.html): fix possible panic at shutdown when [stream aggregation](https://docs.victoriametrics.com/stream-aggregation.html) is enabled. See [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4407) for details.
* BUGFIX: [vmauth](https://docs.victoriametrics.com/vmauth.html): Properly handle LOCAL command for proxy protocol. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3335#issuecomment-1569864108).

View file

@ -64,7 +64,7 @@ func getPushgatewayLabels(path string) ([]prompbmarshal.Label, error) {
s = s[n+1:]
}
if isBase64 {
data, err := base64.URLEncoding.DecodeString(value)
data, err := base64.RawURLEncoding.DecodeString(strings.TrimRight(value, "="))
if err != nil {
return nil, fmt.Errorf("cannot base64-decode value=%q for label=%q: %w", value, name, err)
}

View file

@ -62,6 +62,9 @@ func TestGetPushgatewayLabelsSuccess(t *testing.T) {
f("/foo/metrics/job@base64/Zm9v", `{job="foo"}`)
f("/foo/metrics/job/x/a/foo/aaa/bar", `{a="foo",aaa="bar",job="x"}`)
f("/foo/metrics/job/x/a@base64/Zm9v", `{a="foo",job="x"}`)
f("/metrics/job/test/region@base64/YXotc291dGhlYXN0LTEtZjAxL3d6eS1hei1zb3V0aGVhc3QtMQ", `{job="test",region="az-southeast-1-f01/wzy-az-southeast-1"}`)
f("/metrics/job/test/empty@base64/=", `{job="test"}`)
f("/metrics/job/test/test@base64/PT0vPT0", `{job="test",test="==/=="}`)
}
func TestGetPushgatewayLabelsFailure(t *testing.T) {