mirror of
https://github.com/prometheus/prometheus.git
synced 2025-03-05 20:59:13 -08:00
Merge branch 'main' into nhcb-scrape-impl
This commit is contained in:
commit
e0444d9384
18
go.mod
18
go.mod
|
@ -33,7 +33,7 @@ require (
|
||||||
github.com/google/go-cmp v0.6.0
|
github.com/google/go-cmp v0.6.0
|
||||||
github.com/google/pprof v0.0.0-20240711041743-f6c9dda6c6da
|
github.com/google/pprof v0.0.0-20240711041743-f6c9dda6c6da
|
||||||
github.com/google/uuid v1.6.0
|
github.com/google/uuid v1.6.0
|
||||||
github.com/gophercloud/gophercloud v1.14.0
|
github.com/gophercloud/gophercloud v1.14.1
|
||||||
github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc
|
github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0
|
github.com/grpc-ecosystem/grpc-gateway v1.16.0
|
||||||
github.com/hashicorp/consul/api v1.29.4
|
github.com/hashicorp/consul/api v1.29.4
|
||||||
|
@ -77,13 +77,13 @@ require (
|
||||||
go.uber.org/multierr v1.11.0
|
go.uber.org/multierr v1.11.0
|
||||||
golang.org/x/oauth2 v0.23.0
|
golang.org/x/oauth2 v0.23.0
|
||||||
golang.org/x/sync v0.8.0
|
golang.org/x/sync v0.8.0
|
||||||
golang.org/x/sys v0.25.0
|
golang.org/x/sys v0.26.0
|
||||||
golang.org/x/text v0.18.0
|
golang.org/x/text v0.19.0
|
||||||
golang.org/x/time v0.6.0
|
golang.org/x/time v0.6.0
|
||||||
golang.org/x/tools v0.24.0
|
golang.org/x/tools v0.26.0
|
||||||
google.golang.org/api v0.199.0
|
google.golang.org/api v0.199.0
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1
|
google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1
|
||||||
google.golang.org/grpc v1.67.0
|
google.golang.org/grpc v1.67.1
|
||||||
google.golang.org/protobuf v1.34.2
|
google.golang.org/protobuf v1.34.2
|
||||||
gopkg.in/yaml.v2 v2.4.0
|
gopkg.in/yaml.v2 v2.4.0
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
|
@ -190,11 +190,11 @@ require (
|
||||||
go.opencensus.io v0.24.0 // indirect
|
go.opencensus.io v0.24.0 // indirect
|
||||||
go.opentelemetry.io/otel/metric v1.30.0 // indirect
|
go.opentelemetry.io/otel/metric v1.30.0 // indirect
|
||||||
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
|
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
|
||||||
golang.org/x/crypto v0.27.0 // indirect
|
golang.org/x/crypto v0.28.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect
|
golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect
|
||||||
golang.org/x/mod v0.20.0 // indirect
|
golang.org/x/mod v0.21.0 // indirect
|
||||||
golang.org/x/net v0.29.0 // indirect
|
golang.org/x/net v0.30.0 // indirect
|
||||||
golang.org/x/term v0.24.0 // indirect
|
golang.org/x/term v0.25.0 // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect
|
||||||
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
|
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
|
||||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||||
|
|
36
go.sum
36
go.sum
|
@ -334,8 +334,8 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+
|
||||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||||
github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s=
|
github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s=
|
||||||
github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A=
|
github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A=
|
||||||
github.com/gophercloud/gophercloud v1.14.0 h1:Bt9zQDhPrbd4qX7EILGmy+i7GP35cc+AAL2+wIJpUE8=
|
github.com/gophercloud/gophercloud v1.14.1 h1:DTCNaTVGl8/cFu58O1JwWgis9gtISAFONqpMKNg/Vpw=
|
||||||
github.com/gophercloud/gophercloud v1.14.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM=
|
github.com/gophercloud/gophercloud v1.14.1/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM=
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||||
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||||
|
@ -782,8 +782,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
|
||||||
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
|
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
|
||||||
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
||||||
golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
|
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
|
||||||
golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
|
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||||
|
@ -818,8 +818,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
|
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
|
||||||
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
@ -865,8 +865,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||||
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
|
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
|
||||||
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
||||||
golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
|
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
|
||||||
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
|
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
@ -955,16 +955,16 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
|
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
|
||||||
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||||
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
||||||
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
|
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
|
||||||
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
||||||
golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM=
|
golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
|
||||||
golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8=
|
golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
@ -976,8 +976,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
|
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
|
||||||
golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
||||||
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
@ -1035,8 +1035,8 @@ golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc
|
||||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||||
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
|
golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
|
||||||
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
|
golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
@ -1116,8 +1116,8 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji
|
||||||
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
||||||
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
||||||
google.golang.org/grpc v1.67.0 h1:IdH9y6PF5MPSdAntIcpjQ+tXO41pcQsfZV2RxtQgVcw=
|
google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
|
||||||
google.golang.org/grpc v1.67.0/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
|
google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
|
|
|
@ -69,6 +69,8 @@ type Parser interface {
|
||||||
// CreatedTimestamp returns the created timestamp (in milliseconds) for the
|
// CreatedTimestamp returns the created timestamp (in milliseconds) for the
|
||||||
// current sample. It returns nil if it is unknown e.g. if it wasn't set,
|
// current sample. It returns nil if it is unknown e.g. if it wasn't set,
|
||||||
// if the scrape protocol or metric type does not support created timestamps.
|
// if the scrape protocol or metric type does not support created timestamps.
|
||||||
|
// Assume the CreatedTimestamp returned pointer is only valid until
|
||||||
|
// the Next iteration.
|
||||||
CreatedTimestamp() *int64
|
CreatedTimestamp() *int64
|
||||||
|
|
||||||
// Next advances the parser to the next sample.
|
// Next advances the parser to the next sample.
|
||||||
|
|
|
@ -14,11 +14,18 @@
|
||||||
package textparse
|
package textparse
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"io"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/google/go-cmp/cmp"
|
||||||
|
"github.com/prometheus/common/model"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"github.com/prometheus/prometheus/model/exemplar"
|
||||||
|
"github.com/prometheus/prometheus/model/histogram"
|
||||||
"github.com/prometheus/prometheus/model/labels"
|
"github.com/prometheus/prometheus/model/labels"
|
||||||
|
"github.com/prometheus/prometheus/util/testutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestNewParser(t *testing.T) {
|
func TestNewParser(t *testing.T) {
|
||||||
|
@ -103,3 +110,93 @@ func TestNewParser(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parsedEntry represents data that is parsed for each entry.
|
||||||
|
type parsedEntry struct {
|
||||||
|
// In all but EntryComment, EntryInvalid.
|
||||||
|
m string
|
||||||
|
|
||||||
|
// In EntryHistogram.
|
||||||
|
shs *histogram.Histogram
|
||||||
|
fhs *histogram.FloatHistogram
|
||||||
|
|
||||||
|
// In EntrySeries.
|
||||||
|
v float64
|
||||||
|
|
||||||
|
// In EntrySeries and EntryHistogram.
|
||||||
|
lset labels.Labels
|
||||||
|
t *int64
|
||||||
|
es []exemplar.Exemplar
|
||||||
|
ct *int64
|
||||||
|
|
||||||
|
// In EntryType.
|
||||||
|
typ model.MetricType
|
||||||
|
// In EntryHelp.
|
||||||
|
help string
|
||||||
|
// In EntryUnit.
|
||||||
|
unit string
|
||||||
|
// In EntryComment.
|
||||||
|
comment string
|
||||||
|
}
|
||||||
|
|
||||||
|
func requireEntries(t *testing.T, exp, got []parsedEntry) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
testutil.RequireEqualWithOptions(t, exp, got, []cmp.Option{
|
||||||
|
cmp.AllowUnexported(parsedEntry{}),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func testParse(t *testing.T, p Parser) (ret []parsedEntry) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
for {
|
||||||
|
et, err := p.Next()
|
||||||
|
if errors.Is(err, io.EOF) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
var got parsedEntry
|
||||||
|
var m []byte
|
||||||
|
switch et {
|
||||||
|
case EntryInvalid:
|
||||||
|
t.Fatal("entry invalid not expected")
|
||||||
|
case EntrySeries, EntryHistogram:
|
||||||
|
if et == EntrySeries {
|
||||||
|
m, got.t, got.v = p.Series()
|
||||||
|
got.m = string(m)
|
||||||
|
} else {
|
||||||
|
m, got.t, got.shs, got.fhs = p.Histogram()
|
||||||
|
got.m = string(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
p.Metric(&got.lset)
|
||||||
|
for e := (exemplar.Exemplar{}); p.Exemplar(&e); {
|
||||||
|
got.es = append(got.es, e)
|
||||||
|
}
|
||||||
|
// Parser reuses int pointer.
|
||||||
|
if ct := p.CreatedTimestamp(); ct != nil {
|
||||||
|
got.ct = int64p(*ct)
|
||||||
|
}
|
||||||
|
case EntryType:
|
||||||
|
m, got.typ = p.Type()
|
||||||
|
got.m = string(m)
|
||||||
|
|
||||||
|
case EntryHelp:
|
||||||
|
m, h := p.Help()
|
||||||
|
got.m = string(m)
|
||||||
|
got.help = string(h)
|
||||||
|
|
||||||
|
case EntryUnit:
|
||||||
|
m, u := p.Unit()
|
||||||
|
got.m = string(m)
|
||||||
|
got.unit = string(u)
|
||||||
|
|
||||||
|
case EntryComment:
|
||||||
|
got.comment = string(p.Comment())
|
||||||
|
}
|
||||||
|
ret = append(ret, got)
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
package textparse
|
package textparse
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"io"
|
"io"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
@ -115,7 +114,7 @@ foobar{quantile="0.99"} 150.1`
|
||||||
input += "\nnull_byte_metric{a=\"abc\x00\"} 1"
|
input += "\nnull_byte_metric{a=\"abc\x00\"} 1"
|
||||||
input += "\n# EOF\n"
|
input += "\n# EOF\n"
|
||||||
|
|
||||||
exp := []expectedParse{
|
exp := []parsedEntry{
|
||||||
{
|
{
|
||||||
m: "go_gc_duration_seconds",
|
m: "go_gc_duration_seconds",
|
||||||
help: "A summary of the GC invocation durations.",
|
help: "A summary of the GC invocation durations.",
|
||||||
|
@ -190,12 +189,16 @@ foobar{quantile="0.99"} 150.1`
|
||||||
m: `hhh_bucket{le="+Inf"}`,
|
m: `hhh_bucket{le="+Inf"}`,
|
||||||
v: 1,
|
v: 1,
|
||||||
lset: labels.FromStrings("__name__", "hhh_bucket", "le", "+Inf"),
|
lset: labels.FromStrings("__name__", "hhh_bucket", "le", "+Inf"),
|
||||||
e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "histogram-bucket-test"), Value: 4},
|
es: []exemplar.Exemplar{
|
||||||
|
{Labels: labels.FromStrings("id", "histogram-bucket-test"), Value: 4},
|
||||||
|
},
|
||||||
}, {
|
}, {
|
||||||
m: `hhh_count`,
|
m: `hhh_count`,
|
||||||
v: 1,
|
v: 1,
|
||||||
lset: labels.FromStrings("__name__", "hhh_count"),
|
lset: labels.FromStrings("__name__", "hhh_count"),
|
||||||
e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "histogram-count-test"), Value: 4},
|
es: []exemplar.Exemplar{
|
||||||
|
{Labels: labels.FromStrings("id", "histogram-count-test"), Value: 4},
|
||||||
|
},
|
||||||
}, {
|
}, {
|
||||||
m: "ggh",
|
m: "ggh",
|
||||||
typ: model.MetricTypeGaugeHistogram,
|
typ: model.MetricTypeGaugeHistogram,
|
||||||
|
@ -203,12 +206,16 @@ foobar{quantile="0.99"} 150.1`
|
||||||
m: `ggh_bucket{le="+Inf"}`,
|
m: `ggh_bucket{le="+Inf"}`,
|
||||||
v: 1,
|
v: 1,
|
||||||
lset: labels.FromStrings("__name__", "ggh_bucket", "le", "+Inf"),
|
lset: labels.FromStrings("__name__", "ggh_bucket", "le", "+Inf"),
|
||||||
e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "gaugehistogram-bucket-test", "xx", "yy"), Value: 4, HasTs: true, Ts: 123123},
|
es: []exemplar.Exemplar{
|
||||||
|
{Labels: labels.FromStrings("id", "gaugehistogram-bucket-test", "xx", "yy"), Value: 4, HasTs: true, Ts: 123123},
|
||||||
|
},
|
||||||
}, {
|
}, {
|
||||||
m: `ggh_count`,
|
m: `ggh_count`,
|
||||||
v: 1,
|
v: 1,
|
||||||
lset: labels.FromStrings("__name__", "ggh_count"),
|
lset: labels.FromStrings("__name__", "ggh_count"),
|
||||||
e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "gaugehistogram-count-test", "xx", "yy"), Value: 4, HasTs: true, Ts: 123123},
|
es: []exemplar.Exemplar{
|
||||||
|
{Labels: labels.FromStrings("id", "gaugehistogram-count-test", "xx", "yy"), Value: 4, HasTs: true, Ts: 123123},
|
||||||
|
},
|
||||||
}, {
|
}, {
|
||||||
m: "smr_seconds",
|
m: "smr_seconds",
|
||||||
typ: model.MetricTypeSummary,
|
typ: model.MetricTypeSummary,
|
||||||
|
@ -216,12 +223,16 @@ foobar{quantile="0.99"} 150.1`
|
||||||
m: `smr_seconds_count`,
|
m: `smr_seconds_count`,
|
||||||
v: 2,
|
v: 2,
|
||||||
lset: labels.FromStrings("__name__", "smr_seconds_count"),
|
lset: labels.FromStrings("__name__", "smr_seconds_count"),
|
||||||
e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "summary-count-test"), Value: 1, HasTs: true, Ts: 123321},
|
es: []exemplar.Exemplar{
|
||||||
|
{Labels: labels.FromStrings("id", "summary-count-test"), Value: 1, HasTs: true, Ts: 123321},
|
||||||
|
},
|
||||||
}, {
|
}, {
|
||||||
m: `smr_seconds_sum`,
|
m: `smr_seconds_sum`,
|
||||||
v: 42,
|
v: 42,
|
||||||
lset: labels.FromStrings("__name__", "smr_seconds_sum"),
|
lset: labels.FromStrings("__name__", "smr_seconds_sum"),
|
||||||
e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "summary-sum-test"), Value: 1, HasTs: true, Ts: 123321},
|
es: []exemplar.Exemplar{
|
||||||
|
{Labels: labels.FromStrings("id", "summary-sum-test"), Value: 1, HasTs: true, Ts: 123321},
|
||||||
|
},
|
||||||
}, {
|
}, {
|
||||||
m: "ii",
|
m: "ii",
|
||||||
typ: model.MetricTypeInfo,
|
typ: model.MetricTypeInfo,
|
||||||
|
@ -270,15 +281,19 @@ foobar{quantile="0.99"} 150.1`
|
||||||
v: 17,
|
v: 17,
|
||||||
lset: labels.FromStrings("__name__", "foo_total"),
|
lset: labels.FromStrings("__name__", "foo_total"),
|
||||||
t: int64p(1520879607789),
|
t: int64p(1520879607789),
|
||||||
e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "counter-test"), Value: 5},
|
es: []exemplar.Exemplar{
|
||||||
ct: int64p(1520872607123),
|
{Labels: labels.FromStrings("id", "counter-test"), Value: 5},
|
||||||
|
},
|
||||||
|
ct: int64p(1520872607123),
|
||||||
}, {
|
}, {
|
||||||
m: `foo_total{a="b"}`,
|
m: `foo_total{a="b"}`,
|
||||||
v: 17.0,
|
v: 17.0,
|
||||||
lset: labels.FromStrings("__name__", "foo_total", "a", "b"),
|
lset: labels.FromStrings("__name__", "foo_total", "a", "b"),
|
||||||
t: int64p(1520879607789),
|
t: int64p(1520879607789),
|
||||||
e: &exemplar.Exemplar{Labels: labels.FromStrings("id", "counter-test"), Value: 5},
|
es: []exemplar.Exemplar{
|
||||||
ct: int64p(1520872607123),
|
{Labels: labels.FromStrings("id", "counter-test"), Value: 5},
|
||||||
|
},
|
||||||
|
ct: int64p(1520872607123),
|
||||||
}, {
|
}, {
|
||||||
m: "bar",
|
m: "bar",
|
||||||
help: "Summary with CT at the end, making sure we find CT even if it's multiple lines a far",
|
help: "Summary with CT at the end, making sure we find CT even if it's multiple lines a far",
|
||||||
|
@ -430,7 +445,8 @@ foobar{quantile="0.99"} 150.1`
|
||||||
}
|
}
|
||||||
|
|
||||||
p := NewOpenMetricsParser([]byte(input), labels.NewSymbolTable(), WithOMParserCTSeriesSkipped())
|
p := NewOpenMetricsParser([]byte(input), labels.NewSymbolTable(), WithOMParserCTSeriesSkipped())
|
||||||
checkParseResultsWithCT(t, p, exp, true)
|
got := testParse(t, p)
|
||||||
|
requireEntries(t, exp, got)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestUTF8OpenMetricsParse(t *testing.T) {
|
func TestUTF8OpenMetricsParse(t *testing.T) {
|
||||||
|
@ -455,7 +471,7 @@ func TestUTF8OpenMetricsParse(t *testing.T) {
|
||||||
|
|
||||||
input += "\n# EOF\n"
|
input += "\n# EOF\n"
|
||||||
|
|
||||||
exp := []expectedParse{
|
exp := []parsedEntry{
|
||||||
{
|
{
|
||||||
m: "go.gc_duration_seconds",
|
m: "go.gc_duration_seconds",
|
||||||
help: "A summary of the GC invocation durations.",
|
help: "A summary of the GC invocation durations.",
|
||||||
|
@ -504,7 +520,8 @@ choices}`, "strange©™\n'quoted' \"name\"", "6"),
|
||||||
}
|
}
|
||||||
|
|
||||||
p := NewOpenMetricsParser([]byte(input), labels.NewSymbolTable(), WithOMParserCTSeriesSkipped())
|
p := NewOpenMetricsParser([]byte(input), labels.NewSymbolTable(), WithOMParserCTSeriesSkipped())
|
||||||
checkParseResultsWithCT(t, p, exp, true)
|
got := testParse(t, p)
|
||||||
|
requireEntries(t, exp, got)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestOpenMetricsParseErrors(t *testing.T) {
|
func TestOpenMetricsParseErrors(t *testing.T) {
|
||||||
|
@ -878,8 +895,8 @@ func TestOMNullByteHandling(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// While not desirable, there are cases were CT fails to parse and
|
// TestCTParseFailures tests known failure edge cases, we know does not work due
|
||||||
// these tests show them.
|
// current OM spec limitations or clients with broken OM format.
|
||||||
// TODO(maniktherana): Make sure OM 1.1/2.0 pass CT via metadata or exemplar-like to avoid this.
|
// TODO(maniktherana): Make sure OM 1.1/2.0 pass CT via metadata or exemplar-like to avoid this.
|
||||||
func TestCTParseFailures(t *testing.T) {
|
func TestCTParseFailures(t *testing.T) {
|
||||||
input := `# HELP thing Histogram with _created as first line
|
input := `# HELP thing Histogram with _created as first line
|
||||||
|
@ -892,68 +909,37 @@ thing_bucket{le="+Inf"} 17`
|
||||||
|
|
||||||
input += "\n# EOF\n"
|
input += "\n# EOF\n"
|
||||||
|
|
||||||
int64p := func(x int64) *int64 { return &x }
|
exp := []parsedEntry{
|
||||||
|
|
||||||
type expectCT struct {
|
|
||||||
m string
|
|
||||||
ct *int64
|
|
||||||
typ model.MetricType
|
|
||||||
help string
|
|
||||||
isErr bool
|
|
||||||
}
|
|
||||||
|
|
||||||
exp := []expectCT{
|
|
||||||
{
|
{
|
||||||
m: "thing",
|
m: "thing",
|
||||||
help: "Histogram with _created as first line",
|
help: "Histogram with _created as first line",
|
||||||
isErr: false,
|
|
||||||
}, {
|
}, {
|
||||||
m: "thing",
|
m: "thing",
|
||||||
typ: model.MetricTypeHistogram,
|
typ: model.MetricTypeHistogram,
|
||||||
isErr: false,
|
|
||||||
}, {
|
}, {
|
||||||
m: `thing_count`,
|
m: `thing_count`,
|
||||||
ct: int64p(1520872607123),
|
ct: nil, // Should be int64p(1520872607123).
|
||||||
isErr: true,
|
|
||||||
}, {
|
}, {
|
||||||
m: `thing_sum`,
|
m: `thing_sum`,
|
||||||
ct: int64p(1520872607123),
|
ct: nil, // Should be int64p(1520872607123).
|
||||||
isErr: true,
|
|
||||||
}, {
|
}, {
|
||||||
m: `thing_bucket{le="0.0"}`,
|
m: `thing_bucket{le="0.0"}`,
|
||||||
ct: int64p(1520872607123),
|
ct: nil, // Should be int64p(1520872607123).
|
||||||
isErr: true,
|
|
||||||
}, {
|
}, {
|
||||||
m: `thing_bucket{le="+Inf"}`,
|
m: `thing_bucket{le="+Inf"}`,
|
||||||
ct: int64p(1520872607123),
|
ct: nil, // Should be int64p(1520872607123),
|
||||||
isErr: true,
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
p := NewOpenMetricsParser([]byte(input), labels.NewSymbolTable(), WithOMParserCTSeriesSkipped())
|
p := NewOpenMetricsParser([]byte(input), labels.NewSymbolTable(), WithOMParserCTSeriesSkipped())
|
||||||
i := 0
|
got := testParse(t, p)
|
||||||
|
resetValAndLset(got) // Keep this test focused on metric, basic entries and CT only.
|
||||||
|
requireEntries(t, exp, got)
|
||||||
|
}
|
||||||
|
|
||||||
var res labels.Labels
|
func resetValAndLset(e []parsedEntry) {
|
||||||
for {
|
for i := range e {
|
||||||
et, err := p.Next()
|
e[i].v = 0
|
||||||
if errors.Is(err, io.EOF) {
|
e[i].lset = labels.EmptyLabels()
|
||||||
break
|
|
||||||
}
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
switch et {
|
|
||||||
case EntrySeries:
|
|
||||||
p.Metric(&res)
|
|
||||||
|
|
||||||
if ct := p.CreatedTimestamp(); exp[i].isErr {
|
|
||||||
require.Nil(t, ct)
|
|
||||||
} else {
|
|
||||||
require.Equal(t, *exp[i].ct, *ct)
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
i++
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
i++
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,33 +14,15 @@
|
||||||
package textparse
|
package textparse
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"io"
|
"io"
|
||||||
"strings"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/prometheus/common/model"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
"github.com/prometheus/common/model"
|
|
||||||
|
|
||||||
"github.com/prometheus/prometheus/model/exemplar"
|
|
||||||
"github.com/prometheus/prometheus/model/labels"
|
"github.com/prometheus/prometheus/model/labels"
|
||||||
"github.com/prometheus/prometheus/util/testutil"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type expectedParse struct {
|
|
||||||
lset labels.Labels
|
|
||||||
m string
|
|
||||||
t *int64
|
|
||||||
v float64
|
|
||||||
typ model.MetricType
|
|
||||||
help string
|
|
||||||
unit string
|
|
||||||
comment string
|
|
||||||
e *exemplar.Exemplar
|
|
||||||
ct *int64
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestPromParse(t *testing.T) {
|
func TestPromParse(t *testing.T) {
|
||||||
input := `# HELP go_gc_duration_seconds A summary of the GC invocation durations.
|
input := `# HELP go_gc_duration_seconds A summary of the GC invocation durations.
|
||||||
# TYPE go_gc_duration_seconds summary
|
# TYPE go_gc_duration_seconds summary
|
||||||
|
@ -72,9 +54,7 @@ testmetric{label="\"bar\""} 1`
|
||||||
input += "\n# HELP metric foo\x00bar"
|
input += "\n# HELP metric foo\x00bar"
|
||||||
input += "\nnull_byte_metric{a=\"abc\x00\"} 1"
|
input += "\nnull_byte_metric{a=\"abc\x00\"} 1"
|
||||||
|
|
||||||
int64p := func(x int64) *int64 { return &x }
|
exp := []parsedEntry{
|
||||||
|
|
||||||
exp := []expectedParse{
|
|
||||||
{
|
{
|
||||||
m: "go_gc_duration_seconds",
|
m: "go_gc_duration_seconds",
|
||||||
help: "A summary of the GC invocation durations.",
|
help: "A summary of the GC invocation durations.",
|
||||||
|
@ -182,80 +162,8 @@ testmetric{label="\"bar\""} 1`
|
||||||
}
|
}
|
||||||
|
|
||||||
p := NewPromParser([]byte(input), labels.NewSymbolTable())
|
p := NewPromParser([]byte(input), labels.NewSymbolTable())
|
||||||
checkParseResults(t, p, exp)
|
got := testParse(t, p)
|
||||||
}
|
requireEntries(t, exp, got)
|
||||||
|
|
||||||
func checkParseResults(t *testing.T, p Parser, exp []expectedParse) {
|
|
||||||
checkParseResultsWithCT(t, p, exp, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
func checkParseResultsWithCT(t *testing.T, p Parser, exp []expectedParse, ctLinesRemoved bool) {
|
|
||||||
i := 0
|
|
||||||
|
|
||||||
var res labels.Labels
|
|
||||||
|
|
||||||
for {
|
|
||||||
et, err := p.Next()
|
|
||||||
if errors.Is(err, io.EOF) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
switch et {
|
|
||||||
case EntrySeries:
|
|
||||||
m, ts, v := p.Series()
|
|
||||||
|
|
||||||
p.Metric(&res)
|
|
||||||
|
|
||||||
if ctLinesRemoved {
|
|
||||||
// Are CT series skipped?
|
|
||||||
_, typ := p.Type()
|
|
||||||
if typeRequiresCT(typ) && strings.HasSuffix(res.Get(labels.MetricName), "_created") {
|
|
||||||
t.Fatalf("we exped created lines skipped")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
require.Equal(t, exp[i].m, string(m))
|
|
||||||
require.Equal(t, exp[i].t, ts)
|
|
||||||
require.Equal(t, exp[i].v, v)
|
|
||||||
testutil.RequireEqual(t, exp[i].lset, res)
|
|
||||||
|
|
||||||
var e exemplar.Exemplar
|
|
||||||
found := p.Exemplar(&e)
|
|
||||||
if exp[i].e == nil {
|
|
||||||
require.False(t, found)
|
|
||||||
} else {
|
|
||||||
require.True(t, found)
|
|
||||||
testutil.RequireEqual(t, *exp[i].e, e)
|
|
||||||
}
|
|
||||||
if ct := p.CreatedTimestamp(); ct != nil {
|
|
||||||
require.Equal(t, *exp[i].ct, *ct)
|
|
||||||
} else {
|
|
||||||
require.Nil(t, exp[i].ct)
|
|
||||||
}
|
|
||||||
|
|
||||||
case EntryType:
|
|
||||||
m, typ := p.Type()
|
|
||||||
require.Equal(t, exp[i].m, string(m))
|
|
||||||
require.Equal(t, exp[i].typ, typ)
|
|
||||||
|
|
||||||
case EntryHelp:
|
|
||||||
m, h := p.Help()
|
|
||||||
require.Equal(t, exp[i].m, string(m))
|
|
||||||
require.Equal(t, exp[i].help, string(h))
|
|
||||||
|
|
||||||
case EntryUnit:
|
|
||||||
m, u := p.Unit()
|
|
||||||
require.Equal(t, exp[i].m, string(m))
|
|
||||||
require.Equal(t, exp[i].unit, string(u))
|
|
||||||
|
|
||||||
case EntryComment:
|
|
||||||
require.Equal(t, exp[i].comment, string(p.Comment()))
|
|
||||||
}
|
|
||||||
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
require.Len(t, exp, i)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestUTF8PromParse(t *testing.T) {
|
func TestUTF8PromParse(t *testing.T) {
|
||||||
|
@ -279,7 +187,7 @@ func TestUTF8PromParse(t *testing.T) {
|
||||||
{"go.gc_duration_seconds_count"} 99
|
{"go.gc_duration_seconds_count"} 99
|
||||||
{"Heizölrückstoßabdämpfung 10€ metric with \"interesting\" {character\nchoices}","strange©™\n'quoted' \"name\""="6"} 10.0`
|
{"Heizölrückstoßabdämpfung 10€ metric with \"interesting\" {character\nchoices}","strange©™\n'quoted' \"name\""="6"} 10.0`
|
||||||
|
|
||||||
exp := []expectedParse{
|
exp := []parsedEntry{
|
||||||
{
|
{
|
||||||
m: "go.gc_duration_seconds",
|
m: "go.gc_duration_seconds",
|
||||||
help: "A summary of the GC invocation durations.",
|
help: "A summary of the GC invocation durations.",
|
||||||
|
@ -335,7 +243,8 @@ choices}`, "strange©™\n'quoted' \"name\"", "6"),
|
||||||
}
|
}
|
||||||
|
|
||||||
p := NewPromParser([]byte(input), labels.NewSymbolTable())
|
p := NewPromParser([]byte(input), labels.NewSymbolTable())
|
||||||
checkParseResults(t, p, exp)
|
got := testParse(t, p)
|
||||||
|
requireEntries(t, exp, got)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPromParseErrors(t *testing.T) {
|
func TestPromParseErrors(t *testing.T) {
|
||||||
|
|
|
@ -457,6 +457,12 @@ func (p *ProtobufParser) Next() (Entry, error) {
|
||||||
|
|
||||||
p.state = EntryHelp
|
p.state = EntryHelp
|
||||||
case EntryHelp:
|
case EntryHelp:
|
||||||
|
if p.mf.Unit != "" {
|
||||||
|
p.state = EntryUnit
|
||||||
|
} else {
|
||||||
|
p.state = EntryType
|
||||||
|
}
|
||||||
|
case EntryUnit:
|
||||||
p.state = EntryType
|
p.state = EntryType
|
||||||
case EntryType:
|
case EntryType:
|
||||||
t := p.mf.GetType()
|
t := p.mf.GetType()
|
||||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue