Merge pull request #6932 from lucacome/bump-otel-deps
Bump OpenTelemetry dependencies
This commit is contained in:
commit
133978f893
28
go.mod
28
go.mod
@ -28,7 +28,7 @@ require (
|
|||||||
github.com/docker/go-units v0.4.0
|
github.com/docker/go-units v0.4.0
|
||||||
github.com/emicklei/go-restful/v3 v3.7.3
|
github.com/emicklei/go-restful/v3 v3.7.3
|
||||||
github.com/fsnotify/fsnotify v1.5.1
|
github.com/fsnotify/fsnotify v1.5.1
|
||||||
github.com/google/go-cmp v0.5.6
|
github.com/google/go-cmp v0.5.8
|
||||||
github.com/google/uuid v1.2.0
|
github.com/google/uuid v1.2.0
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0
|
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
||||||
@ -49,18 +49,18 @@ require (
|
|||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/prometheus/client_golang v1.12.1
|
github.com/prometheus/client_golang v1.12.1
|
||||||
github.com/sirupsen/logrus v1.8.1
|
github.com/sirupsen/logrus v1.8.1
|
||||||
github.com/stretchr/testify v1.7.0
|
github.com/stretchr/testify v1.7.1
|
||||||
github.com/tchap/go-patricia/v2 v2.3.1
|
github.com/tchap/go-patricia/v2 v2.3.1
|
||||||
github.com/urfave/cli v1.22.2
|
github.com/urfave/cli v1.22.2
|
||||||
github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5
|
github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5
|
||||||
go.etcd.io/bbolt v1.3.6
|
go.etcd.io/bbolt v1.3.6
|
||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.32.0
|
||||||
go.opentelemetry.io/otel v1.3.0
|
go.opentelemetry.io/otel v1.7.0
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0
|
||||||
go.opentelemetry.io/otel/sdk v1.3.0
|
go.opentelemetry.io/otel/sdk v1.7.0
|
||||||
go.opentelemetry.io/otel/trace v1.3.0
|
go.opentelemetry.io/otel/trace v1.7.0
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
|
||||||
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150
|
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150
|
||||||
google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46
|
google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46
|
||||||
@ -80,21 +80,21 @@ require (
|
|||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/blang/semver v3.5.1+incompatible // indirect
|
github.com/blang/semver v3.5.1+incompatible // indirect
|
||||||
github.com/blang/semver/v4 v4.0.0 // indirect
|
github.com/blang/semver/v4 v4.0.0 // indirect
|
||||||
github.com/cenkalti/backoff/v4 v4.1.2 // indirect
|
github.com/cenkalti/backoff/v4 v4.1.3 // indirect
|
||||||
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
||||||
github.com/cilium/ebpf v0.7.0 // indirect
|
github.com/cilium/ebpf v0.7.0 // indirect
|
||||||
github.com/containernetworking/cni v1.1.0 // indirect
|
github.com/containernetworking/cni v1.1.0 // indirect
|
||||||
github.com/containers/ocicrypt v1.1.3 // indirect
|
github.com/containers/ocicrypt v1.1.3 // indirect
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect
|
github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect
|
||||||
github.com/emicklei/go-restful v2.9.5+incompatible // indirect
|
github.com/emicklei/go-restful v2.9.5+incompatible // indirect
|
||||||
github.com/go-logr/logr v1.2.2 // indirect
|
github.com/go-logr/logr v1.2.3 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/godbus/dbus/v5 v5.0.6 // indirect
|
github.com/godbus/dbus/v5 v5.0.6 // indirect
|
||||||
github.com/gogo/protobuf v1.3.2 // indirect
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||||
github.com/golang/protobuf v1.5.2 // indirect
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
github.com/google/gofuzz v1.2.0 // indirect
|
github.com/google/gofuzz v1.2.0 // indirect
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
|
||||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
|
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
|
||||||
@ -118,8 +118,8 @@ require (
|
|||||||
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
|
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
|
||||||
go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 // indirect
|
go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 // indirect
|
||||||
go.opencensus.io v0.23.0 // indirect
|
go.opencensus.io v0.23.0 // indirect
|
||||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 // indirect
|
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 // indirect
|
||||||
go.opentelemetry.io/proto/otlp v0.11.0 // indirect
|
go.opentelemetry.io/proto/otlp v0.16.0 // indirect
|
||||||
golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd // indirect
|
golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd // indirect
|
||||||
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 // indirect
|
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 // indirect
|
||||||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
|
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
|
||||||
|
47
go.sum
47
go.sum
@ -135,8 +135,9 @@ github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8n
|
|||||||
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
|
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
|
||||||
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
|
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
|
||||||
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
||||||
github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo=
|
|
||||||
github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
||||||
|
github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4=
|
||||||
|
github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
||||||
github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
||||||
@ -402,8 +403,9 @@ github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg
|
|||||||
github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
||||||
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs=
|
|
||||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
|
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
|
||||||
|
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
|
github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
|
||||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||||
@ -444,6 +446,8 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP
|
|||||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
|
github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
|
||||||
|
github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
|
||||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
@ -494,8 +498,10 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
|||||||
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
|
|
||||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
|
||||||
|
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
|
||||||
|
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0=
|
github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0=
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
@ -544,8 +550,9 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92Bcuy
|
|||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
|
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0=
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
|
||||||
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
|
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
|
||||||
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
||||||
github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
@ -885,8 +892,9 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
|
|||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
|
||||||
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
||||||
github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
||||||
github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
||||||
@ -960,34 +968,43 @@ go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
|
|||||||
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
||||||
go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=
|
go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=
|
||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=
|
||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0 h1:Ky1MObd188aGbgb5OgNnwGuEEwI9MVIcc7rBW6zk5Ak=
|
|
||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w=
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w=
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.32.0 h1:WenoaOMNP71oq3KkMZ/jnxI9xU/JSCLw8yZILSI2lfU=
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.32.0/go.mod h1:J0dBVrt7dPS/lKJyQoW0xzQiUr4r2Ik1VwPjAUWnofI=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=
|
||||||
go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
|
go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
|
||||||
go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y=
|
|
||||||
go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
|
go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
|
||||||
|
go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM=
|
||||||
|
go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
|
||||||
go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=
|
go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 h1:R/OBkMoGgfy2fLhs2QhkCI1w4HLEQX92GCcJB6SSdNk=
|
|
||||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4=
|
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 h1:giGm8w67Ja7amYNfYMdme7xSp2pIxThWopw8+QP51Yk=
|
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 h1:7Yxsak1q4XrJ5y7XBnNwqWx9amMZvoidCctv62XOQ6Y=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0/go.mod h1:M1hVZHNxcbkAlcvrOMlpQ4YOO3Awf+4N2dxkZL3xm04=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0 h1:VQbUHoJqytHHSJ1OZodPH9tvZZSVzUHjPHpkO85sT6k=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 h1:cMDtmgJ5FpRvqx9x2Aq+Mm0O6K/zcUkH73SFz20TuBw=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0/go.mod h1:ceUgdyfNv4h4gLxHR0WNfDiiVmZFodZhZSbOLhpxqXE=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0 h1:Ydage/P0fRrSPpZeCVxzjqGcI6iVmG2xb43+IR8cjqM=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 h1:MFAyzUPrTwLOwCi+cltN0ZVyy4phU41lwH+lyMyQTS4=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1:E+/KKhwOSw8yoPxSSuUHG6vKppkvhN+S1Jc7Nib3k3o=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 h1:pLP0MH4MAqeTEV0g/4flxw9O8Is48uAIauAnjznbW50=
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0/go.mod h1:aFXT9Ng2seM9eizF+LfKiyPBGy8xIZKwhusC1gIu3hA=
|
||||||
go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
|
go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
|
||||||
go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
|
go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
|
||||||
go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
|
go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
|
||||||
go.opentelemetry.io/otel/sdk v1.3.0 h1:3278edCoH89MEJ0Ky8WQXVmDQv3FX4ZJ3Pp+9fJreAI=
|
|
||||||
go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
|
go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
|
||||||
|
go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1B0=
|
||||||
|
go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU=
|
||||||
go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE=
|
go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE=
|
||||||
go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=
|
go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=
|
||||||
go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=
|
go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=
|
||||||
go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY=
|
|
||||||
go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
|
go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
|
||||||
|
go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o=
|
||||||
|
go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
|
||||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||||
go.opentelemetry.io/proto/otlp v0.11.0 h1:cLDgIBTf4lLOlztkhzAEdQsJ4Lj+i5Wc9k6Nn0K1VyU=
|
|
||||||
go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ=
|
go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ=
|
||||||
|
go.opentelemetry.io/proto/otlp v0.16.0 h1:WHzDWdXUvbc5bG2ObdrGfaNpQz7ft7QN9HHmJlbiB1E=
|
||||||
|
go.opentelemetry.io/proto/otlp v0.16.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
|
||||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||||
@ -1340,7 +1357,6 @@ golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom
|
|||||||
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=
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||||
@ -1421,6 +1437,7 @@ google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6D
|
|||||||
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
|
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
|
||||||
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
||||||
google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
||||||
|
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||||
google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||||
google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||||
google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46 h1:G1IeWbjrqEq9ChWxEuRPJu6laA67+XgTFHVSAvepr38=
|
google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46 h1:G1IeWbjrqEq9ChWxEuRPJu6laA67+XgTFHVSAvepr38=
|
||||||
|
@ -15,7 +15,7 @@ require (
|
|||||||
github.com/opencontainers/image-spec v1.0.3-0.20220303224323-02efb9a75ee1
|
github.com/opencontainers/image-spec v1.0.3-0.20220303224323-02efb9a75ee1
|
||||||
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417
|
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417
|
||||||
github.com/sirupsen/logrus v1.8.1
|
github.com/sirupsen/logrus v1.8.1
|
||||||
github.com/stretchr/testify v1.7.0
|
github.com/stretchr/testify v1.7.1
|
||||||
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150
|
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ require (
|
|||||||
github.com/godbus/dbus/v5 v5.0.6 // indirect
|
github.com/godbus/dbus/v5 v5.0.6 // indirect
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||||
github.com/golang/protobuf v1.5.2 // indirect
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
github.com/google/go-cmp v0.5.6 // indirect
|
github.com/google/go-cmp v0.5.8 // indirect
|
||||||
github.com/google/uuid v1.2.0 // indirect
|
github.com/google/uuid v1.2.0 // indirect
|
||||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||||
|
@ -96,7 +96,7 @@ github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnweb
|
|||||||
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
|
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
|
||||||
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
|
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
|
||||||
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
||||||
github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
||||||
github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
||||||
@ -248,9 +248,8 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7
|
|||||||
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
||||||
github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
||||||
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
|
||||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
|
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||||
github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro=
|
github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro=
|
||||||
github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
|
github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
|
||||||
@ -279,6 +278,7 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP
|
|||||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
|
github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
|
||||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
@ -327,8 +327,10 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
|||||||
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
|
|
||||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
|
||||||
|
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
|
||||||
|
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0=
|
github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0=
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
@ -369,6 +371,7 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2
|
|||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
|
||||||
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
|
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
|
||||||
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
||||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
@ -630,8 +633,9 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
|
|||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
|
||||||
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
||||||
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI=
|
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI=
|
||||||
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
||||||
@ -684,25 +688,25 @@ go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
|
|||||||
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
||||||
go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=
|
go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=
|
||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=
|
||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w=
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.32.0/go.mod h1:J0dBVrt7dPS/lKJyQoW0xzQiUr4r2Ik1VwPjAUWnofI=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=
|
||||||
go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
|
go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
|
||||||
go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
|
go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
|
||||||
go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=
|
go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4=
|
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0/go.mod h1:M1hVZHNxcbkAlcvrOMlpQ4YOO3Awf+4N2dxkZL3xm04=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0/go.mod h1:ceUgdyfNv4h4gLxHR0WNfDiiVmZFodZhZSbOLhpxqXE=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1:E+/KKhwOSw8yoPxSSuUHG6vKppkvhN+S1Jc7Nib3k3o=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0/go.mod h1:aFXT9Ng2seM9eizF+LfKiyPBGy8xIZKwhusC1gIu3hA=
|
||||||
go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
|
go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
|
||||||
go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
|
go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
|
||||||
go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
|
go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
|
||||||
go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
|
go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU=
|
||||||
go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE=
|
go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE=
|
||||||
go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=
|
go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=
|
||||||
go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=
|
go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=
|
||||||
go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
|
go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
|
||||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||||
go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ=
|
go.opentelemetry.io/proto/otlp v0.16.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
|
||||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||||
go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
|
go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
|
||||||
@ -1018,7 +1022,6 @@ golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom
|
|||||||
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=
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
||||||
@ -1095,6 +1098,7 @@ google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6D
|
|||||||
google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
|
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
|
||||||
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
||||||
|
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||||
google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||||
google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46 h1:G1IeWbjrqEq9ChWxEuRPJu6laA67+XgTFHVSAvepr38=
|
google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46 h1:G1IeWbjrqEq9ChWxEuRPJu6laA67+XgTFHVSAvepr38=
|
||||||
google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
|
google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
|
||||||
|
3
vendor/github.com/cenkalti/backoff/v4/exponential.go
generated
vendored
3
vendor/github.com/cenkalti/backoff/v4/exponential.go
generated
vendored
@ -147,6 +147,9 @@ func (b *ExponentialBackOff) incrementCurrentInterval() {
|
|||||||
// Returns a random value from the following interval:
|
// Returns a random value from the following interval:
|
||||||
// [currentInterval - randomizationFactor * currentInterval, currentInterval + randomizationFactor * currentInterval].
|
// [currentInterval - randomizationFactor * currentInterval, currentInterval + randomizationFactor * currentInterval].
|
||||||
func getRandomValueFromInterval(randomizationFactor, random float64, currentInterval time.Duration) time.Duration {
|
func getRandomValueFromInterval(randomizationFactor, random float64, currentInterval time.Duration) time.Duration {
|
||||||
|
if randomizationFactor == 0 {
|
||||||
|
return currentInterval // make sure no randomness is used when randomizationFactor is 0.
|
||||||
|
}
|
||||||
var delta = randomizationFactor * float64(currentInterval)
|
var delta = randomizationFactor * float64(currentInterval)
|
||||||
var minInterval = float64(currentInterval) - delta
|
var minInterval = float64(currentInterval) - delta
|
||||||
var maxInterval = float64(currentInterval) + delta
|
var maxInterval = float64(currentInterval) + delta
|
||||||
|
4
vendor/github.com/go-logr/logr/README.md
generated
vendored
4
vendor/github.com/go-logr/logr/README.md
generated
vendored
@ -105,14 +105,18 @@ with higher verbosity means more (and less important) logs will be generated.
|
|||||||
There are implementations for the following logging libraries:
|
There are implementations for the following logging libraries:
|
||||||
|
|
||||||
- **a function** (can bridge to non-structured libraries): [funcr](https://github.com/go-logr/logr/tree/master/funcr)
|
- **a function** (can bridge to non-structured libraries): [funcr](https://github.com/go-logr/logr/tree/master/funcr)
|
||||||
|
- **a testing.T** (for use in Go tests, with JSON-like output): [testr](https://github.com/go-logr/logr/tree/master/testr)
|
||||||
- **github.com/google/glog**: [glogr](https://github.com/go-logr/glogr)
|
- **github.com/google/glog**: [glogr](https://github.com/go-logr/glogr)
|
||||||
- **k8s.io/klog** (for Kubernetes): [klogr](https://git.k8s.io/klog/klogr)
|
- **k8s.io/klog** (for Kubernetes): [klogr](https://git.k8s.io/klog/klogr)
|
||||||
|
- **a testing.T** (with klog-like text output): [ktesting](https://git.k8s.io/klog/ktesting)
|
||||||
- **go.uber.org/zap**: [zapr](https://github.com/go-logr/zapr)
|
- **go.uber.org/zap**: [zapr](https://github.com/go-logr/zapr)
|
||||||
- **log** (the Go standard library logger): [stdr](https://github.com/go-logr/stdr)
|
- **log** (the Go standard library logger): [stdr](https://github.com/go-logr/stdr)
|
||||||
- **github.com/sirupsen/logrus**: [logrusr](https://github.com/bombsimon/logrusr)
|
- **github.com/sirupsen/logrus**: [logrusr](https://github.com/bombsimon/logrusr)
|
||||||
- **github.com/wojas/genericr**: [genericr](https://github.com/wojas/genericr) (makes it easy to implement your own backend)
|
- **github.com/wojas/genericr**: [genericr](https://github.com/wojas/genericr) (makes it easy to implement your own backend)
|
||||||
- **logfmt** (Heroku style [logging](https://www.brandur.org/logfmt)): [logfmtr](https://github.com/iand/logfmtr)
|
- **logfmt** (Heroku style [logging](https://www.brandur.org/logfmt)): [logfmtr](https://github.com/iand/logfmtr)
|
||||||
- **github.com/rs/zerolog**: [zerologr](https://github.com/go-logr/zerologr)
|
- **github.com/rs/zerolog**: [zerologr](https://github.com/go-logr/zerologr)
|
||||||
|
- **github.com/go-kit/log**: [gokitlogr](https://github.com/tonglil/gokitlogr) (also compatible with github.com/go-kit/kit/log since v0.12.0)
|
||||||
|
- **bytes.Buffer** (writing to a buffer): [bufrlogr](https://github.com/tonglil/buflogr) (useful for ensuring values were logged, like during testing)
|
||||||
|
|
||||||
## FAQ
|
## FAQ
|
||||||
|
|
||||||
|
36
vendor/github.com/go-logr/logr/funcr/funcr.go
generated
vendored
36
vendor/github.com/go-logr/logr/funcr/funcr.go
generated
vendored
@ -351,15 +351,15 @@ func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) s
|
|||||||
if v, ok := value.(logr.Marshaler); ok {
|
if v, ok := value.(logr.Marshaler); ok {
|
||||||
// Replace the value with what the type wants to get logged.
|
// Replace the value with what the type wants to get logged.
|
||||||
// That then gets handled below via reflection.
|
// That then gets handled below via reflection.
|
||||||
value = v.MarshalLog()
|
value = invokeMarshaler(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle types that want to format themselves.
|
// Handle types that want to format themselves.
|
||||||
switch v := value.(type) {
|
switch v := value.(type) {
|
||||||
case fmt.Stringer:
|
case fmt.Stringer:
|
||||||
value = v.String()
|
value = invokeStringer(v)
|
||||||
case error:
|
case error:
|
||||||
value = v.Error()
|
value = invokeError(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handling the most common types without reflect is a small perf win.
|
// Handling the most common types without reflect is a small perf win.
|
||||||
@ -408,8 +408,9 @@ func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) s
|
|||||||
if i > 0 {
|
if i > 0 {
|
||||||
buf.WriteByte(',')
|
buf.WriteByte(',')
|
||||||
}
|
}
|
||||||
|
k, _ := v[i].(string) // sanitize() above means no need to check success
|
||||||
// arbitrary keys might need escaping
|
// arbitrary keys might need escaping
|
||||||
buf.WriteString(prettyString(v[i].(string)))
|
buf.WriteString(prettyString(k))
|
||||||
buf.WriteByte(':')
|
buf.WriteByte(':')
|
||||||
buf.WriteString(f.prettyWithFlags(v[i+1], 0, depth+1))
|
buf.WriteString(f.prettyWithFlags(v[i+1], 0, depth+1))
|
||||||
}
|
}
|
||||||
@ -596,6 +597,33 @@ func isEmpty(v reflect.Value) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func invokeMarshaler(m logr.Marshaler) (ret interface{}) {
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
ret = fmt.Sprintf("<panic: %s>", r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
return m.MarshalLog()
|
||||||
|
}
|
||||||
|
|
||||||
|
func invokeStringer(s fmt.Stringer) (ret string) {
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
ret = fmt.Sprintf("<panic: %s>", r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
return s.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
func invokeError(e error) (ret string) {
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
ret = fmt.Sprintf("<panic: %s>", r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
return e.Error()
|
||||||
|
}
|
||||||
|
|
||||||
// Caller represents the original call site for a log line, after considering
|
// Caller represents the original call site for a log line, after considering
|
||||||
// logr.Logger.WithCallDepth and logr.Logger.WithCallStackHelper. The File and
|
// logr.Logger.WithCallDepth and logr.Logger.WithCallStackHelper. The File and
|
||||||
// Line fields will always be provided, while the Func field is optional.
|
// Line fields will always be provided, while the Func field is optional.
|
||||||
|
9
vendor/github.com/go-logr/logr/logr.go
generated
vendored
9
vendor/github.com/go-logr/logr/logr.go
generated
vendored
@ -115,6 +115,15 @@ limitations under the License.
|
|||||||
// may be any Go value, but how the value is formatted is determined by the
|
// may be any Go value, but how the value is formatted is determined by the
|
||||||
// LogSink implementation.
|
// LogSink implementation.
|
||||||
//
|
//
|
||||||
|
// Logger instances are meant to be passed around by value. Code that receives
|
||||||
|
// such a value can call its methods without having to check whether the
|
||||||
|
// instance is ready for use.
|
||||||
|
//
|
||||||
|
// Calling methods with the null logger (Logger{}) as instance will crash
|
||||||
|
// because it has no LogSink. Therefore this null logger should never be passed
|
||||||
|
// around. For cases where passing a logger is optional, a pointer to Logger
|
||||||
|
// should be used.
|
||||||
|
//
|
||||||
// Key Naming Conventions
|
// Key Naming Conventions
|
||||||
//
|
//
|
||||||
// Keys are not strictly required to conform to any specification or regex, but
|
// Keys are not strictly required to conform to any specification or regex, but
|
||||||
|
180
vendor/github.com/golang/protobuf/descriptor/descriptor.go
generated
vendored
180
vendor/github.com/golang/protobuf/descriptor/descriptor.go
generated
vendored
@ -1,180 +0,0 @@
|
|||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Package descriptor provides functions for obtaining the protocol buffer
|
|
||||||
// descriptors of generated Go types.
|
|
||||||
//
|
|
||||||
// Deprecated: See the "google.golang.org/protobuf/reflect/protoreflect" package
|
|
||||||
// for how to obtain an EnumDescriptor or MessageDescriptor in order to
|
|
||||||
// programatically interact with the protobuf type system.
|
|
||||||
package descriptor
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"compress/gzip"
|
|
||||||
"io/ioutil"
|
|
||||||
"sync"
|
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
"google.golang.org/protobuf/reflect/protodesc"
|
|
||||||
"google.golang.org/protobuf/reflect/protoreflect"
|
|
||||||
"google.golang.org/protobuf/runtime/protoimpl"
|
|
||||||
|
|
||||||
descriptorpb "github.com/golang/protobuf/protoc-gen-go/descriptor"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Message is proto.Message with a method to return its descriptor.
|
|
||||||
//
|
|
||||||
// Deprecated: The Descriptor method may not be generated by future
|
|
||||||
// versions of protoc-gen-go, meaning that this interface may not
|
|
||||||
// be implemented by many concrete message types.
|
|
||||||
type Message interface {
|
|
||||||
proto.Message
|
|
||||||
Descriptor() ([]byte, []int)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ForMessage returns the file descriptor proto containing
|
|
||||||
// the message and the message descriptor proto for the message itself.
|
|
||||||
// The returned proto messages must not be mutated.
|
|
||||||
//
|
|
||||||
// Deprecated: Not all concrete message types satisfy the Message interface.
|
|
||||||
// Use MessageDescriptorProto instead. If possible, the calling code should
|
|
||||||
// be rewritten to use protobuf reflection instead.
|
|
||||||
// See package "google.golang.org/protobuf/reflect/protoreflect" for details.
|
|
||||||
func ForMessage(m Message) (*descriptorpb.FileDescriptorProto, *descriptorpb.DescriptorProto) {
|
|
||||||
return MessageDescriptorProto(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
type rawDesc struct {
|
|
||||||
fileDesc []byte
|
|
||||||
indexes []int
|
|
||||||
}
|
|
||||||
|
|
||||||
var rawDescCache sync.Map // map[protoreflect.Descriptor]*rawDesc
|
|
||||||
|
|
||||||
func deriveRawDescriptor(d protoreflect.Descriptor) ([]byte, []int) {
|
|
||||||
// Fast-path: check whether raw descriptors are already cached.
|
|
||||||
origDesc := d
|
|
||||||
if v, ok := rawDescCache.Load(origDesc); ok {
|
|
||||||
return v.(*rawDesc).fileDesc, v.(*rawDesc).indexes
|
|
||||||
}
|
|
||||||
|
|
||||||
// Slow-path: derive the raw descriptor from the v2 descriptor.
|
|
||||||
|
|
||||||
// Start with the leaf (a given enum or message declaration) and
|
|
||||||
// ascend upwards until we hit the parent file descriptor.
|
|
||||||
var idxs []int
|
|
||||||
for {
|
|
||||||
idxs = append(idxs, d.Index())
|
|
||||||
d = d.Parent()
|
|
||||||
if d == nil {
|
|
||||||
// TODO: We could construct a FileDescriptor stub for standalone
|
|
||||||
// descriptors to satisfy the API.
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
if _, ok := d.(protoreflect.FileDescriptor); ok {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obtain the raw file descriptor.
|
|
||||||
fd := d.(protoreflect.FileDescriptor)
|
|
||||||
b, _ := proto.Marshal(protodesc.ToFileDescriptorProto(fd))
|
|
||||||
file := protoimpl.X.CompressGZIP(b)
|
|
||||||
|
|
||||||
// Reverse the indexes, since we populated it in reverse.
|
|
||||||
for i, j := 0, len(idxs)-1; i < j; i, j = i+1, j-1 {
|
|
||||||
idxs[i], idxs[j] = idxs[j], idxs[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
if v, ok := rawDescCache.LoadOrStore(origDesc, &rawDesc{file, idxs}); ok {
|
|
||||||
return v.(*rawDesc).fileDesc, v.(*rawDesc).indexes
|
|
||||||
}
|
|
||||||
return file, idxs
|
|
||||||
}
|
|
||||||
|
|
||||||
// EnumRawDescriptor returns the GZIP'd raw file descriptor representing
|
|
||||||
// the enum and the index path to reach the enum declaration.
|
|
||||||
// The returned slices must not be mutated.
|
|
||||||
func EnumRawDescriptor(e proto.GeneratedEnum) ([]byte, []int) {
|
|
||||||
if ev, ok := e.(interface{ EnumDescriptor() ([]byte, []int) }); ok {
|
|
||||||
return ev.EnumDescriptor()
|
|
||||||
}
|
|
||||||
ed := protoimpl.X.EnumTypeOf(e)
|
|
||||||
return deriveRawDescriptor(ed.Descriptor())
|
|
||||||
}
|
|
||||||
|
|
||||||
// MessageRawDescriptor returns the GZIP'd raw file descriptor representing
|
|
||||||
// the message and the index path to reach the message declaration.
|
|
||||||
// The returned slices must not be mutated.
|
|
||||||
func MessageRawDescriptor(m proto.GeneratedMessage) ([]byte, []int) {
|
|
||||||
if mv, ok := m.(interface{ Descriptor() ([]byte, []int) }); ok {
|
|
||||||
return mv.Descriptor()
|
|
||||||
}
|
|
||||||
md := protoimpl.X.MessageTypeOf(m)
|
|
||||||
return deriveRawDescriptor(md.Descriptor())
|
|
||||||
}
|
|
||||||
|
|
||||||
var fileDescCache sync.Map // map[*byte]*descriptorpb.FileDescriptorProto
|
|
||||||
|
|
||||||
func deriveFileDescriptor(rawDesc []byte) *descriptorpb.FileDescriptorProto {
|
|
||||||
// Fast-path: check whether descriptor protos are already cached.
|
|
||||||
if v, ok := fileDescCache.Load(&rawDesc[0]); ok {
|
|
||||||
return v.(*descriptorpb.FileDescriptorProto)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Slow-path: derive the descriptor proto from the GZIP'd message.
|
|
||||||
zr, err := gzip.NewReader(bytes.NewReader(rawDesc))
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
b, err := ioutil.ReadAll(zr)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
fd := new(descriptorpb.FileDescriptorProto)
|
|
||||||
if err := proto.Unmarshal(b, fd); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
if v, ok := fileDescCache.LoadOrStore(&rawDesc[0], fd); ok {
|
|
||||||
return v.(*descriptorpb.FileDescriptorProto)
|
|
||||||
}
|
|
||||||
return fd
|
|
||||||
}
|
|
||||||
|
|
||||||
// EnumDescriptorProto returns the file descriptor proto representing
|
|
||||||
// the enum and the enum descriptor proto for the enum itself.
|
|
||||||
// The returned proto messages must not be mutated.
|
|
||||||
func EnumDescriptorProto(e proto.GeneratedEnum) (*descriptorpb.FileDescriptorProto, *descriptorpb.EnumDescriptorProto) {
|
|
||||||
rawDesc, idxs := EnumRawDescriptor(e)
|
|
||||||
if rawDesc == nil || idxs == nil {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
fd := deriveFileDescriptor(rawDesc)
|
|
||||||
if len(idxs) == 1 {
|
|
||||||
return fd, fd.EnumType[idxs[0]]
|
|
||||||
}
|
|
||||||
md := fd.MessageType[idxs[0]]
|
|
||||||
for _, i := range idxs[1 : len(idxs)-1] {
|
|
||||||
md = md.NestedType[i]
|
|
||||||
}
|
|
||||||
ed := md.EnumType[idxs[len(idxs)-1]]
|
|
||||||
return fd, ed
|
|
||||||
}
|
|
||||||
|
|
||||||
// MessageDescriptorProto returns the file descriptor proto representing
|
|
||||||
// the message and the message descriptor proto for the message itself.
|
|
||||||
// The returned proto messages must not be mutated.
|
|
||||||
func MessageDescriptorProto(m proto.GeneratedMessage) (*descriptorpb.FileDescriptorProto, *descriptorpb.DescriptorProto) {
|
|
||||||
rawDesc, idxs := MessageRawDescriptor(m)
|
|
||||||
if rawDesc == nil || idxs == nil {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
fd := deriveFileDescriptor(rawDesc)
|
|
||||||
md := fd.MessageType[idxs[0]]
|
|
||||||
for _, i := range idxs[1:] {
|
|
||||||
md = md.NestedType[i]
|
|
||||||
}
|
|
||||||
return fd, md
|
|
||||||
}
|
|
200
vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go
generated
vendored
200
vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go
generated
vendored
@ -1,200 +0,0 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
|
||||||
// source: github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.proto
|
|
||||||
|
|
||||||
package descriptor
|
|
||||||
|
|
||||||
import (
|
|
||||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
|
||||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
|
||||||
descriptorpb "google.golang.org/protobuf/types/descriptorpb"
|
|
||||||
reflect "reflect"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Symbols defined in public import of google/protobuf/descriptor.proto.
|
|
||||||
|
|
||||||
type FieldDescriptorProto_Type = descriptorpb.FieldDescriptorProto_Type
|
|
||||||
|
|
||||||
const FieldDescriptorProto_TYPE_DOUBLE = descriptorpb.FieldDescriptorProto_TYPE_DOUBLE
|
|
||||||
const FieldDescriptorProto_TYPE_FLOAT = descriptorpb.FieldDescriptorProto_TYPE_FLOAT
|
|
||||||
const FieldDescriptorProto_TYPE_INT64 = descriptorpb.FieldDescriptorProto_TYPE_INT64
|
|
||||||
const FieldDescriptorProto_TYPE_UINT64 = descriptorpb.FieldDescriptorProto_TYPE_UINT64
|
|
||||||
const FieldDescriptorProto_TYPE_INT32 = descriptorpb.FieldDescriptorProto_TYPE_INT32
|
|
||||||
const FieldDescriptorProto_TYPE_FIXED64 = descriptorpb.FieldDescriptorProto_TYPE_FIXED64
|
|
||||||
const FieldDescriptorProto_TYPE_FIXED32 = descriptorpb.FieldDescriptorProto_TYPE_FIXED32
|
|
||||||
const FieldDescriptorProto_TYPE_BOOL = descriptorpb.FieldDescriptorProto_TYPE_BOOL
|
|
||||||
const FieldDescriptorProto_TYPE_STRING = descriptorpb.FieldDescriptorProto_TYPE_STRING
|
|
||||||
const FieldDescriptorProto_TYPE_GROUP = descriptorpb.FieldDescriptorProto_TYPE_GROUP
|
|
||||||
const FieldDescriptorProto_TYPE_MESSAGE = descriptorpb.FieldDescriptorProto_TYPE_MESSAGE
|
|
||||||
const FieldDescriptorProto_TYPE_BYTES = descriptorpb.FieldDescriptorProto_TYPE_BYTES
|
|
||||||
const FieldDescriptorProto_TYPE_UINT32 = descriptorpb.FieldDescriptorProto_TYPE_UINT32
|
|
||||||
const FieldDescriptorProto_TYPE_ENUM = descriptorpb.FieldDescriptorProto_TYPE_ENUM
|
|
||||||
const FieldDescriptorProto_TYPE_SFIXED32 = descriptorpb.FieldDescriptorProto_TYPE_SFIXED32
|
|
||||||
const FieldDescriptorProto_TYPE_SFIXED64 = descriptorpb.FieldDescriptorProto_TYPE_SFIXED64
|
|
||||||
const FieldDescriptorProto_TYPE_SINT32 = descriptorpb.FieldDescriptorProto_TYPE_SINT32
|
|
||||||
const FieldDescriptorProto_TYPE_SINT64 = descriptorpb.FieldDescriptorProto_TYPE_SINT64
|
|
||||||
|
|
||||||
var FieldDescriptorProto_Type_name = descriptorpb.FieldDescriptorProto_Type_name
|
|
||||||
var FieldDescriptorProto_Type_value = descriptorpb.FieldDescriptorProto_Type_value
|
|
||||||
|
|
||||||
type FieldDescriptorProto_Label = descriptorpb.FieldDescriptorProto_Label
|
|
||||||
|
|
||||||
const FieldDescriptorProto_LABEL_OPTIONAL = descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL
|
|
||||||
const FieldDescriptorProto_LABEL_REQUIRED = descriptorpb.FieldDescriptorProto_LABEL_REQUIRED
|
|
||||||
const FieldDescriptorProto_LABEL_REPEATED = descriptorpb.FieldDescriptorProto_LABEL_REPEATED
|
|
||||||
|
|
||||||
var FieldDescriptorProto_Label_name = descriptorpb.FieldDescriptorProto_Label_name
|
|
||||||
var FieldDescriptorProto_Label_value = descriptorpb.FieldDescriptorProto_Label_value
|
|
||||||
|
|
||||||
type FileOptions_OptimizeMode = descriptorpb.FileOptions_OptimizeMode
|
|
||||||
|
|
||||||
const FileOptions_SPEED = descriptorpb.FileOptions_SPEED
|
|
||||||
const FileOptions_CODE_SIZE = descriptorpb.FileOptions_CODE_SIZE
|
|
||||||
const FileOptions_LITE_RUNTIME = descriptorpb.FileOptions_LITE_RUNTIME
|
|
||||||
|
|
||||||
var FileOptions_OptimizeMode_name = descriptorpb.FileOptions_OptimizeMode_name
|
|
||||||
var FileOptions_OptimizeMode_value = descriptorpb.FileOptions_OptimizeMode_value
|
|
||||||
|
|
||||||
type FieldOptions_CType = descriptorpb.FieldOptions_CType
|
|
||||||
|
|
||||||
const FieldOptions_STRING = descriptorpb.FieldOptions_STRING
|
|
||||||
const FieldOptions_CORD = descriptorpb.FieldOptions_CORD
|
|
||||||
const FieldOptions_STRING_PIECE = descriptorpb.FieldOptions_STRING_PIECE
|
|
||||||
|
|
||||||
var FieldOptions_CType_name = descriptorpb.FieldOptions_CType_name
|
|
||||||
var FieldOptions_CType_value = descriptorpb.FieldOptions_CType_value
|
|
||||||
|
|
||||||
type FieldOptions_JSType = descriptorpb.FieldOptions_JSType
|
|
||||||
|
|
||||||
const FieldOptions_JS_NORMAL = descriptorpb.FieldOptions_JS_NORMAL
|
|
||||||
const FieldOptions_JS_STRING = descriptorpb.FieldOptions_JS_STRING
|
|
||||||
const FieldOptions_JS_NUMBER = descriptorpb.FieldOptions_JS_NUMBER
|
|
||||||
|
|
||||||
var FieldOptions_JSType_name = descriptorpb.FieldOptions_JSType_name
|
|
||||||
var FieldOptions_JSType_value = descriptorpb.FieldOptions_JSType_value
|
|
||||||
|
|
||||||
type MethodOptions_IdempotencyLevel = descriptorpb.MethodOptions_IdempotencyLevel
|
|
||||||
|
|
||||||
const MethodOptions_IDEMPOTENCY_UNKNOWN = descriptorpb.MethodOptions_IDEMPOTENCY_UNKNOWN
|
|
||||||
const MethodOptions_NO_SIDE_EFFECTS = descriptorpb.MethodOptions_NO_SIDE_EFFECTS
|
|
||||||
const MethodOptions_IDEMPOTENT = descriptorpb.MethodOptions_IDEMPOTENT
|
|
||||||
|
|
||||||
var MethodOptions_IdempotencyLevel_name = descriptorpb.MethodOptions_IdempotencyLevel_name
|
|
||||||
var MethodOptions_IdempotencyLevel_value = descriptorpb.MethodOptions_IdempotencyLevel_value
|
|
||||||
|
|
||||||
type FileDescriptorSet = descriptorpb.FileDescriptorSet
|
|
||||||
type FileDescriptorProto = descriptorpb.FileDescriptorProto
|
|
||||||
type DescriptorProto = descriptorpb.DescriptorProto
|
|
||||||
type ExtensionRangeOptions = descriptorpb.ExtensionRangeOptions
|
|
||||||
type FieldDescriptorProto = descriptorpb.FieldDescriptorProto
|
|
||||||
type OneofDescriptorProto = descriptorpb.OneofDescriptorProto
|
|
||||||
type EnumDescriptorProto = descriptorpb.EnumDescriptorProto
|
|
||||||
type EnumValueDescriptorProto = descriptorpb.EnumValueDescriptorProto
|
|
||||||
type ServiceDescriptorProto = descriptorpb.ServiceDescriptorProto
|
|
||||||
type MethodDescriptorProto = descriptorpb.MethodDescriptorProto
|
|
||||||
|
|
||||||
const Default_MethodDescriptorProto_ClientStreaming = descriptorpb.Default_MethodDescriptorProto_ClientStreaming
|
|
||||||
const Default_MethodDescriptorProto_ServerStreaming = descriptorpb.Default_MethodDescriptorProto_ServerStreaming
|
|
||||||
|
|
||||||
type FileOptions = descriptorpb.FileOptions
|
|
||||||
|
|
||||||
const Default_FileOptions_JavaMultipleFiles = descriptorpb.Default_FileOptions_JavaMultipleFiles
|
|
||||||
const Default_FileOptions_JavaStringCheckUtf8 = descriptorpb.Default_FileOptions_JavaStringCheckUtf8
|
|
||||||
const Default_FileOptions_OptimizeFor = descriptorpb.Default_FileOptions_OptimizeFor
|
|
||||||
const Default_FileOptions_CcGenericServices = descriptorpb.Default_FileOptions_CcGenericServices
|
|
||||||
const Default_FileOptions_JavaGenericServices = descriptorpb.Default_FileOptions_JavaGenericServices
|
|
||||||
const Default_FileOptions_PyGenericServices = descriptorpb.Default_FileOptions_PyGenericServices
|
|
||||||
const Default_FileOptions_PhpGenericServices = descriptorpb.Default_FileOptions_PhpGenericServices
|
|
||||||
const Default_FileOptions_Deprecated = descriptorpb.Default_FileOptions_Deprecated
|
|
||||||
const Default_FileOptions_CcEnableArenas = descriptorpb.Default_FileOptions_CcEnableArenas
|
|
||||||
|
|
||||||
type MessageOptions = descriptorpb.MessageOptions
|
|
||||||
|
|
||||||
const Default_MessageOptions_MessageSetWireFormat = descriptorpb.Default_MessageOptions_MessageSetWireFormat
|
|
||||||
const Default_MessageOptions_NoStandardDescriptorAccessor = descriptorpb.Default_MessageOptions_NoStandardDescriptorAccessor
|
|
||||||
const Default_MessageOptions_Deprecated = descriptorpb.Default_MessageOptions_Deprecated
|
|
||||||
|
|
||||||
type FieldOptions = descriptorpb.FieldOptions
|
|
||||||
|
|
||||||
const Default_FieldOptions_Ctype = descriptorpb.Default_FieldOptions_Ctype
|
|
||||||
const Default_FieldOptions_Jstype = descriptorpb.Default_FieldOptions_Jstype
|
|
||||||
const Default_FieldOptions_Lazy = descriptorpb.Default_FieldOptions_Lazy
|
|
||||||
const Default_FieldOptions_Deprecated = descriptorpb.Default_FieldOptions_Deprecated
|
|
||||||
const Default_FieldOptions_Weak = descriptorpb.Default_FieldOptions_Weak
|
|
||||||
|
|
||||||
type OneofOptions = descriptorpb.OneofOptions
|
|
||||||
type EnumOptions = descriptorpb.EnumOptions
|
|
||||||
|
|
||||||
const Default_EnumOptions_Deprecated = descriptorpb.Default_EnumOptions_Deprecated
|
|
||||||
|
|
||||||
type EnumValueOptions = descriptorpb.EnumValueOptions
|
|
||||||
|
|
||||||
const Default_EnumValueOptions_Deprecated = descriptorpb.Default_EnumValueOptions_Deprecated
|
|
||||||
|
|
||||||
type ServiceOptions = descriptorpb.ServiceOptions
|
|
||||||
|
|
||||||
const Default_ServiceOptions_Deprecated = descriptorpb.Default_ServiceOptions_Deprecated
|
|
||||||
|
|
||||||
type MethodOptions = descriptorpb.MethodOptions
|
|
||||||
|
|
||||||
const Default_MethodOptions_Deprecated = descriptorpb.Default_MethodOptions_Deprecated
|
|
||||||
const Default_MethodOptions_IdempotencyLevel = descriptorpb.Default_MethodOptions_IdempotencyLevel
|
|
||||||
|
|
||||||
type UninterpretedOption = descriptorpb.UninterpretedOption
|
|
||||||
type SourceCodeInfo = descriptorpb.SourceCodeInfo
|
|
||||||
type GeneratedCodeInfo = descriptorpb.GeneratedCodeInfo
|
|
||||||
type DescriptorProto_ExtensionRange = descriptorpb.DescriptorProto_ExtensionRange
|
|
||||||
type DescriptorProto_ReservedRange = descriptorpb.DescriptorProto_ReservedRange
|
|
||||||
type EnumDescriptorProto_EnumReservedRange = descriptorpb.EnumDescriptorProto_EnumReservedRange
|
|
||||||
type UninterpretedOption_NamePart = descriptorpb.UninterpretedOption_NamePart
|
|
||||||
type SourceCodeInfo_Location = descriptorpb.SourceCodeInfo_Location
|
|
||||||
type GeneratedCodeInfo_Annotation = descriptorpb.GeneratedCodeInfo_Annotation
|
|
||||||
|
|
||||||
var File_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto protoreflect.FileDescriptor
|
|
||||||
|
|
||||||
var file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_rawDesc = []byte{
|
|
||||||
0x0a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c,
|
|
||||||
0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x72, 0x6f,
|
|
||||||
0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x67, 0x6f, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72,
|
|
||||||
0x69, 0x70, 0x74, 0x6f, 0x72, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72,
|
|
||||||
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70,
|
|
||||||
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
|
|
||||||
0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68,
|
|
||||||
0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72,
|
|
||||||
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65,
|
|
||||||
0x6e, 0x2d, 0x67, 0x6f, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x3b,
|
|
||||||
0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72,
|
|
||||||
0x6f, 0x74, 0x6f, 0x32,
|
|
||||||
}
|
|
||||||
|
|
||||||
var file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_goTypes = []interface{}{}
|
|
||||||
var file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_depIdxs = []int32{
|
|
||||||
0, // [0:0] is the sub-list for method output_type
|
|
||||||
0, // [0:0] is the sub-list for method input_type
|
|
||||||
0, // [0:0] is the sub-list for extension type_name
|
|
||||||
0, // [0:0] is the sub-list for extension extendee
|
|
||||||
0, // [0:0] is the sub-list for field type_name
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() { file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_init() }
|
|
||||||
func file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_init() {
|
|
||||||
if File_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
type x struct{}
|
|
||||||
out := protoimpl.TypeBuilder{
|
|
||||||
File: protoimpl.DescBuilder{
|
|
||||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
|
||||||
RawDescriptor: file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_rawDesc,
|
|
||||||
NumEnums: 0,
|
|
||||||
NumMessages: 0,
|
|
||||||
NumExtensions: 0,
|
|
||||||
NumServices: 0,
|
|
||||||
},
|
|
||||||
GoTypes: file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_goTypes,
|
|
||||||
DependencyIndexes: file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_depIdxs,
|
|
||||||
}.Build()
|
|
||||||
File_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto = out.File
|
|
||||||
file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_rawDesc = nil
|
|
||||||
file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_goTypes = nil
|
|
||||||
file_github_com_golang_protobuf_protoc_gen_go_descriptor_descriptor_proto_depIdxs = nil
|
|
||||||
}
|
|
71
vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go
generated
vendored
71
vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go
generated
vendored
@ -1,71 +0,0 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
|
||||||
// source: github.com/golang/protobuf/ptypes/wrappers/wrappers.proto
|
|
||||||
|
|
||||||
package wrappers
|
|
||||||
|
|
||||||
import (
|
|
||||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
|
||||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
|
||||||
wrapperspb "google.golang.org/protobuf/types/known/wrapperspb"
|
|
||||||
reflect "reflect"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Symbols defined in public import of google/protobuf/wrappers.proto.
|
|
||||||
|
|
||||||
type DoubleValue = wrapperspb.DoubleValue
|
|
||||||
type FloatValue = wrapperspb.FloatValue
|
|
||||||
type Int64Value = wrapperspb.Int64Value
|
|
||||||
type UInt64Value = wrapperspb.UInt64Value
|
|
||||||
type Int32Value = wrapperspb.Int32Value
|
|
||||||
type UInt32Value = wrapperspb.UInt32Value
|
|
||||||
type BoolValue = wrapperspb.BoolValue
|
|
||||||
type StringValue = wrapperspb.StringValue
|
|
||||||
type BytesValue = wrapperspb.BytesValue
|
|
||||||
|
|
||||||
var File_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto protoreflect.FileDescriptor
|
|
||||||
|
|
||||||
var file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_rawDesc = []byte{
|
|
||||||
0x0a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c,
|
|
||||||
0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x74, 0x79,
|
|
||||||
0x70, 0x65, 0x73, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2f, 0x77, 0x72, 0x61,
|
|
||||||
0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f,
|
|
||||||
0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61,
|
|
||||||
0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x35, 0x5a, 0x33, 0x67,
|
|
||||||
0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67,
|
|
||||||
0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73,
|
|
||||||
0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x3b, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65,
|
|
||||||
0x72, 0x73, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
|
||||||
}
|
|
||||||
|
|
||||||
var file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_goTypes = []interface{}{}
|
|
||||||
var file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_depIdxs = []int32{
|
|
||||||
0, // [0:0] is the sub-list for method output_type
|
|
||||||
0, // [0:0] is the sub-list for method input_type
|
|
||||||
0, // [0:0] is the sub-list for extension type_name
|
|
||||||
0, // [0:0] is the sub-list for extension extendee
|
|
||||||
0, // [0:0] is the sub-list for field type_name
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() { file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_init() }
|
|
||||||
func file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_init() {
|
|
||||||
if File_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
type x struct{}
|
|
||||||
out := protoimpl.TypeBuilder{
|
|
||||||
File: protoimpl.DescBuilder{
|
|
||||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
|
||||||
RawDescriptor: file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_rawDesc,
|
|
||||||
NumEnums: 0,
|
|
||||||
NumMessages: 0,
|
|
||||||
NumExtensions: 0,
|
|
||||||
NumServices: 0,
|
|
||||||
},
|
|
||||||
GoTypes: file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_goTypes,
|
|
||||||
DependencyIndexes: file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_depIdxs,
|
|
||||||
}.Build()
|
|
||||||
File_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto = out.File
|
|
||||||
file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_rawDesc = nil
|
|
||||||
file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_goTypes = nil
|
|
||||||
file_github_com_golang_protobuf_ptypes_wrappers_wrappers_proto_depIdxs = nil
|
|
||||||
}
|
|
19
vendor/github.com/google/go-cmp/cmp/compare.go
generated
vendored
19
vendor/github.com/google/go-cmp/cmp/compare.go
generated
vendored
@ -36,11 +36,12 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp/internal/diff"
|
"github.com/google/go-cmp/cmp/internal/diff"
|
||||||
"github.com/google/go-cmp/cmp/internal/flags"
|
|
||||||
"github.com/google/go-cmp/cmp/internal/function"
|
"github.com/google/go-cmp/cmp/internal/function"
|
||||||
"github.com/google/go-cmp/cmp/internal/value"
|
"github.com/google/go-cmp/cmp/internal/value"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// TODO(≥go1.18): Use any instead of interface{}.
|
||||||
|
|
||||||
// Equal reports whether x and y are equal by recursively applying the
|
// Equal reports whether x and y are equal by recursively applying the
|
||||||
// following rules in the given order to x and y and all of their sub-values:
|
// following rules in the given order to x and y and all of their sub-values:
|
||||||
//
|
//
|
||||||
@ -319,7 +320,6 @@ func (s *state) tryMethod(t reflect.Type, vx, vy reflect.Value) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *state) callTRFunc(f, v reflect.Value, step Transform) reflect.Value {
|
func (s *state) callTRFunc(f, v reflect.Value, step Transform) reflect.Value {
|
||||||
v = sanitizeValue(v, f.Type().In(0))
|
|
||||||
if !s.dynChecker.Next() {
|
if !s.dynChecker.Next() {
|
||||||
return f.Call([]reflect.Value{v})[0]
|
return f.Call([]reflect.Value{v})[0]
|
||||||
}
|
}
|
||||||
@ -343,8 +343,6 @@ func (s *state) callTRFunc(f, v reflect.Value, step Transform) reflect.Value {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *state) callTTBFunc(f, x, y reflect.Value) bool {
|
func (s *state) callTTBFunc(f, x, y reflect.Value) bool {
|
||||||
x = sanitizeValue(x, f.Type().In(0))
|
|
||||||
y = sanitizeValue(y, f.Type().In(1))
|
|
||||||
if !s.dynChecker.Next() {
|
if !s.dynChecker.Next() {
|
||||||
return f.Call([]reflect.Value{x, y})[0].Bool()
|
return f.Call([]reflect.Value{x, y})[0].Bool()
|
||||||
}
|
}
|
||||||
@ -372,19 +370,6 @@ func detectRaces(c chan<- reflect.Value, f reflect.Value, vs ...reflect.Value) {
|
|||||||
ret = f.Call(vs)[0]
|
ret = f.Call(vs)[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
// sanitizeValue converts nil interfaces of type T to those of type R,
|
|
||||||
// assuming that T is assignable to R.
|
|
||||||
// Otherwise, it returns the input value as is.
|
|
||||||
func sanitizeValue(v reflect.Value, t reflect.Type) reflect.Value {
|
|
||||||
// TODO(≥go1.10): Workaround for reflect bug (https://golang.org/issue/22143).
|
|
||||||
if !flags.AtLeastGo110 {
|
|
||||||
if v.Kind() == reflect.Interface && v.IsNil() && v.Type() != t {
|
|
||||||
return reflect.New(t).Elem()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *state) compareStruct(t reflect.Type, vx, vy reflect.Value) {
|
func (s *state) compareStruct(t reflect.Type, vx, vy reflect.Value) {
|
||||||
var addr bool
|
var addr bool
|
||||||
var vax, vay reflect.Value // Addressable versions of vx and vy
|
var vax, vay reflect.Value // Addressable versions of vx and vy
|
||||||
|
1
vendor/github.com/google/go-cmp/cmp/export_panic.go
generated
vendored
1
vendor/github.com/google/go-cmp/cmp/export_panic.go
generated
vendored
@ -2,6 +2,7 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build purego
|
||||||
// +build purego
|
// +build purego
|
||||||
|
|
||||||
package cmp
|
package cmp
|
||||||
|
1
vendor/github.com/google/go-cmp/cmp/export_unsafe.go
generated
vendored
1
vendor/github.com/google/go-cmp/cmp/export_unsafe.go
generated
vendored
@ -2,6 +2,7 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build !purego
|
||||||
// +build !purego
|
// +build !purego
|
||||||
|
|
||||||
package cmp
|
package cmp
|
||||||
|
1
vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go
generated
vendored
1
vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go
generated
vendored
@ -2,6 +2,7 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build !cmp_debug
|
||||||
// +build !cmp_debug
|
// +build !cmp_debug
|
||||||
|
|
||||||
package diff
|
package diff
|
||||||
|
1
vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go
generated
vendored
1
vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go
generated
vendored
@ -2,6 +2,7 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build cmp_debug
|
||||||
// +build cmp_debug
|
// +build cmp_debug
|
||||||
|
|
||||||
package diff
|
package diff
|
||||||
|
10
vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go
generated
vendored
10
vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go
generated
vendored
@ -1,10 +0,0 @@
|
|||||||
// Copyright 2019, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build !go1.10
|
|
||||||
|
|
||||||
package flags
|
|
||||||
|
|
||||||
// AtLeastGo110 reports whether the Go toolchain is at least Go 1.10.
|
|
||||||
const AtLeastGo110 = false
|
|
10
vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go
generated
vendored
10
vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go
generated
vendored
@ -1,10 +0,0 @@
|
|||||||
// Copyright 2019, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// +build go1.10
|
|
||||||
|
|
||||||
package flags
|
|
||||||
|
|
||||||
// AtLeastGo110 reports whether the Go toolchain is at least Go 1.10.
|
|
||||||
const AtLeastGo110 = true
|
|
7
vendor/github.com/google/go-cmp/cmp/internal/value/name.go
generated
vendored
7
vendor/github.com/google/go-cmp/cmp/internal/value/name.go
generated
vendored
@ -9,6 +9,8 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var anyType = reflect.TypeOf((*interface{})(nil)).Elem()
|
||||||
|
|
||||||
// TypeString is nearly identical to reflect.Type.String,
|
// TypeString is nearly identical to reflect.Type.String,
|
||||||
// but has an additional option to specify that full type names be used.
|
// but has an additional option to specify that full type names be used.
|
||||||
func TypeString(t reflect.Type, qualified bool) string {
|
func TypeString(t reflect.Type, qualified bool) string {
|
||||||
@ -20,6 +22,11 @@ func appendTypeName(b []byte, t reflect.Type, qualified, elideFunc bool) []byte
|
|||||||
// of the same name and within the same package,
|
// of the same name and within the same package,
|
||||||
// but declared within the namespace of different functions.
|
// but declared within the namespace of different functions.
|
||||||
|
|
||||||
|
// Use the "any" alias instead of "interface{}" for better readability.
|
||||||
|
if t == anyType {
|
||||||
|
return append(b, "any"...)
|
||||||
|
}
|
||||||
|
|
||||||
// Named type.
|
// Named type.
|
||||||
if t.Name() != "" {
|
if t.Name() != "" {
|
||||||
if qualified && t.PkgPath() != "" {
|
if qualified && t.PkgPath() != "" {
|
||||||
|
1
vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go
generated
vendored
1
vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go
generated
vendored
@ -2,6 +2,7 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build purego
|
||||||
// +build purego
|
// +build purego
|
||||||
|
|
||||||
package value
|
package value
|
||||||
|
1
vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go
generated
vendored
1
vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go
generated
vendored
@ -2,6 +2,7 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build !purego
|
||||||
// +build !purego
|
// +build !purego
|
||||||
|
|
||||||
package value
|
package value
|
||||||
|
2
vendor/github.com/google/go-cmp/cmp/path.go
generated
vendored
2
vendor/github.com/google/go-cmp/cmp/path.go
generated
vendored
@ -178,7 +178,7 @@ type structField struct {
|
|||||||
unexported bool
|
unexported bool
|
||||||
mayForce bool // Forcibly allow visibility
|
mayForce bool // Forcibly allow visibility
|
||||||
paddr bool // Was parent addressable?
|
paddr bool // Was parent addressable?
|
||||||
pvx, pvy reflect.Value // Parent values (always addressible)
|
pvx, pvy reflect.Value // Parent values (always addressable)
|
||||||
field reflect.StructField // Field information
|
field reflect.StructField // Field information
|
||||||
}
|
}
|
||||||
|
|
||||||
|
5
vendor/github.com/google/go-cmp/cmp/report_compare.go
generated
vendored
5
vendor/github.com/google/go-cmp/cmp/report_compare.go
generated
vendored
@ -116,7 +116,10 @@ func (opts formatOptions) FormatDiff(v *valueNode, ptrs *pointerReferences) (out
|
|||||||
}
|
}
|
||||||
|
|
||||||
// For leaf nodes, format the value based on the reflect.Values alone.
|
// For leaf nodes, format the value based on the reflect.Values alone.
|
||||||
if v.MaxDepth == 0 {
|
// As a special case, treat equal []byte as a leaf nodes.
|
||||||
|
isBytes := v.Type.Kind() == reflect.Slice && v.Type.Elem() == reflect.TypeOf(byte(0))
|
||||||
|
isEqualBytes := isBytes && v.NumDiff+v.NumIgnored+v.NumTransformed == 0
|
||||||
|
if v.MaxDepth == 0 || isEqualBytes {
|
||||||
switch opts.DiffMode {
|
switch opts.DiffMode {
|
||||||
case diffUnknown, diffIdentical:
|
case diffUnknown, diffIdentical:
|
||||||
// Format Equal.
|
// Format Equal.
|
||||||
|
13
vendor/github.com/google/go-cmp/cmp/report_reflect.go
generated
vendored
13
vendor/github.com/google/go-cmp/cmp/report_reflect.go
generated
vendored
@ -207,10 +207,11 @@ func (opts formatOptions) FormatValue(v reflect.Value, parentKind reflect.Kind,
|
|||||||
// Check whether this is a []byte of text data.
|
// Check whether this is a []byte of text data.
|
||||||
if t.Elem() == reflect.TypeOf(byte(0)) {
|
if t.Elem() == reflect.TypeOf(byte(0)) {
|
||||||
b := v.Bytes()
|
b := v.Bytes()
|
||||||
isPrintSpace := func(r rune) bool { return unicode.IsPrint(r) && unicode.IsSpace(r) }
|
isPrintSpace := func(r rune) bool { return unicode.IsPrint(r) || unicode.IsSpace(r) }
|
||||||
if len(b) > 0 && utf8.Valid(b) && len(bytes.TrimFunc(b, isPrintSpace)) == 0 {
|
if len(b) > 0 && utf8.Valid(b) && len(bytes.TrimFunc(b, isPrintSpace)) == 0 {
|
||||||
out = opts.formatString("", string(b))
|
out = opts.formatString("", string(b))
|
||||||
return opts.WithTypeMode(emitType).FormatType(t, out)
|
skipType = true
|
||||||
|
return opts.FormatType(t, out)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -281,7 +282,12 @@ func (opts formatOptions) FormatValue(v reflect.Value, parentKind reflect.Kind,
|
|||||||
}
|
}
|
||||||
defer ptrs.Pop()
|
defer ptrs.Pop()
|
||||||
|
|
||||||
skipType = true // Let the underlying value print the type instead
|
// Skip the name only if this is an unnamed pointer type.
|
||||||
|
// Otherwise taking the address of a value does not reproduce
|
||||||
|
// the named pointer type.
|
||||||
|
if v.Type().Name() == "" {
|
||||||
|
skipType = true // Let the underlying value print the type instead
|
||||||
|
}
|
||||||
out = opts.FormatValue(v.Elem(), t.Kind(), ptrs)
|
out = opts.FormatValue(v.Elem(), t.Kind(), ptrs)
|
||||||
out = wrapTrunkReference(ptrRef, opts.PrintAddresses, out)
|
out = wrapTrunkReference(ptrRef, opts.PrintAddresses, out)
|
||||||
out = &textWrap{Prefix: "&", Value: out}
|
out = &textWrap{Prefix: "&", Value: out}
|
||||||
@ -292,7 +298,6 @@ func (opts formatOptions) FormatValue(v reflect.Value, parentKind reflect.Kind,
|
|||||||
}
|
}
|
||||||
// Interfaces accept different concrete types,
|
// Interfaces accept different concrete types,
|
||||||
// so configure the underlying value to explicitly print the type.
|
// so configure the underlying value to explicitly print the type.
|
||||||
skipType = true // Print the concrete type instead
|
|
||||||
return opts.WithTypeMode(emitType).FormatValue(v.Elem(), t.Kind(), ptrs)
|
return opts.WithTypeMode(emitType).FormatValue(v.Elem(), t.Kind(), ptrs)
|
||||||
default:
|
default:
|
||||||
panic(fmt.Sprintf("%v kind not handled", v.Kind()))
|
panic(fmt.Sprintf("%v kind not handled", v.Kind()))
|
||||||
|
6
vendor/github.com/google/go-cmp/cmp/report_slices.go
generated
vendored
6
vendor/github.com/google/go-cmp/cmp/report_slices.go
generated
vendored
@ -80,7 +80,7 @@ func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Use specialized string diffing for longer slices or strings.
|
// Use specialized string diffing for longer slices or strings.
|
||||||
const minLength = 64
|
const minLength = 32
|
||||||
return vx.Len() >= minLength && vy.Len() >= minLength
|
return vx.Len() >= minLength && vy.Len() >= minLength
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -563,10 +563,10 @@ func cleanupSurroundingIdentical(groups []diffStats, eq func(i, j int) bool) []d
|
|||||||
nx := ds.NumIdentical + ds.NumRemoved + ds.NumModified
|
nx := ds.NumIdentical + ds.NumRemoved + ds.NumModified
|
||||||
ny := ds.NumIdentical + ds.NumInserted + ds.NumModified
|
ny := ds.NumIdentical + ds.NumInserted + ds.NumModified
|
||||||
var numLeadingIdentical, numTrailingIdentical int
|
var numLeadingIdentical, numTrailingIdentical int
|
||||||
for i := 0; i < nx && i < ny && eq(ix+i, iy+i); i++ {
|
for j := 0; j < nx && j < ny && eq(ix+j, iy+j); j++ {
|
||||||
numLeadingIdentical++
|
numLeadingIdentical++
|
||||||
}
|
}
|
||||||
for i := 0; i < nx && i < ny && eq(ix+nx-1-i, iy+ny-1-i); i++ {
|
for j := 0; j < nx && j < ny && eq(ix+nx-1-j, iy+ny-1-j); j++ {
|
||||||
numTrailingIdentical++
|
numTrailingIdentical++
|
||||||
}
|
}
|
||||||
if numIdentical := numLeadingIdentical + numTrailingIdentical; numIdentical > 0 {
|
if numIdentical := numLeadingIdentical + numTrailingIdentical; numIdentical > 0 {
|
||||||
|
23
vendor/github.com/grpc-ecosystem/grpc-gateway/internal/BUILD.bazel
generated
vendored
23
vendor/github.com/grpc-ecosystem/grpc-gateway/internal/BUILD.bazel
generated
vendored
@ -1,23 +0,0 @@
|
|||||||
load("@rules_proto//proto:defs.bzl", "proto_library")
|
|
||||||
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
|
||||||
load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
|
|
||||||
|
|
||||||
package(default_visibility = ["//visibility:public"])
|
|
||||||
|
|
||||||
proto_library(
|
|
||||||
name = "internal_proto",
|
|
||||||
srcs = ["errors.proto"],
|
|
||||||
deps = ["@com_google_protobuf//:any_proto"],
|
|
||||||
)
|
|
||||||
|
|
||||||
go_proto_library(
|
|
||||||
name = "internal_go_proto",
|
|
||||||
importpath = "github.com/grpc-ecosystem/grpc-gateway/internal",
|
|
||||||
proto = ":internal_proto",
|
|
||||||
)
|
|
||||||
|
|
||||||
go_library(
|
|
||||||
name = "go_default_library",
|
|
||||||
embed = [":internal_go_proto"],
|
|
||||||
importpath = "github.com/grpc-ecosystem/grpc-gateway/internal",
|
|
||||||
)
|
|
189
vendor/github.com/grpc-ecosystem/grpc-gateway/internal/errors.pb.go
generated
vendored
189
vendor/github.com/grpc-ecosystem/grpc-gateway/internal/errors.pb.go
generated
vendored
@ -1,189 +0,0 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
|
||||||
// source: internal/errors.proto
|
|
||||||
|
|
||||||
package internal
|
|
||||||
|
|
||||||
import (
|
|
||||||
fmt "fmt"
|
|
||||||
proto "github.com/golang/protobuf/proto"
|
|
||||||
any "github.com/golang/protobuf/ptypes/any"
|
|
||||||
math "math"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Reference imports to suppress errors if they are not otherwise used.
|
|
||||||
var _ = proto.Marshal
|
|
||||||
var _ = fmt.Errorf
|
|
||||||
var _ = math.Inf
|
|
||||||
|
|
||||||
// This is a compile-time assertion to ensure that this generated file
|
|
||||||
// is compatible with the proto package it is being compiled against.
|
|
||||||
// A compilation error at this line likely means your copy of the
|
|
||||||
// proto package needs to be updated.
|
|
||||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
|
||||||
|
|
||||||
// Error is the generic error returned from unary RPCs.
|
|
||||||
type Error struct {
|
|
||||||
Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"`
|
|
||||||
// This is to make the error more compatible with users that expect errors to be Status objects:
|
|
||||||
// https://github.com/grpc/grpc/blob/master/src/proto/grpc/status/status.proto
|
|
||||||
// It should be the exact same message as the Error field.
|
|
||||||
Code int32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"`
|
|
||||||
Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"`
|
|
||||||
Details []*any.Any `protobuf:"bytes,4,rep,name=details,proto3" json:"details,omitempty"`
|
|
||||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
|
||||||
XXX_unrecognized []byte `json:"-"`
|
|
||||||
XXX_sizecache int32 `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Error) Reset() { *m = Error{} }
|
|
||||||
func (m *Error) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*Error) ProtoMessage() {}
|
|
||||||
func (*Error) Descriptor() ([]byte, []int) {
|
|
||||||
return fileDescriptor_9b093362ca6d1e03, []int{0}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Error) XXX_Unmarshal(b []byte) error {
|
|
||||||
return xxx_messageInfo_Error.Unmarshal(m, b)
|
|
||||||
}
|
|
||||||
func (m *Error) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
|
||||||
return xxx_messageInfo_Error.Marshal(b, m, deterministic)
|
|
||||||
}
|
|
||||||
func (m *Error) XXX_Merge(src proto.Message) {
|
|
||||||
xxx_messageInfo_Error.Merge(m, src)
|
|
||||||
}
|
|
||||||
func (m *Error) XXX_Size() int {
|
|
||||||
return xxx_messageInfo_Error.Size(m)
|
|
||||||
}
|
|
||||||
func (m *Error) XXX_DiscardUnknown() {
|
|
||||||
xxx_messageInfo_Error.DiscardUnknown(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
var xxx_messageInfo_Error proto.InternalMessageInfo
|
|
||||||
|
|
||||||
func (m *Error) GetError() string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Error
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Error) GetCode() int32 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Code
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Error) GetMessage() string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Message
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Error) GetDetails() []*any.Any {
|
|
||||||
if m != nil {
|
|
||||||
return m.Details
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// StreamError is a response type which is returned when
|
|
||||||
// streaming rpc returns an error.
|
|
||||||
type StreamError struct {
|
|
||||||
GrpcCode int32 `protobuf:"varint,1,opt,name=grpc_code,json=grpcCode,proto3" json:"grpc_code,omitempty"`
|
|
||||||
HttpCode int32 `protobuf:"varint,2,opt,name=http_code,json=httpCode,proto3" json:"http_code,omitempty"`
|
|
||||||
Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"`
|
|
||||||
HttpStatus string `protobuf:"bytes,4,opt,name=http_status,json=httpStatus,proto3" json:"http_status,omitempty"`
|
|
||||||
Details []*any.Any `protobuf:"bytes,5,rep,name=details,proto3" json:"details,omitempty"`
|
|
||||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
|
||||||
XXX_unrecognized []byte `json:"-"`
|
|
||||||
XXX_sizecache int32 `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *StreamError) Reset() { *m = StreamError{} }
|
|
||||||
func (m *StreamError) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*StreamError) ProtoMessage() {}
|
|
||||||
func (*StreamError) Descriptor() ([]byte, []int) {
|
|
||||||
return fileDescriptor_9b093362ca6d1e03, []int{1}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *StreamError) XXX_Unmarshal(b []byte) error {
|
|
||||||
return xxx_messageInfo_StreamError.Unmarshal(m, b)
|
|
||||||
}
|
|
||||||
func (m *StreamError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
|
||||||
return xxx_messageInfo_StreamError.Marshal(b, m, deterministic)
|
|
||||||
}
|
|
||||||
func (m *StreamError) XXX_Merge(src proto.Message) {
|
|
||||||
xxx_messageInfo_StreamError.Merge(m, src)
|
|
||||||
}
|
|
||||||
func (m *StreamError) XXX_Size() int {
|
|
||||||
return xxx_messageInfo_StreamError.Size(m)
|
|
||||||
}
|
|
||||||
func (m *StreamError) XXX_DiscardUnknown() {
|
|
||||||
xxx_messageInfo_StreamError.DiscardUnknown(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
var xxx_messageInfo_StreamError proto.InternalMessageInfo
|
|
||||||
|
|
||||||
func (m *StreamError) GetGrpcCode() int32 {
|
|
||||||
if m != nil {
|
|
||||||
return m.GrpcCode
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *StreamError) GetHttpCode() int32 {
|
|
||||||
if m != nil {
|
|
||||||
return m.HttpCode
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *StreamError) GetMessage() string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Message
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *StreamError) GetHttpStatus() string {
|
|
||||||
if m != nil {
|
|
||||||
return m.HttpStatus
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *StreamError) GetDetails() []*any.Any {
|
|
||||||
if m != nil {
|
|
||||||
return m.Details
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
proto.RegisterType((*Error)(nil), "grpc.gateway.runtime.Error")
|
|
||||||
proto.RegisterType((*StreamError)(nil), "grpc.gateway.runtime.StreamError")
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() { proto.RegisterFile("internal/errors.proto", fileDescriptor_9b093362ca6d1e03) }
|
|
||||||
|
|
||||||
var fileDescriptor_9b093362ca6d1e03 = []byte{
|
|
||||||
// 252 bytes of a gzipped FileDescriptorProto
|
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x90, 0xc1, 0x4a, 0xc4, 0x30,
|
|
||||||
0x10, 0x86, 0x89, 0xbb, 0x75, 0xdb, 0xe9, 0x2d, 0x54, 0x88, 0xee, 0xc1, 0xb2, 0xa7, 0x9e, 0x52,
|
|
||||||
0xd0, 0x27, 0xd0, 0xc5, 0x17, 0xe8, 0xde, 0xbc, 0x2c, 0xd9, 0xdd, 0x31, 0x16, 0xda, 0xa4, 0x24,
|
|
||||||
0x53, 0xa4, 0xf8, 0x56, 0x3e, 0xa1, 0x24, 0xa5, 0xb0, 0x27, 0xf1, 0xd6, 0xf9, 0xfb, 0xcf, 0x7c,
|
|
||||||
0x1f, 0x81, 0xbb, 0xd6, 0x10, 0x3a, 0xa3, 0xba, 0x1a, 0x9d, 0xb3, 0xce, 0xcb, 0xc1, 0x59, 0xb2,
|
|
||||||
0xbc, 0xd0, 0x6e, 0x38, 0x4b, 0xad, 0x08, 0xbf, 0xd4, 0x24, 0xdd, 0x68, 0xa8, 0xed, 0xf1, 0xe1,
|
|
||||||
0x5e, 0x5b, 0xab, 0x3b, 0xac, 0x63, 0xe7, 0x34, 0x7e, 0xd4, 0xca, 0x4c, 0xf3, 0xc2, 0xee, 0x1b,
|
|
||||||
0x92, 0xb7, 0x70, 0x80, 0x17, 0x90, 0xc4, 0x4b, 0x82, 0x95, 0xac, 0xca, 0x9a, 0x79, 0xe0, 0x1c,
|
|
||||||
0xd6, 0x67, 0x7b, 0x41, 0x71, 0x53, 0xb2, 0x2a, 0x69, 0xe2, 0x37, 0x17, 0xb0, 0xe9, 0xd1, 0x7b,
|
|
||||||
0xa5, 0x51, 0xac, 0x62, 0x77, 0x19, 0xb9, 0x84, 0xcd, 0x05, 0x49, 0xb5, 0x9d, 0x17, 0xeb, 0x72,
|
|
||||||
0x55, 0xe5, 0x4f, 0x85, 0x9c, 0xc9, 0x72, 0x21, 0xcb, 0x17, 0x33, 0x35, 0x4b, 0x69, 0xf7, 0xc3,
|
|
||||||
0x20, 0x3f, 0x90, 0x43, 0xd5, 0xcf, 0x0e, 0x5b, 0xc8, 0x82, 0xff, 0x31, 0x22, 0x59, 0x44, 0xa6,
|
|
||||||
0x21, 0xd8, 0x07, 0xec, 0x16, 0xb2, 0x4f, 0xa2, 0xe1, 0x78, 0xe5, 0x93, 0x86, 0x60, 0xff, 0xb7,
|
|
||||||
0xd3, 0x23, 0xe4, 0x71, 0xcd, 0x93, 0xa2, 0x31, 0x78, 0x85, 0xbf, 0x10, 0xa2, 0x43, 0x4c, 0xae,
|
|
||||||
0xa5, 0x93, 0x7f, 0x48, 0xbf, 0xc2, 0x7b, 0xba, 0xbc, 0xfd, 0xe9, 0x36, 0x56, 0x9e, 0x7f, 0x03,
|
|
||||||
0x00, 0x00, 0xff, 0xff, 0xde, 0x72, 0x6b, 0x83, 0x8e, 0x01, 0x00, 0x00,
|
|
||||||
}
|
|
26
vendor/github.com/grpc-ecosystem/grpc-gateway/internal/errors.proto
generated
vendored
26
vendor/github.com/grpc-ecosystem/grpc-gateway/internal/errors.proto
generated
vendored
@ -1,26 +0,0 @@
|
|||||||
syntax = "proto3";
|
|
||||||
package grpc.gateway.runtime;
|
|
||||||
option go_package = "internal";
|
|
||||||
|
|
||||||
import "google/protobuf/any.proto";
|
|
||||||
|
|
||||||
// Error is the generic error returned from unary RPCs.
|
|
||||||
message Error {
|
|
||||||
string error = 1;
|
|
||||||
// This is to make the error more compatible with users that expect errors to be Status objects:
|
|
||||||
// https://github.com/grpc/grpc/blob/master/src/proto/grpc/status/status.proto
|
|
||||||
// It should be the exact same message as the Error field.
|
|
||||||
int32 code = 2;
|
|
||||||
string message = 3;
|
|
||||||
repeated google.protobuf.Any details = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
// StreamError is a response type which is returned when
|
|
||||||
// streaming rpc returns an error.
|
|
||||||
message StreamError {
|
|
||||||
int32 grpc_code = 1;
|
|
||||||
int32 http_code = 2;
|
|
||||||
string message = 3;
|
|
||||||
string http_status = 4;
|
|
||||||
repeated google.protobuf.Any details = 5;
|
|
||||||
}
|
|
85
vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/BUILD.bazel
generated
vendored
85
vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/BUILD.bazel
generated
vendored
@ -1,85 +0,0 @@
|
|||||||
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
|
|
||||||
|
|
||||||
package(default_visibility = ["//visibility:public"])
|
|
||||||
|
|
||||||
go_library(
|
|
||||||
name = "go_default_library",
|
|
||||||
srcs = [
|
|
||||||
"context.go",
|
|
||||||
"convert.go",
|
|
||||||
"doc.go",
|
|
||||||
"errors.go",
|
|
||||||
"fieldmask.go",
|
|
||||||
"handler.go",
|
|
||||||
"marshal_httpbodyproto.go",
|
|
||||||
"marshal_json.go",
|
|
||||||
"marshal_jsonpb.go",
|
|
||||||
"marshal_proto.go",
|
|
||||||
"marshaler.go",
|
|
||||||
"marshaler_registry.go",
|
|
||||||
"mux.go",
|
|
||||||
"pattern.go",
|
|
||||||
"proto2_convert.go",
|
|
||||||
"proto_errors.go",
|
|
||||||
"query.go",
|
|
||||||
],
|
|
||||||
importpath = "github.com/grpc-ecosystem/grpc-gateway/runtime",
|
|
||||||
deps = [
|
|
||||||
"//internal:go_default_library",
|
|
||||||
"//utilities:go_default_library",
|
|
||||||
"@com_github_golang_protobuf//descriptor:go_default_library_gen",
|
|
||||||
"@com_github_golang_protobuf//jsonpb:go_default_library_gen",
|
|
||||||
"@com_github_golang_protobuf//proto:go_default_library",
|
|
||||||
"@go_googleapis//google/api:httpbody_go_proto",
|
|
||||||
"@io_bazel_rules_go//proto/wkt:any_go_proto",
|
|
||||||
"@io_bazel_rules_go//proto/wkt:descriptor_go_proto",
|
|
||||||
"@io_bazel_rules_go//proto/wkt:duration_go_proto",
|
|
||||||
"@io_bazel_rules_go//proto/wkt:field_mask_go_proto",
|
|
||||||
"@io_bazel_rules_go//proto/wkt:timestamp_go_proto",
|
|
||||||
"@io_bazel_rules_go//proto/wkt:wrappers_go_proto",
|
|
||||||
"@org_golang_google_grpc//codes:go_default_library",
|
|
||||||
"@org_golang_google_grpc//grpclog:go_default_library",
|
|
||||||
"@org_golang_google_grpc//metadata:go_default_library",
|
|
||||||
"@org_golang_google_grpc//status:go_default_library",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
go_test(
|
|
||||||
name = "go_default_test",
|
|
||||||
size = "small",
|
|
||||||
srcs = [
|
|
||||||
"context_test.go",
|
|
||||||
"convert_test.go",
|
|
||||||
"errors_test.go",
|
|
||||||
"fieldmask_test.go",
|
|
||||||
"handler_test.go",
|
|
||||||
"marshal_httpbodyproto_test.go",
|
|
||||||
"marshal_json_test.go",
|
|
||||||
"marshal_jsonpb_test.go",
|
|
||||||
"marshal_proto_test.go",
|
|
||||||
"marshaler_registry_test.go",
|
|
||||||
"mux_test.go",
|
|
||||||
"pattern_test.go",
|
|
||||||
"query_test.go",
|
|
||||||
],
|
|
||||||
embed = [":go_default_library"],
|
|
||||||
deps = [
|
|
||||||
"//internal:go_default_library",
|
|
||||||
"//runtime/internal/examplepb:go_default_library",
|
|
||||||
"//utilities:go_default_library",
|
|
||||||
"@com_github_golang_protobuf//jsonpb:go_default_library_gen",
|
|
||||||
"@com_github_golang_protobuf//proto:go_default_library",
|
|
||||||
"@com_github_golang_protobuf//ptypes:go_default_library_gen",
|
|
||||||
"@go_googleapis//google/api:httpbody_go_proto",
|
|
||||||
"@go_googleapis//google/rpc:errdetails_go_proto",
|
|
||||||
"@io_bazel_rules_go//proto/wkt:duration_go_proto",
|
|
||||||
"@io_bazel_rules_go//proto/wkt:empty_go_proto",
|
|
||||||
"@io_bazel_rules_go//proto/wkt:field_mask_go_proto",
|
|
||||||
"@io_bazel_rules_go//proto/wkt:struct_go_proto",
|
|
||||||
"@io_bazel_rules_go//proto/wkt:timestamp_go_proto",
|
|
||||||
"@io_bazel_rules_go//proto/wkt:wrappers_go_proto",
|
|
||||||
"@org_golang_google_grpc//codes:go_default_library",
|
|
||||||
"@org_golang_google_grpc//metadata:go_default_library",
|
|
||||||
"@org_golang_google_grpc//status:go_default_library",
|
|
||||||
],
|
|
||||||
)
|
|
186
vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/errors.go
generated
vendored
186
vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/errors.go
generated
vendored
@ -1,186 +0,0 @@
|
|||||||
package runtime
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/grpc-ecosystem/grpc-gateway/internal"
|
|
||||||
"google.golang.org/grpc/codes"
|
|
||||||
"google.golang.org/grpc/grpclog"
|
|
||||||
"google.golang.org/grpc/status"
|
|
||||||
)
|
|
||||||
|
|
||||||
// HTTPStatusFromCode converts a gRPC error code into the corresponding HTTP response status.
|
|
||||||
// See: https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto
|
|
||||||
func HTTPStatusFromCode(code codes.Code) int {
|
|
||||||
switch code {
|
|
||||||
case codes.OK:
|
|
||||||
return http.StatusOK
|
|
||||||
case codes.Canceled:
|
|
||||||
return http.StatusRequestTimeout
|
|
||||||
case codes.Unknown:
|
|
||||||
return http.StatusInternalServerError
|
|
||||||
case codes.InvalidArgument:
|
|
||||||
return http.StatusBadRequest
|
|
||||||
case codes.DeadlineExceeded:
|
|
||||||
return http.StatusGatewayTimeout
|
|
||||||
case codes.NotFound:
|
|
||||||
return http.StatusNotFound
|
|
||||||
case codes.AlreadyExists:
|
|
||||||
return http.StatusConflict
|
|
||||||
case codes.PermissionDenied:
|
|
||||||
return http.StatusForbidden
|
|
||||||
case codes.Unauthenticated:
|
|
||||||
return http.StatusUnauthorized
|
|
||||||
case codes.ResourceExhausted:
|
|
||||||
return http.StatusTooManyRequests
|
|
||||||
case codes.FailedPrecondition:
|
|
||||||
// Note, this deliberately doesn't translate to the similarly named '412 Precondition Failed' HTTP response status.
|
|
||||||
return http.StatusBadRequest
|
|
||||||
case codes.Aborted:
|
|
||||||
return http.StatusConflict
|
|
||||||
case codes.OutOfRange:
|
|
||||||
return http.StatusBadRequest
|
|
||||||
case codes.Unimplemented:
|
|
||||||
return http.StatusNotImplemented
|
|
||||||
case codes.Internal:
|
|
||||||
return http.StatusInternalServerError
|
|
||||||
case codes.Unavailable:
|
|
||||||
return http.StatusServiceUnavailable
|
|
||||||
case codes.DataLoss:
|
|
||||||
return http.StatusInternalServerError
|
|
||||||
}
|
|
||||||
|
|
||||||
grpclog.Infof("Unknown gRPC error code: %v", code)
|
|
||||||
return http.StatusInternalServerError
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
// HTTPError replies to the request with an error.
|
|
||||||
//
|
|
||||||
// HTTPError is called:
|
|
||||||
// - From generated per-endpoint gateway handler code, when calling the backend results in an error.
|
|
||||||
// - From gateway runtime code, when forwarding the response message results in an error.
|
|
||||||
//
|
|
||||||
// The default value for HTTPError calls the custom error handler configured on the ServeMux via the
|
|
||||||
// WithProtoErrorHandler serve option if that option was used, calling GlobalHTTPErrorHandler otherwise.
|
|
||||||
//
|
|
||||||
// To customize the error handling of a particular ServeMux instance, use the WithProtoErrorHandler
|
|
||||||
// serve option.
|
|
||||||
//
|
|
||||||
// To customize the error format for all ServeMux instances not using the WithProtoErrorHandler serve
|
|
||||||
// option, set GlobalHTTPErrorHandler to a custom function.
|
|
||||||
//
|
|
||||||
// Setting this variable directly to customize error format is deprecated.
|
|
||||||
HTTPError = MuxOrGlobalHTTPError
|
|
||||||
|
|
||||||
// GlobalHTTPErrorHandler is the HTTPError handler for all ServeMux instances not using the
|
|
||||||
// WithProtoErrorHandler serve option.
|
|
||||||
//
|
|
||||||
// You can set a custom function to this variable to customize error format.
|
|
||||||
GlobalHTTPErrorHandler = DefaultHTTPError
|
|
||||||
|
|
||||||
// OtherErrorHandler handles gateway errors from parsing and routing client requests for all
|
|
||||||
// ServeMux instances not using the WithProtoErrorHandler serve option.
|
|
||||||
//
|
|
||||||
// It returns the following error codes: StatusMethodNotAllowed StatusNotFound StatusBadRequest
|
|
||||||
//
|
|
||||||
// To customize parsing and routing error handling of a particular ServeMux instance, use the
|
|
||||||
// WithProtoErrorHandler serve option.
|
|
||||||
//
|
|
||||||
// To customize parsing and routing error handling of all ServeMux instances not using the
|
|
||||||
// WithProtoErrorHandler serve option, set a custom function to this variable.
|
|
||||||
OtherErrorHandler = DefaultOtherErrorHandler
|
|
||||||
)
|
|
||||||
|
|
||||||
// MuxOrGlobalHTTPError uses the mux-configured error handler, falling back to GlobalErrorHandler.
|
|
||||||
func MuxOrGlobalHTTPError(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, r *http.Request, err error) {
|
|
||||||
if mux.protoErrorHandler != nil {
|
|
||||||
mux.protoErrorHandler(ctx, mux, marshaler, w, r, err)
|
|
||||||
} else {
|
|
||||||
GlobalHTTPErrorHandler(ctx, mux, marshaler, w, r, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// DefaultHTTPError is the default implementation of HTTPError.
|
|
||||||
// If "err" is an error from gRPC system, the function replies with the status code mapped by HTTPStatusFromCode.
|
|
||||||
// If otherwise, it replies with http.StatusInternalServerError.
|
|
||||||
//
|
|
||||||
// The response body returned by this function is a JSON object,
|
|
||||||
// which contains a member whose key is "error" and whose value is err.Error().
|
|
||||||
func DefaultHTTPError(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, r *http.Request, err error) {
|
|
||||||
const fallback = `{"error": "failed to marshal error message"}`
|
|
||||||
|
|
||||||
s, ok := status.FromError(err)
|
|
||||||
if !ok {
|
|
||||||
s = status.New(codes.Unknown, err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
w.Header().Del("Trailer")
|
|
||||||
w.Header().Del("Transfer-Encoding")
|
|
||||||
|
|
||||||
contentType := marshaler.ContentType()
|
|
||||||
// Check marshaler on run time in order to keep backwards compatibility
|
|
||||||
// An interface param needs to be added to the ContentType() function on
|
|
||||||
// the Marshal interface to be able to remove this check
|
|
||||||
if typeMarshaler, ok := marshaler.(contentTypeMarshaler); ok {
|
|
||||||
pb := s.Proto()
|
|
||||||
contentType = typeMarshaler.ContentTypeFromMessage(pb)
|
|
||||||
}
|
|
||||||
w.Header().Set("Content-Type", contentType)
|
|
||||||
|
|
||||||
body := &internal.Error{
|
|
||||||
Error: s.Message(),
|
|
||||||
Message: s.Message(),
|
|
||||||
Code: int32(s.Code()),
|
|
||||||
Details: s.Proto().GetDetails(),
|
|
||||||
}
|
|
||||||
|
|
||||||
buf, merr := marshaler.Marshal(body)
|
|
||||||
if merr != nil {
|
|
||||||
grpclog.Infof("Failed to marshal error message %q: %v", body, merr)
|
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
|
||||||
if _, err := io.WriteString(w, fallback); err != nil {
|
|
||||||
grpclog.Infof("Failed to write response: %v", err)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
md, ok := ServerMetadataFromContext(ctx)
|
|
||||||
if !ok {
|
|
||||||
grpclog.Infof("Failed to extract ServerMetadata from context")
|
|
||||||
}
|
|
||||||
|
|
||||||
handleForwardResponseServerMetadata(w, mux, md)
|
|
||||||
|
|
||||||
// RFC 7230 https://tools.ietf.org/html/rfc7230#section-4.1.2
|
|
||||||
// Unless the request includes a TE header field indicating "trailers"
|
|
||||||
// is acceptable, as described in Section 4.3, a server SHOULD NOT
|
|
||||||
// generate trailer fields that it believes are necessary for the user
|
|
||||||
// agent to receive.
|
|
||||||
var wantsTrailers bool
|
|
||||||
|
|
||||||
if te := r.Header.Get("TE"); strings.Contains(strings.ToLower(te), "trailers") {
|
|
||||||
wantsTrailers = true
|
|
||||||
handleForwardResponseTrailerHeader(w, md)
|
|
||||||
w.Header().Set("Transfer-Encoding", "chunked")
|
|
||||||
}
|
|
||||||
|
|
||||||
st := HTTPStatusFromCode(s.Code())
|
|
||||||
w.WriteHeader(st)
|
|
||||||
if _, err := w.Write(buf); err != nil {
|
|
||||||
grpclog.Infof("Failed to write response: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if wantsTrailers {
|
|
||||||
handleForwardResponseTrailer(w, md)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// DefaultOtherErrorHandler is the default implementation of OtherErrorHandler.
|
|
||||||
// It simply writes a string representation of the given error into "w".
|
|
||||||
func DefaultOtherErrorHandler(w http.ResponseWriter, _ *http.Request, msg string, code int) {
|
|
||||||
http.Error(w, msg, code)
|
|
||||||
}
|
|
89
vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/fieldmask.go
generated
vendored
89
vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/fieldmask.go
generated
vendored
@ -1,89 +0,0 @@
|
|||||||
package runtime
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"io"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
descriptor2 "github.com/golang/protobuf/descriptor"
|
|
||||||
"github.com/golang/protobuf/protoc-gen-go/descriptor"
|
|
||||||
"google.golang.org/genproto/protobuf/field_mask"
|
|
||||||
)
|
|
||||||
|
|
||||||
func translateName(name string, md *descriptor.DescriptorProto) (string, *descriptor.DescriptorProto) {
|
|
||||||
// TODO - should really gate this with a test that the marshaller has used json names
|
|
||||||
if md != nil {
|
|
||||||
for _, f := range md.Field {
|
|
||||||
if f.JsonName != nil && f.Name != nil && *f.JsonName == name {
|
|
||||||
var subType *descriptor.DescriptorProto
|
|
||||||
|
|
||||||
// If the field has a TypeName then we retrieve the nested type for translating the embedded message names.
|
|
||||||
if f.TypeName != nil {
|
|
||||||
typeSplit := strings.Split(*f.TypeName, ".")
|
|
||||||
typeName := typeSplit[len(typeSplit)-1]
|
|
||||||
for _, t := range md.NestedType {
|
|
||||||
if typeName == *t.Name {
|
|
||||||
subType = t
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return *f.Name, subType
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return name, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// FieldMaskFromRequestBody creates a FieldMask printing all complete paths from the JSON body.
|
|
||||||
func FieldMaskFromRequestBody(r io.Reader, md *descriptor.DescriptorProto) (*field_mask.FieldMask, error) {
|
|
||||||
fm := &field_mask.FieldMask{}
|
|
||||||
var root interface{}
|
|
||||||
if err := json.NewDecoder(r).Decode(&root); err != nil {
|
|
||||||
if err == io.EOF {
|
|
||||||
return fm, nil
|
|
||||||
}
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
queue := []fieldMaskPathItem{{node: root, md: md}}
|
|
||||||
for len(queue) > 0 {
|
|
||||||
// dequeue an item
|
|
||||||
item := queue[0]
|
|
||||||
queue = queue[1:]
|
|
||||||
|
|
||||||
if m, ok := item.node.(map[string]interface{}); ok {
|
|
||||||
// if the item is an object, then enqueue all of its children
|
|
||||||
for k, v := range m {
|
|
||||||
protoName, subMd := translateName(k, item.md)
|
|
||||||
if subMsg, ok := v.(descriptor2.Message); ok {
|
|
||||||
_, subMd = descriptor2.ForMessage(subMsg)
|
|
||||||
}
|
|
||||||
|
|
||||||
var path string
|
|
||||||
if item.path == "" {
|
|
||||||
path = protoName
|
|
||||||
} else {
|
|
||||||
path = item.path + "." + protoName
|
|
||||||
}
|
|
||||||
queue = append(queue, fieldMaskPathItem{path: path, node: v, md: subMd})
|
|
||||||
}
|
|
||||||
} else if len(item.path) > 0 {
|
|
||||||
// otherwise, it's a leaf node so print its path
|
|
||||||
fm.Paths = append(fm.Paths, item.path)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return fm, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// fieldMaskPathItem stores a in-progress deconstruction of a path for a fieldmask
|
|
||||||
type fieldMaskPathItem struct {
|
|
||||||
// the list of prior fields leading up to node connected by dots
|
|
||||||
path string
|
|
||||||
|
|
||||||
// a generic decoded json object the current item to inspect for further path extraction
|
|
||||||
node interface{}
|
|
||||||
|
|
||||||
// descriptor for parent message
|
|
||||||
md *descriptor.DescriptorProto
|
|
||||||
}
|
|
106
vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto_errors.go
generated
vendored
106
vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto_errors.go
generated
vendored
@ -1,106 +0,0 @@
|
|||||||
package runtime
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/golang/protobuf/ptypes/any"
|
|
||||||
"github.com/grpc-ecosystem/grpc-gateway/internal"
|
|
||||||
"google.golang.org/grpc/codes"
|
|
||||||
"google.golang.org/grpc/grpclog"
|
|
||||||
"google.golang.org/grpc/status"
|
|
||||||
)
|
|
||||||
|
|
||||||
// StreamErrorHandlerFunc accepts an error as a gRPC error generated via status package and translates it into a
|
|
||||||
// a proto struct used to represent error at the end of a stream.
|
|
||||||
type StreamErrorHandlerFunc func(context.Context, error) *StreamError
|
|
||||||
|
|
||||||
// StreamError is the payload for the final message in a server stream in the event that the server returns an
|
|
||||||
// error after a response message has already been sent.
|
|
||||||
type StreamError internal.StreamError
|
|
||||||
|
|
||||||
// ProtoErrorHandlerFunc handles the error as a gRPC error generated via status package and replies to the request.
|
|
||||||
type ProtoErrorHandlerFunc func(context.Context, *ServeMux, Marshaler, http.ResponseWriter, *http.Request, error)
|
|
||||||
|
|
||||||
var _ ProtoErrorHandlerFunc = DefaultHTTPProtoErrorHandler
|
|
||||||
|
|
||||||
// DefaultHTTPProtoErrorHandler is an implementation of HTTPError.
|
|
||||||
// If "err" is an error from gRPC system, the function replies with the status code mapped by HTTPStatusFromCode.
|
|
||||||
// If otherwise, it replies with http.StatusInternalServerError.
|
|
||||||
//
|
|
||||||
// The response body returned by this function is a Status message marshaled by a Marshaler.
|
|
||||||
//
|
|
||||||
// Do not set this function to HTTPError variable directly, use WithProtoErrorHandler option instead.
|
|
||||||
func DefaultHTTPProtoErrorHandler(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, _ *http.Request, err error) {
|
|
||||||
// return Internal when Marshal failed
|
|
||||||
const fallback = `{"code": 13, "message": "failed to marshal error message"}`
|
|
||||||
|
|
||||||
s, ok := status.FromError(err)
|
|
||||||
if !ok {
|
|
||||||
s = status.New(codes.Unknown, err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
w.Header().Del("Trailer")
|
|
||||||
|
|
||||||
contentType := marshaler.ContentType()
|
|
||||||
// Check marshaler on run time in order to keep backwards compatibility
|
|
||||||
// An interface param needs to be added to the ContentType() function on
|
|
||||||
// the Marshal interface to be able to remove this check
|
|
||||||
if typeMarshaler, ok := marshaler.(contentTypeMarshaler); ok {
|
|
||||||
pb := s.Proto()
|
|
||||||
contentType = typeMarshaler.ContentTypeFromMessage(pb)
|
|
||||||
}
|
|
||||||
w.Header().Set("Content-Type", contentType)
|
|
||||||
|
|
||||||
buf, merr := marshaler.Marshal(s.Proto())
|
|
||||||
if merr != nil {
|
|
||||||
grpclog.Infof("Failed to marshal error message %q: %v", s.Proto(), merr)
|
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
|
||||||
if _, err := io.WriteString(w, fallback); err != nil {
|
|
||||||
grpclog.Infof("Failed to write response: %v", err)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
md, ok := ServerMetadataFromContext(ctx)
|
|
||||||
if !ok {
|
|
||||||
grpclog.Infof("Failed to extract ServerMetadata from context")
|
|
||||||
}
|
|
||||||
|
|
||||||
handleForwardResponseServerMetadata(w, mux, md)
|
|
||||||
handleForwardResponseTrailerHeader(w, md)
|
|
||||||
st := HTTPStatusFromCode(s.Code())
|
|
||||||
w.WriteHeader(st)
|
|
||||||
if _, err := w.Write(buf); err != nil {
|
|
||||||
grpclog.Infof("Failed to write response: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
handleForwardResponseTrailer(w, md)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DefaultHTTPStreamErrorHandler converts the given err into a *StreamError via
|
|
||||||
// default logic.
|
|
||||||
//
|
|
||||||
// It extracts the gRPC status from err if possible. The fields of the status are
|
|
||||||
// used to populate the returned StreamError, and the HTTP status code is derived
|
|
||||||
// from the gRPC code via HTTPStatusFromCode. If the given err does not contain a
|
|
||||||
// gRPC status, an "Unknown" gRPC code is used and "Internal Server Error" HTTP code.
|
|
||||||
func DefaultHTTPStreamErrorHandler(_ context.Context, err error) *StreamError {
|
|
||||||
grpcCode := codes.Unknown
|
|
||||||
grpcMessage := err.Error()
|
|
||||||
var grpcDetails []*any.Any
|
|
||||||
if s, ok := status.FromError(err); ok {
|
|
||||||
grpcCode = s.Code()
|
|
||||||
grpcMessage = s.Message()
|
|
||||||
grpcDetails = s.Proto().GetDetails()
|
|
||||||
}
|
|
||||||
httpCode := HTTPStatusFromCode(grpcCode)
|
|
||||||
return &StreamError{
|
|
||||||
GrpcCode: int32(grpcCode),
|
|
||||||
HttpCode: int32(httpCode),
|
|
||||||
Message: grpcMessage,
|
|
||||||
HttpStatus: http.StatusText(httpCode),
|
|
||||||
Details: grpcDetails,
|
|
||||||
}
|
|
||||||
}
|
|
406
vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/query.go
generated
vendored
406
vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/query.go
generated
vendored
@ -1,406 +0,0 @@
|
|||||||
package runtime
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/base64"
|
|
||||||
"fmt"
|
|
||||||
"net/url"
|
|
||||||
"reflect"
|
|
||||||
"regexp"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
"github.com/grpc-ecosystem/grpc-gateway/utilities"
|
|
||||||
"google.golang.org/grpc/grpclog"
|
|
||||||
)
|
|
||||||
|
|
||||||
var valuesKeyRegexp = regexp.MustCompile("^(.*)\\[(.*)\\]$")
|
|
||||||
|
|
||||||
var currentQueryParser QueryParameterParser = &defaultQueryParser{}
|
|
||||||
|
|
||||||
// QueryParameterParser defines interface for all query parameter parsers
|
|
||||||
type QueryParameterParser interface {
|
|
||||||
Parse(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error
|
|
||||||
}
|
|
||||||
|
|
||||||
// PopulateQueryParameters parses query parameters
|
|
||||||
// into "msg" using current query parser
|
|
||||||
func PopulateQueryParameters(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error {
|
|
||||||
return currentQueryParser.Parse(msg, values, filter)
|
|
||||||
}
|
|
||||||
|
|
||||||
type defaultQueryParser struct{}
|
|
||||||
|
|
||||||
// Parse populates "values" into "msg".
|
|
||||||
// A value is ignored if its key starts with one of the elements in "filter".
|
|
||||||
func (*defaultQueryParser) Parse(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error {
|
|
||||||
for key, values := range values {
|
|
||||||
match := valuesKeyRegexp.FindStringSubmatch(key)
|
|
||||||
if len(match) == 3 {
|
|
||||||
key = match[1]
|
|
||||||
values = append([]string{match[2]}, values...)
|
|
||||||
}
|
|
||||||
fieldPath := strings.Split(key, ".")
|
|
||||||
if filter.HasCommonPrefix(fieldPath) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if err := populateFieldValueFromPath(msg, fieldPath, values); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// PopulateFieldFromPath sets a value in a nested Protobuf structure.
|
|
||||||
// It instantiates missing protobuf fields as it goes.
|
|
||||||
func PopulateFieldFromPath(msg proto.Message, fieldPathString string, value string) error {
|
|
||||||
fieldPath := strings.Split(fieldPathString, ".")
|
|
||||||
return populateFieldValueFromPath(msg, fieldPath, []string{value})
|
|
||||||
}
|
|
||||||
|
|
||||||
func populateFieldValueFromPath(msg proto.Message, fieldPath []string, values []string) error {
|
|
||||||
m := reflect.ValueOf(msg)
|
|
||||||
if m.Kind() != reflect.Ptr {
|
|
||||||
return fmt.Errorf("unexpected type %T: %v", msg, msg)
|
|
||||||
}
|
|
||||||
var props *proto.Properties
|
|
||||||
m = m.Elem()
|
|
||||||
for i, fieldName := range fieldPath {
|
|
||||||
isLast := i == len(fieldPath)-1
|
|
||||||
if !isLast && m.Kind() != reflect.Struct {
|
|
||||||
return fmt.Errorf("non-aggregate type in the mid of path: %s", strings.Join(fieldPath, "."))
|
|
||||||
}
|
|
||||||
var f reflect.Value
|
|
||||||
var err error
|
|
||||||
f, props, err = fieldByProtoName(m, fieldName)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
} else if !f.IsValid() {
|
|
||||||
grpclog.Infof("field not found in %T: %s", msg, strings.Join(fieldPath, "."))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
switch f.Kind() {
|
|
||||||
case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, reflect.String, reflect.Uint32, reflect.Uint64:
|
|
||||||
if !isLast {
|
|
||||||
return fmt.Errorf("unexpected nested field %s in %s", fieldPath[i+1], strings.Join(fieldPath[:i+1], "."))
|
|
||||||
}
|
|
||||||
m = f
|
|
||||||
case reflect.Slice:
|
|
||||||
if !isLast {
|
|
||||||
return fmt.Errorf("unexpected repeated field in %s", strings.Join(fieldPath, "."))
|
|
||||||
}
|
|
||||||
// Handle []byte
|
|
||||||
if f.Type().Elem().Kind() == reflect.Uint8 {
|
|
||||||
m = f
|
|
||||||
break
|
|
||||||
}
|
|
||||||
return populateRepeatedField(f, values, props)
|
|
||||||
case reflect.Ptr:
|
|
||||||
if f.IsNil() {
|
|
||||||
m = reflect.New(f.Type().Elem())
|
|
||||||
f.Set(m.Convert(f.Type()))
|
|
||||||
}
|
|
||||||
m = f.Elem()
|
|
||||||
continue
|
|
||||||
case reflect.Struct:
|
|
||||||
m = f
|
|
||||||
continue
|
|
||||||
case reflect.Map:
|
|
||||||
if !isLast {
|
|
||||||
return fmt.Errorf("unexpected nested field %s in %s", fieldPath[i+1], strings.Join(fieldPath[:i+1], "."))
|
|
||||||
}
|
|
||||||
return populateMapField(f, values, props)
|
|
||||||
default:
|
|
||||||
return fmt.Errorf("unexpected type %s in %T", f.Type(), msg)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch len(values) {
|
|
||||||
case 0:
|
|
||||||
return fmt.Errorf("no value of field: %s", strings.Join(fieldPath, "."))
|
|
||||||
case 1:
|
|
||||||
default:
|
|
||||||
grpclog.Infof("too many field values: %s", strings.Join(fieldPath, "."))
|
|
||||||
}
|
|
||||||
return populateField(m, values[0], props)
|
|
||||||
}
|
|
||||||
|
|
||||||
// fieldByProtoName looks up a field whose corresponding protobuf field name is "name".
|
|
||||||
// "m" must be a struct value. It returns zero reflect.Value if no such field found.
|
|
||||||
func fieldByProtoName(m reflect.Value, name string) (reflect.Value, *proto.Properties, error) {
|
|
||||||
props := proto.GetProperties(m.Type())
|
|
||||||
|
|
||||||
// look up field name in oneof map
|
|
||||||
for _, op := range props.OneofTypes {
|
|
||||||
if name == op.Prop.OrigName || name == op.Prop.JSONName {
|
|
||||||
v := reflect.New(op.Type.Elem())
|
|
||||||
field := m.Field(op.Field)
|
|
||||||
if !field.IsNil() {
|
|
||||||
return reflect.Value{}, nil, fmt.Errorf("field already set for %s oneof", props.Prop[op.Field].OrigName)
|
|
||||||
}
|
|
||||||
field.Set(v)
|
|
||||||
return v.Elem().Field(0), op.Prop, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, p := range props.Prop {
|
|
||||||
if p.OrigName == name {
|
|
||||||
return m.FieldByName(p.Name), p, nil
|
|
||||||
}
|
|
||||||
if p.JSONName == name {
|
|
||||||
return m.FieldByName(p.Name), p, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return reflect.Value{}, nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func populateMapField(f reflect.Value, values []string, props *proto.Properties) error {
|
|
||||||
if len(values) != 2 {
|
|
||||||
return fmt.Errorf("more than one value provided for key %s in map %s", values[0], props.Name)
|
|
||||||
}
|
|
||||||
|
|
||||||
key, value := values[0], values[1]
|
|
||||||
keyType := f.Type().Key()
|
|
||||||
valueType := f.Type().Elem()
|
|
||||||
if f.IsNil() {
|
|
||||||
f.Set(reflect.MakeMap(f.Type()))
|
|
||||||
}
|
|
||||||
|
|
||||||
keyConv, ok := convFromType[keyType.Kind()]
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("unsupported key type %s in map %s", keyType, props.Name)
|
|
||||||
}
|
|
||||||
valueConv, ok := convFromType[valueType.Kind()]
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("unsupported value type %s in map %s", valueType, props.Name)
|
|
||||||
}
|
|
||||||
|
|
||||||
keyV := keyConv.Call([]reflect.Value{reflect.ValueOf(key)})
|
|
||||||
if err := keyV[1].Interface(); err != nil {
|
|
||||||
return err.(error)
|
|
||||||
}
|
|
||||||
valueV := valueConv.Call([]reflect.Value{reflect.ValueOf(value)})
|
|
||||||
if err := valueV[1].Interface(); err != nil {
|
|
||||||
return err.(error)
|
|
||||||
}
|
|
||||||
|
|
||||||
f.SetMapIndex(keyV[0].Convert(keyType), valueV[0].Convert(valueType))
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func populateRepeatedField(f reflect.Value, values []string, props *proto.Properties) error {
|
|
||||||
elemType := f.Type().Elem()
|
|
||||||
|
|
||||||
// is the destination field a slice of an enumeration type?
|
|
||||||
if enumValMap := proto.EnumValueMap(props.Enum); enumValMap != nil {
|
|
||||||
return populateFieldEnumRepeated(f, values, enumValMap)
|
|
||||||
}
|
|
||||||
|
|
||||||
conv, ok := convFromType[elemType.Kind()]
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("unsupported field type %s", elemType)
|
|
||||||
}
|
|
||||||
f.Set(reflect.MakeSlice(f.Type(), len(values), len(values)).Convert(f.Type()))
|
|
||||||
for i, v := range values {
|
|
||||||
result := conv.Call([]reflect.Value{reflect.ValueOf(v)})
|
|
||||||
if err := result[1].Interface(); err != nil {
|
|
||||||
return err.(error)
|
|
||||||
}
|
|
||||||
f.Index(i).Set(result[0].Convert(f.Index(i).Type()))
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func populateField(f reflect.Value, value string, props *proto.Properties) error {
|
|
||||||
i := f.Addr().Interface()
|
|
||||||
|
|
||||||
// Handle protobuf well known types
|
|
||||||
var name string
|
|
||||||
switch m := i.(type) {
|
|
||||||
case interface{ XXX_WellKnownType() string }:
|
|
||||||
name = m.XXX_WellKnownType()
|
|
||||||
case proto.Message:
|
|
||||||
const wktPrefix = "google.protobuf."
|
|
||||||
if fullName := proto.MessageName(m); strings.HasPrefix(fullName, wktPrefix) {
|
|
||||||
name = fullName[len(wktPrefix):]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch name {
|
|
||||||
case "Timestamp":
|
|
||||||
if value == "null" {
|
|
||||||
f.FieldByName("Seconds").SetInt(0)
|
|
||||||
f.FieldByName("Nanos").SetInt(0)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
t, err := time.Parse(time.RFC3339Nano, value)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("bad Timestamp: %v", err)
|
|
||||||
}
|
|
||||||
f.FieldByName("Seconds").SetInt(int64(t.Unix()))
|
|
||||||
f.FieldByName("Nanos").SetInt(int64(t.Nanosecond()))
|
|
||||||
return nil
|
|
||||||
case "Duration":
|
|
||||||
if value == "null" {
|
|
||||||
f.FieldByName("Seconds").SetInt(0)
|
|
||||||
f.FieldByName("Nanos").SetInt(0)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
d, err := time.ParseDuration(value)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("bad Duration: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
ns := d.Nanoseconds()
|
|
||||||
s := ns / 1e9
|
|
||||||
ns %= 1e9
|
|
||||||
f.FieldByName("Seconds").SetInt(s)
|
|
||||||
f.FieldByName("Nanos").SetInt(ns)
|
|
||||||
return nil
|
|
||||||
case "DoubleValue":
|
|
||||||
fallthrough
|
|
||||||
case "FloatValue":
|
|
||||||
float64Val, err := strconv.ParseFloat(value, 64)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("bad DoubleValue: %s", value)
|
|
||||||
}
|
|
||||||
f.FieldByName("Value").SetFloat(float64Val)
|
|
||||||
return nil
|
|
||||||
case "Int64Value":
|
|
||||||
fallthrough
|
|
||||||
case "Int32Value":
|
|
||||||
int64Val, err := strconv.ParseInt(value, 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("bad DoubleValue: %s", value)
|
|
||||||
}
|
|
||||||
f.FieldByName("Value").SetInt(int64Val)
|
|
||||||
return nil
|
|
||||||
case "UInt64Value":
|
|
||||||
fallthrough
|
|
||||||
case "UInt32Value":
|
|
||||||
uint64Val, err := strconv.ParseUint(value, 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("bad DoubleValue: %s", value)
|
|
||||||
}
|
|
||||||
f.FieldByName("Value").SetUint(uint64Val)
|
|
||||||
return nil
|
|
||||||
case "BoolValue":
|
|
||||||
if value == "true" {
|
|
||||||
f.FieldByName("Value").SetBool(true)
|
|
||||||
} else if value == "false" {
|
|
||||||
f.FieldByName("Value").SetBool(false)
|
|
||||||
} else {
|
|
||||||
return fmt.Errorf("bad BoolValue: %s", value)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
case "StringValue":
|
|
||||||
f.FieldByName("Value").SetString(value)
|
|
||||||
return nil
|
|
||||||
case "BytesValue":
|
|
||||||
bytesVal, err := base64.StdEncoding.DecodeString(value)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("bad BytesValue: %s", value)
|
|
||||||
}
|
|
||||||
f.FieldByName("Value").SetBytes(bytesVal)
|
|
||||||
return nil
|
|
||||||
case "FieldMask":
|
|
||||||
p := f.FieldByName("Paths")
|
|
||||||
for _, v := range strings.Split(value, ",") {
|
|
||||||
if v != "" {
|
|
||||||
p.Set(reflect.Append(p, reflect.ValueOf(v)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle Time and Duration stdlib types
|
|
||||||
switch t := i.(type) {
|
|
||||||
case *time.Time:
|
|
||||||
pt, err := time.Parse(time.RFC3339Nano, value)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("bad Timestamp: %v", err)
|
|
||||||
}
|
|
||||||
*t = pt
|
|
||||||
return nil
|
|
||||||
case *time.Duration:
|
|
||||||
d, err := time.ParseDuration(value)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("bad Duration: %v", err)
|
|
||||||
}
|
|
||||||
*t = d
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// is the destination field an enumeration type?
|
|
||||||
if enumValMap := proto.EnumValueMap(props.Enum); enumValMap != nil {
|
|
||||||
return populateFieldEnum(f, value, enumValMap)
|
|
||||||
}
|
|
||||||
|
|
||||||
conv, ok := convFromType[f.Kind()]
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("field type %T is not supported in query parameters", i)
|
|
||||||
}
|
|
||||||
result := conv.Call([]reflect.Value{reflect.ValueOf(value)})
|
|
||||||
if err := result[1].Interface(); err != nil {
|
|
||||||
return err.(error)
|
|
||||||
}
|
|
||||||
f.Set(result[0].Convert(f.Type()))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func convertEnum(value string, t reflect.Type, enumValMap map[string]int32) (reflect.Value, error) {
|
|
||||||
// see if it's an enumeration string
|
|
||||||
if enumVal, ok := enumValMap[value]; ok {
|
|
||||||
return reflect.ValueOf(enumVal).Convert(t), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// check for an integer that matches an enumeration value
|
|
||||||
eVal, err := strconv.Atoi(value)
|
|
||||||
if err != nil {
|
|
||||||
return reflect.Value{}, fmt.Errorf("%s is not a valid %s", value, t)
|
|
||||||
}
|
|
||||||
for _, v := range enumValMap {
|
|
||||||
if v == int32(eVal) {
|
|
||||||
return reflect.ValueOf(eVal).Convert(t), nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return reflect.Value{}, fmt.Errorf("%s is not a valid %s", value, t)
|
|
||||||
}
|
|
||||||
|
|
||||||
func populateFieldEnum(f reflect.Value, value string, enumValMap map[string]int32) error {
|
|
||||||
cval, err := convertEnum(value, f.Type(), enumValMap)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
f.Set(cval)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func populateFieldEnumRepeated(f reflect.Value, values []string, enumValMap map[string]int32) error {
|
|
||||||
elemType := f.Type().Elem()
|
|
||||||
f.Set(reflect.MakeSlice(f.Type(), len(values), len(values)).Convert(f.Type()))
|
|
||||||
for i, v := range values {
|
|
||||||
result, err := convertEnum(v, elemType, enumValMap)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
f.Index(i).Set(result)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
convFromType = map[reflect.Kind]reflect.Value{
|
|
||||||
reflect.String: reflect.ValueOf(String),
|
|
||||||
reflect.Bool: reflect.ValueOf(Bool),
|
|
||||||
reflect.Float64: reflect.ValueOf(Float64),
|
|
||||||
reflect.Float32: reflect.ValueOf(Float32),
|
|
||||||
reflect.Int64: reflect.ValueOf(Int64),
|
|
||||||
reflect.Int32: reflect.ValueOf(Int32),
|
|
||||||
reflect.Uint64: reflect.ValueOf(Uint64),
|
|
||||||
reflect.Uint32: reflect.ValueOf(Uint32),
|
|
||||||
reflect.Slice: reflect.ValueOf(Bytes),
|
|
||||||
}
|
|
||||||
)
|
|
35
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/BUILD.bazel
generated
vendored
Normal file
35
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/BUILD.bazel
generated
vendored
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
|
||||||
|
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "httprule",
|
||||||
|
srcs = [
|
||||||
|
"compile.go",
|
||||||
|
"parse.go",
|
||||||
|
"types.go",
|
||||||
|
],
|
||||||
|
importpath = "github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule",
|
||||||
|
deps = ["//utilities"],
|
||||||
|
)
|
||||||
|
|
||||||
|
go_test(
|
||||||
|
name = "httprule_test",
|
||||||
|
size = "small",
|
||||||
|
srcs = [
|
||||||
|
"compile_test.go",
|
||||||
|
"parse_test.go",
|
||||||
|
"types_test.go",
|
||||||
|
],
|
||||||
|
embed = [":httprule"],
|
||||||
|
deps = [
|
||||||
|
"//utilities",
|
||||||
|
"@com_github_golang_glog//:glog",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
alias(
|
||||||
|
name = "go_default_library",
|
||||||
|
actual = ":httprule",
|
||||||
|
visibility = ["//:__subpackages__"],
|
||||||
|
)
|
121
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/compile.go
generated
vendored
Normal file
121
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/compile.go
generated
vendored
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
package httprule
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/grpc-ecosystem/grpc-gateway/v2/utilities"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
opcodeVersion = 1
|
||||||
|
)
|
||||||
|
|
||||||
|
// Template is a compiled representation of path templates.
|
||||||
|
type Template struct {
|
||||||
|
// Version is the version number of the format.
|
||||||
|
Version int
|
||||||
|
// OpCodes is a sequence of operations.
|
||||||
|
OpCodes []int
|
||||||
|
// Pool is a constant pool
|
||||||
|
Pool []string
|
||||||
|
// Verb is a VERB part in the template.
|
||||||
|
Verb string
|
||||||
|
// Fields is a list of field paths bound in this template.
|
||||||
|
Fields []string
|
||||||
|
// Original template (example: /v1/a_bit_of_everything)
|
||||||
|
Template string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compiler compiles utilities representation of path templates into marshallable operations.
|
||||||
|
// They can be unmarshalled by runtime.NewPattern.
|
||||||
|
type Compiler interface {
|
||||||
|
Compile() Template
|
||||||
|
}
|
||||||
|
|
||||||
|
type op struct {
|
||||||
|
// code is the opcode of the operation
|
||||||
|
code utilities.OpCode
|
||||||
|
|
||||||
|
// str is a string operand of the code.
|
||||||
|
// num is ignored if str is not empty.
|
||||||
|
str string
|
||||||
|
|
||||||
|
// num is a numeric operand of the code.
|
||||||
|
num int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w wildcard) compile() []op {
|
||||||
|
return []op{
|
||||||
|
{code: utilities.OpPush},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w deepWildcard) compile() []op {
|
||||||
|
return []op{
|
||||||
|
{code: utilities.OpPushM},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l literal) compile() []op {
|
||||||
|
return []op{
|
||||||
|
{
|
||||||
|
code: utilities.OpLitPush,
|
||||||
|
str: string(l),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v variable) compile() []op {
|
||||||
|
var ops []op
|
||||||
|
for _, s := range v.segments {
|
||||||
|
ops = append(ops, s.compile()...)
|
||||||
|
}
|
||||||
|
ops = append(ops, op{
|
||||||
|
code: utilities.OpConcatN,
|
||||||
|
num: len(v.segments),
|
||||||
|
}, op{
|
||||||
|
code: utilities.OpCapture,
|
||||||
|
str: v.path,
|
||||||
|
})
|
||||||
|
|
||||||
|
return ops
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t template) Compile() Template {
|
||||||
|
var rawOps []op
|
||||||
|
for _, s := range t.segments {
|
||||||
|
rawOps = append(rawOps, s.compile()...)
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
ops []int
|
||||||
|
pool []string
|
||||||
|
fields []string
|
||||||
|
)
|
||||||
|
consts := make(map[string]int)
|
||||||
|
for _, op := range rawOps {
|
||||||
|
ops = append(ops, int(op.code))
|
||||||
|
if op.str == "" {
|
||||||
|
ops = append(ops, op.num)
|
||||||
|
} else {
|
||||||
|
// eof segment literal represents the "/" path pattern
|
||||||
|
if op.str == eof {
|
||||||
|
op.str = ""
|
||||||
|
}
|
||||||
|
if _, ok := consts[op.str]; !ok {
|
||||||
|
consts[op.str] = len(pool)
|
||||||
|
pool = append(pool, op.str)
|
||||||
|
}
|
||||||
|
ops = append(ops, consts[op.str])
|
||||||
|
}
|
||||||
|
if op.code == utilities.OpCapture {
|
||||||
|
fields = append(fields, op.str)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Template{
|
||||||
|
Version: opcodeVersion,
|
||||||
|
OpCodes: ops,
|
||||||
|
Pool: pool,
|
||||||
|
Verb: t.verb,
|
||||||
|
Fields: fields,
|
||||||
|
Template: t.template,
|
||||||
|
}
|
||||||
|
}
|
11
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/fuzz.go
generated
vendored
Normal file
11
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/fuzz.go
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
// +build gofuzz
|
||||||
|
|
||||||
|
package httprule
|
||||||
|
|
||||||
|
func Fuzz(data []byte) int {
|
||||||
|
_, err := Parse(string(data))
|
||||||
|
if err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
368
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/parse.go
generated
vendored
Normal file
368
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/parse.go
generated
vendored
Normal file
@ -0,0 +1,368 @@
|
|||||||
|
package httprule
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// InvalidTemplateError indicates that the path template is not valid.
|
||||||
|
type InvalidTemplateError struct {
|
||||||
|
tmpl string
|
||||||
|
msg string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e InvalidTemplateError) Error() string {
|
||||||
|
return fmt.Sprintf("%s: %s", e.msg, e.tmpl)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse parses the string representation of path template
|
||||||
|
func Parse(tmpl string) (Compiler, error) {
|
||||||
|
if !strings.HasPrefix(tmpl, "/") {
|
||||||
|
return template{}, InvalidTemplateError{tmpl: tmpl, msg: "no leading /"}
|
||||||
|
}
|
||||||
|
tokens, verb := tokenize(tmpl[1:])
|
||||||
|
|
||||||
|
p := parser{tokens: tokens}
|
||||||
|
segs, err := p.topLevelSegments()
|
||||||
|
if err != nil {
|
||||||
|
return template{}, InvalidTemplateError{tmpl: tmpl, msg: err.Error()}
|
||||||
|
}
|
||||||
|
|
||||||
|
return template{
|
||||||
|
segments: segs,
|
||||||
|
verb: verb,
|
||||||
|
template: tmpl,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func tokenize(path string) (tokens []string, verb string) {
|
||||||
|
if path == "" {
|
||||||
|
return []string{eof}, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
init = iota
|
||||||
|
field
|
||||||
|
nested
|
||||||
|
)
|
||||||
|
st := init
|
||||||
|
for path != "" {
|
||||||
|
var idx int
|
||||||
|
switch st {
|
||||||
|
case init:
|
||||||
|
idx = strings.IndexAny(path, "/{")
|
||||||
|
case field:
|
||||||
|
idx = strings.IndexAny(path, ".=}")
|
||||||
|
case nested:
|
||||||
|
idx = strings.IndexAny(path, "/}")
|
||||||
|
}
|
||||||
|
if idx < 0 {
|
||||||
|
tokens = append(tokens, path)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
switch r := path[idx]; r {
|
||||||
|
case '/', '.':
|
||||||
|
case '{':
|
||||||
|
st = field
|
||||||
|
case '=':
|
||||||
|
st = nested
|
||||||
|
case '}':
|
||||||
|
st = init
|
||||||
|
}
|
||||||
|
if idx == 0 {
|
||||||
|
tokens = append(tokens, path[idx:idx+1])
|
||||||
|
} else {
|
||||||
|
tokens = append(tokens, path[:idx], path[idx:idx+1])
|
||||||
|
}
|
||||||
|
path = path[idx+1:]
|
||||||
|
}
|
||||||
|
|
||||||
|
l := len(tokens)
|
||||||
|
// See
|
||||||
|
// https://github.com/grpc-ecosystem/grpc-gateway/pull/1947#issuecomment-774523693 ;
|
||||||
|
// although normal and backwards-compat logic here is to use the last index
|
||||||
|
// of a colon, if the final segment is a variable followed by a colon, the
|
||||||
|
// part following the colon must be a verb. Hence if the previous token is
|
||||||
|
// an end var marker, we switch the index we're looking for to Index instead
|
||||||
|
// of LastIndex, so that we correctly grab the remaining part of the path as
|
||||||
|
// the verb.
|
||||||
|
var penultimateTokenIsEndVar bool
|
||||||
|
switch l {
|
||||||
|
case 0, 1:
|
||||||
|
// Not enough to be variable so skip this logic and don't result in an
|
||||||
|
// invalid index
|
||||||
|
default:
|
||||||
|
penultimateTokenIsEndVar = tokens[l-2] == "}"
|
||||||
|
}
|
||||||
|
t := tokens[l-1]
|
||||||
|
var idx int
|
||||||
|
if penultimateTokenIsEndVar {
|
||||||
|
idx = strings.Index(t, ":")
|
||||||
|
} else {
|
||||||
|
idx = strings.LastIndex(t, ":")
|
||||||
|
}
|
||||||
|
if idx == 0 {
|
||||||
|
tokens, verb = tokens[:l-1], t[1:]
|
||||||
|
} else if idx > 0 {
|
||||||
|
tokens[l-1], verb = t[:idx], t[idx+1:]
|
||||||
|
}
|
||||||
|
tokens = append(tokens, eof)
|
||||||
|
return tokens, verb
|
||||||
|
}
|
||||||
|
|
||||||
|
// parser is a parser of the template syntax defined in github.com/googleapis/googleapis/google/api/http.proto.
|
||||||
|
type parser struct {
|
||||||
|
tokens []string
|
||||||
|
accepted []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// topLevelSegments is the target of this parser.
|
||||||
|
func (p *parser) topLevelSegments() ([]segment, error) {
|
||||||
|
if _, err := p.accept(typeEOF); err == nil {
|
||||||
|
p.tokens = p.tokens[:0]
|
||||||
|
return []segment{literal(eof)}, nil
|
||||||
|
}
|
||||||
|
segs, err := p.segments()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if _, err := p.accept(typeEOF); err != nil {
|
||||||
|
return nil, fmt.Errorf("unexpected token %q after segments %q", p.tokens[0], strings.Join(p.accepted, ""))
|
||||||
|
}
|
||||||
|
return segs, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *parser) segments() ([]segment, error) {
|
||||||
|
s, err := p.segment()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
segs := []segment{s}
|
||||||
|
for {
|
||||||
|
if _, err := p.accept("/"); err != nil {
|
||||||
|
return segs, nil
|
||||||
|
}
|
||||||
|
s, err := p.segment()
|
||||||
|
if err != nil {
|
||||||
|
return segs, err
|
||||||
|
}
|
||||||
|
segs = append(segs, s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *parser) segment() (segment, error) {
|
||||||
|
if _, err := p.accept("*"); err == nil {
|
||||||
|
return wildcard{}, nil
|
||||||
|
}
|
||||||
|
if _, err := p.accept("**"); err == nil {
|
||||||
|
return deepWildcard{}, nil
|
||||||
|
}
|
||||||
|
if l, err := p.literal(); err == nil {
|
||||||
|
return l, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
v, err := p.variable()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("segment neither wildcards, literal or variable: %v", err)
|
||||||
|
}
|
||||||
|
return v, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *parser) literal() (segment, error) {
|
||||||
|
lit, err := p.accept(typeLiteral)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return literal(lit), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *parser) variable() (segment, error) {
|
||||||
|
if _, err := p.accept("{"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
path, err := p.fieldPath()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var segs []segment
|
||||||
|
if _, err := p.accept("="); err == nil {
|
||||||
|
segs, err = p.segments()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("invalid segment in variable %q: %v", path, err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
segs = []segment{wildcard{}}
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := p.accept("}"); err != nil {
|
||||||
|
return nil, fmt.Errorf("unterminated variable segment: %s", path)
|
||||||
|
}
|
||||||
|
return variable{
|
||||||
|
path: path,
|
||||||
|
segments: segs,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *parser) fieldPath() (string, error) {
|
||||||
|
c, err := p.accept(typeIdent)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
components := []string{c}
|
||||||
|
for {
|
||||||
|
if _, err = p.accept("."); err != nil {
|
||||||
|
return strings.Join(components, "."), nil
|
||||||
|
}
|
||||||
|
c, err := p.accept(typeIdent)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("invalid field path component: %v", err)
|
||||||
|
}
|
||||||
|
components = append(components, c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// A termType is a type of terminal symbols.
|
||||||
|
type termType string
|
||||||
|
|
||||||
|
// These constants define some of valid values of termType.
|
||||||
|
// They improve readability of parse functions.
|
||||||
|
//
|
||||||
|
// You can also use "/", "*", "**", "." or "=" as valid values.
|
||||||
|
const (
|
||||||
|
typeIdent = termType("ident")
|
||||||
|
typeLiteral = termType("literal")
|
||||||
|
typeEOF = termType("$")
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// eof is the terminal symbol which always appears at the end of token sequence.
|
||||||
|
eof = "\u0000"
|
||||||
|
)
|
||||||
|
|
||||||
|
// accept tries to accept a token in "p".
|
||||||
|
// This function consumes a token and returns it if it matches to the specified "term".
|
||||||
|
// If it doesn't match, the function does not consume any tokens and return an error.
|
||||||
|
func (p *parser) accept(term termType) (string, error) {
|
||||||
|
t := p.tokens[0]
|
||||||
|
switch term {
|
||||||
|
case "/", "*", "**", ".", "=", "{", "}":
|
||||||
|
if t != string(term) && t != "/" {
|
||||||
|
return "", fmt.Errorf("expected %q but got %q", term, t)
|
||||||
|
}
|
||||||
|
case typeEOF:
|
||||||
|
if t != eof {
|
||||||
|
return "", fmt.Errorf("expected EOF but got %q", t)
|
||||||
|
}
|
||||||
|
case typeIdent:
|
||||||
|
if err := expectIdent(t); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
case typeLiteral:
|
||||||
|
if err := expectPChars(t); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return "", fmt.Errorf("unknown termType %q", term)
|
||||||
|
}
|
||||||
|
p.tokens = p.tokens[1:]
|
||||||
|
p.accepted = append(p.accepted, t)
|
||||||
|
return t, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// expectPChars determines if "t" consists of only pchars defined in RFC3986.
|
||||||
|
//
|
||||||
|
// https://www.ietf.org/rfc/rfc3986.txt, P.49
|
||||||
|
// pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
|
||||||
|
// unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
|
||||||
|
// sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
|
||||||
|
// / "*" / "+" / "," / ";" / "="
|
||||||
|
// pct-encoded = "%" HEXDIG HEXDIG
|
||||||
|
func expectPChars(t string) error {
|
||||||
|
const (
|
||||||
|
init = iota
|
||||||
|
pct1
|
||||||
|
pct2
|
||||||
|
)
|
||||||
|
st := init
|
||||||
|
for _, r := range t {
|
||||||
|
if st != init {
|
||||||
|
if !isHexDigit(r) {
|
||||||
|
return fmt.Errorf("invalid hexdigit: %c(%U)", r, r)
|
||||||
|
}
|
||||||
|
switch st {
|
||||||
|
case pct1:
|
||||||
|
st = pct2
|
||||||
|
case pct2:
|
||||||
|
st = init
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// unreserved
|
||||||
|
switch {
|
||||||
|
case 'A' <= r && r <= 'Z':
|
||||||
|
continue
|
||||||
|
case 'a' <= r && r <= 'z':
|
||||||
|
continue
|
||||||
|
case '0' <= r && r <= '9':
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
switch r {
|
||||||
|
case '-', '.', '_', '~':
|
||||||
|
// unreserved
|
||||||
|
case '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=':
|
||||||
|
// sub-delims
|
||||||
|
case ':', '@':
|
||||||
|
// rest of pchar
|
||||||
|
case '%':
|
||||||
|
// pct-encoded
|
||||||
|
st = pct1
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("invalid character in path segment: %q(%U)", r, r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if st != init {
|
||||||
|
return fmt.Errorf("invalid percent-encoding in %q", t)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// expectIdent determines if "ident" is a valid identifier in .proto schema ([[:alpha:]_][[:alphanum:]_]*).
|
||||||
|
func expectIdent(ident string) error {
|
||||||
|
if ident == "" {
|
||||||
|
return fmt.Errorf("empty identifier")
|
||||||
|
}
|
||||||
|
for pos, r := range ident {
|
||||||
|
switch {
|
||||||
|
case '0' <= r && r <= '9':
|
||||||
|
if pos == 0 {
|
||||||
|
return fmt.Errorf("identifier starting with digit: %s", ident)
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
case 'A' <= r && r <= 'Z':
|
||||||
|
continue
|
||||||
|
case 'a' <= r && r <= 'z':
|
||||||
|
continue
|
||||||
|
case r == '_':
|
||||||
|
continue
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("invalid character %q(%U) in identifier: %s", r, r, ident)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func isHexDigit(r rune) bool {
|
||||||
|
switch {
|
||||||
|
case '0' <= r && r <= '9':
|
||||||
|
return true
|
||||||
|
case 'A' <= r && r <= 'F':
|
||||||
|
return true
|
||||||
|
case 'a' <= r && r <= 'f':
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
60
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/types.go
generated
vendored
Normal file
60
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule/types.go
generated
vendored
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
package httprule
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type template struct {
|
||||||
|
segments []segment
|
||||||
|
verb string
|
||||||
|
template string
|
||||||
|
}
|
||||||
|
|
||||||
|
type segment interface {
|
||||||
|
fmt.Stringer
|
||||||
|
compile() (ops []op)
|
||||||
|
}
|
||||||
|
|
||||||
|
type wildcard struct{}
|
||||||
|
|
||||||
|
type deepWildcard struct{}
|
||||||
|
|
||||||
|
type literal string
|
||||||
|
|
||||||
|
type variable struct {
|
||||||
|
path string
|
||||||
|
segments []segment
|
||||||
|
}
|
||||||
|
|
||||||
|
func (wildcard) String() string {
|
||||||
|
return "*"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (deepWildcard) String() string {
|
||||||
|
return "**"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l literal) String() string {
|
||||||
|
return string(l)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v variable) String() string {
|
||||||
|
var segs []string
|
||||||
|
for _, s := range v.segments {
|
||||||
|
segs = append(segs, s.String())
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("{%s=%s}", v.path, strings.Join(segs, "/"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t template) String() string {
|
||||||
|
var segs []string
|
||||||
|
for _, s := range t.segments {
|
||||||
|
segs = append(segs, s.String())
|
||||||
|
}
|
||||||
|
str := strings.Join(segs, "/")
|
||||||
|
if t.verb != "" {
|
||||||
|
str = fmt.Sprintf("%s:%s", str, t.verb)
|
||||||
|
}
|
||||||
|
return "/" + str
|
||||||
|
}
|
91
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/BUILD.bazel
generated
vendored
Normal file
91
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/BUILD.bazel
generated
vendored
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
|
||||||
|
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "runtime",
|
||||||
|
srcs = [
|
||||||
|
"context.go",
|
||||||
|
"convert.go",
|
||||||
|
"doc.go",
|
||||||
|
"errors.go",
|
||||||
|
"fieldmask.go",
|
||||||
|
"handler.go",
|
||||||
|
"marshal_httpbodyproto.go",
|
||||||
|
"marshal_json.go",
|
||||||
|
"marshal_jsonpb.go",
|
||||||
|
"marshal_proto.go",
|
||||||
|
"marshaler.go",
|
||||||
|
"marshaler_registry.go",
|
||||||
|
"mux.go",
|
||||||
|
"pattern.go",
|
||||||
|
"proto2_convert.go",
|
||||||
|
"query.go",
|
||||||
|
],
|
||||||
|
importpath = "github.com/grpc-ecosystem/grpc-gateway/v2/runtime",
|
||||||
|
deps = [
|
||||||
|
"//internal/httprule",
|
||||||
|
"//utilities",
|
||||||
|
"@go_googleapis//google/api:httpbody_go_proto",
|
||||||
|
"@io_bazel_rules_go//proto/wkt:field_mask_go_proto",
|
||||||
|
"@org_golang_google_grpc//codes",
|
||||||
|
"@org_golang_google_grpc//grpclog",
|
||||||
|
"@org_golang_google_grpc//metadata",
|
||||||
|
"@org_golang_google_grpc//status",
|
||||||
|
"@org_golang_google_protobuf//encoding/protojson",
|
||||||
|
"@org_golang_google_protobuf//proto",
|
||||||
|
"@org_golang_google_protobuf//reflect/protoreflect",
|
||||||
|
"@org_golang_google_protobuf//reflect/protoregistry",
|
||||||
|
"@org_golang_google_protobuf//types/known/durationpb",
|
||||||
|
"@org_golang_google_protobuf//types/known/timestamppb",
|
||||||
|
"@org_golang_google_protobuf//types/known/wrapperspb",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
go_test(
|
||||||
|
name = "runtime_test",
|
||||||
|
size = "small",
|
||||||
|
srcs = [
|
||||||
|
"context_test.go",
|
||||||
|
"convert_test.go",
|
||||||
|
"errors_test.go",
|
||||||
|
"fieldmask_test.go",
|
||||||
|
"handler_test.go",
|
||||||
|
"marshal_httpbodyproto_test.go",
|
||||||
|
"marshal_json_test.go",
|
||||||
|
"marshal_jsonpb_test.go",
|
||||||
|
"marshal_proto_test.go",
|
||||||
|
"marshaler_registry_test.go",
|
||||||
|
"mux_test.go",
|
||||||
|
"pattern_test.go",
|
||||||
|
"query_test.go",
|
||||||
|
],
|
||||||
|
embed = [":runtime"],
|
||||||
|
deps = [
|
||||||
|
"//runtime/internal/examplepb",
|
||||||
|
"//utilities",
|
||||||
|
"@com_github_google_go_cmp//cmp",
|
||||||
|
"@com_github_google_go_cmp//cmp/cmpopts",
|
||||||
|
"@go_googleapis//google/api:httpbody_go_proto",
|
||||||
|
"@go_googleapis//google/rpc:errdetails_go_proto",
|
||||||
|
"@go_googleapis//google/rpc:status_go_proto",
|
||||||
|
"@io_bazel_rules_go//proto/wkt:field_mask_go_proto",
|
||||||
|
"@org_golang_google_grpc//codes",
|
||||||
|
"@org_golang_google_grpc//metadata",
|
||||||
|
"@org_golang_google_grpc//status",
|
||||||
|
"@org_golang_google_protobuf//encoding/protojson",
|
||||||
|
"@org_golang_google_protobuf//proto",
|
||||||
|
"@org_golang_google_protobuf//testing/protocmp",
|
||||||
|
"@org_golang_google_protobuf//types/known/durationpb",
|
||||||
|
"@org_golang_google_protobuf//types/known/emptypb",
|
||||||
|
"@org_golang_google_protobuf//types/known/structpb",
|
||||||
|
"@org_golang_google_protobuf//types/known/timestamppb",
|
||||||
|
"@org_golang_google_protobuf//types/known/wrapperspb",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
alias(
|
||||||
|
name = "go_default_library",
|
||||||
|
actual = ":runtime",
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
@ -41,6 +41,19 @@ var (
|
|||||||
DefaultContextTimeout = 0 * time.Second
|
DefaultContextTimeout = 0 * time.Second
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
rpcMethodKey struct{}
|
||||||
|
httpPathPatternKey struct{}
|
||||||
|
|
||||||
|
AnnotateContextOption func(ctx context.Context) context.Context
|
||||||
|
)
|
||||||
|
|
||||||
|
func WithHTTPPathPattern(pattern string) AnnotateContextOption {
|
||||||
|
return func(ctx context.Context) context.Context {
|
||||||
|
return withHTTPPathPattern(ctx, pattern)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func decodeBinHeader(v string) ([]byte, error) {
|
func decodeBinHeader(v string) ([]byte, error) {
|
||||||
if len(v)%4 == 0 {
|
if len(v)%4 == 0 {
|
||||||
// Input was padded, or padding was not necessary.
|
// Input was padded, or padding was not necessary.
|
||||||
@ -56,8 +69,8 @@ At a minimum, the RemoteAddr is included in the fashion of "X-Forwarded-For",
|
|||||||
except that the forwarded destination is not another HTTP service but rather
|
except that the forwarded destination is not another HTTP service but rather
|
||||||
a gRPC service.
|
a gRPC service.
|
||||||
*/
|
*/
|
||||||
func AnnotateContext(ctx context.Context, mux *ServeMux, req *http.Request) (context.Context, error) {
|
func AnnotateContext(ctx context.Context, mux *ServeMux, req *http.Request, rpcMethodName string, options ...AnnotateContextOption) (context.Context, error) {
|
||||||
ctx, md, err := annotateContext(ctx, mux, req)
|
ctx, md, err := annotateContext(ctx, mux, req, rpcMethodName, options...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -70,8 +83,8 @@ func AnnotateContext(ctx context.Context, mux *ServeMux, req *http.Request) (con
|
|||||||
|
|
||||||
// AnnotateIncomingContext adds context information such as metadata from the request.
|
// AnnotateIncomingContext adds context information such as metadata from the request.
|
||||||
// Attach metadata as incoming context.
|
// Attach metadata as incoming context.
|
||||||
func AnnotateIncomingContext(ctx context.Context, mux *ServeMux, req *http.Request) (context.Context, error) {
|
func AnnotateIncomingContext(ctx context.Context, mux *ServeMux, req *http.Request, rpcMethodName string, options ...AnnotateContextOption) (context.Context, error) {
|
||||||
ctx, md, err := annotateContext(ctx, mux, req)
|
ctx, md, err := annotateContext(ctx, mux, req, rpcMethodName, options...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -82,7 +95,11 @@ func AnnotateIncomingContext(ctx context.Context, mux *ServeMux, req *http.Reque
|
|||||||
return metadata.NewIncomingContext(ctx, md), nil
|
return metadata.NewIncomingContext(ctx, md), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func annotateContext(ctx context.Context, mux *ServeMux, req *http.Request) (context.Context, metadata.MD, error) {
|
func annotateContext(ctx context.Context, mux *ServeMux, req *http.Request, rpcMethodName string, options ...AnnotateContextOption) (context.Context, metadata.MD, error) {
|
||||||
|
ctx = withRPCMethod(ctx, rpcMethodName)
|
||||||
|
for _, o := range options {
|
||||||
|
ctx = o(ctx)
|
||||||
|
}
|
||||||
var pairs []string
|
var pairs []string
|
||||||
timeout := DefaultContextTimeout
|
timeout := DefaultContextTimeout
|
||||||
if tm := req.Header.Get(metadataGrpcTimeout); tm != "" {
|
if tm := req.Header.Get(metadataGrpcTimeout); tm != "" {
|
||||||
@ -132,6 +149,7 @@ func annotateContext(ctx context.Context, mux *ServeMux, req *http.Request) (con
|
|||||||
}
|
}
|
||||||
|
|
||||||
if timeout != 0 {
|
if timeout != 0 {
|
||||||
|
//nolint:govet // The context outlives this function
|
||||||
ctx, _ = context.WithTimeout(ctx, timeout)
|
ctx, _ = context.WithTimeout(ctx, timeout)
|
||||||
}
|
}
|
||||||
if len(pairs) == 0 {
|
if len(pairs) == 0 {
|
||||||
@ -289,3 +307,39 @@ func isPermanentHTTPHeader(hdr string) bool {
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RPCMethod returns the method string for the server context. The returned
|
||||||
|
// string is in the format of "/package.service/method".
|
||||||
|
func RPCMethod(ctx context.Context) (string, bool) {
|
||||||
|
m := ctx.Value(rpcMethodKey{})
|
||||||
|
if m == nil {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
ms, ok := m.(string)
|
||||||
|
if !ok {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
return ms, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func withRPCMethod(ctx context.Context, rpcMethodName string) context.Context {
|
||||||
|
return context.WithValue(ctx, rpcMethodKey{}, rpcMethodName)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTPPathPattern returns the HTTP path pattern string relating to the HTTP handler, if one exists.
|
||||||
|
// The format of the returned string is defined by the google.api.http path template type.
|
||||||
|
func HTTPPathPattern(ctx context.Context) (string, bool) {
|
||||||
|
m := ctx.Value(httpPathPatternKey{})
|
||||||
|
if m == nil {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
ms, ok := m.(string)
|
||||||
|
if !ok {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
return ms, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func withHTTPPathPattern(ctx context.Context, httpPathPattern string) context.Context {
|
||||||
|
return context.WithValue(ctx, httpPathPatternKey{}, httpPathPattern)
|
||||||
|
}
|
@ -6,10 +6,10 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/golang/protobuf/jsonpb"
|
"google.golang.org/protobuf/encoding/protojson"
|
||||||
"github.com/golang/protobuf/ptypes/duration"
|
"google.golang.org/protobuf/types/known/durationpb"
|
||||||
"github.com/golang/protobuf/ptypes/timestamp"
|
"google.golang.org/protobuf/types/known/timestamppb"
|
||||||
"github.com/golang/protobuf/ptypes/wrappers"
|
"google.golang.org/protobuf/types/known/wrapperspb"
|
||||||
)
|
)
|
||||||
|
|
||||||
// String just returns the given string.
|
// String just returns the given string.
|
||||||
@ -205,9 +205,11 @@ func BytesSlice(val, sep string) ([][]byte, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Timestamp converts the given RFC3339 formatted string into a timestamp.Timestamp.
|
// Timestamp converts the given RFC3339 formatted string into a timestamp.Timestamp.
|
||||||
func Timestamp(val string) (*timestamp.Timestamp, error) {
|
func Timestamp(val string) (*timestamppb.Timestamp, error) {
|
||||||
var r timestamp.Timestamp
|
var r timestamppb.Timestamp
|
||||||
err := jsonpb.UnmarshalString(val, &r)
|
val = strconv.Quote(strings.Trim(val, `"`))
|
||||||
|
unmarshaler := &protojson.UnmarshalOptions{}
|
||||||
|
err := unmarshaler.Unmarshal([]byte(val), &r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -215,9 +217,11 @@ func Timestamp(val string) (*timestamp.Timestamp, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Duration converts the given string into a timestamp.Duration.
|
// Duration converts the given string into a timestamp.Duration.
|
||||||
func Duration(val string) (*duration.Duration, error) {
|
func Duration(val string) (*durationpb.Duration, error) {
|
||||||
var r duration.Duration
|
var r durationpb.Duration
|
||||||
err := jsonpb.UnmarshalString(val, &r)
|
val = strconv.Quote(strings.Trim(val, `"`))
|
||||||
|
unmarshaler := &protojson.UnmarshalOptions{}
|
||||||
|
err := unmarshaler.Unmarshal([]byte(val), &r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -265,54 +269,54 @@ func EnumSlice(val, sep string, enumValMap map[string]int32) ([]int32, error) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// StringValue well-known type support as wrapper around string type
|
// StringValue well-known type support as wrapper around string type
|
||||||
func StringValue(val string) (*wrappers.StringValue, error) {
|
func StringValue(val string) (*wrapperspb.StringValue, error) {
|
||||||
return &wrappers.StringValue{Value: val}, nil
|
return &wrapperspb.StringValue{Value: val}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// FloatValue well-known type support as wrapper around float32 type
|
// FloatValue well-known type support as wrapper around float32 type
|
||||||
func FloatValue(val string) (*wrappers.FloatValue, error) {
|
func FloatValue(val string) (*wrapperspb.FloatValue, error) {
|
||||||
parsedVal, err := Float32(val)
|
parsedVal, err := Float32(val)
|
||||||
return &wrappers.FloatValue{Value: parsedVal}, err
|
return &wrapperspb.FloatValue{Value: parsedVal}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// DoubleValue well-known type support as wrapper around float64 type
|
// DoubleValue well-known type support as wrapper around float64 type
|
||||||
func DoubleValue(val string) (*wrappers.DoubleValue, error) {
|
func DoubleValue(val string) (*wrapperspb.DoubleValue, error) {
|
||||||
parsedVal, err := Float64(val)
|
parsedVal, err := Float64(val)
|
||||||
return &wrappers.DoubleValue{Value: parsedVal}, err
|
return &wrapperspb.DoubleValue{Value: parsedVal}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// BoolValue well-known type support as wrapper around bool type
|
// BoolValue well-known type support as wrapper around bool type
|
||||||
func BoolValue(val string) (*wrappers.BoolValue, error) {
|
func BoolValue(val string) (*wrapperspb.BoolValue, error) {
|
||||||
parsedVal, err := Bool(val)
|
parsedVal, err := Bool(val)
|
||||||
return &wrappers.BoolValue{Value: parsedVal}, err
|
return &wrapperspb.BoolValue{Value: parsedVal}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int32Value well-known type support as wrapper around int32 type
|
// Int32Value well-known type support as wrapper around int32 type
|
||||||
func Int32Value(val string) (*wrappers.Int32Value, error) {
|
func Int32Value(val string) (*wrapperspb.Int32Value, error) {
|
||||||
parsedVal, err := Int32(val)
|
parsedVal, err := Int32(val)
|
||||||
return &wrappers.Int32Value{Value: parsedVal}, err
|
return &wrapperspb.Int32Value{Value: parsedVal}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// UInt32Value well-known type support as wrapper around uint32 type
|
// UInt32Value well-known type support as wrapper around uint32 type
|
||||||
func UInt32Value(val string) (*wrappers.UInt32Value, error) {
|
func UInt32Value(val string) (*wrapperspb.UInt32Value, error) {
|
||||||
parsedVal, err := Uint32(val)
|
parsedVal, err := Uint32(val)
|
||||||
return &wrappers.UInt32Value{Value: parsedVal}, err
|
return &wrapperspb.UInt32Value{Value: parsedVal}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int64Value well-known type support as wrapper around int64 type
|
// Int64Value well-known type support as wrapper around int64 type
|
||||||
func Int64Value(val string) (*wrappers.Int64Value, error) {
|
func Int64Value(val string) (*wrapperspb.Int64Value, error) {
|
||||||
parsedVal, err := Int64(val)
|
parsedVal, err := Int64(val)
|
||||||
return &wrappers.Int64Value{Value: parsedVal}, err
|
return &wrapperspb.Int64Value{Value: parsedVal}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// UInt64Value well-known type support as wrapper around uint64 type
|
// UInt64Value well-known type support as wrapper around uint64 type
|
||||||
func UInt64Value(val string) (*wrappers.UInt64Value, error) {
|
func UInt64Value(val string) (*wrapperspb.UInt64Value, error) {
|
||||||
parsedVal, err := Uint64(val)
|
parsedVal, err := Uint64(val)
|
||||||
return &wrappers.UInt64Value{Value: parsedVal}, err
|
return &wrapperspb.UInt64Value{Value: parsedVal}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// BytesValue well-known type support as wrapper around bytes[] type
|
// BytesValue well-known type support as wrapper around bytes[] type
|
||||||
func BytesValue(val string) (*wrappers.BytesValue, error) {
|
func BytesValue(val string) (*wrapperspb.BytesValue, error) {
|
||||||
parsedVal, err := Bytes(val)
|
parsedVal, err := Bytes(val)
|
||||||
return &wrappers.BytesValue{Value: parsedVal}, err
|
return &wrapperspb.BytesValue{Value: parsedVal}, err
|
||||||
}
|
}
|
180
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/errors.go
generated
vendored
Normal file
180
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/errors.go
generated
vendored
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
package runtime
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"google.golang.org/grpc/codes"
|
||||||
|
"google.golang.org/grpc/grpclog"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ErrorHandlerFunc is the signature used to configure error handling.
|
||||||
|
type ErrorHandlerFunc func(context.Context, *ServeMux, Marshaler, http.ResponseWriter, *http.Request, error)
|
||||||
|
|
||||||
|
// StreamErrorHandlerFunc is the signature used to configure stream error handling.
|
||||||
|
type StreamErrorHandlerFunc func(context.Context, error) *status.Status
|
||||||
|
|
||||||
|
// RoutingErrorHandlerFunc is the signature used to configure error handling for routing errors.
|
||||||
|
type RoutingErrorHandlerFunc func(context.Context, *ServeMux, Marshaler, http.ResponseWriter, *http.Request, int)
|
||||||
|
|
||||||
|
// HTTPStatusError is the error to use when needing to provide a different HTTP status code for an error
|
||||||
|
// passed to the DefaultRoutingErrorHandler.
|
||||||
|
type HTTPStatusError struct {
|
||||||
|
HTTPStatus int
|
||||||
|
Err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *HTTPStatusError) Error() string {
|
||||||
|
return e.Err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTPStatusFromCode converts a gRPC error code into the corresponding HTTP response status.
|
||||||
|
// See: https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto
|
||||||
|
func HTTPStatusFromCode(code codes.Code) int {
|
||||||
|
switch code {
|
||||||
|
case codes.OK:
|
||||||
|
return http.StatusOK
|
||||||
|
case codes.Canceled:
|
||||||
|
return http.StatusRequestTimeout
|
||||||
|
case codes.Unknown:
|
||||||
|
return http.StatusInternalServerError
|
||||||
|
case codes.InvalidArgument:
|
||||||
|
return http.StatusBadRequest
|
||||||
|
case codes.DeadlineExceeded:
|
||||||
|
return http.StatusGatewayTimeout
|
||||||
|
case codes.NotFound:
|
||||||
|
return http.StatusNotFound
|
||||||
|
case codes.AlreadyExists:
|
||||||
|
return http.StatusConflict
|
||||||
|
case codes.PermissionDenied:
|
||||||
|
return http.StatusForbidden
|
||||||
|
case codes.Unauthenticated:
|
||||||
|
return http.StatusUnauthorized
|
||||||
|
case codes.ResourceExhausted:
|
||||||
|
return http.StatusTooManyRequests
|
||||||
|
case codes.FailedPrecondition:
|
||||||
|
// Note, this deliberately doesn't translate to the similarly named '412 Precondition Failed' HTTP response status.
|
||||||
|
return http.StatusBadRequest
|
||||||
|
case codes.Aborted:
|
||||||
|
return http.StatusConflict
|
||||||
|
case codes.OutOfRange:
|
||||||
|
return http.StatusBadRequest
|
||||||
|
case codes.Unimplemented:
|
||||||
|
return http.StatusNotImplemented
|
||||||
|
case codes.Internal:
|
||||||
|
return http.StatusInternalServerError
|
||||||
|
case codes.Unavailable:
|
||||||
|
return http.StatusServiceUnavailable
|
||||||
|
case codes.DataLoss:
|
||||||
|
return http.StatusInternalServerError
|
||||||
|
}
|
||||||
|
|
||||||
|
grpclog.Infof("Unknown gRPC error code: %v", code)
|
||||||
|
return http.StatusInternalServerError
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTPError uses the mux-configured error handler.
|
||||||
|
func HTTPError(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, r *http.Request, err error) {
|
||||||
|
mux.errorHandler(ctx, mux, marshaler, w, r, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultHTTPErrorHandler is the default error handler.
|
||||||
|
// If "err" is a gRPC Status, the function replies with the status code mapped by HTTPStatusFromCode.
|
||||||
|
// If "err" is a HTTPStatusError, the function replies with the status code provide by that struct. This is
|
||||||
|
// intended to allow passing through of specific statuses via the function set via WithRoutingErrorHandler
|
||||||
|
// for the ServeMux constructor to handle edge cases which the standard mappings in HTTPStatusFromCode
|
||||||
|
// are insufficient for.
|
||||||
|
// If otherwise, it replies with http.StatusInternalServerError.
|
||||||
|
//
|
||||||
|
// The response body written by this function is a Status message marshaled by the Marshaler.
|
||||||
|
func DefaultHTTPErrorHandler(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, r *http.Request, err error) {
|
||||||
|
// return Internal when Marshal failed
|
||||||
|
const fallback = `{"code": 13, "message": "failed to marshal error message"}`
|
||||||
|
|
||||||
|
var customStatus *HTTPStatusError
|
||||||
|
if errors.As(err, &customStatus) {
|
||||||
|
err = customStatus.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
s := status.Convert(err)
|
||||||
|
pb := s.Proto()
|
||||||
|
|
||||||
|
w.Header().Del("Trailer")
|
||||||
|
w.Header().Del("Transfer-Encoding")
|
||||||
|
|
||||||
|
contentType := marshaler.ContentType(pb)
|
||||||
|
w.Header().Set("Content-Type", contentType)
|
||||||
|
|
||||||
|
if s.Code() == codes.Unauthenticated {
|
||||||
|
w.Header().Set("WWW-Authenticate", s.Message())
|
||||||
|
}
|
||||||
|
|
||||||
|
buf, merr := marshaler.Marshal(pb)
|
||||||
|
if merr != nil {
|
||||||
|
grpclog.Infof("Failed to marshal error message %q: %v", s, merr)
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
if _, err := io.WriteString(w, fallback); err != nil {
|
||||||
|
grpclog.Infof("Failed to write response: %v", err)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
md, ok := ServerMetadataFromContext(ctx)
|
||||||
|
if !ok {
|
||||||
|
grpclog.Infof("Failed to extract ServerMetadata from context")
|
||||||
|
}
|
||||||
|
|
||||||
|
handleForwardResponseServerMetadata(w, mux, md)
|
||||||
|
|
||||||
|
// RFC 7230 https://tools.ietf.org/html/rfc7230#section-4.1.2
|
||||||
|
// Unless the request includes a TE header field indicating "trailers"
|
||||||
|
// is acceptable, as described in Section 4.3, a server SHOULD NOT
|
||||||
|
// generate trailer fields that it believes are necessary for the user
|
||||||
|
// agent to receive.
|
||||||
|
doForwardTrailers := requestAcceptsTrailers(r)
|
||||||
|
|
||||||
|
if doForwardTrailers {
|
||||||
|
handleForwardResponseTrailerHeader(w, md)
|
||||||
|
w.Header().Set("Transfer-Encoding", "chunked")
|
||||||
|
}
|
||||||
|
|
||||||
|
st := HTTPStatusFromCode(s.Code())
|
||||||
|
if customStatus != nil {
|
||||||
|
st = customStatus.HTTPStatus
|
||||||
|
}
|
||||||
|
|
||||||
|
w.WriteHeader(st)
|
||||||
|
if _, err := w.Write(buf); err != nil {
|
||||||
|
grpclog.Infof("Failed to write response: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if doForwardTrailers {
|
||||||
|
handleForwardResponseTrailer(w, md)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func DefaultStreamErrorHandler(_ context.Context, err error) *status.Status {
|
||||||
|
return status.Convert(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultRoutingErrorHandler is our default handler for routing errors.
|
||||||
|
// By default http error codes mapped on the following error codes:
|
||||||
|
// NotFound -> grpc.NotFound
|
||||||
|
// StatusBadRequest -> grpc.InvalidArgument
|
||||||
|
// MethodNotAllowed -> grpc.Unimplemented
|
||||||
|
// Other -> grpc.Internal, method is not expecting to be called for anything else
|
||||||
|
func DefaultRoutingErrorHandler(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, r *http.Request, httpStatus int) {
|
||||||
|
sterr := status.Error(codes.Internal, "Unexpected routing error")
|
||||||
|
switch httpStatus {
|
||||||
|
case http.StatusBadRequest:
|
||||||
|
sterr = status.Error(codes.InvalidArgument, http.StatusText(httpStatus))
|
||||||
|
case http.StatusMethodNotAllowed:
|
||||||
|
sterr = status.Error(codes.Unimplemented, http.StatusText(httpStatus))
|
||||||
|
case http.StatusNotFound:
|
||||||
|
sterr = status.Error(codes.NotFound, http.StatusText(httpStatus))
|
||||||
|
}
|
||||||
|
mux.errorHandler(ctx, mux, marshaler, w, r, sterr)
|
||||||
|
}
|
165
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/fieldmask.go
generated
vendored
Normal file
165
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/fieldmask.go
generated
vendored
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
package runtime
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"sort"
|
||||||
|
|
||||||
|
"google.golang.org/genproto/protobuf/field_mask"
|
||||||
|
"google.golang.org/protobuf/proto"
|
||||||
|
"google.golang.org/protobuf/reflect/protoreflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getFieldByName(fields protoreflect.FieldDescriptors, name string) protoreflect.FieldDescriptor {
|
||||||
|
fd := fields.ByName(protoreflect.Name(name))
|
||||||
|
if fd != nil {
|
||||||
|
return fd
|
||||||
|
}
|
||||||
|
|
||||||
|
return fields.ByJSONName(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FieldMaskFromRequestBody creates a FieldMask printing all complete paths from the JSON body.
|
||||||
|
func FieldMaskFromRequestBody(r io.Reader, msg proto.Message) (*field_mask.FieldMask, error) {
|
||||||
|
fm := &field_mask.FieldMask{}
|
||||||
|
var root interface{}
|
||||||
|
|
||||||
|
if err := json.NewDecoder(r).Decode(&root); err != nil {
|
||||||
|
if err == io.EOF {
|
||||||
|
return fm, nil
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
queue := []fieldMaskPathItem{{node: root, msg: msg.ProtoReflect()}}
|
||||||
|
for len(queue) > 0 {
|
||||||
|
// dequeue an item
|
||||||
|
item := queue[0]
|
||||||
|
queue = queue[1:]
|
||||||
|
|
||||||
|
m, ok := item.node.(map[string]interface{})
|
||||||
|
switch {
|
||||||
|
case ok:
|
||||||
|
// if the item is an object, then enqueue all of its children
|
||||||
|
for k, v := range m {
|
||||||
|
if item.msg == nil {
|
||||||
|
return nil, fmt.Errorf("JSON structure did not match request type")
|
||||||
|
}
|
||||||
|
|
||||||
|
fd := getFieldByName(item.msg.Descriptor().Fields(), k)
|
||||||
|
if fd == nil {
|
||||||
|
return nil, fmt.Errorf("could not find field %q in %q", k, item.msg.Descriptor().FullName())
|
||||||
|
}
|
||||||
|
|
||||||
|
if isDynamicProtoMessage(fd.Message()) {
|
||||||
|
for _, p := range buildPathsBlindly(k, v) {
|
||||||
|
newPath := p
|
||||||
|
if item.path != "" {
|
||||||
|
newPath = item.path + "." + newPath
|
||||||
|
}
|
||||||
|
queue = append(queue, fieldMaskPathItem{path: newPath})
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if isProtobufAnyMessage(fd.Message()) {
|
||||||
|
_, hasTypeField := v.(map[string]interface{})["@type"]
|
||||||
|
if hasTypeField {
|
||||||
|
queue = append(queue, fieldMaskPathItem{path: k})
|
||||||
|
continue
|
||||||
|
} else {
|
||||||
|
return nil, fmt.Errorf("could not find field @type in %q in message %q", k, item.msg.Descriptor().FullName())
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
child := fieldMaskPathItem{
|
||||||
|
node: v,
|
||||||
|
}
|
||||||
|
if item.path == "" {
|
||||||
|
child.path = string(fd.FullName().Name())
|
||||||
|
} else {
|
||||||
|
child.path = item.path + "." + string(fd.FullName().Name())
|
||||||
|
}
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case fd.IsList(), fd.IsMap():
|
||||||
|
// As per: https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/field_mask.proto#L85-L86
|
||||||
|
// Do not recurse into repeated fields. The repeated field goes on the end of the path and we stop.
|
||||||
|
fm.Paths = append(fm.Paths, child.path)
|
||||||
|
case fd.Message() != nil:
|
||||||
|
child.msg = item.msg.Get(fd).Message()
|
||||||
|
fallthrough
|
||||||
|
default:
|
||||||
|
queue = append(queue, child)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case len(item.path) > 0:
|
||||||
|
// otherwise, it's a leaf node so print its path
|
||||||
|
fm.Paths = append(fm.Paths, item.path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort for deterministic output in the presence
|
||||||
|
// of repeated fields.
|
||||||
|
sort.Strings(fm.Paths)
|
||||||
|
|
||||||
|
return fm, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func isProtobufAnyMessage(md protoreflect.MessageDescriptor) bool {
|
||||||
|
return md != nil && (md.FullName() == "google.protobuf.Any")
|
||||||
|
}
|
||||||
|
|
||||||
|
func isDynamicProtoMessage(md protoreflect.MessageDescriptor) bool {
|
||||||
|
return md != nil && (md.FullName() == "google.protobuf.Struct" || md.FullName() == "google.protobuf.Value")
|
||||||
|
}
|
||||||
|
|
||||||
|
// buildPathsBlindly does not attempt to match proto field names to the
|
||||||
|
// json value keys. Instead it relies completely on the structure of
|
||||||
|
// the unmarshalled json contained within in.
|
||||||
|
// Returns a slice containing all subpaths with the root at the
|
||||||
|
// passed in name and json value.
|
||||||
|
func buildPathsBlindly(name string, in interface{}) []string {
|
||||||
|
m, ok := in.(map[string]interface{})
|
||||||
|
if !ok {
|
||||||
|
return []string{name}
|
||||||
|
}
|
||||||
|
|
||||||
|
var paths []string
|
||||||
|
queue := []fieldMaskPathItem{{path: name, node: m}}
|
||||||
|
for len(queue) > 0 {
|
||||||
|
cur := queue[0]
|
||||||
|
queue = queue[1:]
|
||||||
|
|
||||||
|
m, ok := cur.node.(map[string]interface{})
|
||||||
|
if !ok {
|
||||||
|
// This should never happen since we should always check that we only add
|
||||||
|
// nodes of type map[string]interface{} to the queue.
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for k, v := range m {
|
||||||
|
if mi, ok := v.(map[string]interface{}); ok {
|
||||||
|
queue = append(queue, fieldMaskPathItem{path: cur.path + "." + k, node: mi})
|
||||||
|
} else {
|
||||||
|
// This is not a struct, so there are no more levels to descend.
|
||||||
|
curPath := cur.path + "." + k
|
||||||
|
paths = append(paths, curPath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return paths
|
||||||
|
}
|
||||||
|
|
||||||
|
// fieldMaskPathItem stores a in-progress deconstruction of a path for a fieldmask
|
||||||
|
type fieldMaskPathItem struct {
|
||||||
|
// the list of prior fields leading up to node connected by dots
|
||||||
|
path string
|
||||||
|
|
||||||
|
// a generic decoded json object the current item to inspect for further path extraction
|
||||||
|
node interface{}
|
||||||
|
|
||||||
|
// parent message
|
||||||
|
msg protoreflect.Message
|
||||||
|
}
|
@ -2,19 +2,19 @@ package runtime
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/textproto"
|
"net/textproto"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
"google.golang.org/genproto/googleapis/api/httpbody"
|
||||||
"github.com/grpc-ecosystem/grpc-gateway/internal"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/grpclog"
|
"google.golang.org/grpc/grpclog"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
|
"google.golang.org/protobuf/proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
var errEmptyResponse = errors.New("empty response")
|
|
||||||
|
|
||||||
// ForwardResponseStream forwards the stream from gRPC server to REST client.
|
// ForwardResponseStream forwards the stream from gRPC server to REST client.
|
||||||
func ForwardResponseStream(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, req *http.Request, recv func() (proto.Message, error), opts ...func(context.Context, http.ResponseWriter, proto.Message) error) {
|
func ForwardResponseStream(ctx context.Context, mux *ServeMux, marshaler Marshaler, w http.ResponseWriter, req *http.Request, recv func() (proto.Message, error), opts ...func(context.Context, http.ResponseWriter, proto.Message) error) {
|
||||||
f, ok := w.(http.Flusher)
|
f, ok := w.(http.Flusher)
|
||||||
@ -33,7 +33,6 @@ func ForwardResponseStream(ctx context.Context, mux *ServeMux, marshaler Marshal
|
|||||||
handleForwardResponseServerMetadata(w, mux, md)
|
handleForwardResponseServerMetadata(w, mux, md)
|
||||||
|
|
||||||
w.Header().Set("Transfer-Encoding", "chunked")
|
w.Header().Set("Transfer-Encoding", "chunked")
|
||||||
w.Header().Set("Content-Type", marshaler.ContentType())
|
|
||||||
if err := handleForwardResponseOptions(ctx, w, nil, opts); err != nil {
|
if err := handleForwardResponseOptions(ctx, w, nil, opts); err != nil {
|
||||||
HTTPError(ctx, mux, marshaler, w, req, err)
|
HTTPError(ctx, mux, marshaler, w, req, err)
|
||||||
return
|
return
|
||||||
@ -61,10 +60,17 @@ func ForwardResponseStream(ctx context.Context, mux *ServeMux, marshaler Marshal
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !wroteHeader {
|
||||||
|
w.Header().Set("Content-Type", marshaler.ContentType(resp))
|
||||||
|
}
|
||||||
|
|
||||||
var buf []byte
|
var buf []byte
|
||||||
|
httpBody, isHTTPBody := resp.(*httpbody.HttpBody)
|
||||||
switch {
|
switch {
|
||||||
case resp == nil:
|
case resp == nil:
|
||||||
buf, err = marshaler.Marshal(errorChunk(streamError(ctx, mux.streamErrorHandler, errEmptyResponse)))
|
buf, err = marshaler.Marshal(errorChunk(status.New(codes.Internal, "empty response")))
|
||||||
|
case isHTTPBody:
|
||||||
|
buf = httpBody.GetData()
|
||||||
default:
|
default:
|
||||||
result := map[string]interface{}{"result": resp}
|
result := map[string]interface{}{"result": resp}
|
||||||
if rb, ok := resp.(responseBody); ok {
|
if rb, ok := resp.(responseBody); ok {
|
||||||
@ -132,15 +138,22 @@ func ForwardResponseMessage(ctx context.Context, mux *ServeMux, marshaler Marsha
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleForwardResponseServerMetadata(w, mux, md)
|
handleForwardResponseServerMetadata(w, mux, md)
|
||||||
|
|
||||||
|
// RFC 7230 https://tools.ietf.org/html/rfc7230#section-4.1.2
|
||||||
|
// Unless the request includes a TE header field indicating "trailers"
|
||||||
|
// is acceptable, as described in Section 4.3, a server SHOULD NOT
|
||||||
|
// generate trailer fields that it believes are necessary for the user
|
||||||
|
// agent to receive.
|
||||||
|
doForwardTrailers := requestAcceptsTrailers(req)
|
||||||
|
|
||||||
|
if doForwardTrailers {
|
||||||
|
handleForwardResponseTrailerHeader(w, md)
|
||||||
|
w.Header().Set("Transfer-Encoding", "chunked")
|
||||||
|
}
|
||||||
|
|
||||||
handleForwardResponseTrailerHeader(w, md)
|
handleForwardResponseTrailerHeader(w, md)
|
||||||
|
|
||||||
contentType := marshaler.ContentType()
|
contentType := marshaler.ContentType(resp)
|
||||||
// Check marshaler on run time in order to keep backwards compatibility
|
|
||||||
// An interface param needs to be added to the ContentType() function on
|
|
||||||
// the Marshal interface to be able to remove this check
|
|
||||||
if typeMarshaler, ok := marshaler.(contentTypeMarshaler); ok {
|
|
||||||
contentType = typeMarshaler.ContentTypeFromMessage(resp)
|
|
||||||
}
|
|
||||||
w.Header().Set("Content-Type", contentType)
|
w.Header().Set("Content-Type", contentType)
|
||||||
|
|
||||||
if err := handleForwardResponseOptions(ctx, w, resp, opts); err != nil {
|
if err := handleForwardResponseOptions(ctx, w, resp, opts); err != nil {
|
||||||
@ -164,7 +177,14 @@ func ForwardResponseMessage(ctx context.Context, mux *ServeMux, marshaler Marsha
|
|||||||
grpclog.Infof("Failed to write response: %v", err)
|
grpclog.Infof("Failed to write response: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
handleForwardResponseTrailer(w, md)
|
if doForwardTrailers {
|
||||||
|
handleForwardResponseTrailer(w, md)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func requestAcceptsTrailers(req *http.Request) bool {
|
||||||
|
te := req.Header.Get("TE")
|
||||||
|
return strings.Contains(strings.ToLower(te), "trailers")
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleForwardResponseOptions(ctx context.Context, w http.ResponseWriter, resp proto.Message, opts []func(context.Context, http.ResponseWriter, proto.Message) error) error {
|
func handleForwardResponseOptions(ctx context.Context, w http.ResponseWriter, resp proto.Message, opts []func(context.Context, http.ResponseWriter, proto.Message) error) error {
|
||||||
@ -181,11 +201,13 @@ func handleForwardResponseOptions(ctx context.Context, w http.ResponseWriter, re
|
|||||||
}
|
}
|
||||||
|
|
||||||
func handleForwardResponseStreamError(ctx context.Context, wroteHeader bool, marshaler Marshaler, w http.ResponseWriter, req *http.Request, mux *ServeMux, err error) {
|
func handleForwardResponseStreamError(ctx context.Context, wroteHeader bool, marshaler Marshaler, w http.ResponseWriter, req *http.Request, mux *ServeMux, err error) {
|
||||||
serr := streamError(ctx, mux.streamErrorHandler, err)
|
st := mux.streamErrorHandler(ctx, err)
|
||||||
|
msg := errorChunk(st)
|
||||||
if !wroteHeader {
|
if !wroteHeader {
|
||||||
w.WriteHeader(int(serr.HttpCode))
|
w.Header().Set("Content-Type", marshaler.ContentType(msg))
|
||||||
|
w.WriteHeader(HTTPStatusFromCode(st.Code()))
|
||||||
}
|
}
|
||||||
buf, merr := marshaler.Marshal(errorChunk(serr))
|
buf, merr := marshaler.Marshal(msg)
|
||||||
if merr != nil {
|
if merr != nil {
|
||||||
grpclog.Infof("Failed to marshal an error: %v", merr)
|
grpclog.Infof("Failed to marshal an error: %v", merr)
|
||||||
return
|
return
|
||||||
@ -196,17 +218,6 @@ func handleForwardResponseStreamError(ctx context.Context, wroteHeader bool, mar
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// streamError returns the payload for the final message in a response stream
|
func errorChunk(st *status.Status) map[string]proto.Message {
|
||||||
// that represents the given err.
|
return map[string]proto.Message{"error": st.Proto()}
|
||||||
func streamError(ctx context.Context, errHandler StreamErrorHandlerFunc, err error) *StreamError {
|
|
||||||
serr := errHandler(ctx, err)
|
|
||||||
if serr != nil {
|
|
||||||
return serr
|
|
||||||
}
|
|
||||||
// TODO: log about misbehaving stream error handler?
|
|
||||||
return DefaultHTTPStreamErrorHandler(ctx, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func errorChunk(err *StreamError) map[string]proto.Message {
|
|
||||||
return map[string]proto.Message{"error": (*internal.StreamError)(err)}
|
|
||||||
}
|
}
|
@ -4,13 +4,6 @@ import (
|
|||||||
"google.golang.org/genproto/googleapis/api/httpbody"
|
"google.golang.org/genproto/googleapis/api/httpbody"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SetHTTPBodyMarshaler overwrite the default marshaler with the HTTPBodyMarshaler
|
|
||||||
func SetHTTPBodyMarshaler(serveMux *ServeMux) {
|
|
||||||
serveMux.marshalers.mimeMap[MIMEWildcard] = &HTTPBodyMarshaler{
|
|
||||||
Marshaler: &JSONPb{OrigName: true},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPBodyMarshaler is a Marshaler which supports marshaling of a
|
// HTTPBodyMarshaler is a Marshaler which supports marshaling of a
|
||||||
// google.api.HttpBody message as the full response body if it is
|
// google.api.HttpBody message as the full response body if it is
|
||||||
// the actual message used as the response. If not, then this will
|
// the actual message used as the response. If not, then this will
|
||||||
@ -19,18 +12,14 @@ type HTTPBodyMarshaler struct {
|
|||||||
Marshaler
|
Marshaler
|
||||||
}
|
}
|
||||||
|
|
||||||
// ContentType implementation to keep backwards compatibility with marshal interface
|
// ContentType returns its specified content type in case v is a
|
||||||
func (h *HTTPBodyMarshaler) ContentType() string {
|
// google.api.HttpBody message, otherwise it will fall back to the default Marshalers
|
||||||
return h.ContentTypeFromMessage(nil)
|
// content type.
|
||||||
}
|
func (h *HTTPBodyMarshaler) ContentType(v interface{}) string {
|
||||||
|
|
||||||
// ContentTypeFromMessage in case v is a google.api.HttpBody message it returns
|
|
||||||
// its specified content type otherwise fall back to the default Marshaler.
|
|
||||||
func (h *HTTPBodyMarshaler) ContentTypeFromMessage(v interface{}) string {
|
|
||||||
if httpBody, ok := v.(*httpbody.HttpBody); ok {
|
if httpBody, ok := v.(*httpbody.HttpBody); ok {
|
||||||
return httpBody.GetContentType()
|
return httpBody.GetContentType()
|
||||||
}
|
}
|
||||||
return h.Marshaler.ContentType()
|
return h.Marshaler.ContentType(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Marshal marshals "v" by returning the body bytes if v is a
|
// Marshal marshals "v" by returning the body bytes if v is a
|
@ -15,7 +15,7 @@ import (
|
|||||||
type JSONBuiltin struct{}
|
type JSONBuiltin struct{}
|
||||||
|
|
||||||
// ContentType always Returns "application/json".
|
// ContentType always Returns "application/json".
|
||||||
func (*JSONBuiltin) ContentType() string {
|
func (*JSONBuiltin) ContentType(_ interface{}) string {
|
||||||
return "application/json"
|
return "application/json"
|
||||||
}
|
}
|
||||||
|
|
@ -6,21 +6,25 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"github.com/golang/protobuf/jsonpb"
|
"google.golang.org/protobuf/encoding/protojson"
|
||||||
"github.com/golang/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
// JSONPb is a Marshaler which marshals/unmarshals into/from JSON
|
// JSONPb is a Marshaler which marshals/unmarshals into/from JSON
|
||||||
// with the "github.com/golang/protobuf/jsonpb".
|
// with the "google.golang.org/protobuf/encoding/protojson" marshaler.
|
||||||
// It supports fully functionality of protobuf unlike JSONBuiltin.
|
// It supports the full functionality of protobuf unlike JSONBuiltin.
|
||||||
//
|
//
|
||||||
// The NewDecoder method returns a DecoderWrapper, so the underlying
|
// The NewDecoder method returns a DecoderWrapper, so the underlying
|
||||||
// *json.Decoder methods can be used.
|
// *json.Decoder methods can be used.
|
||||||
type JSONPb jsonpb.Marshaler
|
type JSONPb struct {
|
||||||
|
protojson.MarshalOptions
|
||||||
|
protojson.UnmarshalOptions
|
||||||
|
}
|
||||||
|
|
||||||
// ContentType always returns "application/json".
|
// ContentType always returns "application/json".
|
||||||
func (*JSONPb) ContentType() string {
|
func (*JSONPb) ContentType(_ interface{}) string {
|
||||||
return "application/json"
|
return "application/json"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,7 +51,13 @@ func (j *JSONPb) marshalTo(w io.Writer, v interface{}) error {
|
|||||||
_, err = w.Write(buf)
|
_, err = w.Write(buf)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return (*jsonpb.Marshaler)(j).Marshal(w, p)
|
b, err := j.MarshalOptions.Marshal(p)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = w.Write(b)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -56,8 +66,8 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// marshalNonProto marshals a non-message field of a protobuf message.
|
// marshalNonProto marshals a non-message field of a protobuf message.
|
||||||
// This function does not correctly marshals arbitrary data structure into JSON,
|
// This function does not correctly marshal arbitrary data structures into JSON,
|
||||||
// but it is only capable of marshaling non-message field values of protobuf,
|
// it is only capable of marshaling non-message field values of protobuf,
|
||||||
// i.e. primitive types, enums; pointers to primitives or enums; maps from
|
// i.e. primitive types, enums; pointers to primitives or enums; maps from
|
||||||
// integer/string types to primitives/enums/pointers to messages.
|
// integer/string types to primitives/enums/pointers to messages.
|
||||||
func (j *JSONPb) marshalNonProtoField(v interface{}) ([]byte, error) {
|
func (j *JSONPb) marshalNonProtoField(v interface{}) ([]byte, error) {
|
||||||
@ -74,7 +84,7 @@ func (j *JSONPb) marshalNonProtoField(v interface{}) ([]byte, error) {
|
|||||||
|
|
||||||
if rv.Kind() == reflect.Slice {
|
if rv.Kind() == reflect.Slice {
|
||||||
if rv.IsNil() {
|
if rv.IsNil() {
|
||||||
if j.EmitDefaults {
|
if j.EmitUnpopulated {
|
||||||
return []byte("[]"), nil
|
return []byte("[]"), nil
|
||||||
}
|
}
|
||||||
return []byte("null"), nil
|
return []byte("null"), nil
|
||||||
@ -93,7 +103,37 @@ func (j *JSONPb) marshalNonProtoField(v interface{}) ([]byte, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err = (*jsonpb.Marshaler)(j).Marshal(&buf, rv.Index(i).Interface().(proto.Message)); err != nil {
|
if err = j.marshalTo(&buf, rv.Index(i).Interface().(proto.Message)); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = buf.WriteByte(']')
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf.Bytes(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if rv.Type().Elem().Implements(typeProtoEnum) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
err := buf.WriteByte('[')
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for i := 0; i < rv.Len(); i++ {
|
||||||
|
if i != 0 {
|
||||||
|
err = buf.WriteByte(',')
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if j.UseEnumNumbers {
|
||||||
|
_, err = buf.WriteString(strconv.FormatInt(rv.Index(i).Int(), 10))
|
||||||
|
} else {
|
||||||
|
_, err = buf.WriteString("\"" + rv.Index(i).Interface().(protoEnum).String() + "\"")
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -120,7 +160,7 @@ func (j *JSONPb) marshalNonProtoField(v interface{}) ([]byte, error) {
|
|||||||
}
|
}
|
||||||
return json.Marshal(m)
|
return json.Marshal(m)
|
||||||
}
|
}
|
||||||
if enum, ok := rv.Interface().(protoEnum); ok && !j.EnumsAsInts {
|
if enum, ok := rv.Interface().(protoEnum); ok && !j.UseEnumNumbers {
|
||||||
return json.Marshal(enum.String())
|
return json.Marshal(enum.String())
|
||||||
}
|
}
|
||||||
return json.Marshal(rv.Interface())
|
return json.Marshal(rv.Interface())
|
||||||
@ -128,25 +168,29 @@ func (j *JSONPb) marshalNonProtoField(v interface{}) ([]byte, error) {
|
|||||||
|
|
||||||
// Unmarshal unmarshals JSON "data" into "v"
|
// Unmarshal unmarshals JSON "data" into "v"
|
||||||
func (j *JSONPb) Unmarshal(data []byte, v interface{}) error {
|
func (j *JSONPb) Unmarshal(data []byte, v interface{}) error {
|
||||||
return unmarshalJSONPb(data, v)
|
return unmarshalJSONPb(data, j.UnmarshalOptions, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDecoder returns a Decoder which reads JSON stream from "r".
|
// NewDecoder returns a Decoder which reads JSON stream from "r".
|
||||||
func (j *JSONPb) NewDecoder(r io.Reader) Decoder {
|
func (j *JSONPb) NewDecoder(r io.Reader) Decoder {
|
||||||
d := json.NewDecoder(r)
|
d := json.NewDecoder(r)
|
||||||
return DecoderWrapper{Decoder: d}
|
return DecoderWrapper{
|
||||||
|
Decoder: d,
|
||||||
|
UnmarshalOptions: j.UnmarshalOptions,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DecoderWrapper is a wrapper around a *json.Decoder that adds
|
// DecoderWrapper is a wrapper around a *json.Decoder that adds
|
||||||
// support for protos to the Decode method.
|
// support for protos to the Decode method.
|
||||||
type DecoderWrapper struct {
|
type DecoderWrapper struct {
|
||||||
*json.Decoder
|
*json.Decoder
|
||||||
|
protojson.UnmarshalOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode wraps the embedded decoder's Decode method to support
|
// Decode wraps the embedded decoder's Decode method to support
|
||||||
// protos using a jsonpb.Unmarshaler.
|
// protos using a jsonpb.Unmarshaler.
|
||||||
func (d DecoderWrapper) Decode(v interface{}) error {
|
func (d DecoderWrapper) Decode(v interface{}) error {
|
||||||
return decodeJSONPb(d.Decoder, v)
|
return decodeJSONPb(d.Decoder, d.UnmarshalOptions, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewEncoder returns an Encoder which writes JSON stream into "w".
|
// NewEncoder returns an Encoder which writes JSON stream into "w".
|
||||||
@ -162,21 +206,28 @@ func (j *JSONPb) NewEncoder(w io.Writer) Encoder {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func unmarshalJSONPb(data []byte, v interface{}) error {
|
func unmarshalJSONPb(data []byte, unmarshaler protojson.UnmarshalOptions, v interface{}) error {
|
||||||
d := json.NewDecoder(bytes.NewReader(data))
|
d := json.NewDecoder(bytes.NewReader(data))
|
||||||
return decodeJSONPb(d, v)
|
return decodeJSONPb(d, unmarshaler, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
func decodeJSONPb(d *json.Decoder, v interface{}) error {
|
func decodeJSONPb(d *json.Decoder, unmarshaler protojson.UnmarshalOptions, v interface{}) error {
|
||||||
p, ok := v.(proto.Message)
|
p, ok := v.(proto.Message)
|
||||||
if !ok {
|
if !ok {
|
||||||
return decodeNonProtoField(d, v)
|
return decodeNonProtoField(d, unmarshaler, v)
|
||||||
}
|
}
|
||||||
unmarshaler := &jsonpb.Unmarshaler{AllowUnknownFields: allowUnknownFields}
|
|
||||||
return unmarshaler.UnmarshalNext(d, p)
|
// Decode into bytes for marshalling
|
||||||
|
var b json.RawMessage
|
||||||
|
err := d.Decode(&b)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return unmarshaler.Unmarshal([]byte(b), p)
|
||||||
}
|
}
|
||||||
|
|
||||||
func decodeNonProtoField(d *json.Decoder, v interface{}) error {
|
func decodeNonProtoField(d *json.Decoder, unmarshaler protojson.UnmarshalOptions, v interface{}) error {
|
||||||
rv := reflect.ValueOf(v)
|
rv := reflect.ValueOf(v)
|
||||||
if rv.Kind() != reflect.Ptr {
|
if rv.Kind() != reflect.Ptr {
|
||||||
return fmt.Errorf("%T is not a pointer", v)
|
return fmt.Errorf("%T is not a pointer", v)
|
||||||
@ -186,8 +237,14 @@ func decodeNonProtoField(d *json.Decoder, v interface{}) error {
|
|||||||
rv.Set(reflect.New(rv.Type().Elem()))
|
rv.Set(reflect.New(rv.Type().Elem()))
|
||||||
}
|
}
|
||||||
if rv.Type().ConvertibleTo(typeProtoMessage) {
|
if rv.Type().ConvertibleTo(typeProtoMessage) {
|
||||||
unmarshaler := &jsonpb.Unmarshaler{AllowUnknownFields: allowUnknownFields}
|
// Decode into bytes for marshalling
|
||||||
return unmarshaler.UnmarshalNext(d, rv.Interface().(proto.Message))
|
var b json.RawMessage
|
||||||
|
err := d.Decode(&b)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return unmarshaler.Unmarshal([]byte(b), rv.Interface().(proto.Message))
|
||||||
}
|
}
|
||||||
rv = rv.Elem()
|
rv = rv.Elem()
|
||||||
}
|
}
|
||||||
@ -211,24 +268,45 @@ func decodeNonProtoField(d *json.Decoder, v interface{}) error {
|
|||||||
}
|
}
|
||||||
bk := result[0]
|
bk := result[0]
|
||||||
bv := reflect.New(rv.Type().Elem())
|
bv := reflect.New(rv.Type().Elem())
|
||||||
if err := unmarshalJSONPb([]byte(*v), bv.Interface()); err != nil {
|
if v == nil {
|
||||||
|
null := json.RawMessage("null")
|
||||||
|
v = &null
|
||||||
|
}
|
||||||
|
if err := unmarshalJSONPb([]byte(*v), unmarshaler, bv.Interface()); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
rv.SetMapIndex(bk, bv.Elem())
|
rv.SetMapIndex(bk, bv.Elem())
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
if rv.Kind() == reflect.Slice {
|
||||||
|
var sl []json.RawMessage
|
||||||
|
if err := d.Decode(&sl); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if sl != nil {
|
||||||
|
rv.Set(reflect.MakeSlice(rv.Type(), 0, 0))
|
||||||
|
}
|
||||||
|
for _, item := range sl {
|
||||||
|
bv := reflect.New(rv.Type().Elem())
|
||||||
|
if err := unmarshalJSONPb([]byte(item), unmarshaler, bv.Interface()); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
rv.Set(reflect.Append(rv, bv.Elem()))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
if _, ok := rv.Interface().(protoEnum); ok {
|
if _, ok := rv.Interface().(protoEnum); ok {
|
||||||
var repr interface{}
|
var repr interface{}
|
||||||
if err := d.Decode(&repr); err != nil {
|
if err := d.Decode(&repr); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
switch repr.(type) {
|
switch v := repr.(type) {
|
||||||
case string:
|
case string:
|
||||||
// TODO(yugui) Should use proto.StructProperties?
|
// TODO(yugui) Should use proto.StructProperties?
|
||||||
return fmt.Errorf("unmarshaling of symbolic enum %q not supported: %T", repr, rv.Interface())
|
return fmt.Errorf("unmarshaling of symbolic enum %q not supported: %T", repr, rv.Interface())
|
||||||
case float64:
|
case float64:
|
||||||
rv.Set(reflect.ValueOf(int32(repr.(float64))).Convert(rv.Type()))
|
rv.Set(reflect.ValueOf(int32(v)).Convert(rv.Type()))
|
||||||
return nil
|
return nil
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("cannot assign %#v into Go type %T", repr, rv.Interface())
|
return fmt.Errorf("cannot assign %#v into Go type %T", repr, rv.Interface())
|
||||||
@ -242,6 +320,8 @@ type protoEnum interface {
|
|||||||
EnumDescriptor() ([]byte, []int)
|
EnumDescriptor() ([]byte, []int)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var typeProtoEnum = reflect.TypeOf((*protoEnum)(nil)).Elem()
|
||||||
|
|
||||||
var typeProtoMessage = reflect.TypeOf((*proto.Message)(nil)).Elem()
|
var typeProtoMessage = reflect.TypeOf((*proto.Message)(nil)).Elem()
|
||||||
|
|
||||||
// Delimiter for newline encoded JSON streams.
|
// Delimiter for newline encoded JSON streams.
|
||||||
@ -249,14 +329,16 @@ func (j *JSONPb) Delimiter() []byte {
|
|||||||
return []byte("\n")
|
return []byte("\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
// allowUnknownFields helps not to return an error when the destination
|
var (
|
||||||
// is a struct and the input contains object keys which do not match any
|
convFromType = map[reflect.Kind]reflect.Value{
|
||||||
// non-ignored, exported fields in the destination.
|
reflect.String: reflect.ValueOf(String),
|
||||||
var allowUnknownFields = true
|
reflect.Bool: reflect.ValueOf(Bool),
|
||||||
|
reflect.Float64: reflect.ValueOf(Float64),
|
||||||
// DisallowUnknownFields enables option in decoder (unmarshaller) to
|
reflect.Float32: reflect.ValueOf(Float32),
|
||||||
// return an error when it finds an unknown field. This function must be
|
reflect.Int64: reflect.ValueOf(Int64),
|
||||||
// called before using the JSON marshaller.
|
reflect.Int32: reflect.ValueOf(Int32),
|
||||||
func DisallowUnknownFields() {
|
reflect.Uint64: reflect.ValueOf(Uint64),
|
||||||
allowUnknownFields = false
|
reflect.Uint32: reflect.ValueOf(Uint32),
|
||||||
}
|
reflect.Slice: reflect.ValueOf(Bytes),
|
||||||
|
}
|
||||||
|
)
|
@ -4,15 +4,16 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
|
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
|
||||||
|
"google.golang.org/protobuf/proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ProtoMarshaller is a Marshaller which marshals/unmarshals into/from serialize proto bytes
|
// ProtoMarshaller is a Marshaller which marshals/unmarshals into/from serialize proto bytes
|
||||||
type ProtoMarshaller struct{}
|
type ProtoMarshaller struct{}
|
||||||
|
|
||||||
// ContentType always returns "application/octet-stream".
|
// ContentType always returns "application/octet-stream".
|
||||||
func (*ProtoMarshaller) ContentType() string {
|
func (*ProtoMarshaller) ContentType(_ interface{}) string {
|
||||||
return "application/octet-stream"
|
return "application/octet-stream"
|
||||||
}
|
}
|
||||||
|
|
@ -16,14 +16,9 @@ type Marshaler interface {
|
|||||||
// NewEncoder returns an Encoder which writes bytes sequence into "w".
|
// NewEncoder returns an Encoder which writes bytes sequence into "w".
|
||||||
NewEncoder(w io.Writer) Encoder
|
NewEncoder(w io.Writer) Encoder
|
||||||
// ContentType returns the Content-Type which this marshaler is responsible for.
|
// ContentType returns the Content-Type which this marshaler is responsible for.
|
||||||
ContentType() string
|
// The parameter describes the type which is being marshalled, which can sometimes
|
||||||
}
|
// affect the content type returned.
|
||||||
|
ContentType(v interface{}) string
|
||||||
// Marshalers that implement contentTypeMarshaler will have their ContentTypeFromMessage method called
|
|
||||||
// to set the Content-Type header on the response
|
|
||||||
type contentTypeMarshaler interface {
|
|
||||||
// ContentTypeFromMessage returns the Content-Type this marshaler produces from the provided message
|
|
||||||
ContentTypeFromMessage(v interface{}) string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decoder decodes a byte sequence
|
// Decoder decodes a byte sequence
|
@ -6,6 +6,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"google.golang.org/grpc/grpclog"
|
"google.golang.org/grpc/grpclog"
|
||||||
|
"google.golang.org/protobuf/encoding/protojson"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MIMEWildcard is the fallback MIME type used for requests which do not match
|
// MIMEWildcard is the fallback MIME type used for requests which do not match
|
||||||
@ -16,7 +17,16 @@ var (
|
|||||||
acceptHeader = http.CanonicalHeaderKey("Accept")
|
acceptHeader = http.CanonicalHeaderKey("Accept")
|
||||||
contentTypeHeader = http.CanonicalHeaderKey("Content-Type")
|
contentTypeHeader = http.CanonicalHeaderKey("Content-Type")
|
||||||
|
|
||||||
defaultMarshaler = &JSONPb{OrigName: true}
|
defaultMarshaler = &HTTPBodyMarshaler{
|
||||||
|
Marshaler: &JSONPb{
|
||||||
|
MarshalOptions: protojson.MarshalOptions{
|
||||||
|
EmitUnpopulated: true,
|
||||||
|
},
|
||||||
|
UnmarshalOptions: protojson.UnmarshalOptions{
|
||||||
|
DiscardUnknown: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// MarshalerForRequest returns the inbound/outbound marshalers for this request.
|
// MarshalerForRequest returns the inbound/outbound marshalers for this request.
|
@ -2,28 +2,47 @@ package runtime
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/textproto"
|
"net/textproto"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/metadata"
|
"google.golang.org/grpc/metadata"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
|
"google.golang.org/protobuf/proto"
|
||||||
|
)
|
||||||
|
|
||||||
|
// UnescapingMode defines the behavior of ServeMux when unescaping path parameters.
|
||||||
|
type UnescapingMode int
|
||||||
|
|
||||||
|
const (
|
||||||
|
// UnescapingModeLegacy is the default V2 behavior, which escapes the entire
|
||||||
|
// path string before doing any routing.
|
||||||
|
UnescapingModeLegacy UnescapingMode = iota
|
||||||
|
|
||||||
|
// EscapingTypeExceptReserved unescapes all path parameters except RFC 6570
|
||||||
|
// reserved characters.
|
||||||
|
UnescapingModeAllExceptReserved
|
||||||
|
|
||||||
|
// EscapingTypeExceptSlash unescapes URL path parameters except path
|
||||||
|
// seperators, which will be left as "%2F".
|
||||||
|
UnescapingModeAllExceptSlash
|
||||||
|
|
||||||
|
// URL path parameters will be fully decoded.
|
||||||
|
UnescapingModeAllCharacters
|
||||||
|
|
||||||
|
// UnescapingModeDefault is the default escaping type.
|
||||||
|
// TODO(v3): default this to UnescapingModeAllExceptReserved per grpc-httpjson-transcoding's
|
||||||
|
// reference implementation
|
||||||
|
UnescapingModeDefault = UnescapingModeLegacy
|
||||||
)
|
)
|
||||||
|
|
||||||
// A HandlerFunc handles a specific pair of path pattern and HTTP method.
|
// A HandlerFunc handles a specific pair of path pattern and HTTP method.
|
||||||
type HandlerFunc func(w http.ResponseWriter, r *http.Request, pathParams map[string]string)
|
type HandlerFunc func(w http.ResponseWriter, r *http.Request, pathParams map[string]string)
|
||||||
|
|
||||||
// ErrUnknownURI is the error supplied to a custom ProtoErrorHandlerFunc when
|
|
||||||
// a request is received with a URI path that does not match any registered
|
|
||||||
// service method.
|
|
||||||
//
|
|
||||||
// Since gRPC servers return an "Unimplemented" code for requests with an
|
|
||||||
// unrecognized URI path, this error also has a gRPC "Unimplemented" code.
|
|
||||||
var ErrUnknownURI = status.Error(codes.Unimplemented, http.StatusText(http.StatusNotImplemented))
|
|
||||||
|
|
||||||
// ServeMux is a request multiplexer for grpc-gateway.
|
// ServeMux is a request multiplexer for grpc-gateway.
|
||||||
// It matches http requests to patterns and invokes the corresponding handler.
|
// It matches http requests to patterns and invokes the corresponding handler.
|
||||||
type ServeMux struct {
|
type ServeMux struct {
|
||||||
@ -34,10 +53,11 @@ type ServeMux struct {
|
|||||||
incomingHeaderMatcher HeaderMatcherFunc
|
incomingHeaderMatcher HeaderMatcherFunc
|
||||||
outgoingHeaderMatcher HeaderMatcherFunc
|
outgoingHeaderMatcher HeaderMatcherFunc
|
||||||
metadataAnnotators []func(context.Context, *http.Request) metadata.MD
|
metadataAnnotators []func(context.Context, *http.Request) metadata.MD
|
||||||
|
errorHandler ErrorHandlerFunc
|
||||||
streamErrorHandler StreamErrorHandlerFunc
|
streamErrorHandler StreamErrorHandlerFunc
|
||||||
protoErrorHandler ProtoErrorHandlerFunc
|
routingErrorHandler RoutingErrorHandlerFunc
|
||||||
disablePathLengthFallback bool
|
disablePathLengthFallback bool
|
||||||
lastMatchWins bool
|
unescapingMode UnescapingMode
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServeMuxOption is an option that can be given to a ServeMux on construction.
|
// ServeMuxOption is an option that can be given to a ServeMux on construction.
|
||||||
@ -55,8 +75,16 @@ func WithForwardResponseOption(forwardResponseOption func(context.Context, http.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithEscapingType sets the escaping type. See the definitions of UnescapingMode
|
||||||
|
// for more information.
|
||||||
|
func WithUnescapingMode(mode UnescapingMode) ServeMuxOption {
|
||||||
|
return func(serveMux *ServeMux) {
|
||||||
|
serveMux.unescapingMode = mode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// SetQueryParameterParser sets the query parameter parser, used to populate message from query parameters.
|
// SetQueryParameterParser sets the query parameter parser, used to populate message from query parameters.
|
||||||
// Configuring this will mean the generated swagger output is no longer correct, and it should be
|
// Configuring this will mean the generated OpenAPI output is no longer correct, and it should be
|
||||||
// done with careful consideration.
|
// done with careful consideration.
|
||||||
func SetQueryParameterParser(queryParameterParser QueryParameterParser) ServeMuxOption {
|
func SetQueryParameterParser(queryParameterParser QueryParameterParser) ServeMuxOption {
|
||||||
return func(serveMux *ServeMux) {
|
return func(serveMux *ServeMux) {
|
||||||
@ -111,14 +139,36 @@ func WithMetadata(annotator func(context.Context, *http.Request) metadata.MD) Se
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithProtoErrorHandler returns a ServeMuxOption for configuring a custom error handler.
|
// WithErrorHandler returns a ServeMuxOption for configuring a custom error handler.
|
||||||
//
|
//
|
||||||
// This can be used to handle an error as general proto message defined by gRPC.
|
// This can be used to configure a custom error response.
|
||||||
// When this option is used, the mux uses the configured error handler instead of HTTPError and
|
func WithErrorHandler(fn ErrorHandlerFunc) ServeMuxOption {
|
||||||
// OtherErrorHandler.
|
|
||||||
func WithProtoErrorHandler(fn ProtoErrorHandlerFunc) ServeMuxOption {
|
|
||||||
return func(serveMux *ServeMux) {
|
return func(serveMux *ServeMux) {
|
||||||
serveMux.protoErrorHandler = fn
|
serveMux.errorHandler = fn
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithStreamErrorHandler returns a ServeMuxOption that will use the given custom stream
|
||||||
|
// error handler, which allows for customizing the error trailer for server-streaming
|
||||||
|
// calls.
|
||||||
|
//
|
||||||
|
// For stream errors that occur before any response has been written, the mux's
|
||||||
|
// ErrorHandler will be invoked. However, once data has been written, the errors must
|
||||||
|
// be handled differently: they must be included in the response body. The response body's
|
||||||
|
// final message will include the error details returned by the stream error handler.
|
||||||
|
func WithStreamErrorHandler(fn StreamErrorHandlerFunc) ServeMuxOption {
|
||||||
|
return func(serveMux *ServeMux) {
|
||||||
|
serveMux.streamErrorHandler = fn
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithRoutingErrorHandler returns a ServeMuxOption for configuring a custom error handler to handle http routing errors.
|
||||||
|
//
|
||||||
|
// Method called for errors which can happen before gRPC route selected or executed.
|
||||||
|
// The following error codes: StatusMethodNotAllowed StatusNotFound StatusBadRequest
|
||||||
|
func WithRoutingErrorHandler(fn RoutingErrorHandlerFunc) ServeMuxOption {
|
||||||
|
return func(serveMux *ServeMux) {
|
||||||
|
serveMux.routingErrorHandler = fn
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,36 +179,16 @@ func WithDisablePathLengthFallback() ServeMuxOption {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithStreamErrorHandler returns a ServeMuxOption that will use the given custom stream
|
|
||||||
// error handler, which allows for customizing the error trailer for server-streaming
|
|
||||||
// calls.
|
|
||||||
//
|
|
||||||
// For stream errors that occur before any response has been written, the mux's
|
|
||||||
// ProtoErrorHandler will be invoked. However, once data has been written, the errors must
|
|
||||||
// be handled differently: they must be included in the response body. The response body's
|
|
||||||
// final message will include the error details returned by the stream error handler.
|
|
||||||
func WithStreamErrorHandler(fn StreamErrorHandlerFunc) ServeMuxOption {
|
|
||||||
return func(serveMux *ServeMux) {
|
|
||||||
serveMux.streamErrorHandler = fn
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithLastMatchWins returns a ServeMuxOption that will enable "last
|
|
||||||
// match wins" behavior, where if multiple path patterns match a
|
|
||||||
// request path, the last one defined in the .proto file will be used.
|
|
||||||
func WithLastMatchWins() ServeMuxOption {
|
|
||||||
return func(serveMux *ServeMux) {
|
|
||||||
serveMux.lastMatchWins = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewServeMux returns a new ServeMux whose internal mapping is empty.
|
// NewServeMux returns a new ServeMux whose internal mapping is empty.
|
||||||
func NewServeMux(opts ...ServeMuxOption) *ServeMux {
|
func NewServeMux(opts ...ServeMuxOption) *ServeMux {
|
||||||
serveMux := &ServeMux{
|
serveMux := &ServeMux{
|
||||||
handlers: make(map[string][]handler),
|
handlers: make(map[string][]handler),
|
||||||
forwardResponseOptions: make([]func(context.Context, http.ResponseWriter, proto.Message) error, 0),
|
forwardResponseOptions: make([]func(context.Context, http.ResponseWriter, proto.Message) error, 0),
|
||||||
marshalers: makeMarshalerMIMERegistry(),
|
marshalers: makeMarshalerMIMERegistry(),
|
||||||
streamErrorHandler: DefaultHTTPStreamErrorHandler,
|
errorHandler: DefaultHTTPErrorHandler,
|
||||||
|
streamErrorHandler: DefaultStreamErrorHandler,
|
||||||
|
routingErrorHandler: DefaultRoutingErrorHandler,
|
||||||
|
unescapingMode: UnescapingModeDefault,
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
@ -180,11 +210,23 @@ func NewServeMux(opts ...ServeMuxOption) *ServeMux {
|
|||||||
|
|
||||||
// Handle associates "h" to the pair of HTTP method and path pattern.
|
// Handle associates "h" to the pair of HTTP method and path pattern.
|
||||||
func (s *ServeMux) Handle(meth string, pat Pattern, h HandlerFunc) {
|
func (s *ServeMux) Handle(meth string, pat Pattern, h HandlerFunc) {
|
||||||
if s.lastMatchWins {
|
s.handlers[meth] = append([]handler{{pat: pat, h: h}}, s.handlers[meth]...)
|
||||||
s.handlers[meth] = append([]handler{handler{pat: pat, h: h}}, s.handlers[meth]...)
|
}
|
||||||
} else {
|
|
||||||
s.handlers[meth] = append(s.handlers[meth], handler{pat: pat, h: h})
|
// HandlePath allows users to configure custom path handlers.
|
||||||
|
// refer: https://grpc-ecosystem.github.io/grpc-gateway/docs/operations/inject_router/
|
||||||
|
func (s *ServeMux) HandlePath(meth string, pathPattern string, h HandlerFunc) error {
|
||||||
|
compiler, err := httprule.Parse(pathPattern)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("parsing path pattern: %w", err)
|
||||||
}
|
}
|
||||||
|
tp := compiler.Compile()
|
||||||
|
pattern, err := NewPattern(tp.Version, tp.OpCodes, tp.Pool, tp.Verb)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("creating new pattern: %w", err)
|
||||||
|
}
|
||||||
|
s.Handle(meth, pattern, h)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServeHTTP dispatches the request to the first handler whose pattern matches to r.Method and r.Path.
|
// ServeHTTP dispatches the request to the first handler whose pattern matches to r.Method and r.Path.
|
||||||
@ -193,48 +235,66 @@ func (s *ServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
path := r.URL.Path
|
path := r.URL.Path
|
||||||
if !strings.HasPrefix(path, "/") {
|
if !strings.HasPrefix(path, "/") {
|
||||||
if s.protoErrorHandler != nil {
|
_, outboundMarshaler := MarshalerForRequest(s, r)
|
||||||
_, outboundMarshaler := MarshalerForRequest(s, r)
|
s.routingErrorHandler(ctx, s, outboundMarshaler, w, r, http.StatusBadRequest)
|
||||||
sterr := status.Error(codes.InvalidArgument, http.StatusText(http.StatusBadRequest))
|
|
||||||
s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, sterr)
|
|
||||||
} else {
|
|
||||||
OtherErrorHandler(w, r, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
components := strings.Split(path[1:], "/")
|
// TODO(v3): remove UnescapingModeLegacy
|
||||||
l := len(components)
|
if s.unescapingMode != UnescapingModeLegacy && r.URL.RawPath != "" {
|
||||||
var verb string
|
path = r.URL.RawPath
|
||||||
if idx := strings.LastIndex(components[l-1], ":"); idx == 0 {
|
|
||||||
if s.protoErrorHandler != nil {
|
|
||||||
_, outboundMarshaler := MarshalerForRequest(s, r)
|
|
||||||
s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, ErrUnknownURI)
|
|
||||||
} else {
|
|
||||||
OtherErrorHandler(w, r, http.StatusText(http.StatusNotFound), http.StatusNotFound)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
} else if idx > 0 {
|
|
||||||
c := components[l-1]
|
|
||||||
components[l-1], verb = c[:idx], c[idx+1:]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
components := strings.Split(path[1:], "/")
|
||||||
|
|
||||||
if override := r.Header.Get("X-HTTP-Method-Override"); override != "" && s.isPathLengthFallback(r) {
|
if override := r.Header.Get("X-HTTP-Method-Override"); override != "" && s.isPathLengthFallback(r) {
|
||||||
r.Method = strings.ToUpper(override)
|
r.Method = strings.ToUpper(override)
|
||||||
if err := r.ParseForm(); err != nil {
|
if err := r.ParseForm(); err != nil {
|
||||||
if s.protoErrorHandler != nil {
|
_, outboundMarshaler := MarshalerForRequest(s, r)
|
||||||
_, outboundMarshaler := MarshalerForRequest(s, r)
|
sterr := status.Error(codes.InvalidArgument, err.Error())
|
||||||
sterr := status.Error(codes.InvalidArgument, err.Error())
|
s.errorHandler(ctx, s, outboundMarshaler, w, r, sterr)
|
||||||
s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, sterr)
|
|
||||||
} else {
|
|
||||||
OtherErrorHandler(w, r, err.Error(), http.StatusBadRequest)
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Verb out here is to memoize for the fallback case below
|
||||||
|
var verb string
|
||||||
|
|
||||||
for _, h := range s.handlers[r.Method] {
|
for _, h := range s.handlers[r.Method] {
|
||||||
pathParams, err := h.pat.Match(components, verb)
|
// If the pattern has a verb, explicitly look for a suffix in the last
|
||||||
|
// component that matches a colon plus the verb. This allows us to
|
||||||
|
// handle some cases that otherwise can't be correctly handled by the
|
||||||
|
// former LastIndex case, such as when the verb literal itself contains
|
||||||
|
// a colon. This should work for all cases that have run through the
|
||||||
|
// parser because we know what verb we're looking for, however, there
|
||||||
|
// are still some cases that the parser itself cannot disambiguate. See
|
||||||
|
// the comment there if interested.
|
||||||
|
patVerb := h.pat.Verb()
|
||||||
|
l := len(components)
|
||||||
|
lastComponent := components[l-1]
|
||||||
|
var idx int = -1
|
||||||
|
if patVerb != "" && strings.HasSuffix(lastComponent, ":"+patVerb) {
|
||||||
|
idx = len(lastComponent) - len(patVerb) - 1
|
||||||
|
}
|
||||||
|
if idx == 0 {
|
||||||
|
_, outboundMarshaler := MarshalerForRequest(s, r)
|
||||||
|
s.routingErrorHandler(ctx, s, outboundMarshaler, w, r, http.StatusNotFound)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if idx > 0 {
|
||||||
|
components[l-1], verb = lastComponent[:idx], lastComponent[idx+1:]
|
||||||
|
}
|
||||||
|
|
||||||
|
pathParams, err := h.pat.MatchAndEscape(components, verb, s.unescapingMode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
var mse MalformedSequenceError
|
||||||
|
if ok := errors.As(err, &mse); ok {
|
||||||
|
_, outboundMarshaler := MarshalerForRequest(s, r)
|
||||||
|
s.errorHandler(ctx, s, outboundMarshaler, w, r, &HTTPStatusError{
|
||||||
|
HTTPStatus: http.StatusBadRequest,
|
||||||
|
Err: mse,
|
||||||
|
})
|
||||||
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
h.h(w, r, pathParams)
|
h.h(w, r, pathParams)
|
||||||
@ -242,47 +302,43 @@ func (s *ServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// lookup other methods to handle fallback from GET to POST and
|
// lookup other methods to handle fallback from GET to POST and
|
||||||
// to determine if it is MethodNotAllowed or NotFound.
|
// to determine if it is NotImplemented or NotFound.
|
||||||
for m, handlers := range s.handlers {
|
for m, handlers := range s.handlers {
|
||||||
if m == r.Method {
|
if m == r.Method {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
for _, h := range handlers {
|
for _, h := range handlers {
|
||||||
pathParams, err := h.pat.Match(components, verb)
|
pathParams, err := h.pat.MatchAndEscape(components, verb, s.unescapingMode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
var mse MalformedSequenceError
|
||||||
|
if ok := errors.As(err, &mse); ok {
|
||||||
|
_, outboundMarshaler := MarshalerForRequest(s, r)
|
||||||
|
s.errorHandler(ctx, s, outboundMarshaler, w, r, &HTTPStatusError{
|
||||||
|
HTTPStatus: http.StatusBadRequest,
|
||||||
|
Err: mse,
|
||||||
|
})
|
||||||
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// X-HTTP-Method-Override is optional. Always allow fallback to POST.
|
// X-HTTP-Method-Override is optional. Always allow fallback to POST.
|
||||||
if s.isPathLengthFallback(r) {
|
if s.isPathLengthFallback(r) {
|
||||||
if err := r.ParseForm(); err != nil {
|
if err := r.ParseForm(); err != nil {
|
||||||
if s.protoErrorHandler != nil {
|
_, outboundMarshaler := MarshalerForRequest(s, r)
|
||||||
_, outboundMarshaler := MarshalerForRequest(s, r)
|
sterr := status.Error(codes.InvalidArgument, err.Error())
|
||||||
sterr := status.Error(codes.InvalidArgument, err.Error())
|
s.errorHandler(ctx, s, outboundMarshaler, w, r, sterr)
|
||||||
s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, sterr)
|
|
||||||
} else {
|
|
||||||
OtherErrorHandler(w, r, err.Error(), http.StatusBadRequest)
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
h.h(w, r, pathParams)
|
h.h(w, r, pathParams)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if s.protoErrorHandler != nil {
|
_, outboundMarshaler := MarshalerForRequest(s, r)
|
||||||
_, outboundMarshaler := MarshalerForRequest(s, r)
|
s.routingErrorHandler(ctx, s, outboundMarshaler, w, r, http.StatusMethodNotAllowed)
|
||||||
s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, ErrUnknownURI)
|
|
||||||
} else {
|
|
||||||
OtherErrorHandler(w, r, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed)
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.protoErrorHandler != nil {
|
_, outboundMarshaler := MarshalerForRequest(s, r)
|
||||||
_, outboundMarshaler := MarshalerForRequest(s, r)
|
s.routingErrorHandler(ctx, s, outboundMarshaler, w, r, http.StatusNotFound)
|
||||||
s.protoErrorHandler(ctx, s, outboundMarshaler, w, r, ErrUnknownURI)
|
|
||||||
} else {
|
|
||||||
OtherErrorHandler(w, r, http.StatusText(http.StatusNotFound), http.StatusNotFound)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetForwardResponseOptions returns the ForwardResponseOptions associated with this ServeMux.
|
// GetForwardResponseOptions returns the ForwardResponseOptions associated with this ServeMux.
|
@ -3,9 +3,10 @@ package runtime
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/grpc-ecosystem/grpc-gateway/utilities"
|
"github.com/grpc-ecosystem/grpc-gateway/v2/utilities"
|
||||||
"google.golang.org/grpc/grpclog"
|
"google.golang.org/grpc/grpclog"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -14,14 +15,23 @@ var (
|
|||||||
ErrNotMatch = errors.New("not match to the path pattern")
|
ErrNotMatch = errors.New("not match to the path pattern")
|
||||||
// ErrInvalidPattern indicates that the given definition of Pattern is not valid.
|
// ErrInvalidPattern indicates that the given definition of Pattern is not valid.
|
||||||
ErrInvalidPattern = errors.New("invalid pattern")
|
ErrInvalidPattern = errors.New("invalid pattern")
|
||||||
|
// ErrMalformedSequence indicates that an escape sequence was malformed.
|
||||||
|
ErrMalformedSequence = errors.New("malformed escape sequence")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type MalformedSequenceError string
|
||||||
|
|
||||||
|
func (e MalformedSequenceError) Error() string {
|
||||||
|
return "malformed path escape " + strconv.Quote(string(e))
|
||||||
|
}
|
||||||
|
|
||||||
type op struct {
|
type op struct {
|
||||||
code utilities.OpCode
|
code utilities.OpCode
|
||||||
operand int
|
operand int
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pattern is a template pattern of http request paths defined in github.com/googleapis/googleapis/google/api/http.proto.
|
// Pattern is a template pattern of http request paths defined in
|
||||||
|
// https://github.com/googleapis/googleapis/blob/master/google/api/http.proto
|
||||||
type Pattern struct {
|
type Pattern struct {
|
||||||
// ops is a list of operations
|
// ops is a list of operations
|
||||||
ops []op
|
ops []op
|
||||||
@ -35,31 +45,14 @@ type Pattern struct {
|
|||||||
tailLen int
|
tailLen int
|
||||||
// verb is the VERB part of the path pattern. It is empty if the pattern does not have VERB part.
|
// verb is the VERB part of the path pattern. It is empty if the pattern does not have VERB part.
|
||||||
verb string
|
verb string
|
||||||
// assumeColonVerb indicates whether a path suffix after a final
|
|
||||||
// colon may only be interpreted as a verb.
|
|
||||||
assumeColonVerb bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type patternOptions struct {
|
|
||||||
assumeColonVerb bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// PatternOpt is an option for creating Patterns.
|
|
||||||
type PatternOpt func(*patternOptions)
|
|
||||||
|
|
||||||
// NewPattern returns a new Pattern from the given definition values.
|
// NewPattern returns a new Pattern from the given definition values.
|
||||||
// "ops" is a sequence of op codes. "pool" is a constant pool.
|
// "ops" is a sequence of op codes. "pool" is a constant pool.
|
||||||
// "verb" is the verb part of the pattern. It is empty if the pattern does not have the part.
|
// "verb" is the verb part of the pattern. It is empty if the pattern does not have the part.
|
||||||
// "version" must be 1 for now.
|
// "version" must be 1 for now.
|
||||||
// It returns an error if the given definition is invalid.
|
// It returns an error if the given definition is invalid.
|
||||||
func NewPattern(version int, ops []int, pool []string, verb string, opts ...PatternOpt) (Pattern, error) {
|
func NewPattern(version int, ops []int, pool []string, verb string) (Pattern, error) {
|
||||||
options := patternOptions{
|
|
||||||
assumeColonVerb: true,
|
|
||||||
}
|
|
||||||
for _, o := range opts {
|
|
||||||
o(&options)
|
|
||||||
}
|
|
||||||
|
|
||||||
if version != 1 {
|
if version != 1 {
|
||||||
grpclog.Infof("unsupported version: %d", version)
|
grpclog.Infof("unsupported version: %d", version)
|
||||||
return Pattern{}, ErrInvalidPattern
|
return Pattern{}, ErrInvalidPattern
|
||||||
@ -111,7 +104,7 @@ func NewPattern(version int, ops []int, pool []string, verb string, opts ...Patt
|
|||||||
}
|
}
|
||||||
stack -= op.operand
|
stack -= op.operand
|
||||||
if stack < 0 {
|
if stack < 0 {
|
||||||
grpclog.Print("stack underflow")
|
grpclog.Info("stack underflow")
|
||||||
return Pattern{}, ErrInvalidPattern
|
return Pattern{}, ErrInvalidPattern
|
||||||
}
|
}
|
||||||
stack++
|
stack++
|
||||||
@ -139,13 +132,12 @@ func NewPattern(version int, ops []int, pool []string, verb string, opts ...Patt
|
|||||||
typedOps = append(typedOps, op)
|
typedOps = append(typedOps, op)
|
||||||
}
|
}
|
||||||
return Pattern{
|
return Pattern{
|
||||||
ops: typedOps,
|
ops: typedOps,
|
||||||
pool: pool,
|
pool: pool,
|
||||||
vars: vars,
|
vars: vars,
|
||||||
stacksize: maxstack,
|
stacksize: maxstack,
|
||||||
tailLen: tailLen,
|
tailLen: tailLen,
|
||||||
verb: verb,
|
verb: verb,
|
||||||
assumeColonVerb: options.assumeColonVerb,
|
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,12 +149,13 @@ func MustPattern(p Pattern, err error) Pattern {
|
|||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
// Match examines components if it matches to the Pattern.
|
// MatchAndEscape examines components to determine if they match to a Pattern.
|
||||||
// If it matches, the function returns a mapping from field paths to their captured values.
|
// MatchAndEscape will return an error if no Patterns matched or if a pattern
|
||||||
// If otherwise, the function returns an error.
|
// matched but contained malformed escape sequences. If successful, the function
|
||||||
func (p Pattern) Match(components []string, verb string) (map[string]string, error) {
|
// returns a mapping from field paths to their captured values.
|
||||||
|
func (p Pattern) MatchAndEscape(components []string, verb string, unescapingMode UnescapingMode) (map[string]string, error) {
|
||||||
if p.verb != verb {
|
if p.verb != verb {
|
||||||
if p.assumeColonVerb || p.verb != "" {
|
if p.verb != "" {
|
||||||
return nil, ErrNotMatch
|
return nil, ErrNotMatch
|
||||||
}
|
}
|
||||||
if len(components) == 0 {
|
if len(components) == 0 {
|
||||||
@ -171,7 +164,6 @@ func (p Pattern) Match(components []string, verb string) (map[string]string, err
|
|||||||
components = append([]string{}, components...)
|
components = append([]string{}, components...)
|
||||||
components[len(components)-1] += ":" + verb
|
components[len(components)-1] += ":" + verb
|
||||||
}
|
}
|
||||||
verb = ""
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var pos int
|
var pos int
|
||||||
@ -179,6 +171,8 @@ func (p Pattern) Match(components []string, verb string) (map[string]string, err
|
|||||||
captured := make([]string, len(p.vars))
|
captured := make([]string, len(p.vars))
|
||||||
l := len(components)
|
l := len(components)
|
||||||
for _, op := range p.ops {
|
for _, op := range p.ops {
|
||||||
|
var err error
|
||||||
|
|
||||||
switch op.code {
|
switch op.code {
|
||||||
case utilities.OpNop:
|
case utilities.OpNop:
|
||||||
continue
|
continue
|
||||||
@ -191,6 +185,10 @@ func (p Pattern) Match(components []string, verb string) (map[string]string, err
|
|||||||
if lit := p.pool[op.operand]; c != lit {
|
if lit := p.pool[op.operand]; c != lit {
|
||||||
return nil, ErrNotMatch
|
return nil, ErrNotMatch
|
||||||
}
|
}
|
||||||
|
} else if op.code == utilities.OpPush {
|
||||||
|
if c, err = unescape(c, unescapingMode, false); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
stack = append(stack, c)
|
stack = append(stack, c)
|
||||||
pos++
|
pos++
|
||||||
@ -200,7 +198,11 @@ func (p Pattern) Match(components []string, verb string) (map[string]string, err
|
|||||||
return nil, ErrNotMatch
|
return nil, ErrNotMatch
|
||||||
}
|
}
|
||||||
end -= p.tailLen
|
end -= p.tailLen
|
||||||
stack = append(stack, strings.Join(components[pos:end], "/"))
|
c := strings.Join(components[pos:end], "/")
|
||||||
|
if c, err = unescape(c, unescapingMode, true); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
stack = append(stack, c)
|
||||||
pos = end
|
pos = end
|
||||||
case utilities.OpConcatN:
|
case utilities.OpConcatN:
|
||||||
n := op.operand
|
n := op.operand
|
||||||
@ -222,6 +224,16 @@ func (p Pattern) Match(components []string, verb string) (map[string]string, err
|
|||||||
return bindings, nil
|
return bindings, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MatchAndEscape examines components to determine if they match to a Pattern.
|
||||||
|
// It will never perform per-component unescaping (see: UnescapingModeLegacy).
|
||||||
|
// MatchAndEscape will return an error if no Patterns matched. If successful,
|
||||||
|
// the function returns a mapping from field paths to their captured values.
|
||||||
|
//
|
||||||
|
// Deprecated: Use MatchAndEscape.
|
||||||
|
func (p Pattern) Match(components []string, verb string) (map[string]string, error) {
|
||||||
|
return p.MatchAndEscape(components, verb, UnescapingModeDefault)
|
||||||
|
}
|
||||||
|
|
||||||
// Verb returns the verb part of the Pattern.
|
// Verb returns the verb part of the Pattern.
|
||||||
func (p Pattern) Verb() string { return p.verb }
|
func (p Pattern) Verb() string { return p.verb }
|
||||||
|
|
||||||
@ -253,10 +265,119 @@ func (p Pattern) String() string {
|
|||||||
return "/" + segs
|
return "/" + segs
|
||||||
}
|
}
|
||||||
|
|
||||||
// AssumeColonVerbOpt indicates whether a path suffix after a final
|
/*
|
||||||
// colon may only be interpreted as a verb.
|
* The following code is adopted and modified from Go's standard library
|
||||||
func AssumeColonVerbOpt(val bool) PatternOpt {
|
* and carries the attached license.
|
||||||
return PatternOpt(func(o *patternOptions) {
|
*
|
||||||
o.assumeColonVerb = val
|
* Copyright 2009 The Go Authors. All rights reserved.
|
||||||
})
|
* Use of this source code is governed by a BSD-style
|
||||||
|
* license that can be found in the LICENSE file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ishex returns whether or not the given byte is a valid hex character
|
||||||
|
func ishex(c byte) bool {
|
||||||
|
switch {
|
||||||
|
case '0' <= c && c <= '9':
|
||||||
|
return true
|
||||||
|
case 'a' <= c && c <= 'f':
|
||||||
|
return true
|
||||||
|
case 'A' <= c && c <= 'F':
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func isRFC6570Reserved(c byte) bool {
|
||||||
|
switch c {
|
||||||
|
case '!', '#', '$', '&', '\'', '(', ')', '*',
|
||||||
|
'+', ',', '/', ':', ';', '=', '?', '@', '[', ']':
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// unhex converts a hex point to the bit representation
|
||||||
|
func unhex(c byte) byte {
|
||||||
|
switch {
|
||||||
|
case '0' <= c && c <= '9':
|
||||||
|
return c - '0'
|
||||||
|
case 'a' <= c && c <= 'f':
|
||||||
|
return c - 'a' + 10
|
||||||
|
case 'A' <= c && c <= 'F':
|
||||||
|
return c - 'A' + 10
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// shouldUnescapeWithMode returns true if the character is escapable with the
|
||||||
|
// given mode
|
||||||
|
func shouldUnescapeWithMode(c byte, mode UnescapingMode) bool {
|
||||||
|
switch mode {
|
||||||
|
case UnescapingModeAllExceptReserved:
|
||||||
|
if isRFC6570Reserved(c) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
case UnescapingModeAllExceptSlash:
|
||||||
|
if c == '/' {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
case UnescapingModeAllCharacters:
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// unescape unescapes a path string using the provided mode
|
||||||
|
func unescape(s string, mode UnescapingMode, multisegment bool) (string, error) {
|
||||||
|
// TODO(v3): remove UnescapingModeLegacy
|
||||||
|
if mode == UnescapingModeLegacy {
|
||||||
|
return s, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if !multisegment {
|
||||||
|
mode = UnescapingModeAllCharacters
|
||||||
|
}
|
||||||
|
|
||||||
|
// Count %, check that they're well-formed.
|
||||||
|
n := 0
|
||||||
|
for i := 0; i < len(s); {
|
||||||
|
if s[i] == '%' {
|
||||||
|
n++
|
||||||
|
if i+2 >= len(s) || !ishex(s[i+1]) || !ishex(s[i+2]) {
|
||||||
|
s = s[i:]
|
||||||
|
if len(s) > 3 {
|
||||||
|
s = s[:3]
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", MalformedSequenceError(s)
|
||||||
|
}
|
||||||
|
i += 3
|
||||||
|
} else {
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if n == 0 {
|
||||||
|
return s, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var t strings.Builder
|
||||||
|
t.Grow(len(s))
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
switch s[i] {
|
||||||
|
case '%':
|
||||||
|
c := unhex(s[i+1])<<4 | unhex(s[i+2])
|
||||||
|
if shouldUnescapeWithMode(c, mode) {
|
||||||
|
t.WriteByte(c)
|
||||||
|
i += 2
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
fallthrough
|
||||||
|
default:
|
||||||
|
t.WriteByte(s[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return t.String(), nil
|
||||||
}
|
}
|
@ -1,7 +1,7 @@
|
|||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/golang/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
// StringP returns a pointer to a string whose pointee is same as the given string value.
|
// StringP returns a pointer to a string whose pointee is same as the given string value.
|
329
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/query.go
generated
vendored
Normal file
329
vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/query.go
generated
vendored
Normal file
@ -0,0 +1,329 @@
|
|||||||
|
package runtime
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/base64"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"net/url"
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/grpc-ecosystem/grpc-gateway/v2/utilities"
|
||||||
|
"google.golang.org/genproto/protobuf/field_mask"
|
||||||
|
"google.golang.org/grpc/grpclog"
|
||||||
|
"google.golang.org/protobuf/proto"
|
||||||
|
"google.golang.org/protobuf/reflect/protoreflect"
|
||||||
|
"google.golang.org/protobuf/reflect/protoregistry"
|
||||||
|
"google.golang.org/protobuf/types/known/durationpb"
|
||||||
|
"google.golang.org/protobuf/types/known/timestamppb"
|
||||||
|
"google.golang.org/protobuf/types/known/wrapperspb"
|
||||||
|
)
|
||||||
|
|
||||||
|
var valuesKeyRegexp = regexp.MustCompile(`^(.*)\[(.*)\]$`)
|
||||||
|
|
||||||
|
var currentQueryParser QueryParameterParser = &defaultQueryParser{}
|
||||||
|
|
||||||
|
// QueryParameterParser defines interface for all query parameter parsers
|
||||||
|
type QueryParameterParser interface {
|
||||||
|
Parse(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// PopulateQueryParameters parses query parameters
|
||||||
|
// into "msg" using current query parser
|
||||||
|
func PopulateQueryParameters(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error {
|
||||||
|
return currentQueryParser.Parse(msg, values, filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
type defaultQueryParser struct{}
|
||||||
|
|
||||||
|
// Parse populates "values" into "msg".
|
||||||
|
// A value is ignored if its key starts with one of the elements in "filter".
|
||||||
|
func (*defaultQueryParser) Parse(msg proto.Message, values url.Values, filter *utilities.DoubleArray) error {
|
||||||
|
for key, values := range values {
|
||||||
|
match := valuesKeyRegexp.FindStringSubmatch(key)
|
||||||
|
if len(match) == 3 {
|
||||||
|
key = match[1]
|
||||||
|
values = append([]string{match[2]}, values...)
|
||||||
|
}
|
||||||
|
fieldPath := strings.Split(key, ".")
|
||||||
|
if filter.HasCommonPrefix(fieldPath) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if err := populateFieldValueFromPath(msg.ProtoReflect(), fieldPath, values); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// PopulateFieldFromPath sets a value in a nested Protobuf structure.
|
||||||
|
func PopulateFieldFromPath(msg proto.Message, fieldPathString string, value string) error {
|
||||||
|
fieldPath := strings.Split(fieldPathString, ".")
|
||||||
|
return populateFieldValueFromPath(msg.ProtoReflect(), fieldPath, []string{value})
|
||||||
|
}
|
||||||
|
|
||||||
|
func populateFieldValueFromPath(msgValue protoreflect.Message, fieldPath []string, values []string) error {
|
||||||
|
if len(fieldPath) < 1 {
|
||||||
|
return errors.New("no field path")
|
||||||
|
}
|
||||||
|
if len(values) < 1 {
|
||||||
|
return errors.New("no value provided")
|
||||||
|
}
|
||||||
|
|
||||||
|
var fieldDescriptor protoreflect.FieldDescriptor
|
||||||
|
for i, fieldName := range fieldPath {
|
||||||
|
fields := msgValue.Descriptor().Fields()
|
||||||
|
|
||||||
|
// Get field by name
|
||||||
|
fieldDescriptor = fields.ByName(protoreflect.Name(fieldName))
|
||||||
|
if fieldDescriptor == nil {
|
||||||
|
fieldDescriptor = fields.ByJSONName(fieldName)
|
||||||
|
if fieldDescriptor == nil {
|
||||||
|
// We're not returning an error here because this could just be
|
||||||
|
// an extra query parameter that isn't part of the request.
|
||||||
|
grpclog.Infof("field not found in %q: %q", msgValue.Descriptor().FullName(), strings.Join(fieldPath, "."))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this is the last element, we're done
|
||||||
|
if i == len(fieldPath)-1 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only singular message fields are allowed
|
||||||
|
if fieldDescriptor.Message() == nil || fieldDescriptor.Cardinality() == protoreflect.Repeated {
|
||||||
|
return fmt.Errorf("invalid path: %q is not a message", fieldName)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the nested message
|
||||||
|
msgValue = msgValue.Mutable(fieldDescriptor).Message()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if oneof already set
|
||||||
|
if of := fieldDescriptor.ContainingOneof(); of != nil {
|
||||||
|
if f := msgValue.WhichOneof(of); f != nil {
|
||||||
|
return fmt.Errorf("field already set for oneof %q", of.FullName().Name())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case fieldDescriptor.IsList():
|
||||||
|
return populateRepeatedField(fieldDescriptor, msgValue.Mutable(fieldDescriptor).List(), values)
|
||||||
|
case fieldDescriptor.IsMap():
|
||||||
|
return populateMapField(fieldDescriptor, msgValue.Mutable(fieldDescriptor).Map(), values)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(values) > 1 {
|
||||||
|
return fmt.Errorf("too many values for field %q: %s", fieldDescriptor.FullName().Name(), strings.Join(values, ", "))
|
||||||
|
}
|
||||||
|
|
||||||
|
return populateField(fieldDescriptor, msgValue, values[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
func populateField(fieldDescriptor protoreflect.FieldDescriptor, msgValue protoreflect.Message, value string) error {
|
||||||
|
v, err := parseField(fieldDescriptor, value)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("parsing field %q: %w", fieldDescriptor.FullName().Name(), err)
|
||||||
|
}
|
||||||
|
|
||||||
|
msgValue.Set(fieldDescriptor, v)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func populateRepeatedField(fieldDescriptor protoreflect.FieldDescriptor, list protoreflect.List, values []string) error {
|
||||||
|
for _, value := range values {
|
||||||
|
v, err := parseField(fieldDescriptor, value)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("parsing list %q: %w", fieldDescriptor.FullName().Name(), err)
|
||||||
|
}
|
||||||
|
list.Append(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func populateMapField(fieldDescriptor protoreflect.FieldDescriptor, mp protoreflect.Map, values []string) error {
|
||||||
|
if len(values) != 2 {
|
||||||
|
return fmt.Errorf("more than one value provided for key %q in map %q", values[0], fieldDescriptor.FullName())
|
||||||
|
}
|
||||||
|
|
||||||
|
key, err := parseField(fieldDescriptor.MapKey(), values[0])
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("parsing map key %q: %w", fieldDescriptor.FullName().Name(), err)
|
||||||
|
}
|
||||||
|
|
||||||
|
value, err := parseField(fieldDescriptor.MapValue(), values[1])
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("parsing map value %q: %w", fieldDescriptor.FullName().Name(), err)
|
||||||
|
}
|
||||||
|
|
||||||
|
mp.Set(key.MapKey(), value)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseField(fieldDescriptor protoreflect.FieldDescriptor, value string) (protoreflect.Value, error) {
|
||||||
|
switch fieldDescriptor.Kind() {
|
||||||
|
case protoreflect.BoolKind:
|
||||||
|
v, err := strconv.ParseBool(value)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, err
|
||||||
|
}
|
||||||
|
return protoreflect.ValueOfBool(v), nil
|
||||||
|
case protoreflect.EnumKind:
|
||||||
|
enum, err := protoregistry.GlobalTypes.FindEnumByName(fieldDescriptor.Enum().FullName())
|
||||||
|
switch {
|
||||||
|
case errors.Is(err, protoregistry.NotFound):
|
||||||
|
return protoreflect.Value{}, fmt.Errorf("enum %q is not registered", fieldDescriptor.Enum().FullName())
|
||||||
|
case err != nil:
|
||||||
|
return protoreflect.Value{}, fmt.Errorf("failed to look up enum: %w", err)
|
||||||
|
}
|
||||||
|
// Look for enum by name
|
||||||
|
v := enum.Descriptor().Values().ByName(protoreflect.Name(value))
|
||||||
|
if v == nil {
|
||||||
|
i, err := strconv.Atoi(value)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, fmt.Errorf("%q is not a valid value", value)
|
||||||
|
}
|
||||||
|
// Look for enum by number
|
||||||
|
v = enum.Descriptor().Values().ByNumber(protoreflect.EnumNumber(i))
|
||||||
|
if v == nil {
|
||||||
|
return protoreflect.Value{}, fmt.Errorf("%q is not a valid value", value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return protoreflect.ValueOfEnum(v.Number()), nil
|
||||||
|
case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind:
|
||||||
|
v, err := strconv.ParseInt(value, 10, 32)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, err
|
||||||
|
}
|
||||||
|
return protoreflect.ValueOfInt32(int32(v)), nil
|
||||||
|
case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind:
|
||||||
|
v, err := strconv.ParseInt(value, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, err
|
||||||
|
}
|
||||||
|
return protoreflect.ValueOfInt64(v), nil
|
||||||
|
case protoreflect.Uint32Kind, protoreflect.Fixed32Kind:
|
||||||
|
v, err := strconv.ParseUint(value, 10, 32)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, err
|
||||||
|
}
|
||||||
|
return protoreflect.ValueOfUint32(uint32(v)), nil
|
||||||
|
case protoreflect.Uint64Kind, protoreflect.Fixed64Kind:
|
||||||
|
v, err := strconv.ParseUint(value, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, err
|
||||||
|
}
|
||||||
|
return protoreflect.ValueOfUint64(v), nil
|
||||||
|
case protoreflect.FloatKind:
|
||||||
|
v, err := strconv.ParseFloat(value, 32)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, err
|
||||||
|
}
|
||||||
|
return protoreflect.ValueOfFloat32(float32(v)), nil
|
||||||
|
case protoreflect.DoubleKind:
|
||||||
|
v, err := strconv.ParseFloat(value, 64)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, err
|
||||||
|
}
|
||||||
|
return protoreflect.ValueOfFloat64(v), nil
|
||||||
|
case protoreflect.StringKind:
|
||||||
|
return protoreflect.ValueOfString(value), nil
|
||||||
|
case protoreflect.BytesKind:
|
||||||
|
v, err := base64.URLEncoding.DecodeString(value)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, err
|
||||||
|
}
|
||||||
|
return protoreflect.ValueOfBytes(v), nil
|
||||||
|
case protoreflect.MessageKind, protoreflect.GroupKind:
|
||||||
|
return parseMessage(fieldDescriptor.Message(), value)
|
||||||
|
default:
|
||||||
|
panic(fmt.Sprintf("unknown field kind: %v", fieldDescriptor.Kind()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseMessage(msgDescriptor protoreflect.MessageDescriptor, value string) (protoreflect.Value, error) {
|
||||||
|
var msg proto.Message
|
||||||
|
switch msgDescriptor.FullName() {
|
||||||
|
case "google.protobuf.Timestamp":
|
||||||
|
if value == "null" {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
t, err := time.Parse(time.RFC3339Nano, value)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, err
|
||||||
|
}
|
||||||
|
msg = timestamppb.New(t)
|
||||||
|
case "google.protobuf.Duration":
|
||||||
|
if value == "null" {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
d, err := time.ParseDuration(value)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, err
|
||||||
|
}
|
||||||
|
msg = durationpb.New(d)
|
||||||
|
case "google.protobuf.DoubleValue":
|
||||||
|
v, err := strconv.ParseFloat(value, 64)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, err
|
||||||
|
}
|
||||||
|
msg = &wrapperspb.DoubleValue{Value: v}
|
||||||
|
case "google.protobuf.FloatValue":
|
||||||
|
v, err := strconv.ParseFloat(value, 32)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, err
|
||||||
|
}
|
||||||
|
msg = &wrapperspb.FloatValue{Value: float32(v)}
|
||||||
|
case "google.protobuf.Int64Value":
|
||||||
|
v, err := strconv.ParseInt(value, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, err
|
||||||
|
}
|
||||||
|
msg = &wrapperspb.Int64Value{Value: v}
|
||||||
|
case "google.protobuf.Int32Value":
|
||||||
|
v, err := strconv.ParseInt(value, 10, 32)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, err
|
||||||
|
}
|
||||||
|
msg = &wrapperspb.Int32Value{Value: int32(v)}
|
||||||
|
case "google.protobuf.UInt64Value":
|
||||||
|
v, err := strconv.ParseUint(value, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, err
|
||||||
|
}
|
||||||
|
msg = &wrapperspb.UInt64Value{Value: v}
|
||||||
|
case "google.protobuf.UInt32Value":
|
||||||
|
v, err := strconv.ParseUint(value, 10, 32)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, err
|
||||||
|
}
|
||||||
|
msg = &wrapperspb.UInt32Value{Value: uint32(v)}
|
||||||
|
case "google.protobuf.BoolValue":
|
||||||
|
v, err := strconv.ParseBool(value)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, err
|
||||||
|
}
|
||||||
|
msg = &wrapperspb.BoolValue{Value: v}
|
||||||
|
case "google.protobuf.StringValue":
|
||||||
|
msg = &wrapperspb.StringValue{Value: value}
|
||||||
|
case "google.protobuf.BytesValue":
|
||||||
|
v, err := base64.URLEncoding.DecodeString(value)
|
||||||
|
if err != nil {
|
||||||
|
return protoreflect.Value{}, err
|
||||||
|
}
|
||||||
|
msg = &wrapperspb.BytesValue{Value: v}
|
||||||
|
case "google.protobuf.FieldMask":
|
||||||
|
fm := &field_mask.FieldMask{}
|
||||||
|
fm.Paths = append(fm.Paths, strings.Split(value, ",")...)
|
||||||
|
msg = fm
|
||||||
|
default:
|
||||||
|
return protoreflect.Value{}, fmt.Errorf("unsupported message type: %q", string(msgDescriptor.FullName()))
|
||||||
|
}
|
||||||
|
|
||||||
|
return protoreflect.ValueOfMessage(msg.ProtoReflect()), nil
|
||||||
|
}
|
@ -3,19 +3,25 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
|
|||||||
package(default_visibility = ["//visibility:public"])
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
go_library(
|
go_library(
|
||||||
name = "go_default_library",
|
name = "utilities",
|
||||||
srcs = [
|
srcs = [
|
||||||
"doc.go",
|
"doc.go",
|
||||||
"pattern.go",
|
"pattern.go",
|
||||||
"readerfactory.go",
|
"readerfactory.go",
|
||||||
"trie.go",
|
"trie.go",
|
||||||
],
|
],
|
||||||
importpath = "github.com/grpc-ecosystem/grpc-gateway/utilities",
|
importpath = "github.com/grpc-ecosystem/grpc-gateway/v2/utilities",
|
||||||
)
|
)
|
||||||
|
|
||||||
go_test(
|
go_test(
|
||||||
name = "go_default_test",
|
name = "utilities_test",
|
||||||
size = "small",
|
size = "small",
|
||||||
srcs = ["trie_test.go"],
|
srcs = ["trie_test.go"],
|
||||||
embed = [":go_default_library"],
|
deps = [":utilities"],
|
||||||
|
)
|
||||||
|
|
||||||
|
alias(
|
||||||
|
name = "go_default_library",
|
||||||
|
actual = ":utilities",
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
)
|
)
|
@ -145,10 +145,7 @@ func (l byLex) Less(i, j int) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if k < len(sj) {
|
return k < len(sj)
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// HasCommonPrefix determines if any sequence in the DoubleArray is a prefix of the given sequence.
|
// HasCommonPrefix determines if any sequence in the DoubleArray is a prefix of the given sequence.
|
54
vendor/github.com/stretchr/testify/assert/assertion_compare.go
generated
vendored
54
vendor/github.com/stretchr/testify/assert/assertion_compare.go
generated
vendored
@ -3,6 +3,7 @@ package assert
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type CompareType int
|
type CompareType int
|
||||||
@ -30,6 +31,8 @@ var (
|
|||||||
float64Type = reflect.TypeOf(float64(1))
|
float64Type = reflect.TypeOf(float64(1))
|
||||||
|
|
||||||
stringType = reflect.TypeOf("")
|
stringType = reflect.TypeOf("")
|
||||||
|
|
||||||
|
timeType = reflect.TypeOf(time.Time{})
|
||||||
)
|
)
|
||||||
|
|
||||||
func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {
|
func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {
|
||||||
@ -299,6 +302,27 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {
|
|||||||
return compareLess, true
|
return compareLess, true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Check for known struct types we can check for compare results.
|
||||||
|
case reflect.Struct:
|
||||||
|
{
|
||||||
|
// All structs enter here. We're not interested in most types.
|
||||||
|
if !canConvert(obj1Value, timeType) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
// time.Time can compared!
|
||||||
|
timeObj1, ok := obj1.(time.Time)
|
||||||
|
if !ok {
|
||||||
|
timeObj1 = obj1Value.Convert(timeType).Interface().(time.Time)
|
||||||
|
}
|
||||||
|
|
||||||
|
timeObj2, ok := obj2.(time.Time)
|
||||||
|
if !ok {
|
||||||
|
timeObj2 = obj2Value.Convert(timeType).Interface().(time.Time)
|
||||||
|
}
|
||||||
|
|
||||||
|
return compare(timeObj1.UnixNano(), timeObj2.UnixNano(), reflect.Int64)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return compareEqual, false
|
return compareEqual, false
|
||||||
@ -310,7 +334,10 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {
|
|||||||
// assert.Greater(t, float64(2), float64(1))
|
// assert.Greater(t, float64(2), float64(1))
|
||||||
// assert.Greater(t, "b", "a")
|
// assert.Greater(t, "b", "a")
|
||||||
func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {
|
func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return compareTwoValues(t, e1, e2, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs)
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
return compareTwoValues(t, e1, e2, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GreaterOrEqual asserts that the first element is greater than or equal to the second
|
// GreaterOrEqual asserts that the first element is greater than or equal to the second
|
||||||
@ -320,7 +347,10 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface
|
|||||||
// assert.GreaterOrEqual(t, "b", "a")
|
// assert.GreaterOrEqual(t, "b", "a")
|
||||||
// assert.GreaterOrEqual(t, "b", "b")
|
// assert.GreaterOrEqual(t, "b", "b")
|
||||||
func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {
|
func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return compareTwoValues(t, e1, e2, []CompareType{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs)
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
return compareTwoValues(t, e1, e2, []CompareType{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Less asserts that the first element is less than the second
|
// Less asserts that the first element is less than the second
|
||||||
@ -329,7 +359,10 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in
|
|||||||
// assert.Less(t, float64(1), float64(2))
|
// assert.Less(t, float64(1), float64(2))
|
||||||
// assert.Less(t, "a", "b")
|
// assert.Less(t, "a", "b")
|
||||||
func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {
|
func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return compareTwoValues(t, e1, e2, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs)
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
return compareTwoValues(t, e1, e2, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// LessOrEqual asserts that the first element is less than or equal to the second
|
// LessOrEqual asserts that the first element is less than or equal to the second
|
||||||
@ -339,7 +372,10 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{})
|
|||||||
// assert.LessOrEqual(t, "a", "b")
|
// assert.LessOrEqual(t, "a", "b")
|
||||||
// assert.LessOrEqual(t, "b", "b")
|
// assert.LessOrEqual(t, "b", "b")
|
||||||
func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {
|
func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return compareTwoValues(t, e1, e2, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs)
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
return compareTwoValues(t, e1, e2, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Positive asserts that the specified element is positive
|
// Positive asserts that the specified element is positive
|
||||||
@ -347,8 +383,11 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter
|
|||||||
// assert.Positive(t, 1)
|
// assert.Positive(t, 1)
|
||||||
// assert.Positive(t, 1.23)
|
// assert.Positive(t, 1.23)
|
||||||
func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {
|
func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
zero := reflect.Zero(reflect.TypeOf(e))
|
zero := reflect.Zero(reflect.TypeOf(e))
|
||||||
return compareTwoValues(t, e, zero.Interface(), []CompareType{compareGreater}, "\"%v\" is not positive", msgAndArgs)
|
return compareTwoValues(t, e, zero.Interface(), []CompareType{compareGreater}, "\"%v\" is not positive", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Negative asserts that the specified element is negative
|
// Negative asserts that the specified element is negative
|
||||||
@ -356,8 +395,11 @@ func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {
|
|||||||
// assert.Negative(t, -1)
|
// assert.Negative(t, -1)
|
||||||
// assert.Negative(t, -1.23)
|
// assert.Negative(t, -1.23)
|
||||||
func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {
|
func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
zero := reflect.Zero(reflect.TypeOf(e))
|
zero := reflect.Zero(reflect.TypeOf(e))
|
||||||
return compareTwoValues(t, e, zero.Interface(), []CompareType{compareLess}, "\"%v\" is not negative", msgAndArgs)
|
return compareTwoValues(t, e, zero.Interface(), []CompareType{compareLess}, "\"%v\" is not negative", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool {
|
func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool {
|
||||||
|
16
vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go
generated
vendored
Normal file
16
vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go
generated
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
//go:build go1.17
|
||||||
|
// +build go1.17
|
||||||
|
|
||||||
|
// TODO: once support for Go 1.16 is dropped, this file can be
|
||||||
|
// merged/removed with assertion_compare_go1.17_test.go and
|
||||||
|
// assertion_compare_legacy.go
|
||||||
|
|
||||||
|
package assert
|
||||||
|
|
||||||
|
import "reflect"
|
||||||
|
|
||||||
|
// Wrapper around reflect.Value.CanConvert, for compatability
|
||||||
|
// reasons.
|
||||||
|
func canConvert(value reflect.Value, to reflect.Type) bool {
|
||||||
|
return value.CanConvert(to)
|
||||||
|
}
|
16
vendor/github.com/stretchr/testify/assert/assertion_compare_legacy.go
generated
vendored
Normal file
16
vendor/github.com/stretchr/testify/assert/assertion_compare_legacy.go
generated
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
//go:build !go1.17
|
||||||
|
// +build !go1.17
|
||||||
|
|
||||||
|
// TODO: once support for Go 1.16 is dropped, this file can be
|
||||||
|
// merged/removed with assertion_compare_go1.17_test.go and
|
||||||
|
// assertion_compare_can_convert.go
|
||||||
|
|
||||||
|
package assert
|
||||||
|
|
||||||
|
import "reflect"
|
||||||
|
|
||||||
|
// Older versions of Go does not have the reflect.Value.CanConvert
|
||||||
|
// method.
|
||||||
|
func canConvert(value reflect.Value, to reflect.Type) bool {
|
||||||
|
return false
|
||||||
|
}
|
12
vendor/github.com/stretchr/testify/assert/assertion_format.go
generated
vendored
12
vendor/github.com/stretchr/testify/assert/assertion_format.go
generated
vendored
@ -123,6 +123,18 @@ func ErrorAsf(t TestingT, err error, target interface{}, msg string, args ...int
|
|||||||
return ErrorAs(t, err, target, append([]interface{}{msg}, args...)...)
|
return ErrorAs(t, err, target, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ErrorContainsf asserts that a function returned an error (i.e. not `nil`)
|
||||||
|
// and that the error contains the specified substring.
|
||||||
|
//
|
||||||
|
// actualObj, err := SomeFunction()
|
||||||
|
// assert.ErrorContainsf(t, err, expectedErrorSubString, "error message %s", "formatted")
|
||||||
|
func ErrorContainsf(t TestingT, theError error, contains string, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
return ErrorContains(t, theError, contains, append([]interface{}{msg}, args...)...)
|
||||||
|
}
|
||||||
|
|
||||||
// ErrorIsf asserts that at least one of the errors in err's chain matches target.
|
// ErrorIsf asserts that at least one of the errors in err's chain matches target.
|
||||||
// This is a wrapper for errors.Is.
|
// This is a wrapper for errors.Is.
|
||||||
func ErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) bool {
|
func ErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) bool {
|
||||||
|
24
vendor/github.com/stretchr/testify/assert/assertion_forward.go
generated
vendored
24
vendor/github.com/stretchr/testify/assert/assertion_forward.go
generated
vendored
@ -222,6 +222,30 @@ func (a *Assertions) ErrorAsf(err error, target interface{}, msg string, args ..
|
|||||||
return ErrorAsf(a.t, err, target, msg, args...)
|
return ErrorAsf(a.t, err, target, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ErrorContains asserts that a function returned an error (i.e. not `nil`)
|
||||||
|
// and that the error contains the specified substring.
|
||||||
|
//
|
||||||
|
// actualObj, err := SomeFunction()
|
||||||
|
// a.ErrorContains(err, expectedErrorSubString)
|
||||||
|
func (a *Assertions) ErrorContains(theError error, contains string, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
return ErrorContains(a.t, theError, contains, msgAndArgs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ErrorContainsf asserts that a function returned an error (i.e. not `nil`)
|
||||||
|
// and that the error contains the specified substring.
|
||||||
|
//
|
||||||
|
// actualObj, err := SomeFunction()
|
||||||
|
// a.ErrorContainsf(err, expectedErrorSubString, "error message %s", "formatted")
|
||||||
|
func (a *Assertions) ErrorContainsf(theError error, contains string, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
return ErrorContainsf(a.t, theError, contains, msg, args...)
|
||||||
|
}
|
||||||
|
|
||||||
// ErrorIs asserts that at least one of the errors in err's chain matches target.
|
// ErrorIs asserts that at least one of the errors in err's chain matches target.
|
||||||
// This is a wrapper for errors.Is.
|
// This is a wrapper for errors.Is.
|
||||||
func (a *Assertions) ErrorIs(err error, target error, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) ErrorIs(err error, target error, msgAndArgs ...interface{}) bool {
|
||||||
|
8
vendor/github.com/stretchr/testify/assert/assertion_order.go
generated
vendored
8
vendor/github.com/stretchr/testify/assert/assertion_order.go
generated
vendored
@ -50,7 +50,7 @@ func isOrdered(t TestingT, object interface{}, allowedComparesResults []CompareT
|
|||||||
// assert.IsIncreasing(t, []float{1, 2})
|
// assert.IsIncreasing(t, []float{1, 2})
|
||||||
// assert.IsIncreasing(t, []string{"a", "b"})
|
// assert.IsIncreasing(t, []string{"a", "b"})
|
||||||
func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return isOrdered(t, object, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs)
|
return isOrdered(t, object, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsNonIncreasing asserts that the collection is not increasing
|
// IsNonIncreasing asserts that the collection is not increasing
|
||||||
@ -59,7 +59,7 @@ func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) boo
|
|||||||
// assert.IsNonIncreasing(t, []float{2, 1})
|
// assert.IsNonIncreasing(t, []float{2, 1})
|
||||||
// assert.IsNonIncreasing(t, []string{"b", "a"})
|
// assert.IsNonIncreasing(t, []string{"b", "a"})
|
||||||
func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return isOrdered(t, object, []CompareType{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs)
|
return isOrdered(t, object, []CompareType{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsDecreasing asserts that the collection is decreasing
|
// IsDecreasing asserts that the collection is decreasing
|
||||||
@ -68,7 +68,7 @@ func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{})
|
|||||||
// assert.IsDecreasing(t, []float{2, 1})
|
// assert.IsDecreasing(t, []float{2, 1})
|
||||||
// assert.IsDecreasing(t, []string{"b", "a"})
|
// assert.IsDecreasing(t, []string{"b", "a"})
|
||||||
func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return isOrdered(t, object, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs)
|
return isOrdered(t, object, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsNonDecreasing asserts that the collection is not decreasing
|
// IsNonDecreasing asserts that the collection is not decreasing
|
||||||
@ -77,5 +77,5 @@ func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) boo
|
|||||||
// assert.IsNonDecreasing(t, []float{1, 2})
|
// assert.IsNonDecreasing(t, []float{1, 2})
|
||||||
// assert.IsNonDecreasing(t, []string{"a", "b"})
|
// assert.IsNonDecreasing(t, []string{"a", "b"})
|
||||||
func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return isOrdered(t, object, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs)
|
return isOrdered(t, object, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
112
vendor/github.com/stretchr/testify/assert/assertions.go
generated
vendored
112
vendor/github.com/stretchr/testify/assert/assertions.go
generated
vendored
@ -718,10 +718,14 @@ func NotEqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...inte
|
|||||||
// return (false, false) if impossible.
|
// return (false, false) if impossible.
|
||||||
// return (true, false) if element was not found.
|
// return (true, false) if element was not found.
|
||||||
// return (true, true) if element was found.
|
// return (true, true) if element was found.
|
||||||
func includeElement(list interface{}, element interface{}) (ok, found bool) {
|
func containsElement(list interface{}, element interface{}) (ok, found bool) {
|
||||||
|
|
||||||
listValue := reflect.ValueOf(list)
|
listValue := reflect.ValueOf(list)
|
||||||
listKind := reflect.TypeOf(list).Kind()
|
listType := reflect.TypeOf(list)
|
||||||
|
if listType == nil {
|
||||||
|
return false, false
|
||||||
|
}
|
||||||
|
listKind := listType.Kind()
|
||||||
defer func() {
|
defer func() {
|
||||||
if e := recover(); e != nil {
|
if e := recover(); e != nil {
|
||||||
ok = false
|
ok = false
|
||||||
@ -764,7 +768,7 @@ func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bo
|
|||||||
h.Helper()
|
h.Helper()
|
||||||
}
|
}
|
||||||
|
|
||||||
ok, found := includeElement(s, contains)
|
ok, found := containsElement(s, contains)
|
||||||
if !ok {
|
if !ok {
|
||||||
return Fail(t, fmt.Sprintf("%#v could not be applied builtin len()", s), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("%#v could not be applied builtin len()", s), msgAndArgs...)
|
||||||
}
|
}
|
||||||
@ -787,7 +791,7 @@ func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{})
|
|||||||
h.Helper()
|
h.Helper()
|
||||||
}
|
}
|
||||||
|
|
||||||
ok, found := includeElement(s, contains)
|
ok, found := containsElement(s, contains)
|
||||||
if !ok {
|
if !ok {
|
||||||
return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...)
|
||||||
}
|
}
|
||||||
@ -831,7 +835,7 @@ func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok
|
|||||||
|
|
||||||
for i := 0; i < subsetValue.Len(); i++ {
|
for i := 0; i < subsetValue.Len(); i++ {
|
||||||
element := subsetValue.Index(i).Interface()
|
element := subsetValue.Index(i).Interface()
|
||||||
ok, found := includeElement(list, element)
|
ok, found := containsElement(list, element)
|
||||||
if !ok {
|
if !ok {
|
||||||
return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...)
|
||||||
}
|
}
|
||||||
@ -852,7 +856,7 @@ func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{})
|
|||||||
h.Helper()
|
h.Helper()
|
||||||
}
|
}
|
||||||
if subset == nil {
|
if subset == nil {
|
||||||
return Fail(t, fmt.Sprintf("nil is the empty set which is a subset of every set"), msgAndArgs...)
|
return Fail(t, "nil is the empty set which is a subset of every set", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
subsetValue := reflect.ValueOf(subset)
|
subsetValue := reflect.ValueOf(subset)
|
||||||
@ -875,7 +879,7 @@ func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{})
|
|||||||
|
|
||||||
for i := 0; i < subsetValue.Len(); i++ {
|
for i := 0; i < subsetValue.Len(); i++ {
|
||||||
element := subsetValue.Index(i).Interface()
|
element := subsetValue.Index(i).Interface()
|
||||||
ok, found := includeElement(list, element)
|
ok, found := containsElement(list, element)
|
||||||
if !ok {
|
if !ok {
|
||||||
return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...)
|
||||||
}
|
}
|
||||||
@ -1000,27 +1004,21 @@ func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool {
|
|||||||
type PanicTestFunc func()
|
type PanicTestFunc func()
|
||||||
|
|
||||||
// didPanic returns true if the function passed to it panics. Otherwise, it returns false.
|
// didPanic returns true if the function passed to it panics. Otherwise, it returns false.
|
||||||
func didPanic(f PanicTestFunc) (bool, interface{}, string) {
|
func didPanic(f PanicTestFunc) (didPanic bool, message interface{}, stack string) {
|
||||||
|
didPanic = true
|
||||||
didPanic := false
|
|
||||||
var message interface{}
|
|
||||||
var stack string
|
|
||||||
func() {
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
if message = recover(); message != nil {
|
|
||||||
didPanic = true
|
|
||||||
stack = string(debug.Stack())
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
// call the target function
|
|
||||||
f()
|
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
message = recover()
|
||||||
|
if didPanic {
|
||||||
|
stack = string(debug.Stack())
|
||||||
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
return didPanic, message, stack
|
// call the target function
|
||||||
|
f()
|
||||||
|
didPanic = false
|
||||||
|
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Panics asserts that the code inside the specified PanicTestFunc panics.
|
// Panics asserts that the code inside the specified PanicTestFunc panics.
|
||||||
@ -1161,11 +1159,15 @@ func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs
|
|||||||
bf, bok := toFloat(actual)
|
bf, bok := toFloat(actual)
|
||||||
|
|
||||||
if !aok || !bok {
|
if !aok || !bok {
|
||||||
return Fail(t, fmt.Sprintf("Parameters must be numerical"), msgAndArgs...)
|
return Fail(t, "Parameters must be numerical", msgAndArgs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
if math.IsNaN(af) && math.IsNaN(bf) {
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
if math.IsNaN(af) {
|
if math.IsNaN(af) {
|
||||||
return Fail(t, fmt.Sprintf("Expected must not be NaN"), msgAndArgs...)
|
return Fail(t, "Expected must not be NaN", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
if math.IsNaN(bf) {
|
if math.IsNaN(bf) {
|
||||||
@ -1188,7 +1190,7 @@ func InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAn
|
|||||||
if expected == nil || actual == nil ||
|
if expected == nil || actual == nil ||
|
||||||
reflect.TypeOf(actual).Kind() != reflect.Slice ||
|
reflect.TypeOf(actual).Kind() != reflect.Slice ||
|
||||||
reflect.TypeOf(expected).Kind() != reflect.Slice {
|
reflect.TypeOf(expected).Kind() != reflect.Slice {
|
||||||
return Fail(t, fmt.Sprintf("Parameters must be slice"), msgAndArgs...)
|
return Fail(t, "Parameters must be slice", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
actualSlice := reflect.ValueOf(actual)
|
actualSlice := reflect.ValueOf(actual)
|
||||||
@ -1250,8 +1252,12 @@ func InDeltaMapValues(t TestingT, expected, actual interface{}, delta float64, m
|
|||||||
|
|
||||||
func calcRelativeError(expected, actual interface{}) (float64, error) {
|
func calcRelativeError(expected, actual interface{}) (float64, error) {
|
||||||
af, aok := toFloat(expected)
|
af, aok := toFloat(expected)
|
||||||
if !aok {
|
bf, bok := toFloat(actual)
|
||||||
return 0, fmt.Errorf("expected value %q cannot be converted to float", expected)
|
if !aok || !bok {
|
||||||
|
return 0, fmt.Errorf("Parameters must be numerical")
|
||||||
|
}
|
||||||
|
if math.IsNaN(af) && math.IsNaN(bf) {
|
||||||
|
return 0, nil
|
||||||
}
|
}
|
||||||
if math.IsNaN(af) {
|
if math.IsNaN(af) {
|
||||||
return 0, errors.New("expected value must not be NaN")
|
return 0, errors.New("expected value must not be NaN")
|
||||||
@ -1259,10 +1265,6 @@ func calcRelativeError(expected, actual interface{}) (float64, error) {
|
|||||||
if af == 0 {
|
if af == 0 {
|
||||||
return 0, fmt.Errorf("expected value must have a value other than zero to calculate the relative error")
|
return 0, fmt.Errorf("expected value must have a value other than zero to calculate the relative error")
|
||||||
}
|
}
|
||||||
bf, bok := toFloat(actual)
|
|
||||||
if !bok {
|
|
||||||
return 0, fmt.Errorf("actual value %q cannot be converted to float", actual)
|
|
||||||
}
|
|
||||||
if math.IsNaN(bf) {
|
if math.IsNaN(bf) {
|
||||||
return 0, errors.New("actual value must not be NaN")
|
return 0, errors.New("actual value must not be NaN")
|
||||||
}
|
}
|
||||||
@ -1298,7 +1300,7 @@ func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, m
|
|||||||
if expected == nil || actual == nil ||
|
if expected == nil || actual == nil ||
|
||||||
reflect.TypeOf(actual).Kind() != reflect.Slice ||
|
reflect.TypeOf(actual).Kind() != reflect.Slice ||
|
||||||
reflect.TypeOf(expected).Kind() != reflect.Slice {
|
reflect.TypeOf(expected).Kind() != reflect.Slice {
|
||||||
return Fail(t, fmt.Sprintf("Parameters must be slice"), msgAndArgs...)
|
return Fail(t, "Parameters must be slice", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
actualSlice := reflect.ValueOf(actual)
|
actualSlice := reflect.ValueOf(actual)
|
||||||
@ -1375,6 +1377,27 @@ func EqualError(t TestingT, theError error, errString string, msgAndArgs ...inte
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ErrorContains asserts that a function returned an error (i.e. not `nil`)
|
||||||
|
// and that the error contains the specified substring.
|
||||||
|
//
|
||||||
|
// actualObj, err := SomeFunction()
|
||||||
|
// assert.ErrorContains(t, err, expectedErrorSubString)
|
||||||
|
func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
if !Error(t, theError, msgAndArgs...) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
actual := theError.Error()
|
||||||
|
if !strings.Contains(actual, contains) {
|
||||||
|
return Fail(t, fmt.Sprintf("Error %#v does not contain %#v", actual, contains), msgAndArgs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
// matchRegexp return true if a specified regexp matches a string.
|
// matchRegexp return true if a specified regexp matches a string.
|
||||||
func matchRegexp(rx interface{}, str interface{}) bool {
|
func matchRegexp(rx interface{}, str interface{}) bool {
|
||||||
|
|
||||||
@ -1588,12 +1611,17 @@ func diff(expected interface{}, actual interface{}) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var e, a string
|
var e, a string
|
||||||
if et != reflect.TypeOf("") {
|
|
||||||
e = spewConfig.Sdump(expected)
|
switch et {
|
||||||
a = spewConfig.Sdump(actual)
|
case reflect.TypeOf(""):
|
||||||
} else {
|
|
||||||
e = reflect.ValueOf(expected).String()
|
e = reflect.ValueOf(expected).String()
|
||||||
a = reflect.ValueOf(actual).String()
|
a = reflect.ValueOf(actual).String()
|
||||||
|
case reflect.TypeOf(time.Time{}):
|
||||||
|
e = spewConfigStringerEnabled.Sdump(expected)
|
||||||
|
a = spewConfigStringerEnabled.Sdump(actual)
|
||||||
|
default:
|
||||||
|
e = spewConfig.Sdump(expected)
|
||||||
|
a = spewConfig.Sdump(actual)
|
||||||
}
|
}
|
||||||
|
|
||||||
diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{
|
diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{
|
||||||
@ -1625,6 +1653,14 @@ var spewConfig = spew.ConfigState{
|
|||||||
MaxDepth: 10,
|
MaxDepth: 10,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var spewConfigStringerEnabled = spew.ConfigState{
|
||||||
|
Indent: " ",
|
||||||
|
DisablePointerAddresses: true,
|
||||||
|
DisableCapacities: true,
|
||||||
|
SortKeys: true,
|
||||||
|
MaxDepth: 10,
|
||||||
|
}
|
||||||
|
|
||||||
type tHelper interface {
|
type tHelper interface {
|
||||||
Helper()
|
Helper()
|
||||||
}
|
}
|
||||||
|
30
vendor/github.com/stretchr/testify/require/require.go
generated
vendored
30
vendor/github.com/stretchr/testify/require/require.go
generated
vendored
@ -280,6 +280,36 @@ func ErrorAsf(t TestingT, err error, target interface{}, msg string, args ...int
|
|||||||
t.FailNow()
|
t.FailNow()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ErrorContains asserts that a function returned an error (i.e. not `nil`)
|
||||||
|
// and that the error contains the specified substring.
|
||||||
|
//
|
||||||
|
// actualObj, err := SomeFunction()
|
||||||
|
// assert.ErrorContains(t, err, expectedErrorSubString)
|
||||||
|
func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...interface{}) {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
if assert.ErrorContains(t, theError, contains, msgAndArgs...) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
|
||||||
|
// ErrorContainsf asserts that a function returned an error (i.e. not `nil`)
|
||||||
|
// and that the error contains the specified substring.
|
||||||
|
//
|
||||||
|
// actualObj, err := SomeFunction()
|
||||||
|
// assert.ErrorContainsf(t, err, expectedErrorSubString, "error message %s", "formatted")
|
||||||
|
func ErrorContainsf(t TestingT, theError error, contains string, msg string, args ...interface{}) {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
if assert.ErrorContainsf(t, theError, contains, msg, args...) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
|
||||||
// ErrorIs asserts that at least one of the errors in err's chain matches target.
|
// ErrorIs asserts that at least one of the errors in err's chain matches target.
|
||||||
// This is a wrapper for errors.Is.
|
// This is a wrapper for errors.Is.
|
||||||
func ErrorIs(t TestingT, err error, target error, msgAndArgs ...interface{}) {
|
func ErrorIs(t TestingT, err error, target error, msgAndArgs ...interface{}) {
|
||||||
|
24
vendor/github.com/stretchr/testify/require/require_forward.go
generated
vendored
24
vendor/github.com/stretchr/testify/require/require_forward.go
generated
vendored
@ -223,6 +223,30 @@ func (a *Assertions) ErrorAsf(err error, target interface{}, msg string, args ..
|
|||||||
ErrorAsf(a.t, err, target, msg, args...)
|
ErrorAsf(a.t, err, target, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ErrorContains asserts that a function returned an error (i.e. not `nil`)
|
||||||
|
// and that the error contains the specified substring.
|
||||||
|
//
|
||||||
|
// actualObj, err := SomeFunction()
|
||||||
|
// a.ErrorContains(err, expectedErrorSubString)
|
||||||
|
func (a *Assertions) ErrorContains(theError error, contains string, msgAndArgs ...interface{}) {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
ErrorContains(a.t, theError, contains, msgAndArgs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ErrorContainsf asserts that a function returned an error (i.e. not `nil`)
|
||||||
|
// and that the error contains the specified substring.
|
||||||
|
//
|
||||||
|
// actualObj, err := SomeFunction()
|
||||||
|
// a.ErrorContainsf(err, expectedErrorSubString, "error message %s", "formatted")
|
||||||
|
func (a *Assertions) ErrorContainsf(theError error, contains string, msg string, args ...interface{}) {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
ErrorContainsf(a.t, theError, contains, msg, args...)
|
||||||
|
}
|
||||||
|
|
||||||
// ErrorIs asserts that at least one of the errors in err's chain matches target.
|
// ErrorIs asserts that at least one of the errors in err's chain matches target.
|
||||||
// This is a wrapper for errors.Is.
|
// This is a wrapper for errors.Is.
|
||||||
func (a *Assertions) ErrorIs(err error, target error, msgAndArgs ...interface{}) {
|
func (a *Assertions) ErrorIs(err error, target error, msgAndArgs ...interface{}) {
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package otelgrpc
|
package otelgrpc // import "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package otelgrpc
|
package otelgrpc // import "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
|
||||||
|
|
||||||
// gRPC tracing middleware
|
// gRPC tracing middleware
|
||||||
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/rpc.md
|
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/rpc.md
|
||||||
@ -33,7 +33,7 @@ import (
|
|||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/baggage"
|
"go.opentelemetry.io/otel/baggage"
|
||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -12,13 +12,13 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package internal
|
package internal // import "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/internal"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ParseFullMethod returns a span name following the OpenTelemetry semantic
|
// ParseFullMethod returns a span name following the OpenTelemetry semantic
|
||||||
|
@ -12,11 +12,11 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package otelgrpc
|
package otelgrpc // import "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Semantic conventions for attribute keys for gRPC.
|
// Semantic conventions for attribute keys for gRPC.
|
||||||
|
@ -12,11 +12,11 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package otelgrpc
|
package otelgrpc // import "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
|
||||||
|
|
||||||
// Version is the current release version of the gRPC instrumentation.
|
// Version is the current release version of the gRPC instrumentation.
|
||||||
func Version() string {
|
func Version() string {
|
||||||
return "0.27.0"
|
return "0.32.0"
|
||||||
// This string is updated by the pre_release.sh script during release
|
// This string is updated by the pre_release.sh script during release
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1
vendor/go.opentelemetry.io/otel/.gitignore
generated
vendored
1
vendor/go.opentelemetry.io/otel/.gitignore
generated
vendored
@ -16,6 +16,5 @@ gen/
|
|||||||
/example/opencensus/opencensus
|
/example/opencensus/opencensus
|
||||||
/example/passthrough/passthrough
|
/example/passthrough/passthrough
|
||||||
/example/prometheus/prometheus
|
/example/prometheus/prometheus
|
||||||
/example/prom-collector/prom-collector
|
|
||||||
/example/zipkin/zipkin
|
/example/zipkin/zipkin
|
||||||
/example/otel-collector/otel-collector
|
/example/otel-collector/otel-collector
|
||||||
|
28
vendor/go.opentelemetry.io/otel/.golangci.yml
generated
vendored
28
vendor/go.opentelemetry.io/otel/.golangci.yml
generated
vendored
@ -4,11 +4,27 @@ run:
|
|||||||
tests: true #Default
|
tests: true #Default
|
||||||
|
|
||||||
linters:
|
linters:
|
||||||
|
# Disable everything by default so upgrades to not include new "default
|
||||||
|
# enabled" linters.
|
||||||
|
disable-all: true
|
||||||
|
# Specifically enable linters we want to use.
|
||||||
enable:
|
enable:
|
||||||
- misspell
|
- deadcode
|
||||||
- goimports
|
- errcheck
|
||||||
- revive
|
|
||||||
- gofmt
|
- gofmt
|
||||||
|
- goimports
|
||||||
|
- gosimple
|
||||||
|
- govet
|
||||||
|
- godot
|
||||||
|
- ineffassign
|
||||||
|
- misspell
|
||||||
|
- revive
|
||||||
|
- staticcheck
|
||||||
|
- structcheck
|
||||||
|
- typecheck
|
||||||
|
- unused
|
||||||
|
- varcheck
|
||||||
|
|
||||||
|
|
||||||
issues:
|
issues:
|
||||||
exclude-rules:
|
exclude-rules:
|
||||||
@ -30,3 +46,9 @@ linters-settings:
|
|||||||
- cancelled
|
- cancelled
|
||||||
goimports:
|
goimports:
|
||||||
local-prefixes: go.opentelemetry.io
|
local-prefixes: go.opentelemetry.io
|
||||||
|
godot:
|
||||||
|
exclude:
|
||||||
|
# Exclude sentence fragments for lists.
|
||||||
|
- '^[ ]*[-•]'
|
||||||
|
# Exclude sentences prefixing a list.
|
||||||
|
- ':$'
|
||||||
|
2
vendor/go.opentelemetry.io/otel/.lycheeignore
generated
vendored
Normal file
2
vendor/go.opentelemetry.io/otel/.lycheeignore
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
http://localhost
|
||||||
|
http://jaeger-collector
|
16
vendor/go.opentelemetry.io/otel/.markdown-link.json
generated
vendored
16
vendor/go.opentelemetry.io/otel/.markdown-link.json
generated
vendored
@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"ignorePatterns": [
|
|
||||||
{
|
|
||||||
"pattern": "^http(s)?://localhost"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"replacementPatterns": [
|
|
||||||
{
|
|
||||||
"pattern": "^/registry",
|
|
||||||
"replacement": "https://opentelemetry.io/registry"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"retryOn429": true,
|
|
||||||
"retryCount": 5,
|
|
||||||
"fallbackRetryDelay": "30s"
|
|
||||||
}
|
|
224
vendor/go.opentelemetry.io/otel/CHANGELOG.md
generated
vendored
224
vendor/go.opentelemetry.io/otel/CHANGELOG.md
generated
vendored
@ -8,6 +8,219 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [1.7.0/0.30.0] - 2022-04-28
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add the `go.opentelemetry.io/otel/semconv/v1.8.0` package.
|
||||||
|
The package contains semantic conventions from the `v1.8.0` version of the OpenTelemetry specification. (#2763)
|
||||||
|
- Add the `go.opentelemetry.io/otel/semconv/v1.9.0` package.
|
||||||
|
The package contains semantic conventions from the `v1.9.0` version of the OpenTelemetry specification. (#2792)
|
||||||
|
- Add the `go.opentelemetry.io/otel/semconv/v1.10.0` package.
|
||||||
|
The package contains semantic conventions from the `v1.10.0` version of the OpenTelemetry specification. (#2842)
|
||||||
|
- Added an in-memory exporter to metrictest to aid testing with a full SDK. (#2776)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Globally delegated instruments are unwrapped before delegating asynchronous callbacks. (#2784)
|
||||||
|
- Remove import of `testing` package in non-tests builds of the `go.opentelemetry.io/otel` package. (#2786)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- The `WithLabelEncoder` option from the `go.opentelemetry.io/otel/exporters/stdout/stdoutmetric` package is renamed to `WithAttributeEncoder`. (#2790)
|
||||||
|
- The `LabelFilterSelector` interface from `go.opentelemetry.io/otel/sdk/metric/processor/reducer` is renamed to `AttributeFilterSelector`.
|
||||||
|
The method included in the renamed interface also changed from `LabelFilterFor` to `AttributeFilterFor`. (#2790)
|
||||||
|
- The `Metadata.Labels` method from the `go.opentelemetry.io/otel/sdk/metric/export` package is renamed to `Metadata.Attributes`.
|
||||||
|
Consequentially, the `Record` type from the same package also has had the embedded method renamed. (#2790)
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
- The `Iterator.Label` method in the `go.opentelemetry.io/otel/attribute` package is deprecated.
|
||||||
|
Use the equivalent `Iterator.Attribute` method instead. (#2790)
|
||||||
|
- The `Iterator.IndexedLabel` method in the `go.opentelemetry.io/otel/attribute` package is deprecated.
|
||||||
|
Use the equivalent `Iterator.IndexedAttribute` method instead. (#2790)
|
||||||
|
- The `MergeIterator.Label` method in the `go.opentelemetry.io/otel/attribute` package is deprecated.
|
||||||
|
Use the equivalent `MergeIterator.Attribute` method instead. (#2790)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Removed the `Batch` type from the `go.opentelemetry.io/otel/sdk/metric/metrictest` package. (#2864)
|
||||||
|
- Removed the `Measurement` type from the `go.opentelemetry.io/otel/sdk/metric/metrictest` package. (#2864)
|
||||||
|
|
||||||
|
## [0.29.0] - 2022-04-11
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- The metrics global package was added back into several test files. (#2764)
|
||||||
|
- The `Meter` function is added back to the `go.opentelemetry.io/otel/metric/global` package.
|
||||||
|
This function is a convenience function equivalent to calling `global.MeterProvider().Meter(...)`. (#2750)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Removed module the `go.opentelemetry.io/otel/sdk/export/metric`.
|
||||||
|
Use the `go.opentelemetry.io/otel/sdk/metric` module instead. (#2720)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Don't panic anymore when setting a global MeterProvider to itself. (#2749)
|
||||||
|
- Upgrade `go.opentelemetry.io/proto/otlp` in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric` from `v0.12.1` to `v0.15.0`.
|
||||||
|
This replaces the use of the now deprecated `InstrumentationLibrary` and `InstrumentationLibraryMetrics` types and fields in the proto library with the equivalent `InstrumentationScope` and `ScopeMetrics`. (#2748)
|
||||||
|
|
||||||
|
## [1.6.3] - 2022-04-07
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Allow non-comparable global `MeterProvider`, `TracerProvider`, and `TextMapPropagator` types to be set. (#2772, #2773)
|
||||||
|
|
||||||
|
## [1.6.2] - 2022-04-06
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Don't panic anymore when setting a global TracerProvider or TextMapPropagator to itself. (#2749)
|
||||||
|
- Upgrade `go.opentelemetry.io/proto/otlp` in `go.opentelemetry.io/otel/exporters/otlp/otlptrace` from `v0.12.1` to `v0.15.0`.
|
||||||
|
This replaces the use of the now deprecated `InstrumentationLibrary` and `InstrumentationLibrarySpans` types and fields in the proto library with the equivalent `InstrumentationScope` and `ScopeSpans`. (#2748)
|
||||||
|
|
||||||
|
## [1.6.1] - 2022-03-28
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- The `go.opentelemetry.io/otel/schema/*` packages now use the correct schema URL for their `SchemaURL` constant.
|
||||||
|
Instead of using `"https://opentelemetry.io/schemas/v<version>"` they now use the correct URL without a `v` prefix, `"https://opentelemetry.io/schemas/<version>"`. (#2743, #2744)
|
||||||
|
|
||||||
|
### Security
|
||||||
|
|
||||||
|
- Upgrade `go.opentelemetry.io/proto/otlp` from `v0.12.0` to `v0.12.1`.
|
||||||
|
This includes an indirect upgrade of `github.com/grpc-ecosystem/grpc-gateway` which resolves [a vulnerability](https://nvd.nist.gov/vuln/detail/CVE-2019-11254) from `gopkg.in/yaml.v2` in version `v2.2.3`. (#2724, #2728)
|
||||||
|
|
||||||
|
## [1.6.0/0.28.0] - 2022-03-23
|
||||||
|
|
||||||
|
### ⚠️ Notice ⚠️
|
||||||
|
|
||||||
|
This update is a breaking change of the unstable Metrics API.
|
||||||
|
Code instrumented with the `go.opentelemetry.io/otel/metric` will need to be modified.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add metrics exponential histogram support.
|
||||||
|
New mapping functions have been made available in `sdk/metric/aggregator/exponential/mapping` for other OpenTelemetry projects to take dependencies on. (#2502)
|
||||||
|
- Add Go 1.18 to our compatibility tests. (#2679)
|
||||||
|
- Allow configuring the Sampler with the `OTEL_TRACES_SAMPLER` and `OTEL_TRACES_SAMPLER_ARG` environment variables. (#2305, #2517)
|
||||||
|
- Add the `metric/global` for obtaining and setting the global `MeterProvider`. (#2660)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- The metrics API has been significantly changed to match the revised OpenTelemetry specification.
|
||||||
|
High-level changes include:
|
||||||
|
|
||||||
|
- Synchronous and asynchronous instruments are now handled by independent `InstrumentProvider`s.
|
||||||
|
These `InstrumentProvider`s are managed with a `Meter`.
|
||||||
|
- Synchronous and asynchronous instruments are grouped into their own packages based on value types.
|
||||||
|
- Asynchronous callbacks can now be registered with a `Meter`.
|
||||||
|
|
||||||
|
Be sure to check out the metric module documentation for more information on how to use the revised API. (#2587, #2660)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fallback to general attribute limits when span specific ones are not set in the environment. (#2675, #2677)
|
||||||
|
|
||||||
|
## [1.5.0] - 2022-03-16
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Log the Exporters configuration in the TracerProviders message. (#2578)
|
||||||
|
- Added support to configure the span limits with environment variables.
|
||||||
|
The following environment variables are supported. (#2606, #2637)
|
||||||
|
- `OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT`
|
||||||
|
- `OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT`
|
||||||
|
- `OTEL_SPAN_EVENT_COUNT_LIMIT`
|
||||||
|
- `OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT`
|
||||||
|
- `OTEL_SPAN_LINK_COUNT_LIMIT`
|
||||||
|
- `OTEL_LINK_ATTRIBUTE_COUNT_LIMIT`
|
||||||
|
|
||||||
|
If the provided environment variables are invalid (negative), the default values would be used.
|
||||||
|
- Rename the `gc` runtime name to `go` (#2560)
|
||||||
|
- Add resource container ID detection. (#2418)
|
||||||
|
- Add span attribute value length limit.
|
||||||
|
The new `AttributeValueLengthLimit` field is added to the `"go.opentelemetry.io/otel/sdk/trace".SpanLimits` type to configure this limit for a `TracerProvider`.
|
||||||
|
The default limit for this resource is "unlimited". (#2637)
|
||||||
|
- Add the `WithRawSpanLimits` option to `go.opentelemetry.io/otel/sdk/trace`.
|
||||||
|
This option replaces the `WithSpanLimits` option.
|
||||||
|
Zero or negative values will not be changed to the default value like `WithSpanLimits` does.
|
||||||
|
Setting a limit to zero will effectively disable the related resource it limits and setting to a negative value will mean that resource is unlimited.
|
||||||
|
Consequentially, limits should be constructed using `NewSpanLimits` and updated accordingly. (#2637)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Drop oldest tracestate `Member` when capacity is reached. (#2592)
|
||||||
|
- Add event and link drop counts to the exported data from the `oltptrace` exporter. (#2601)
|
||||||
|
- Unify path cleaning functionally in the `otlpmetric` and `otlptrace` configuration. (#2639)
|
||||||
|
- Change the debug message from the `sdk/trace.BatchSpanProcessor` to reflect the count is cumulative. (#2640)
|
||||||
|
- Introduce new internal `envconfig` package for OTLP exporters. (#2608)
|
||||||
|
- If `http.Request.Host` is empty, fall back to use `URL.Host` when populating `http.host` in the `semconv` packages. (#2661)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Remove the OTLP trace exporter limit of SpanEvents when exporting. (#2616)
|
||||||
|
- Default to port `4318` instead of `4317` for the `otlpmetrichttp` and `otlptracehttp` client. (#2614, #2625)
|
||||||
|
- Unlimited span limits are now supported (negative values). (#2636, #2637)
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
- Deprecated `"go.opentelemetry.io/otel/sdk/trace".WithSpanLimits`.
|
||||||
|
Use `WithRawSpanLimits` instead.
|
||||||
|
That option allows setting unlimited and zero limits, this option does not.
|
||||||
|
This option will be kept until the next major version incremented release. (#2637)
|
||||||
|
|
||||||
|
## [1.4.1] - 2022-02-16
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix race condition in reading the dropped spans number for the `BatchSpanProcessor`. (#2615)
|
||||||
|
|
||||||
|
## [1.4.0] - 2022-02-11
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Use `OTEL_EXPORTER_ZIPKIN_ENDPOINT` environment variable to specify zipkin collector endpoint. (#2490)
|
||||||
|
- Log the configuration of `TracerProvider`s, and `Tracer`s for debugging.
|
||||||
|
To enable use a logger with Verbosity (V level) `>=1`. (#2500)
|
||||||
|
- Added support to configure the batch span-processor with environment variables.
|
||||||
|
The following environment variables are used. (#2515)
|
||||||
|
- `OTEL_BSP_SCHEDULE_DELAY`
|
||||||
|
- `OTEL_BSP_EXPORT_TIMEOUT`
|
||||||
|
- `OTEL_BSP_MAX_QUEUE_SIZE`.
|
||||||
|
- `OTEL_BSP_MAX_EXPORT_BATCH_SIZE`
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Zipkin exporter exports `Resource` attributes in the `Tags` field. (#2589)
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
- Deprecate module the `go.opentelemetry.io/otel/sdk/export/metric`.
|
||||||
|
Use the `go.opentelemetry.io/otel/sdk/metric` module instead. (#2382)
|
||||||
|
- Deprecate `"go.opentelemetry.io/otel/sdk/metric".AtomicFieldOffsets`. (#2445)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed the instrument kind for noop async instruments to correctly report an implementation. (#2461)
|
||||||
|
- Fix UDP packets overflowing with Jaeger payloads. (#2489, #2512)
|
||||||
|
- Change the `otlpmetric.Client` interface's `UploadMetrics` method to accept a single `ResourceMetrics` instead of a slice of them. (#2491)
|
||||||
|
- Specify explicit buckets in Prometheus example, fixing issue where example only has `+inf` bucket. (#2419, #2493)
|
||||||
|
- W3C baggage will now decode urlescaped values. (#2529)
|
||||||
|
- Baggage members are now only validated once, when calling `NewMember` and not also when adding it to the baggage itself. (#2522)
|
||||||
|
- The order attributes are dropped from spans in the `go.opentelemetry.io/otel/sdk/trace` package when capacity is reached is fixed to be in compliance with the OpenTelemetry specification.
|
||||||
|
Instead of dropping the least-recently-used attribute, the last added attribute is dropped.
|
||||||
|
This drop order still only applies to attributes with unique keys not already contained in the span.
|
||||||
|
If an attribute is added with a key already contained in the span, that attribute is updated to the new value being added. (#2576)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Updated `go.opentelemetry.io/proto/otlp` from `v0.11.0` to `v0.12.0`. This version removes a number of deprecated methods. (#2546)
|
||||||
|
- [`Metric.GetIntGauge()`](https://pkg.go.dev/go.opentelemetry.io/proto/otlp@v0.11.0/metrics/v1#Metric.GetIntGauge)
|
||||||
|
- [`Metric.GetIntHistogram()`](https://pkg.go.dev/go.opentelemetry.io/proto/otlp@v0.11.0/metrics/v1#Metric.GetIntHistogram)
|
||||||
|
- [`Metric.GetIntSum()`](https://pkg.go.dev/go.opentelemetry.io/proto/otlp@v0.11.0/metrics/v1#Metric.GetIntSum)
|
||||||
|
|
||||||
## [1.3.0] - 2021-12-10
|
## [1.3.0] - 2021-12-10
|
||||||
|
|
||||||
### ⚠️ Notice ⚠️
|
### ⚠️ Notice ⚠️
|
||||||
@ -1639,7 +1852,16 @@ It contains api and sdk for trace and meter.
|
|||||||
- CircleCI build CI manifest files.
|
- CircleCI build CI manifest files.
|
||||||
- CODEOWNERS file to track owners of this project.
|
- CODEOWNERS file to track owners of this project.
|
||||||
|
|
||||||
[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.3.0...HEAD
|
[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.7.0...HEAD
|
||||||
|
[1.7.0/0.30.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.7.0
|
||||||
|
[0.29.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/metric/v0.29.0
|
||||||
|
[1.6.3]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.6.3
|
||||||
|
[1.6.2]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.6.2
|
||||||
|
[1.6.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.6.1
|
||||||
|
[1.6.0/0.28.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.6.0
|
||||||
|
[1.5.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.5.0
|
||||||
|
[1.4.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.4.1
|
||||||
|
[1.4.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.4.0
|
||||||
[1.3.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.3.0
|
[1.3.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.3.0
|
||||||
[1.2.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.2.0
|
[1.2.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.2.0
|
||||||
[1.1.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.1.0
|
[1.1.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.1.0
|
||||||
|
2
vendor/go.opentelemetry.io/otel/CODEOWNERS
generated
vendored
2
vendor/go.opentelemetry.io/otel/CODEOWNERS
generated
vendored
@ -12,6 +12,6 @@
|
|||||||
# https://help.github.com/en/articles/about-code-owners
|
# https://help.github.com/en/articles/about-code-owners
|
||||||
#
|
#
|
||||||
|
|
||||||
* @jmacd @MrAlias @Aneurysm9 @evantorrie @XSAM @dashpole @paivagustavo @MadVikingGod @pellared
|
* @jmacd @MrAlias @Aneurysm9 @evantorrie @XSAM @dashpole @paivagustavo @MadVikingGod @pellared @hanyuancheung
|
||||||
|
|
||||||
CODEOWNERS @MrAlias @Aneurysm9 @MadVikingGod
|
CODEOWNERS @MrAlias @Aneurysm9 @MadVikingGod
|
||||||
|
67
vendor/go.opentelemetry.io/otel/CONTRIBUTING.md
generated
vendored
67
vendor/go.opentelemetry.io/otel/CONTRIBUTING.md
generated
vendored
@ -228,11 +228,11 @@ all options to create a configured `config`.
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
// newConfig returns an appropriately configured config.
|
// newConfig returns an appropriately configured config.
|
||||||
func newConfig([]Option) config {
|
func newConfig(options ...Option) config {
|
||||||
// Set default values for config.
|
// Set default values for config.
|
||||||
config := config{/* […] */}
|
config := config{/* […] */}
|
||||||
for _, option := range options {
|
for _, option := range options {
|
||||||
option.apply(&config)
|
config = option.apply(config)
|
||||||
}
|
}
|
||||||
// Preform any validation here.
|
// Preform any validation here.
|
||||||
return config
|
return config
|
||||||
@ -253,7 +253,7 @@ To set the value of the options a `config` contains, a corresponding
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
type Option interface {
|
type Option interface {
|
||||||
apply(*config)
|
apply(config) config
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -261,6 +261,9 @@ Having `apply` unexported makes sure that it will not be used externally.
|
|||||||
Moreover, the interface becomes sealed so the user cannot easily implement
|
Moreover, the interface becomes sealed so the user cannot easily implement
|
||||||
the interface on its own.
|
the interface on its own.
|
||||||
|
|
||||||
|
The `apply` method should return a modified version of the passed config.
|
||||||
|
This approach, instead of passing a pointer, is used to prevent the config from being allocated to the heap.
|
||||||
|
|
||||||
The name of the interface should be prefixed in the same way the
|
The name of the interface should be prefixed in the same way the
|
||||||
corresponding `config` is (if at all).
|
corresponding `config` is (if at all).
|
||||||
|
|
||||||
@ -283,8 +286,9 @@ func With*(…) Option { … }
|
|||||||
```go
|
```go
|
||||||
type defaultFalseOption bool
|
type defaultFalseOption bool
|
||||||
|
|
||||||
func (o defaultFalseOption) apply(c *config) {
|
func (o defaultFalseOption) apply(c config) config {
|
||||||
c.Bool = bool(o)
|
c.Bool = bool(o)
|
||||||
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithOption sets a T to have an option included.
|
// WithOption sets a T to have an option included.
|
||||||
@ -296,8 +300,9 @@ func WithOption() Option {
|
|||||||
```go
|
```go
|
||||||
type defaultTrueOption bool
|
type defaultTrueOption bool
|
||||||
|
|
||||||
func (o defaultTrueOption) apply(c *config) {
|
func (o defaultTrueOption) apply(c config) config {
|
||||||
c.Bool = bool(o)
|
c.Bool = bool(o)
|
||||||
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithoutOption sets a T to have Bool option excluded.
|
// WithoutOption sets a T to have Bool option excluded.
|
||||||
@ -313,8 +318,9 @@ type myTypeOption struct {
|
|||||||
MyType MyType
|
MyType MyType
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o myTypeOption) apply(c *config) {
|
func (o myTypeOption) apply(c config) config {
|
||||||
c.MyType = o.MyType
|
c.MyType = o.MyType
|
||||||
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithMyType sets T to have include MyType.
|
// WithMyType sets T to have include MyType.
|
||||||
@ -326,16 +332,17 @@ func WithMyType(t MyType) Option {
|
|||||||
##### Functional Options
|
##### Functional Options
|
||||||
|
|
||||||
```go
|
```go
|
||||||
type optionFunc func(*config)
|
type optionFunc func(config) config
|
||||||
|
|
||||||
func (fn optionFunc) apply(c *config) {
|
func (fn optionFunc) apply(c config) config {
|
||||||
fn(c)
|
return fn(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithMyType sets t as MyType.
|
// WithMyType sets t as MyType.
|
||||||
func WithMyType(t MyType) Option {
|
func WithMyType(t MyType) Option {
|
||||||
return optionFunc(func(c *config) {
|
return optionFunc(func(c config) config {
|
||||||
c.MyType = t
|
c.MyType = t
|
||||||
|
return c
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@ -370,12 +377,12 @@ type config struct {
|
|||||||
|
|
||||||
// DogOption apply Dog specific options.
|
// DogOption apply Dog specific options.
|
||||||
type DogOption interface {
|
type DogOption interface {
|
||||||
applyDog(*config)
|
applyDog(config) config
|
||||||
}
|
}
|
||||||
|
|
||||||
// BirdOption apply Bird specific options.
|
// BirdOption apply Bird specific options.
|
||||||
type BirdOption interface {
|
type BirdOption interface {
|
||||||
applyBird(*config)
|
applyBird(config) config
|
||||||
}
|
}
|
||||||
|
|
||||||
// Option apply options for all animals.
|
// Option apply options for all animals.
|
||||||
@ -385,17 +392,36 @@ type Option interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type weightOption float64
|
type weightOption float64
|
||||||
func (o weightOption) applyDog(c *config) { c.Weight = float64(o) }
|
|
||||||
func (o weightOption) applyBird(c *config) { c.Weight = float64(o) }
|
func (o weightOption) applyDog(c config) config {
|
||||||
func WithWeight(w float64) Option { return weightOption(w) }
|
c.Weight = float64(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o weightOption) applyBird(c config) config {
|
||||||
|
c.Weight = float64(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithWeight(w float64) Option { return weightOption(w) }
|
||||||
|
|
||||||
type furColorOption string
|
type furColorOption string
|
||||||
func (o furColorOption) applyDog(c *config) { c.Color = string(o) }
|
|
||||||
func WithFurColor(c string) DogOption { return furColorOption(c) }
|
func (o furColorOption) applyDog(c config) config {
|
||||||
|
c.Color = string(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithFurColor(c string) DogOption { return furColorOption(c) }
|
||||||
|
|
||||||
type maxAltitudeOption float64
|
type maxAltitudeOption float64
|
||||||
func (o maxAltitudeOption) applyBird(c *config) { c.MaxAltitude = float64(o) }
|
|
||||||
func WithMaxAltitude(a float64) BirdOption { return maxAltitudeOption(a) }
|
func (o maxAltitudeOption) applyBird(c config) config {
|
||||||
|
c.MaxAltitude = float64(o)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithMaxAltitude(a float64) BirdOption { return maxAltitudeOption(a) }
|
||||||
|
|
||||||
func NewDog(name string, o ...DogOption) Dog {…}
|
func NewDog(name string, o ...DogOption) Dog {…}
|
||||||
func NewBird(name string, o ...BirdOption) Bird {…}
|
func NewBird(name string, o ...BirdOption) Bird {…}
|
||||||
@ -478,10 +504,11 @@ Approvers:
|
|||||||
|
|
||||||
- [Evan Torrie](https://github.com/evantorrie), Verizon Media
|
- [Evan Torrie](https://github.com/evantorrie), Verizon Media
|
||||||
- [Josh MacDonald](https://github.com/jmacd), LightStep
|
- [Josh MacDonald](https://github.com/jmacd), LightStep
|
||||||
- [Sam Xie](https://github.com/XSAM)
|
- [Sam Xie](https://github.com/XSAM), Cisco/AppDynamics
|
||||||
- [David Ashpole](https://github.com/dashpole), Google
|
- [David Ashpole](https://github.com/dashpole), Google
|
||||||
- [Gustavo Silva Paiva](https://github.com/paivagustavo), LightStep
|
- [Gustavo Silva Paiva](https://github.com/paivagustavo), LightStep
|
||||||
- [Robert Pająk](https://github.com/pellared), Splunk
|
- [Robert Pająk](https://github.com/pellared), Splunk
|
||||||
|
- [Chester Cheung](https://github.com/hanyuancheung), Tencent
|
||||||
|
|
||||||
Maintainers:
|
Maintainers:
|
||||||
|
|
||||||
|
165
vendor/go.opentelemetry.io/otel/Makefile
generated
vendored
165
vendor/go.opentelemetry.io/otel/Makefile
generated
vendored
@ -12,13 +12,11 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
EXAMPLES := $(shell ./get_main_pkgs.sh ./example)
|
|
||||||
TOOLS_MOD_DIR := ./internal/tools
|
TOOLS_MOD_DIR := ./internal/tools
|
||||||
|
|
||||||
# All source code and documents. Used in spell check.
|
|
||||||
ALL_DOCS := $(shell find . -name '*.md' -type f | sort)
|
ALL_DOCS := $(shell find . -name '*.md' -type f | sort)
|
||||||
# All directories with go.mod files related to opentelemetry library. Used for building, testing and linting.
|
ALL_GO_MOD_DIRS := $(shell find . -type f -name 'go.mod' -exec dirname {} \; | sort)
|
||||||
ALL_GO_MOD_DIRS := $(filter-out $(TOOLS_MOD_DIR), $(shell find . -type f -name 'go.mod' -exec dirname {} \; | egrep -v '^./example' | sort)) $(shell find ./example -type f -name 'go.mod' -exec dirname {} \; | sort)
|
OTEL_GO_MOD_DIRS := $(filter-out $(TOOLS_MOD_DIR), $(ALL_GO_MOD_DIRS))
|
||||||
ALL_COVERAGE_MOD_DIRS := $(shell find . -type f -name 'go.mod' -exec dirname {} \; | egrep -v '^./example|^$(TOOLS_MOD_DIR)' | sort)
|
ALL_COVERAGE_MOD_DIRS := $(shell find . -type f -name 'go.mod' -exec dirname {} \; | egrep -v '^./example|^$(TOOLS_MOD_DIR)' | sort)
|
||||||
|
|
||||||
GO = go
|
GO = go
|
||||||
@ -27,8 +25,8 @@ TIMEOUT = 60
|
|||||||
.DEFAULT_GOAL := precommit
|
.DEFAULT_GOAL := precommit
|
||||||
|
|
||||||
.PHONY: precommit ci
|
.PHONY: precommit ci
|
||||||
precommit: dependabot-check license-check lint build examples test-default
|
precommit: dependabot-generate license-check vanity-import-fix misspell go-mod-tidy golangci-lint-fix test-default
|
||||||
ci: precommit check-clean-work-tree test-coverage
|
ci: dependabot-check license-check lint vanity-import-check build test-default check-clean-work-tree test-coverage
|
||||||
|
|
||||||
# Tools
|
# Tools
|
||||||
|
|
||||||
@ -49,6 +47,12 @@ $(TOOLS)/semconvgen: PACKAGE=go.opentelemetry.io/build-tools/semconvgen
|
|||||||
CROSSLINK = $(TOOLS)/crosslink
|
CROSSLINK = $(TOOLS)/crosslink
|
||||||
$(TOOLS)/crosslink: PACKAGE=go.opentelemetry.io/otel/$(TOOLS_MOD_DIR)/crosslink
|
$(TOOLS)/crosslink: PACKAGE=go.opentelemetry.io/otel/$(TOOLS_MOD_DIR)/crosslink
|
||||||
|
|
||||||
|
SEMCONVKIT = $(TOOLS)/semconvkit
|
||||||
|
$(TOOLS)/semconvkit: PACKAGE=go.opentelemetry.io/otel/$(TOOLS_MOD_DIR)/semconvkit
|
||||||
|
|
||||||
|
DBOTCONF = $(TOOLS)/dbotconf
|
||||||
|
$(TOOLS)/dbotconf: PACKAGE=go.opentelemetry.io/build-tools/dbotconf
|
||||||
|
|
||||||
GOLANGCI_LINT = $(TOOLS)/golangci-lint
|
GOLANGCI_LINT = $(TOOLS)/golangci-lint
|
||||||
$(TOOLS)/golangci-lint: PACKAGE=github.com/golangci/golangci-lint/cmd/golangci-lint
|
$(TOOLS)/golangci-lint: PACKAGE=github.com/golangci/golangci-lint/cmd/golangci-lint
|
||||||
|
|
||||||
@ -68,55 +72,51 @@ GOJQ = $(TOOLS)/gojq
|
|||||||
$(TOOLS)/gojq: PACKAGE=github.com/itchyny/gojq/cmd/gojq
|
$(TOOLS)/gojq: PACKAGE=github.com/itchyny/gojq/cmd/gojq
|
||||||
|
|
||||||
.PHONY: tools
|
.PHONY: tools
|
||||||
tools: $(CROSSLINK) $(GOLANGCI_LINT) $(MISSPELL) $(GOCOVMERGE) $(STRINGER) $(PORTO) $(GOJQ) $(SEMCONVGEN) $(MULTIMOD)
|
tools: $(CROSSLINK) $(DBOTCONF) $(GOLANGCI_LINT) $(MISSPELL) $(GOCOVMERGE) $(STRINGER) $(PORTO) $(GOJQ) $(SEMCONVGEN) $(MULTIMOD) $(SEMCONVKIT)
|
||||||
|
|
||||||
# Build
|
# Build
|
||||||
|
|
||||||
.PHONY: examples generate build
|
.PHONY: generate build
|
||||||
examples:
|
|
||||||
@set -e; for dir in $(EXAMPLES); do \
|
|
||||||
echo "$(GO) build $${dir}/..."; \
|
|
||||||
(cd "$${dir}" && \
|
|
||||||
$(GO) build .); \
|
|
||||||
done
|
|
||||||
|
|
||||||
generate: $(STRINGER) $(PORTO)
|
generate: $(OTEL_GO_MOD_DIRS:%=generate/%)
|
||||||
set -e; for dir in $(ALL_GO_MOD_DIRS); do \
|
generate/%: DIR=$*
|
||||||
echo "$(GO) generate $${dir}/..."; \
|
generate/%: | $(STRINGER) $(PORTO)
|
||||||
(cd "$${dir}" && \
|
@echo "$(GO) generate $(DIR)/..." \
|
||||||
PATH="$(TOOLS):$${PATH}" $(GO) generate ./... && \
|
&& cd $(DIR) \
|
||||||
$(PORTO) -w .); \
|
&& PATH="$(TOOLS):$${PATH}" $(GO) generate ./... && $(PORTO) -w .
|
||||||
done
|
|
||||||
|
|
||||||
build: generate
|
build: generate $(OTEL_GO_MOD_DIRS:%=build/%) $(OTEL_GO_MOD_DIRS:%=build-tests/%)
|
||||||
# Build all package code including testing code.
|
build/%: DIR=$*
|
||||||
set -e; for dir in $(ALL_GO_MOD_DIRS); do \
|
build/%:
|
||||||
echo "$(GO) build $${dir}/..."; \
|
@echo "$(GO) build $(DIR)/..." \
|
||||||
(cd "$${dir}" && \
|
&& cd $(DIR) \
|
||||||
$(GO) build ./... && \
|
&& $(GO) build ./...
|
||||||
$(GO) list ./... \
|
|
||||||
| grep -v third_party \
|
build-tests/%: DIR=$*
|
||||||
| xargs $(GO) test -vet=off -run xxxxxMatchNothingxxxxx >/dev/null); \
|
build-tests/%:
|
||||||
done
|
@echo "$(GO) build tests $(DIR)/..." \
|
||||||
|
&& cd $(DIR) \
|
||||||
|
&& $(GO) list ./... \
|
||||||
|
| grep -v third_party \
|
||||||
|
| xargs $(GO) test -vet=off -run xxxxxMatchNothingxxxxx >/dev/null
|
||||||
|
|
||||||
# Tests
|
# Tests
|
||||||
|
|
||||||
TEST_TARGETS := test-default test-bench test-short test-verbose test-race
|
TEST_TARGETS := test-default test-bench test-short test-verbose test-race
|
||||||
.PHONY: $(TEST_TARGETS) test
|
.PHONY: $(TEST_TARGETS) test
|
||||||
test-default: ARGS=-v -race
|
test-default test-race: ARGS=-race
|
||||||
test-bench: ARGS=-run=xxxxxMatchNothingxxxxx -test.benchtime=1ms -bench=.
|
test-bench: ARGS=-run=xxxxxMatchNothingxxxxx -test.benchtime=1ms -bench=.
|
||||||
test-short: ARGS=-short
|
test-short: ARGS=-short
|
||||||
test-verbose: ARGS=-v
|
test-verbose: ARGS=-v -race
|
||||||
test-race: ARGS=-race
|
|
||||||
$(TEST_TARGETS): test
|
$(TEST_TARGETS): test
|
||||||
test:
|
test: $(OTEL_GO_MOD_DIRS:%=test/%)
|
||||||
@set -e; for dir in $(ALL_GO_MOD_DIRS); do \
|
test/%: DIR=$*
|
||||||
echo "$(GO) test -timeout $(TIMEOUT)s $(ARGS) $${dir}/..."; \
|
test/%:
|
||||||
(cd "$${dir}" && \
|
@echo "$(GO) test -timeout $(TIMEOUT)s $(ARGS) $(DIR)/..." \
|
||||||
$(GO) list ./... \
|
&& cd $(DIR) \
|
||||||
| grep -v third_party \
|
&& $(GO) list ./... \
|
||||||
| xargs $(GO) test -timeout $(TIMEOUT)s $(ARGS)); \
|
| grep -v third_party \
|
||||||
done
|
| xargs $(GO) test -timeout $(TIMEOUT)s $(ARGS)
|
||||||
|
|
||||||
COVERAGE_MODE = atomic
|
COVERAGE_MODE = atomic
|
||||||
COVERAGE_PROFILE = coverage.out
|
COVERAGE_PROFILE = coverage.out
|
||||||
@ -129,37 +129,52 @@ test-coverage: | $(GOCOVMERGE)
|
|||||||
(cd "$${dir}" && \
|
(cd "$${dir}" && \
|
||||||
$(GO) list ./... \
|
$(GO) list ./... \
|
||||||
| grep -v third_party \
|
| grep -v third_party \
|
||||||
|
| grep -v 'semconv/v.*' \
|
||||||
| xargs $(GO) test -coverpkg=./... -covermode=$(COVERAGE_MODE) -coverprofile="$(COVERAGE_PROFILE)" && \
|
| xargs $(GO) test -coverpkg=./... -covermode=$(COVERAGE_MODE) -coverprofile="$(COVERAGE_PROFILE)" && \
|
||||||
$(GO) tool cover -html=coverage.out -o coverage.html); \
|
$(GO) tool cover -html=coverage.out -o coverage.html); \
|
||||||
done; \
|
done; \
|
||||||
$(GOCOVMERGE) $$(find . -name coverage.out) > coverage.txt
|
$(GOCOVMERGE) $$(find . -name coverage.out) > coverage.txt
|
||||||
|
|
||||||
|
.PHONY: golangci-lint golangci-lint-fix
|
||||||
|
golangci-lint-fix: ARGS=--fix
|
||||||
|
golangci-lint-fix: golangci-lint
|
||||||
|
golangci-lint: $(OTEL_GO_MOD_DIRS:%=golangci-lint/%)
|
||||||
|
golangci-lint/%: DIR=$*
|
||||||
|
golangci-lint/%: | $(GOLANGCI_LINT)
|
||||||
|
@echo 'golangci-lint $(if $(ARGS),$(ARGS) ,)$(DIR)' \
|
||||||
|
&& cd $(DIR) \
|
||||||
|
&& $(GOLANGCI_LINT) run --allow-serial-runners $(ARGS)
|
||||||
|
|
||||||
|
.PHONY: crosslink
|
||||||
|
crosslink: | $(CROSSLINK)
|
||||||
|
@echo "cross-linking all go modules" \
|
||||||
|
&& $(CROSSLINK)
|
||||||
|
|
||||||
|
.PHONY: go-mod-tidy
|
||||||
|
go-mod-tidy: $(ALL_GO_MOD_DIRS:%=go-mod-tidy/%)
|
||||||
|
go-mod-tidy/%: DIR=$*
|
||||||
|
go-mod-tidy/%: | crosslink
|
||||||
|
@echo "$(GO) mod tidy in $(DIR)" \
|
||||||
|
&& cd $(DIR) \
|
||||||
|
&& $(GO) mod tidy
|
||||||
|
|
||||||
|
.PHONY: lint-modules
|
||||||
|
lint-modules: go-mod-tidy
|
||||||
|
|
||||||
.PHONY: lint
|
.PHONY: lint
|
||||||
lint: misspell lint-modules | $(GOLANGCI_LINT)
|
lint: misspell lint-modules golangci-lint
|
||||||
set -e; for dir in $(ALL_GO_MOD_DIRS); do \
|
|
||||||
echo "golangci-lint in $${dir}"; \
|
|
||||||
(cd "$${dir}" && \
|
|
||||||
$(GOLANGCI_LINT) run --fix && \
|
|
||||||
$(GOLANGCI_LINT) run); \
|
|
||||||
done
|
|
||||||
|
|
||||||
.PHONY: vanity-import-check
|
.PHONY: vanity-import-check
|
||||||
vanity-import-check: | $(PORTO)
|
vanity-import-check: | $(PORTO)
|
||||||
$(PORTO) --include-internal -l .
|
@$(PORTO) --include-internal -l . || echo "(run: make vanity-import-fix)"
|
||||||
|
|
||||||
|
.PHONY: vanity-import-fix
|
||||||
|
vanity-import-fix: | $(PORTO)
|
||||||
|
@$(PORTO) --include-internal -w .
|
||||||
|
|
||||||
.PHONY: misspell
|
.PHONY: misspell
|
||||||
misspell: | $(MISSPELL)
|
misspell: | $(MISSPELL)
|
||||||
$(MISSPELL) -w $(ALL_DOCS)
|
@$(MISSPELL) -w $(ALL_DOCS)
|
||||||
|
|
||||||
.PHONY: lint-modules
|
|
||||||
lint-modules: | $(CROSSLINK)
|
|
||||||
set -e; for dir in $(ALL_GO_MOD_DIRS) $(TOOLS_MOD_DIR); do \
|
|
||||||
echo "$(GO) mod tidy in $${dir}"; \
|
|
||||||
(cd "$${dir}" && \
|
|
||||||
$(GO) mod tidy); \
|
|
||||||
done
|
|
||||||
echo "cross-linking all go modules"
|
|
||||||
$(CROSSLINK)
|
|
||||||
|
|
||||||
.PHONY: license-check
|
.PHONY: license-check
|
||||||
license-check:
|
license-check:
|
||||||
@ -171,19 +186,14 @@ license-check:
|
|||||||
exit 1; \
|
exit 1; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
DEPENDABOT_CONFIG = .github/dependabot.yml
|
||||||
.PHONY: dependabot-check
|
.PHONY: dependabot-check
|
||||||
dependabot-check:
|
dependabot-check: | $(DBOTCONF)
|
||||||
@result=$$( \
|
@$(DBOTCONF) verify $(DEPENDABOT_CONFIG) || echo "(run: make dependabot-generate)"
|
||||||
for f in $$( find . -type f -name go.mod -exec dirname {} \; | sed 's/^.//' ); \
|
|
||||||
do grep -q "directory: \+$$f" .github/dependabot.yml \
|
.PHONY: dependabot-generate
|
||||||
|| echo "$$f"; \
|
dependabot-generate: | $(DBOTCONF)
|
||||||
done; \
|
@$(DBOTCONF) generate > $(DEPENDABOT_CONFIG)
|
||||||
); \
|
|
||||||
if [ -n "$$result" ]; then \
|
|
||||||
echo "missing go.mod dependabot check:"; echo "$$result"; \
|
|
||||||
echo "new modules need to be added to the .github/dependabot.yml file"; \
|
|
||||||
exit 1; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
.PHONY: check-clean-work-tree
|
.PHONY: check-clean-work-tree
|
||||||
check-clean-work-tree:
|
check-clean-work-tree:
|
||||||
@ -195,6 +205,15 @@ check-clean-work-tree:
|
|||||||
exit 1; \
|
exit 1; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
SEMCONVPKG ?= "semconv/"
|
||||||
|
.PHONY: semconv-generate
|
||||||
|
semconv-generate: | $(SEMCONVGEN) $(SEMCONVKIT)
|
||||||
|
@[ "$(TAG)" ] || ( echo "TAG unset: missing opentelemetry specification tag"; exit 1 )
|
||||||
|
@[ "$(OTEL_SPEC_REPO)" ] || ( echo "OTEL_SPEC_REPO unset: missing path to opentelemetry specification repo"; exit 1 )
|
||||||
|
@$(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/trace" -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
||||||
|
@$(SEMCONVGEN) -i "$(OTEL_SPEC_REPO)/semantic_conventions/resource" -t "$(SEMCONVPKG)/template.j2" -s "$(TAG)"
|
||||||
|
@$(SEMCONVKIT) -output "$(SEMCONVPKG)/$(TAG)" -tag "$(TAG)"
|
||||||
|
|
||||||
.PHONY: prerelease
|
.PHONY: prerelease
|
||||||
prerelease: | $(MULTIMOD)
|
prerelease: | $(MULTIMOD)
|
||||||
@[ "${MODSET}" ] || ( echo ">> env var MODSET is not set"; exit 1 )
|
@[ "${MODSET}" ] || ( echo ">> env var MODSET is not set"; exit 1 )
|
||||||
|
12
vendor/go.opentelemetry.io/otel/README.md
generated
vendored
12
vendor/go.opentelemetry.io/otel/README.md
generated
vendored
@ -41,20 +41,28 @@ This project is tested on the following systems.
|
|||||||
|
|
||||||
| OS | Go Version | Architecture |
|
| OS | Go Version | Architecture |
|
||||||
| ------- | ---------- | ------------ |
|
| ------- | ---------- | ------------ |
|
||||||
|
| Ubuntu | 1.18 | amd64 |
|
||||||
| Ubuntu | 1.17 | amd64 |
|
| Ubuntu | 1.17 | amd64 |
|
||||||
| Ubuntu | 1.16 | amd64 |
|
| Ubuntu | 1.16 | amd64 |
|
||||||
|
| Ubuntu | 1.18 | 386 |
|
||||||
| Ubuntu | 1.17 | 386 |
|
| Ubuntu | 1.17 | 386 |
|
||||||
| Ubuntu | 1.16 | 386 |
|
| Ubuntu | 1.16 | 386 |
|
||||||
|
| MacOS | 1.18 | amd64 |
|
||||||
| MacOS | 1.17 | amd64 |
|
| MacOS | 1.17 | amd64 |
|
||||||
| MacOS | 1.16 | amd64 |
|
| MacOS | 1.16 | amd64 |
|
||||||
|
| Windows | 1.18 | amd64 |
|
||||||
| Windows | 1.17 | amd64 |
|
| Windows | 1.17 | amd64 |
|
||||||
| Windows | 1.16 | amd64 |
|
| Windows | 1.16 | amd64 |
|
||||||
|
| Windows | 1.18 | 386 |
|
||||||
| Windows | 1.17 | 386 |
|
| Windows | 1.17 | 386 |
|
||||||
| Windows | 1.16 | 386 |
|
| Windows | 1.16 | 386 |
|
||||||
|
|
||||||
While this project should work for other systems, no compatibility guarantees
|
While this project should work for other systems, no compatibility guarantees
|
||||||
are made for those systems currently.
|
are made for those systems currently.
|
||||||
|
|
||||||
|
Go 1.18 was added in March of 2022.
|
||||||
|
Go 1.16 will be removed around June 2022.
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
You can find a getting started guide on [opentelemetry.io](https://opentelemetry.io/docs/go/getting-started/).
|
You can find a getting started guide on [opentelemetry.io](https://opentelemetry.io/docs/go/getting-started/).
|
||||||
@ -76,7 +84,7 @@ libraries](https://github.com/open-telemetry/opentelemetry-go-contrib/tree/main/
|
|||||||
If you need to extend the telemetry an instrumentation library provides or want
|
If you need to extend the telemetry an instrumentation library provides or want
|
||||||
to build your own instrumentation for your application directly you will need
|
to build your own instrumentation for your application directly you will need
|
||||||
to use the
|
to use the
|
||||||
[go.opentelemetry.io/otel/api](https://pkg.go.dev/go.opentelemetry.io/otel/api)
|
[Go otel](https://pkg.go.dev/go.opentelemetry.io/otel)
|
||||||
package. The included [examples](./example/) are a good way to see some
|
package. The included [examples](./example/) are a good way to see some
|
||||||
practical uses of this process.
|
practical uses of this process.
|
||||||
|
|
||||||
@ -95,8 +103,6 @@ All officially supported exporters for the OpenTelemetry project are contained i
|
|||||||
| [stdout](./exporters/stdout/) | ✓ | ✓ |
|
| [stdout](./exporters/stdout/) | ✓ | ✓ |
|
||||||
| [Zipkin](./exporters/zipkin/) | | ✓ |
|
| [Zipkin](./exporters/zipkin/) | | ✓ |
|
||||||
|
|
||||||
Additionally, OpenTelemetry community supported exporters can be found in the [contrib repository](https://github.com/open-telemetry/opentelemetry-go-contrib/tree/main/exporters).
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
See the [contributing documentation](CONTRIBUTING.md).
|
See the [contributing documentation](CONTRIBUTING.md).
|
||||||
|
41
vendor/go.opentelemetry.io/otel/RELEASING.md
generated
vendored
41
vendor/go.opentelemetry.io/otel/RELEASING.md
generated
vendored
@ -2,35 +2,23 @@
|
|||||||
|
|
||||||
## Semantic Convention Generation
|
## Semantic Convention Generation
|
||||||
|
|
||||||
If a new version of the OpenTelemetry Specification has been released it will be necessary to generate a new
|
New versions of the [OpenTelemetry specification] mean new versions of the `semconv` package need to be generated.
|
||||||
semantic convention package from the YAML definitions in the specification repository. There is a `semconvgen` utility
|
The `semconv-generate` make target is used for this.
|
||||||
installed by `make tools` that can be used to generate the a package with the name matching the specification
|
|
||||||
version number under the `semconv` package. This will ideally be done soon after the specification release is
|
|
||||||
tagged. Make sure that the specification repo contains a checkout of the the latest tagged release so that the
|
|
||||||
generated files match the released semantic conventions.
|
|
||||||
|
|
||||||
There are currently two categories of semantic conventions that must be generated, `resource` and `trace`.
|
1. Checkout a local copy of the [OpenTelemetry specification] to the desired release tag.
|
||||||
|
2. Run the `make semconv-generate ...` target from this repository.
|
||||||
|
|
||||||
```
|
For example,
|
||||||
.tools/semconvgen -i /path/to/specification/repo/semantic_conventions/resource -t semconv/template.j2
|
|
||||||
.tools/semconvgen -i /path/to/specification/repo/semantic_conventions/trace -t semconv/template.j2
|
```sh
|
||||||
|
export TAG="v1.7.0" # Change to the release version you are generating.
|
||||||
|
export OTEL_SPEC_REPO="/absolute/path/to/opentelemetry-specification"
|
||||||
|
git -C "$OTEL_SPEC_REPO" checkout "tags/$TAG"
|
||||||
|
make semconv-generate # Uses the exported TAG and OTEL_SPEC_REPO.
|
||||||
```
|
```
|
||||||
|
|
||||||
Using default values for all options other than `input` will result in using the `template.j2` template to
|
This should create a new sub-package of [`semconv`](./semconv).
|
||||||
generate `resource.go` and `trace.go` in `/path/to/otelgo/repo/semconv/<version>`.
|
Ensure things look correct before submitting a pull request to include the addition.
|
||||||
|
|
||||||
There are several ancillary files that are not generated and should be copied into the new package from the
|
|
||||||
prior package, with updates made as appropriate to canonical import path statements and constant values.
|
|
||||||
These files include:
|
|
||||||
|
|
||||||
* doc.go
|
|
||||||
* exception.go
|
|
||||||
* http(_test)?.go
|
|
||||||
* schema.go
|
|
||||||
|
|
||||||
Uses of the previous schema version in this repository should be updated to use the newly generated version.
|
|
||||||
No tooling for this exists at present, so use find/replace in your editor of choice or craft a `grep | sed`
|
|
||||||
pipeline if you like living on the edge.
|
|
||||||
|
|
||||||
## Pre-Release
|
## Pre-Release
|
||||||
|
|
||||||
@ -108,7 +96,6 @@ It is critical you make sure the version you push upstream is correct.
|
|||||||
|
|
||||||
Finally create a Release for the new `<new tag>` on GitHub.
|
Finally create a Release for the new `<new tag>` on GitHub.
|
||||||
The release body should include all the release notes from the Changelog for this release.
|
The release body should include all the release notes from the Changelog for this release.
|
||||||
Additionally, the `tag.sh` script generates commit logs since last release which can be used to supplement the release notes.
|
|
||||||
|
|
||||||
## Verify Examples
|
## Verify Examples
|
||||||
|
|
||||||
@ -131,3 +118,5 @@ Once verified be sure to [make a release for the `contrib` repository](https://g
|
|||||||
|
|
||||||
Update [the documentation](./website_docs) for [the OpenTelemetry website](https://opentelemetry.io/docs/go/).
|
Update [the documentation](./website_docs) for [the OpenTelemetry website](https://opentelemetry.io/docs/go/).
|
||||||
Importantly, bump any package versions referenced to be the latest one you just released and ensure all code examples still compile and are accurate.
|
Importantly, bump any package versions referenced to be the latest one you just released and ensure all code examples still compile and are accurate.
|
||||||
|
|
||||||
|
[OpenTelemetry specification]: https://github.com/open-telemetry/opentelemetry-specification
|
||||||
|
82
vendor/go.opentelemetry.io/otel/attribute/encoder.go
generated
vendored
82
vendor/go.opentelemetry.io/otel/attribute/encoder.go
generated
vendored
@ -21,19 +21,17 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
// Encoder is a mechanism for serializing a label set into a
|
// Encoder is a mechanism for serializing an attribute set into a specific
|
||||||
// specific string representation that supports caching, to
|
// string representation that supports caching, to avoid repeated
|
||||||
// avoid repeated serialization. An example could be an
|
// serialization. An example could be an exporter encoding the attribute
|
||||||
// exporter encoding the label set into a wire representation.
|
// set into a wire representation.
|
||||||
Encoder interface {
|
Encoder interface {
|
||||||
// Encode returns the serialized encoding of the label
|
// Encode returns the serialized encoding of the attribute set using
|
||||||
// set using its Iterator. This result may be cached
|
// its Iterator. This result may be cached by a attribute.Set.
|
||||||
// by a attribute.Set.
|
|
||||||
Encode(iterator Iterator) string
|
Encode(iterator Iterator) string
|
||||||
|
|
||||||
// ID returns a value that is unique for each class of
|
// ID returns a value that is unique for each class of attribute
|
||||||
// label encoder. Label encoders allocate these using
|
// encoder. Attribute encoders allocate these using `NewEncoderID`.
|
||||||
// `NewEncoderID`.
|
|
||||||
ID() EncoderID
|
ID() EncoderID
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,54 +41,53 @@ type (
|
|||||||
value uint64
|
value uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
// defaultLabelEncoder uses a sync.Pool of buffers to reduce
|
// defaultAttrEncoder uses a sync.Pool of buffers to reduce the number of
|
||||||
// the number of allocations used in encoding labels. This
|
// allocations used in encoding attributes. This implementation encodes a
|
||||||
// implementation encodes a comma-separated list of key=value,
|
// comma-separated list of key=value, with '/'-escaping of '=', ',', and
|
||||||
// with '/'-escaping of '=', ',', and '\'.
|
// '\'.
|
||||||
defaultLabelEncoder struct {
|
defaultAttrEncoder struct {
|
||||||
// pool is a pool of labelset builders. The buffers in this
|
// pool is a pool of attribute set builders. The buffers in this pool
|
||||||
// pool grow to a size that most label encodings will not
|
// grow to a size that most attribute encodings will not allocate new
|
||||||
// allocate new memory.
|
// memory.
|
||||||
pool sync.Pool // *bytes.Buffer
|
pool sync.Pool // *bytes.Buffer
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// escapeChar is used to ensure uniqueness of the label encoding where
|
// escapeChar is used to ensure uniqueness of the attribute encoding where
|
||||||
// keys or values contain either '=' or ','. Since there is no parser
|
// keys or values contain either '=' or ','. Since there is no parser needed
|
||||||
// needed for this encoding and its only requirement is to be unique,
|
// for this encoding and its only requirement is to be unique, this choice is
|
||||||
// this choice is arbitrary. Users will see these in some exporters
|
// arbitrary. Users will see these in some exporters (e.g., stdout), so the
|
||||||
// (e.g., stdout), so the backslash ('\') is used as a conventional choice.
|
// backslash ('\') is used as a conventional choice.
|
||||||
const escapeChar = '\\'
|
const escapeChar = '\\'
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_ Encoder = &defaultLabelEncoder{}
|
_ Encoder = &defaultAttrEncoder{}
|
||||||
|
|
||||||
// encoderIDCounter is for generating IDs for other label
|
// encoderIDCounter is for generating IDs for other attribute encoders.
|
||||||
// encoders.
|
|
||||||
encoderIDCounter uint64
|
encoderIDCounter uint64
|
||||||
|
|
||||||
defaultEncoderOnce sync.Once
|
defaultEncoderOnce sync.Once
|
||||||
defaultEncoderID = NewEncoderID()
|
defaultEncoderID = NewEncoderID()
|
||||||
defaultEncoderInstance *defaultLabelEncoder
|
defaultEncoderInstance *defaultAttrEncoder
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewEncoderID returns a unique label encoder ID. It should be
|
// NewEncoderID returns a unique attribute encoder ID. It should be called
|
||||||
// called once per each type of label encoder. Preferably in init() or
|
// once per each type of attribute encoder. Preferably in init() or in var
|
||||||
// in var definition.
|
// definition.
|
||||||
func NewEncoderID() EncoderID {
|
func NewEncoderID() EncoderID {
|
||||||
return EncoderID{value: atomic.AddUint64(&encoderIDCounter, 1)}
|
return EncoderID{value: atomic.AddUint64(&encoderIDCounter, 1)}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DefaultEncoder returns a label encoder that encodes labels
|
// DefaultEncoder returns an attribute encoder that encodes attributes in such
|
||||||
// in such a way that each escaped label's key is followed by an equal
|
// a way that each escaped attribute's key is followed by an equal sign and
|
||||||
// sign and then by an escaped label's value. All key-value pairs are
|
// then by an escaped attribute's value. All key-value pairs are separated by
|
||||||
// separated by a comma.
|
// a comma.
|
||||||
//
|
//
|
||||||
// Escaping is done by prepending a backslash before either a
|
// Escaping is done by prepending a backslash before either a backslash, equal
|
||||||
// backslash, equal sign or a comma.
|
// sign or a comma.
|
||||||
func DefaultEncoder() Encoder {
|
func DefaultEncoder() Encoder {
|
||||||
defaultEncoderOnce.Do(func() {
|
defaultEncoderOnce.Do(func() {
|
||||||
defaultEncoderInstance = &defaultLabelEncoder{
|
defaultEncoderInstance = &defaultAttrEncoder{
|
||||||
pool: sync.Pool{
|
pool: sync.Pool{
|
||||||
New: func() interface{} {
|
New: func() interface{} {
|
||||||
return &bytes.Buffer{}
|
return &bytes.Buffer{}
|
||||||
@ -101,15 +98,14 @@ func DefaultEncoder() Encoder {
|
|||||||
return defaultEncoderInstance
|
return defaultEncoderInstance
|
||||||
}
|
}
|
||||||
|
|
||||||
// Encode is a part of an implementation of the LabelEncoder
|
// Encode is a part of an implementation of the AttributeEncoder interface.
|
||||||
// interface.
|
func (d *defaultAttrEncoder) Encode(iter Iterator) string {
|
||||||
func (d *defaultLabelEncoder) Encode(iter Iterator) string {
|
|
||||||
buf := d.pool.Get().(*bytes.Buffer)
|
buf := d.pool.Get().(*bytes.Buffer)
|
||||||
defer d.pool.Put(buf)
|
defer d.pool.Put(buf)
|
||||||
buf.Reset()
|
buf.Reset()
|
||||||
|
|
||||||
for iter.Next() {
|
for iter.Next() {
|
||||||
i, keyValue := iter.IndexedLabel()
|
i, keyValue := iter.IndexedAttribute()
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
_, _ = buf.WriteRune(',')
|
_, _ = buf.WriteRune(',')
|
||||||
}
|
}
|
||||||
@ -126,8 +122,8 @@ func (d *defaultLabelEncoder) Encode(iter Iterator) string {
|
|||||||
return buf.String()
|
return buf.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ID is a part of an implementation of the LabelEncoder interface.
|
// ID is a part of an implementation of the AttributeEncoder interface.
|
||||||
func (*defaultLabelEncoder) ID() EncoderID {
|
func (*defaultAttrEncoder) ID() EncoderID {
|
||||||
return defaultEncoderID
|
return defaultEncoderID
|
||||||
}
|
}
|
||||||
|
|
||||||
|
80
vendor/go.opentelemetry.io/otel/attribute/iterator.go
generated
vendored
80
vendor/go.opentelemetry.io/otel/attribute/iterator.go
generated
vendored
@ -14,16 +14,16 @@
|
|||||||
|
|
||||||
package attribute // import "go.opentelemetry.io/otel/attribute"
|
package attribute // import "go.opentelemetry.io/otel/attribute"
|
||||||
|
|
||||||
// Iterator allows iterating over the set of labels in order,
|
// Iterator allows iterating over the set of attributes in order, sorted by
|
||||||
// sorted by key.
|
// key.
|
||||||
type Iterator struct {
|
type Iterator struct {
|
||||||
storage *Set
|
storage *Set
|
||||||
idx int
|
idx int
|
||||||
}
|
}
|
||||||
|
|
||||||
// MergeIterator supports iterating over two sets of labels while
|
// MergeIterator supports iterating over two sets of attributes while
|
||||||
// eliminating duplicate values from the combined set. The first
|
// eliminating duplicate values from the combined set. The first iterator
|
||||||
// iterator value takes precedence.
|
// value takes precedence.
|
||||||
type MergeIterator struct {
|
type MergeIterator struct {
|
||||||
one oneIterator
|
one oneIterator
|
||||||
two oneIterator
|
two oneIterator
|
||||||
@ -31,13 +31,13 @@ type MergeIterator struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type oneIterator struct {
|
type oneIterator struct {
|
||||||
iter Iterator
|
iter Iterator
|
||||||
done bool
|
done bool
|
||||||
label KeyValue
|
attr KeyValue
|
||||||
}
|
}
|
||||||
|
|
||||||
// Next moves the iterator to the next position. Returns false if there
|
// Next moves the iterator to the next position. Returns false if there are no
|
||||||
// are no more labels.
|
// more attributes.
|
||||||
func (i *Iterator) Next() bool {
|
func (i *Iterator) Next() bool {
|
||||||
i.idx++
|
i.idx++
|
||||||
return i.idx < i.Len()
|
return i.idx < i.Len()
|
||||||
@ -45,30 +45,41 @@ func (i *Iterator) Next() bool {
|
|||||||
|
|
||||||
// Label returns current KeyValue. Must be called only after Next returns
|
// Label returns current KeyValue. Must be called only after Next returns
|
||||||
// true.
|
// true.
|
||||||
|
//
|
||||||
|
// Deprecated: Use Attribute instead.
|
||||||
func (i *Iterator) Label() KeyValue {
|
func (i *Iterator) Label() KeyValue {
|
||||||
|
return i.Attribute()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attribute returns the current KeyValue of the Iterator. It must be called
|
||||||
|
// only after Next returns true.
|
||||||
|
func (i *Iterator) Attribute() KeyValue {
|
||||||
kv, _ := i.storage.Get(i.idx)
|
kv, _ := i.storage.Get(i.idx)
|
||||||
return kv
|
return kv
|
||||||
}
|
}
|
||||||
|
|
||||||
// Attribute is a synonym for Label().
|
|
||||||
func (i *Iterator) Attribute() KeyValue {
|
|
||||||
return i.Label()
|
|
||||||
}
|
|
||||||
|
|
||||||
// IndexedLabel returns current index and attribute. Must be called only
|
// IndexedLabel returns current index and attribute. Must be called only
|
||||||
// after Next returns true.
|
// after Next returns true.
|
||||||
|
//
|
||||||
|
// Deprecated: Use IndexedAttribute instead.
|
||||||
func (i *Iterator) IndexedLabel() (int, KeyValue) {
|
func (i *Iterator) IndexedLabel() (int, KeyValue) {
|
||||||
return i.idx, i.Label()
|
return i.idx, i.Attribute()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Len returns a number of labels in the iterator's `*Set`.
|
// IndexedAttribute returns current index and attribute. Must be called only
|
||||||
|
// after Next returns true.
|
||||||
|
func (i *Iterator) IndexedAttribute() (int, KeyValue) {
|
||||||
|
return i.idx, i.Attribute()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Len returns a number of attributes in the iterated set.
|
||||||
func (i *Iterator) Len() int {
|
func (i *Iterator) Len() int {
|
||||||
return i.storage.Len()
|
return i.storage.Len()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToSlice is a convenience function that creates a slice of labels
|
// ToSlice is a convenience function that creates a slice of attributes from
|
||||||
// from the passed iterator. The iterator is set up to start from the
|
// the passed iterator. The iterator is set up to start from the beginning
|
||||||
// beginning before creating the slice.
|
// before creating the slice.
|
||||||
func (i *Iterator) ToSlice() []KeyValue {
|
func (i *Iterator) ToSlice() []KeyValue {
|
||||||
l := i.Len()
|
l := i.Len()
|
||||||
if l == 0 {
|
if l == 0 {
|
||||||
@ -77,12 +88,12 @@ func (i *Iterator) ToSlice() []KeyValue {
|
|||||||
i.idx = -1
|
i.idx = -1
|
||||||
slice := make([]KeyValue, 0, l)
|
slice := make([]KeyValue, 0, l)
|
||||||
for i.Next() {
|
for i.Next() {
|
||||||
slice = append(slice, i.Label())
|
slice = append(slice, i.Attribute())
|
||||||
}
|
}
|
||||||
return slice
|
return slice
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMergeIterator returns a MergeIterator for merging two label sets
|
// NewMergeIterator returns a MergeIterator for merging two attribute sets.
|
||||||
// Duplicates are resolved by taking the value from the first set.
|
// Duplicates are resolved by taking the value from the first set.
|
||||||
func NewMergeIterator(s1, s2 *Set) MergeIterator {
|
func NewMergeIterator(s1, s2 *Set) MergeIterator {
|
||||||
mi := MergeIterator{
|
mi := MergeIterator{
|
||||||
@ -102,42 +113,49 @@ func makeOne(iter Iterator) oneIterator {
|
|||||||
|
|
||||||
func (oi *oneIterator) advance() {
|
func (oi *oneIterator) advance() {
|
||||||
if oi.done = !oi.iter.Next(); !oi.done {
|
if oi.done = !oi.iter.Next(); !oi.done {
|
||||||
oi.label = oi.iter.Label()
|
oi.attr = oi.iter.Attribute()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Next returns true if there is another label available.
|
// Next returns true if there is another attribute available.
|
||||||
func (m *MergeIterator) Next() bool {
|
func (m *MergeIterator) Next() bool {
|
||||||
if m.one.done && m.two.done {
|
if m.one.done && m.two.done {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if m.one.done {
|
if m.one.done {
|
||||||
m.current = m.two.label
|
m.current = m.two.attr
|
||||||
m.two.advance()
|
m.two.advance()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if m.two.done {
|
if m.two.done {
|
||||||
m.current = m.one.label
|
m.current = m.one.attr
|
||||||
m.one.advance()
|
m.one.advance()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if m.one.label.Key == m.two.label.Key {
|
if m.one.attr.Key == m.two.attr.Key {
|
||||||
m.current = m.one.label // first iterator label value wins
|
m.current = m.one.attr // first iterator attribute value wins
|
||||||
m.one.advance()
|
m.one.advance()
|
||||||
m.two.advance()
|
m.two.advance()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if m.one.label.Key < m.two.label.Key {
|
if m.one.attr.Key < m.two.attr.Key {
|
||||||
m.current = m.one.label
|
m.current = m.one.attr
|
||||||
m.one.advance()
|
m.one.advance()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
m.current = m.two.label
|
m.current = m.two.attr
|
||||||
m.two.advance()
|
m.two.advance()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Label returns the current value after Next() returns true.
|
// Label returns the current value after Next() returns true.
|
||||||
|
//
|
||||||
|
// Deprecated: Use Attribute instead.
|
||||||
func (m *MergeIterator) Label() KeyValue {
|
func (m *MergeIterator) Label() KeyValue {
|
||||||
return m.current
|
return m.current
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Attribute returns the current value after Next() returns true.
|
||||||
|
func (m *MergeIterator) Attribute() KeyValue {
|
||||||
|
return m.current
|
||||||
|
}
|
||||||
|
2
vendor/go.opentelemetry.io/otel/attribute/kv.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/attribute/kv.go
generated
vendored
@ -26,7 +26,7 @@ type KeyValue struct {
|
|||||||
|
|
||||||
// Valid returns if kv is a valid OpenTelemetry attribute.
|
// Valid returns if kv is a valid OpenTelemetry attribute.
|
||||||
func (kv KeyValue) Valid() bool {
|
func (kv KeyValue) Valid() bool {
|
||||||
return kv.Key != "" && kv.Value.Type() != INVALID
|
return kv.Key.Defined() && kv.Value.Type() != INVALID
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bool creates a KeyValue with a BOOL Value type.
|
// Bool creates a KeyValue with a BOOL Value type.
|
||||||
|
152
vendor/go.opentelemetry.io/otel/attribute/set.go
generated
vendored
152
vendor/go.opentelemetry.io/otel/attribute/set.go
generated
vendored
@ -21,49 +21,42 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
// Set is the representation for a distinct label set. It
|
// Set is the representation for a distinct attribute set. It manages an
|
||||||
// manages an immutable set of labels, with an internal cache
|
// immutable set of attributes, with an internal cache for storing
|
||||||
// for storing label encodings.
|
// attribute encodings.
|
||||||
//
|
//
|
||||||
// This type supports the `Equivalent` method of comparison
|
// This type supports the Equivalent method of comparison using values of
|
||||||
// using values of type `Distinct`.
|
// type Distinct.
|
||||||
//
|
|
||||||
// This type is used to implement:
|
|
||||||
// 1. Metric labels
|
|
||||||
// 2. Resource sets
|
|
||||||
// 3. Correlation map (TODO)
|
|
||||||
Set struct {
|
Set struct {
|
||||||
equivalent Distinct
|
equivalent Distinct
|
||||||
}
|
}
|
||||||
|
|
||||||
// Distinct wraps a variable-size array of `KeyValue`,
|
// Distinct wraps a variable-size array of KeyValue, constructed with keys
|
||||||
// constructed with keys in sorted order. This can be used as
|
// in sorted order. This can be used as a map key or for equality checking
|
||||||
// a map key or for equality checking between Sets.
|
// between Sets.
|
||||||
Distinct struct {
|
Distinct struct {
|
||||||
iface interface{}
|
iface interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Filter supports removing certain labels from label sets.
|
// Filter supports removing certain attributes from attribute sets. When
|
||||||
// When the filter returns true, the label will be kept in
|
// the filter returns true, the attribute will be kept in the filtered
|
||||||
// the filtered label set. When the filter returns false, the
|
// attribute set. When the filter returns false, the attribute is excluded
|
||||||
// label is excluded from the filtered label set, and the
|
// from the filtered attribute set, and the attribute instead appears in
|
||||||
// label instead appears in the `removed` list of excluded labels.
|
// the removed list of excluded attributes.
|
||||||
Filter func(KeyValue) bool
|
Filter func(KeyValue) bool
|
||||||
|
|
||||||
// Sortable implements `sort.Interface`, used for sorting
|
// Sortable implements sort.Interface, used for sorting KeyValue. This is
|
||||||
// `KeyValue`. This is an exported type to support a
|
// an exported type to support a memory optimization. A pointer to one of
|
||||||
// memory optimization. A pointer to one of these is needed
|
// these is needed for the call to sort.Stable(), which the caller may
|
||||||
// for the call to `sort.Stable()`, which the caller may
|
// provide in order to avoid an allocation. See NewSetWithSortable().
|
||||||
// provide in order to avoid an allocation. See
|
|
||||||
// `NewSetWithSortable()`.
|
|
||||||
Sortable []KeyValue
|
Sortable []KeyValue
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// keyValueType is used in `computeDistinctReflect`.
|
// keyValueType is used in computeDistinctReflect.
|
||||||
keyValueType = reflect.TypeOf(KeyValue{})
|
keyValueType = reflect.TypeOf(KeyValue{})
|
||||||
|
|
||||||
// emptySet is returned for empty label sets.
|
// emptySet is returned for empty attribute sets.
|
||||||
emptySet = &Set{
|
emptySet = &Set{
|
||||||
equivalent: Distinct{
|
equivalent: Distinct{
|
||||||
iface: [0]KeyValue{},
|
iface: [0]KeyValue{},
|
||||||
@ -78,17 +71,17 @@ func EmptySet() *Set {
|
|||||||
return emptySet
|
return emptySet
|
||||||
}
|
}
|
||||||
|
|
||||||
// reflect abbreviates `reflect.ValueOf`.
|
// reflect abbreviates reflect.ValueOf.
|
||||||
func (d Distinct) reflect() reflect.Value {
|
func (d Distinct) reflect() reflect.Value {
|
||||||
return reflect.ValueOf(d.iface)
|
return reflect.ValueOf(d.iface)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Valid returns true if this value refers to a valid `*Set`.
|
// Valid returns true if this value refers to a valid Set.
|
||||||
func (d Distinct) Valid() bool {
|
func (d Distinct) Valid() bool {
|
||||||
return d.iface != nil
|
return d.iface != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Len returns the number of labels in this set.
|
// Len returns the number of attributes in this set.
|
||||||
func (l *Set) Len() int {
|
func (l *Set) Len() int {
|
||||||
if l == nil || !l.equivalent.Valid() {
|
if l == nil || !l.equivalent.Valid() {
|
||||||
return 0
|
return 0
|
||||||
@ -96,7 +89,7 @@ func (l *Set) Len() int {
|
|||||||
return l.equivalent.reflect().Len()
|
return l.equivalent.reflect().Len()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get returns the KeyValue at ordered position `idx` in this set.
|
// Get returns the KeyValue at ordered position idx in this set.
|
||||||
func (l *Set) Get(idx int) (KeyValue, bool) {
|
func (l *Set) Get(idx int) (KeyValue, bool) {
|
||||||
if l == nil {
|
if l == nil {
|
||||||
return KeyValue{}, false
|
return KeyValue{}, false
|
||||||
@ -142,7 +135,7 @@ func (l *Set) HasValue(k Key) bool {
|
|||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iter returns an iterator for visiting the labels in this set.
|
// Iter returns an iterator for visiting the attributes in this set.
|
||||||
func (l *Set) Iter() Iterator {
|
func (l *Set) Iter() Iterator {
|
||||||
return Iterator{
|
return Iterator{
|
||||||
storage: l,
|
storage: l,
|
||||||
@ -150,18 +143,17 @@ func (l *Set) Iter() Iterator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToSlice returns the set of labels belonging to this set, sorted,
|
// ToSlice returns the set of attributes belonging to this set, sorted, where
|
||||||
// where keys appear no more than once.
|
// keys appear no more than once.
|
||||||
func (l *Set) ToSlice() []KeyValue {
|
func (l *Set) ToSlice() []KeyValue {
|
||||||
iter := l.Iter()
|
iter := l.Iter()
|
||||||
return iter.ToSlice()
|
return iter.ToSlice()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Equivalent returns a value that may be used as a map key. The
|
// Equivalent returns a value that may be used as a map key. The Distinct type
|
||||||
// Distinct type guarantees that the result will equal the equivalent
|
// guarantees that the result will equal the equivalent. Distinct value of any
|
||||||
// Distinct value of any label set with the same elements as this,
|
// attribute set with the same elements as this, where sets are made unique by
|
||||||
// where sets are made unique by choosing the last value in the input
|
// choosing the last value in the input for any given key.
|
||||||
// for any given key.
|
|
||||||
func (l *Set) Equivalent() Distinct {
|
func (l *Set) Equivalent() Distinct {
|
||||||
if l == nil || !l.equivalent.Valid() {
|
if l == nil || !l.equivalent.Valid() {
|
||||||
return emptySet.equivalent
|
return emptySet.equivalent
|
||||||
@ -174,8 +166,7 @@ func (l *Set) Equals(o *Set) bool {
|
|||||||
return l.Equivalent() == o.Equivalent()
|
return l.Equivalent() == o.Equivalent()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Encoded returns the encoded form of this set, according to
|
// Encoded returns the encoded form of this set, according to encoder.
|
||||||
// `encoder`.
|
|
||||||
func (l *Set) Encoded(encoder Encoder) string {
|
func (l *Set) Encoded(encoder Encoder) string {
|
||||||
if l == nil || encoder == nil {
|
if l == nil || encoder == nil {
|
||||||
return ""
|
return ""
|
||||||
@ -190,11 +181,11 @@ func empty() Set {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSet returns a new `Set`. See the documentation for
|
// NewSet returns a new Set. See the documentation for
|
||||||
// `NewSetWithSortableFiltered` for more details.
|
// NewSetWithSortableFiltered for more details.
|
||||||
//
|
//
|
||||||
// Except for empty sets, this method adds an additional allocation
|
// Except for empty sets, this method adds an additional allocation compared
|
||||||
// compared with calls that include a `*Sortable`.
|
// with calls that include a Sortable.
|
||||||
func NewSet(kvs ...KeyValue) Set {
|
func NewSet(kvs ...KeyValue) Set {
|
||||||
// Check for empty set.
|
// Check for empty set.
|
||||||
if len(kvs) == 0 {
|
if len(kvs) == 0 {
|
||||||
@ -204,10 +195,10 @@ func NewSet(kvs ...KeyValue) Set {
|
|||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSetWithSortable returns a new `Set`. See the documentation for
|
// NewSetWithSortable returns a new Set. See the documentation for
|
||||||
// `NewSetWithSortableFiltered` for more details.
|
// NewSetWithSortableFiltered for more details.
|
||||||
//
|
//
|
||||||
// This call includes a `*Sortable` option as a memory optimization.
|
// This call includes a Sortable option as a memory optimization.
|
||||||
func NewSetWithSortable(kvs []KeyValue, tmp *Sortable) Set {
|
func NewSetWithSortable(kvs []KeyValue, tmp *Sortable) Set {
|
||||||
// Check for empty set.
|
// Check for empty set.
|
||||||
if len(kvs) == 0 {
|
if len(kvs) == 0 {
|
||||||
@ -217,12 +208,11 @@ func NewSetWithSortable(kvs []KeyValue, tmp *Sortable) Set {
|
|||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSetWithFiltered returns a new `Set`. See the documentation for
|
// NewSetWithFiltered returns a new Set. See the documentation for
|
||||||
// `NewSetWithSortableFiltered` for more details.
|
// NewSetWithSortableFiltered for more details.
|
||||||
//
|
//
|
||||||
// This call includes a `Filter` to include/exclude label keys from
|
// This call includes a Filter to include/exclude attribute keys from the
|
||||||
// the return value. Excluded keys are returned as a slice of label
|
// return value. Excluded keys are returned as a slice of attribute values.
|
||||||
// values.
|
|
||||||
func NewSetWithFiltered(kvs []KeyValue, filter Filter) (Set, []KeyValue) {
|
func NewSetWithFiltered(kvs []KeyValue, filter Filter) (Set, []KeyValue) {
|
||||||
// Check for empty set.
|
// Check for empty set.
|
||||||
if len(kvs) == 0 {
|
if len(kvs) == 0 {
|
||||||
@ -231,7 +221,7 @@ func NewSetWithFiltered(kvs []KeyValue, filter Filter) (Set, []KeyValue) {
|
|||||||
return NewSetWithSortableFiltered(kvs, new(Sortable), filter)
|
return NewSetWithSortableFiltered(kvs, new(Sortable), filter)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSetWithSortableFiltered returns a new `Set`.
|
// NewSetWithSortableFiltered returns a new Set.
|
||||||
//
|
//
|
||||||
// Duplicate keys are eliminated by taking the last value. This
|
// Duplicate keys are eliminated by taking the last value. This
|
||||||
// re-orders the input slice so that unique last-values are contiguous
|
// re-orders the input slice so that unique last-values are contiguous
|
||||||
@ -243,17 +233,16 @@ func NewSetWithFiltered(kvs []KeyValue, filter Filter) (Set, []KeyValue) {
|
|||||||
// - Caller sees the reordering, but doesn't lose values
|
// - Caller sees the reordering, but doesn't lose values
|
||||||
// - Repeated call preserve last-value wins.
|
// - Repeated call preserve last-value wins.
|
||||||
//
|
//
|
||||||
// Note that methods are defined on `*Set`, although this returns `Set`.
|
// Note that methods are defined on Set, although this returns Set. Callers
|
||||||
// Callers can avoid memory allocations by:
|
// can avoid memory allocations by:
|
||||||
//
|
//
|
||||||
// - allocating a `Sortable` for use as a temporary in this method
|
// - allocating a Sortable for use as a temporary in this method
|
||||||
// - allocating a `Set` for storing the return value of this
|
// - allocating a Set for storing the return value of this constructor.
|
||||||
// constructor.
|
|
||||||
//
|
//
|
||||||
// The result maintains a cache of encoded labels, by attribute.EncoderID.
|
// The result maintains a cache of encoded attributes, by attribute.EncoderID.
|
||||||
// This value should not be copied after its first use.
|
// This value should not be copied after its first use.
|
||||||
//
|
//
|
||||||
// The second `[]KeyValue` return value is a list of labels that were
|
// The second []KeyValue return value is a list of attributes that were
|
||||||
// excluded by the Filter (if non-nil).
|
// excluded by the Filter (if non-nil).
|
||||||
func NewSetWithSortableFiltered(kvs []KeyValue, tmp *Sortable, filter Filter) (Set, []KeyValue) {
|
func NewSetWithSortableFiltered(kvs []KeyValue, tmp *Sortable, filter Filter) (Set, []KeyValue) {
|
||||||
// Check for empty set.
|
// Check for empty set.
|
||||||
@ -293,13 +282,13 @@ func NewSetWithSortableFiltered(kvs []KeyValue, tmp *Sortable, filter Filter) (S
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// filterSet reorders `kvs` so that included keys are contiguous at
|
// filterSet reorders kvs so that included keys are contiguous at the end of
|
||||||
// the end of the slice, while excluded keys precede the included keys.
|
// the slice, while excluded keys precede the included keys.
|
||||||
func filterSet(kvs []KeyValue, filter Filter) (Set, []KeyValue) {
|
func filterSet(kvs []KeyValue, filter Filter) (Set, []KeyValue) {
|
||||||
var excluded []KeyValue
|
var excluded []KeyValue
|
||||||
|
|
||||||
// Move labels that do not match the filter so
|
// Move attributes that do not match the filter so they're adjacent before
|
||||||
// they're adjacent before calling computeDistinct().
|
// calling computeDistinct().
|
||||||
distinctPosition := len(kvs)
|
distinctPosition := len(kvs)
|
||||||
|
|
||||||
// Swap indistinct keys forward and distinct keys toward the
|
// Swap indistinct keys forward and distinct keys toward the
|
||||||
@ -319,8 +308,8 @@ func filterSet(kvs []KeyValue, filter Filter) (Set, []KeyValue) {
|
|||||||
}, excluded
|
}, excluded
|
||||||
}
|
}
|
||||||
|
|
||||||
// Filter returns a filtered copy of this `Set`. See the
|
// Filter returns a filtered copy of this Set. See the documentation for
|
||||||
// documentation for `NewSetWithSortableFiltered` for more details.
|
// NewSetWithSortableFiltered for more details.
|
||||||
func (l *Set) Filter(re Filter) (Set, []KeyValue) {
|
func (l *Set) Filter(re Filter) (Set, []KeyValue) {
|
||||||
if re == nil {
|
if re == nil {
|
||||||
return Set{
|
return Set{
|
||||||
@ -333,9 +322,9 @@ func (l *Set) Filter(re Filter) (Set, []KeyValue) {
|
|||||||
return filterSet(l.ToSlice(), re)
|
return filterSet(l.ToSlice(), re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// computeDistinct returns a `Distinct` using either the fixed- or
|
// computeDistinct returns a Distinct using either the fixed- or
|
||||||
// reflect-oriented code path, depending on the size of the input.
|
// reflect-oriented code path, depending on the size of the input. The input
|
||||||
// The input slice is assumed to already be sorted and de-duplicated.
|
// slice is assumed to already be sorted and de-duplicated.
|
||||||
func computeDistinct(kvs []KeyValue) Distinct {
|
func computeDistinct(kvs []KeyValue) Distinct {
|
||||||
iface := computeDistinctFixed(kvs)
|
iface := computeDistinctFixed(kvs)
|
||||||
if iface == nil {
|
if iface == nil {
|
||||||
@ -346,8 +335,8 @@ func computeDistinct(kvs []KeyValue) Distinct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// computeDistinctFixed computes a `Distinct` for small slices. It
|
// computeDistinctFixed computes a Distinct for small slices. It returns nil
|
||||||
// returns nil if the input is too large for this code path.
|
// if the input is too large for this code path.
|
||||||
func computeDistinctFixed(kvs []KeyValue) interface{} {
|
func computeDistinctFixed(kvs []KeyValue) interface{} {
|
||||||
switch len(kvs) {
|
switch len(kvs) {
|
||||||
case 1:
|
case 1:
|
||||||
@ -395,8 +384,8 @@ func computeDistinctFixed(kvs []KeyValue) interface{} {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// computeDistinctReflect computes a `Distinct` using reflection,
|
// computeDistinctReflect computes a Distinct using reflection, works for any
|
||||||
// works for any size input.
|
// size input.
|
||||||
func computeDistinctReflect(kvs []KeyValue) interface{} {
|
func computeDistinctReflect(kvs []KeyValue) interface{} {
|
||||||
at := reflect.New(reflect.ArrayOf(len(kvs), keyValueType)).Elem()
|
at := reflect.New(reflect.ArrayOf(len(kvs), keyValueType)).Elem()
|
||||||
for i, keyValue := range kvs {
|
for i, keyValue := range kvs {
|
||||||
@ -405,22 +394,31 @@ func computeDistinctReflect(kvs []KeyValue) interface{} {
|
|||||||
return at.Interface()
|
return at.Interface()
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalJSON returns the JSON encoding of the `*Set`.
|
// MarshalJSON returns the JSON encoding of the Set.
|
||||||
func (l *Set) MarshalJSON() ([]byte, error) {
|
func (l *Set) MarshalJSON() ([]byte, error) {
|
||||||
return json.Marshal(l.equivalent.iface)
|
return json.Marshal(l.equivalent.iface)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Len implements `sort.Interface`.
|
// MarshalLog is the marshaling function used by the logging system to represent this exporter.
|
||||||
|
func (l Set) MarshalLog() interface{} {
|
||||||
|
kvs := make(map[string]string)
|
||||||
|
for _, kv := range l.ToSlice() {
|
||||||
|
kvs[string(kv.Key)] = kv.Value.Emit()
|
||||||
|
}
|
||||||
|
return kvs
|
||||||
|
}
|
||||||
|
|
||||||
|
// Len implements sort.Interface.
|
||||||
func (l *Sortable) Len() int {
|
func (l *Sortable) Len() int {
|
||||||
return len(*l)
|
return len(*l)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Swap implements `sort.Interface`.
|
// Swap implements sort.Interface.
|
||||||
func (l *Sortable) Swap(i, j int) {
|
func (l *Sortable) Swap(i, j int) {
|
||||||
(*l)[i], (*l)[j] = (*l)[j], (*l)[i]
|
(*l)[i], (*l)[j] = (*l)[j], (*l)[i]
|
||||||
}
|
}
|
||||||
|
|
||||||
// Less implements `sort.Interface`.
|
// Less implements sort.Interface.
|
||||||
func (l *Sortable) Less(i, j int) bool {
|
func (l *Sortable) Less(i, j int) bool {
|
||||||
return (*l)[i].Key < (*l)[j].Key
|
return (*l)[i].Key < (*l)[j].Key
|
||||||
}
|
}
|
||||||
|
4
vendor/go.opentelemetry.io/otel/attribute/value.go
generated
vendored
4
vendor/go.opentelemetry.io/otel/attribute/value.go
generated
vendored
@ -187,7 +187,7 @@ func (v Value) AsFloat64() float64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// AsFloat64Slice returns the []float64 value. Make sure that the Value's type is
|
// AsFloat64Slice returns the []float64 value. Make sure that the Value's type is
|
||||||
// INT64SLICE.
|
// FLOAT64SLICE.
|
||||||
func (v Value) AsFloat64Slice() []float64 {
|
func (v Value) AsFloat64Slice() []float64 {
|
||||||
if s, ok := v.slice.(*[]float64); ok {
|
if s, ok := v.slice.(*[]float64); ok {
|
||||||
return *s
|
return *s
|
||||||
@ -202,7 +202,7 @@ func (v Value) AsString() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// AsStringSlice returns the []string value. Make sure that the Value's type is
|
// AsStringSlice returns the []string value. Make sure that the Value's type is
|
||||||
// INT64SLICE.
|
// STRINGSLICE.
|
||||||
func (v Value) AsStringSlice() []string {
|
func (v Value) AsStringSlice() []string {
|
||||||
if s, ok := v.slice.(*[]string); ok {
|
if s, ok := v.slice.(*[]string); ok {
|
||||||
return *s
|
return *s
|
||||||
|
105
vendor/go.opentelemetry.io/otel/baggage/baggage.go
generated
vendored
105
vendor/go.opentelemetry.io/otel/baggage/baggage.go
generated
vendored
@ -61,45 +61,57 @@ type Property struct {
|
|||||||
// hasValue indicates if a zero-value value means the property does not
|
// hasValue indicates if a zero-value value means the property does not
|
||||||
// have a value or if it was the zero-value.
|
// have a value or if it was the zero-value.
|
||||||
hasValue bool
|
hasValue bool
|
||||||
|
|
||||||
|
// hasData indicates whether the created property contains data or not.
|
||||||
|
// Properties that do not contain data are invalid with no other check
|
||||||
|
// required.
|
||||||
|
hasData bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewKeyProperty(key string) (Property, error) {
|
func NewKeyProperty(key string) (Property, error) {
|
||||||
p := Property{}
|
|
||||||
if !keyRe.MatchString(key) {
|
if !keyRe.MatchString(key) {
|
||||||
return p, fmt.Errorf("%w: %q", errInvalidKey, key)
|
return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidKey, key)
|
||||||
}
|
}
|
||||||
p.key = key
|
|
||||||
|
p := Property{key: key, hasData: true}
|
||||||
return p, nil
|
return p, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewKeyValueProperty(key, value string) (Property, error) {
|
func NewKeyValueProperty(key, value string) (Property, error) {
|
||||||
p := Property{}
|
|
||||||
if !keyRe.MatchString(key) {
|
if !keyRe.MatchString(key) {
|
||||||
return p, fmt.Errorf("%w: %q", errInvalidKey, key)
|
return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidKey, key)
|
||||||
}
|
}
|
||||||
if !valueRe.MatchString(value) {
|
if !valueRe.MatchString(value) {
|
||||||
return p, fmt.Errorf("%w: %q", errInvalidValue, value)
|
return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidValue, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
p := Property{
|
||||||
|
key: key,
|
||||||
|
value: value,
|
||||||
|
hasValue: true,
|
||||||
|
hasData: true,
|
||||||
}
|
}
|
||||||
p.key = key
|
|
||||||
p.value = value
|
|
||||||
p.hasValue = true
|
|
||||||
return p, nil
|
return p, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newInvalidProperty() Property {
|
||||||
|
return Property{}
|
||||||
|
}
|
||||||
|
|
||||||
// parseProperty attempts to decode a Property from the passed string. It
|
// parseProperty attempts to decode a Property from the passed string. It
|
||||||
// returns an error if the input is invalid according to the W3C Baggage
|
// returns an error if the input is invalid according to the W3C Baggage
|
||||||
// specification.
|
// specification.
|
||||||
func parseProperty(property string) (Property, error) {
|
func parseProperty(property string) (Property, error) {
|
||||||
p := Property{}
|
|
||||||
if property == "" {
|
if property == "" {
|
||||||
return p, nil
|
return newInvalidProperty(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
match := propertyRe.FindStringSubmatch(property)
|
match := propertyRe.FindStringSubmatch(property)
|
||||||
if len(match) != 4 {
|
if len(match) != 4 {
|
||||||
return p, fmt.Errorf("%w: %q", errInvalidProperty, property)
|
return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidProperty, property)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p := Property{hasData: true}
|
||||||
if match[1] != "" {
|
if match[1] != "" {
|
||||||
p.key = match[1]
|
p.key = match[1]
|
||||||
} else {
|
} else {
|
||||||
@ -107,6 +119,7 @@ func parseProperty(property string) (Property, error) {
|
|||||||
p.value = match[3]
|
p.value = match[3]
|
||||||
p.hasValue = true
|
p.hasValue = true
|
||||||
}
|
}
|
||||||
|
|
||||||
return p, nil
|
return p, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,6 +130,10 @@ func (p Property) validate() error {
|
|||||||
return fmt.Errorf("invalid property: %w", err)
|
return fmt.Errorf("invalid property: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !p.hasData {
|
||||||
|
return errFunc(fmt.Errorf("%w: %q", errInvalidProperty, p))
|
||||||
|
}
|
||||||
|
|
||||||
if !keyRe.MatchString(p.key) {
|
if !keyRe.MatchString(p.key) {
|
||||||
return errFunc(fmt.Errorf("%w: %q", errInvalidKey, p.key))
|
return errFunc(fmt.Errorf("%w: %q", errInvalidKey, p.key))
|
||||||
}
|
}
|
||||||
@ -220,26 +237,40 @@ func (p properties) String() string {
|
|||||||
type Member struct {
|
type Member struct {
|
||||||
key, value string
|
key, value string
|
||||||
properties properties
|
properties properties
|
||||||
|
|
||||||
|
// hasData indicates whether the created property contains data or not.
|
||||||
|
// Properties that do not contain data are invalid with no other check
|
||||||
|
// required.
|
||||||
|
hasData bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMember returns a new Member from the passed arguments. An error is
|
// NewMember returns a new Member from the passed arguments. An error is
|
||||||
// returned if the created Member would be invalid according to the W3C
|
// returned if the created Member would be invalid according to the W3C
|
||||||
// Baggage specification.
|
// Baggage specification.
|
||||||
func NewMember(key, value string, props ...Property) (Member, error) {
|
func NewMember(key, value string, props ...Property) (Member, error) {
|
||||||
m := Member{key: key, value: value, properties: properties(props).Copy()}
|
m := Member{
|
||||||
|
key: key,
|
||||||
|
value: value,
|
||||||
|
properties: properties(props).Copy(),
|
||||||
|
hasData: true,
|
||||||
|
}
|
||||||
if err := m.validate(); err != nil {
|
if err := m.validate(); err != nil {
|
||||||
return Member{}, err
|
return newInvalidMember(), err
|
||||||
}
|
}
|
||||||
|
|
||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newInvalidMember() Member {
|
||||||
|
return Member{}
|
||||||
|
}
|
||||||
|
|
||||||
// parseMember attempts to decode a Member from the passed string. It returns
|
// parseMember attempts to decode a Member from the passed string. It returns
|
||||||
// an error if the input is invalid according to the W3C Baggage
|
// an error if the input is invalid according to the W3C Baggage
|
||||||
// specification.
|
// specification.
|
||||||
func parseMember(member string) (Member, error) {
|
func parseMember(member string) (Member, error) {
|
||||||
if n := len(member); n > maxBytesPerMembers {
|
if n := len(member); n > maxBytesPerMembers {
|
||||||
return Member{}, fmt.Errorf("%w: %d", errMemberBytes, n)
|
return newInvalidMember(), fmt.Errorf("%w: %d", errMemberBytes, n)
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -254,7 +285,7 @@ func parseMember(member string) (Member, error) {
|
|||||||
for _, pStr := range strings.Split(parts[1], propertyDelimiter) {
|
for _, pStr := range strings.Split(parts[1], propertyDelimiter) {
|
||||||
p, err := parseProperty(pStr)
|
p, err := parseProperty(pStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Member{}, err
|
return newInvalidMember(), err
|
||||||
}
|
}
|
||||||
props = append(props, p)
|
props = append(props, p)
|
||||||
}
|
}
|
||||||
@ -265,16 +296,21 @@ func parseMember(member string) (Member, error) {
|
|||||||
// Take into account a value can contain equal signs (=).
|
// Take into account a value can contain equal signs (=).
|
||||||
kv := strings.SplitN(parts[0], keyValueDelimiter, 2)
|
kv := strings.SplitN(parts[0], keyValueDelimiter, 2)
|
||||||
if len(kv) != 2 {
|
if len(kv) != 2 {
|
||||||
return Member{}, fmt.Errorf("%w: %q", errInvalidMember, member)
|
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidMember, member)
|
||||||
}
|
}
|
||||||
// "Leading and trailing whitespaces are allowed but MUST be trimmed
|
// "Leading and trailing whitespaces are allowed but MUST be trimmed
|
||||||
// when converting the header into a data structure."
|
// when converting the header into a data structure."
|
||||||
key, value = strings.TrimSpace(kv[0]), strings.TrimSpace(kv[1])
|
key = strings.TrimSpace(kv[0])
|
||||||
|
var err error
|
||||||
|
value, err = url.QueryUnescape(strings.TrimSpace(kv[1]))
|
||||||
|
if err != nil {
|
||||||
|
return newInvalidMember(), fmt.Errorf("%w: %q", err, value)
|
||||||
|
}
|
||||||
if !keyRe.MatchString(key) {
|
if !keyRe.MatchString(key) {
|
||||||
return Member{}, fmt.Errorf("%w: %q", errInvalidKey, key)
|
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidKey, key)
|
||||||
}
|
}
|
||||||
if !valueRe.MatchString(value) {
|
if !valueRe.MatchString(value) {
|
||||||
return Member{}, fmt.Errorf("%w: %q", errInvalidValue, value)
|
return newInvalidMember(), fmt.Errorf("%w: %q", errInvalidValue, value)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
// This should never happen unless a developer has changed the string
|
// This should never happen unless a developer has changed the string
|
||||||
@ -283,12 +319,16 @@ func parseMember(member string) (Member, error) {
|
|||||||
panic("failed to parse baggage member")
|
panic("failed to parse baggage member")
|
||||||
}
|
}
|
||||||
|
|
||||||
return Member{key: key, value: value, properties: props}, nil
|
return Member{key: key, value: value, properties: props, hasData: true}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// validate ensures m conforms to the W3C Baggage specification, returning an
|
// validate ensures m conforms to the W3C Baggage specification, returning an
|
||||||
// error otherwise.
|
// error otherwise.
|
||||||
func (m Member) validate() error {
|
func (m Member) validate() error {
|
||||||
|
if !m.hasData {
|
||||||
|
return fmt.Errorf("%w: %q", errInvalidMember, m)
|
||||||
|
}
|
||||||
|
|
||||||
if !keyRe.MatchString(m.key) {
|
if !keyRe.MatchString(m.key) {
|
||||||
return fmt.Errorf("%w: %q", errInvalidKey, m.key)
|
return fmt.Errorf("%w: %q", errInvalidKey, m.key)
|
||||||
}
|
}
|
||||||
@ -324,9 +364,10 @@ type Baggage struct { //nolint:golint
|
|||||||
list baggage.List
|
list baggage.List
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns a new valid Baggage. It returns an error if the passed members
|
// New returns a new valid Baggage. It returns an error if it results in a
|
||||||
// are invalid according to the W3C Baggage specification or if it results in
|
// Baggage exceeding limits set in that specification.
|
||||||
// a Baggage exceeding limits set in that specification.
|
//
|
||||||
|
// It expects all the provided members to have already been validated.
|
||||||
func New(members ...Member) (Baggage, error) {
|
func New(members ...Member) (Baggage, error) {
|
||||||
if len(members) == 0 {
|
if len(members) == 0 {
|
||||||
return Baggage{}, nil
|
return Baggage{}, nil
|
||||||
@ -334,9 +375,10 @@ func New(members ...Member) (Baggage, error) {
|
|||||||
|
|
||||||
b := make(baggage.List)
|
b := make(baggage.List)
|
||||||
for _, m := range members {
|
for _, m := range members {
|
||||||
if err := m.validate(); err != nil {
|
if !m.hasData {
|
||||||
return Baggage{}, err
|
return Baggage{}, errInvalidMember
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenTelemetry resolves duplicates by last-one-wins.
|
// OpenTelemetry resolves duplicates by last-one-wins.
|
||||||
b[m.key] = baggage.Item{
|
b[m.key] = baggage.Item{
|
||||||
Value: m.value,
|
Value: m.value,
|
||||||
@ -401,6 +443,8 @@ func Parse(bStr string) (Baggage, error) {
|
|||||||
//
|
//
|
||||||
// If there is no list-member matching the passed key the returned Member will
|
// If there is no list-member matching the passed key the returned Member will
|
||||||
// be a zero-value Member.
|
// be a zero-value Member.
|
||||||
|
// The returned member is not validated, as we assume the validation happened
|
||||||
|
// when it was added to the Baggage.
|
||||||
func (b Baggage) Member(key string) Member {
|
func (b Baggage) Member(key string) Member {
|
||||||
v, ok := b.list[key]
|
v, ok := b.list[key]
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -408,7 +452,7 @@ func (b Baggage) Member(key string) Member {
|
|||||||
// where a zero-valued Member is included in the Baggage because a
|
// where a zero-valued Member is included in the Baggage because a
|
||||||
// zero-valued Member is invalid according to the W3C Baggage
|
// zero-valued Member is invalid according to the W3C Baggage
|
||||||
// specification (it has an empty key).
|
// specification (it has an empty key).
|
||||||
return Member{}
|
return newInvalidMember()
|
||||||
}
|
}
|
||||||
|
|
||||||
return Member{
|
return Member{
|
||||||
@ -420,6 +464,9 @@ func (b Baggage) Member(key string) Member {
|
|||||||
|
|
||||||
// Members returns all the baggage list-members.
|
// Members returns all the baggage list-members.
|
||||||
// The order of the returned list-members does not have significance.
|
// The order of the returned list-members does not have significance.
|
||||||
|
//
|
||||||
|
// The returned members are not validated, as we assume the validation happened
|
||||||
|
// when they were added to the Baggage.
|
||||||
func (b Baggage) Members() []Member {
|
func (b Baggage) Members() []Member {
|
||||||
if len(b.list) == 0 {
|
if len(b.list) == 0 {
|
||||||
return nil
|
return nil
|
||||||
@ -443,8 +490,8 @@ func (b Baggage) Members() []Member {
|
|||||||
// If member is invalid according to the W3C Baggage specification, an error
|
// If member is invalid according to the W3C Baggage specification, an error
|
||||||
// is returned with the original Baggage.
|
// is returned with the original Baggage.
|
||||||
func (b Baggage) SetMember(member Member) (Baggage, error) {
|
func (b Baggage) SetMember(member Member) (Baggage, error) {
|
||||||
if err := member.validate(); err != nil {
|
if !member.hasData {
|
||||||
return b, fmt.Errorf("%w: %s", errInvalidMember, err)
|
return b, errInvalidMember
|
||||||
}
|
}
|
||||||
|
|
||||||
n := len(b.list)
|
n := len(b.list)
|
||||||
|
34
vendor/go.opentelemetry.io/otel/exporters/otlp/internal/config.go
generated
vendored
Normal file
34
vendor/go.opentelemetry.io/otel/exporters/otlp/internal/config.go
generated
vendored
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
// Package internal contains common functionality for all OTLP exporters.
|
||||||
|
package internal // import "go.opentelemetry.io/otel/exporters/otlp/internal"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"path"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CleanPath returns a path with all spaces trimmed and all redundancies removed. If urlPath is empty or cleaning it results in an empty string, defaultPath is returned instead.
|
||||||
|
func CleanPath(urlPath string, defaultPath string) string {
|
||||||
|
tmp := path.Clean(strings.TrimSpace(urlPath))
|
||||||
|
if tmp == "." {
|
||||||
|
return defaultPath
|
||||||
|
}
|
||||||
|
if !path.IsAbs(tmp) {
|
||||||
|
tmp = fmt.Sprintf("/%s", tmp)
|
||||||
|
}
|
||||||
|
return tmp
|
||||||
|
}
|
148
vendor/go.opentelemetry.io/otel/exporters/otlp/internal/envconfig/envconfig.go
generated
vendored
Normal file
148
vendor/go.opentelemetry.io/otel/exporters/otlp/internal/envconfig/envconfig.go
generated
vendored
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package envconfig // import "go.opentelemetry.io/otel/exporters/otlp/internal/envconfig"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/tls"
|
||||||
|
"crypto/x509"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"net/url"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ConfigFn is the generic function used to set a config.
|
||||||
|
type ConfigFn func(*EnvOptionsReader)
|
||||||
|
|
||||||
|
// EnvOptionsReader reads the required environment variables.
|
||||||
|
type EnvOptionsReader struct {
|
||||||
|
GetEnv func(string) string
|
||||||
|
ReadFile func(string) ([]byte, error)
|
||||||
|
Namespace string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply runs every ConfigFn.
|
||||||
|
func (e *EnvOptionsReader) Apply(opts ...ConfigFn) {
|
||||||
|
for _, o := range opts {
|
||||||
|
o(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetEnvValue gets an OTLP environment variable value of the specified key
|
||||||
|
// using the GetEnv function.
|
||||||
|
// This function prepends the OTLP specified namespace to all key lookups.
|
||||||
|
func (e *EnvOptionsReader) GetEnvValue(key string) (string, bool) {
|
||||||
|
v := strings.TrimSpace(e.GetEnv(keyWithNamespace(e.Namespace, key)))
|
||||||
|
return v, v != ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithString retrieves the specified config and passes it to ConfigFn as a string.
|
||||||
|
func WithString(n string, fn func(string)) func(e *EnvOptionsReader) {
|
||||||
|
return func(e *EnvOptionsReader) {
|
||||||
|
if v, ok := e.GetEnvValue(n); ok {
|
||||||
|
fn(v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithDuration retrieves the specified config and passes it to ConfigFn as a duration.
|
||||||
|
func WithDuration(n string, fn func(time.Duration)) func(e *EnvOptionsReader) {
|
||||||
|
return func(e *EnvOptionsReader) {
|
||||||
|
if v, ok := e.GetEnvValue(n); ok {
|
||||||
|
if d, err := strconv.Atoi(v); err == nil {
|
||||||
|
fn(time.Duration(d) * time.Millisecond)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithHeaders retrieves the specified config and passes it to ConfigFn as a map of HTTP headers.
|
||||||
|
func WithHeaders(n string, fn func(map[string]string)) func(e *EnvOptionsReader) {
|
||||||
|
return func(e *EnvOptionsReader) {
|
||||||
|
if v, ok := e.GetEnvValue(n); ok {
|
||||||
|
fn(stringToHeader(v))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithURL retrieves the specified config and passes it to ConfigFn as a net/url.URL.
|
||||||
|
func WithURL(n string, fn func(*url.URL)) func(e *EnvOptionsReader) {
|
||||||
|
return func(e *EnvOptionsReader) {
|
||||||
|
if v, ok := e.GetEnvValue(n); ok {
|
||||||
|
if u, err := url.Parse(v); err == nil {
|
||||||
|
fn(u)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithTLSConfig retrieves the specified config and passes it to ConfigFn as a crypto/tls.Config.
|
||||||
|
func WithTLSConfig(n string, fn func(*tls.Config)) func(e *EnvOptionsReader) {
|
||||||
|
return func(e *EnvOptionsReader) {
|
||||||
|
if v, ok := e.GetEnvValue(n); ok {
|
||||||
|
if b, err := e.ReadFile(v); err == nil {
|
||||||
|
if c, err := createTLSConfig(b); err == nil {
|
||||||
|
fn(c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func keyWithNamespace(ns, key string) string {
|
||||||
|
if ns == "" {
|
||||||
|
return key
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%s_%s", ns, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
func stringToHeader(value string) map[string]string {
|
||||||
|
headersPairs := strings.Split(value, ",")
|
||||||
|
headers := make(map[string]string)
|
||||||
|
|
||||||
|
for _, header := range headersPairs {
|
||||||
|
nameValue := strings.SplitN(header, "=", 2)
|
||||||
|
if len(nameValue) < 2 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
name, err := url.QueryUnescape(nameValue[0])
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
trimmedName := strings.TrimSpace(name)
|
||||||
|
value, err := url.QueryUnescape(nameValue[1])
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
trimmedValue := strings.TrimSpace(value)
|
||||||
|
|
||||||
|
headers[trimmedName] = trimmedValue
|
||||||
|
}
|
||||||
|
|
||||||
|
return headers
|
||||||
|
}
|
||||||
|
|
||||||
|
func createTLSConfig(certBytes []byte) (*tls.Config, error) {
|
||||||
|
cp := x509.NewCertPool()
|
||||||
|
if ok := cp.AppendCertsFromPEM(certBytes); !ok {
|
||||||
|
return nil, errors.New("failed to append certificate to the cert pool")
|
||||||
|
}
|
||||||
|
|
||||||
|
return &tls.Config{
|
||||||
|
RootCAs: cp,
|
||||||
|
}, nil
|
||||||
|
}
|
16
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/README.md
generated
vendored
16
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/README.md
generated
vendored
@ -38,12 +38,14 @@ override the default configuration. For more information about how each of
|
|||||||
these environment variables is interpreted, see [the OpenTelemetry
|
these environment variables is interpreted, see [the OpenTelemetry
|
||||||
specification](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.8.0/specification/protocol/exporter.md).
|
specification](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.8.0/specification/protocol/exporter.md).
|
||||||
|
|
||||||
| Environment variable | Option | Default value |
|
| Environment variable | Option | Default value |
|
||||||
| ------------------------------------------------------------------------ |------------------------------ | ----------------------------------- |
|
| ------------------------------------------------------------------------ |------------------------------ | -------------------------------------------------------- |
|
||||||
| `OTEL_EXPORTER_OTLP_ENDPOINT` `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` | `WithEndpoint` `WithInsecure` | `https://localhost:4317` |
|
| `OTEL_EXPORTER_OTLP_ENDPOINT` `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` | `WithEndpoint` `WithInsecure` | `https://localhost:4317` or `https://localhost:4318`[^1] |
|
||||||
| `OTEL_EXPORTER_OTLP_CERTIFICATE` `OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE` | `WithTLSClientConfig` | |
|
| `OTEL_EXPORTER_OTLP_CERTIFICATE` `OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE` | `WithTLSClientConfig` | |
|
||||||
| `OTEL_EXPORTER_OTLP_HEADERS` `OTEL_EXPORTER_OTLP_TRACES_HEADERS` | `WithHeaders` | |
|
| `OTEL_EXPORTER_OTLP_HEADERS` `OTEL_EXPORTER_OTLP_TRACES_HEADERS` | `WithHeaders` | |
|
||||||
| `OTEL_EXPORTER_OTLP_COMPRESSION` `OTEL_EXPORTER_OTLP_TRACES_COMPRESSION` | `WithCompression` | |
|
| `OTEL_EXPORTER_OTLP_COMPRESSION` `OTEL_EXPORTER_OTLP_TRACES_COMPRESSION` | `WithCompression` | |
|
||||||
| `OTEL_EXPORTER_OTLP_TIMEOUT` `OTEL_EXPORTER_OTLP_TRACES_TIMEOUT` | `WithTimeout` | `10s` |
|
| `OTEL_EXPORTER_OTLP_TIMEOUT` `OTEL_EXPORTER_OTLP_TRACES_TIMEOUT` | `WithTimeout` | `10s` |
|
||||||
|
|
||||||
|
[^1]: The gRPC client defaults to `https://localhost:4317` and the HTTP client `https://localhost:4318`.
|
||||||
|
|
||||||
Configuration using options have precedence over the environment variables.
|
Configuration using options have precedence over the environment variables.
|
||||||
|
11
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/exporter.go
generated
vendored
11
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/exporter.go
generated
vendored
@ -100,3 +100,14 @@ func NewUnstarted(client Client) *Exporter {
|
|||||||
client: client,
|
client: client,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MarshalLog is the marshaling function used by the logging system to represent this exporter.
|
||||||
|
func (e *Exporter) MarshalLog() interface{} {
|
||||||
|
return struct {
|
||||||
|
Type string
|
||||||
|
Client Client
|
||||||
|
}{
|
||||||
|
Type: "otlptrace",
|
||||||
|
Client: e.client,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
222
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/envconfig.go
generated
vendored
222
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/envconfig.go
generated
vendored
@ -16,65 +16,59 @@ package otlpconfig // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel/exporters/otlp/internal/envconfig"
|
||||||
)
|
)
|
||||||
|
|
||||||
var DefaultEnvOptionsReader = EnvOptionsReader{
|
// DefaultEnvOptionsReader is the default environments reader.
|
||||||
GetEnv: os.Getenv,
|
var DefaultEnvOptionsReader = envconfig.EnvOptionsReader{
|
||||||
ReadFile: ioutil.ReadFile,
|
GetEnv: os.Getenv,
|
||||||
|
ReadFile: ioutil.ReadFile,
|
||||||
|
Namespace: "OTEL_EXPORTER_OTLP",
|
||||||
}
|
}
|
||||||
|
|
||||||
func ApplyGRPCEnvConfigs(cfg *Config) {
|
// ApplyGRPCEnvConfigs applies the env configurations for gRPC.
|
||||||
DefaultEnvOptionsReader.ApplyGRPCEnvConfigs(cfg)
|
func ApplyGRPCEnvConfigs(cfg Config) Config {
|
||||||
}
|
opts := getOptionsFromEnv()
|
||||||
|
|
||||||
func ApplyHTTPEnvConfigs(cfg *Config) {
|
|
||||||
DefaultEnvOptionsReader.ApplyHTTPEnvConfigs(cfg)
|
|
||||||
}
|
|
||||||
|
|
||||||
type EnvOptionsReader struct {
|
|
||||||
GetEnv func(string) string
|
|
||||||
ReadFile func(filename string) ([]byte, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *EnvOptionsReader) ApplyHTTPEnvConfigs(cfg *Config) {
|
|
||||||
opts := e.GetOptionsFromEnv()
|
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
opt.ApplyHTTPOption(cfg)
|
cfg = opt.ApplyGRPCOption(cfg)
|
||||||
}
|
}
|
||||||
|
return cfg
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *EnvOptionsReader) ApplyGRPCEnvConfigs(cfg *Config) {
|
// ApplyHTTPEnvConfigs applies the env configurations for HTTP.
|
||||||
opts := e.GetOptionsFromEnv()
|
func ApplyHTTPEnvConfigs(cfg Config) Config {
|
||||||
|
opts := getOptionsFromEnv()
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
opt.ApplyGRPCOption(cfg)
|
cfg = opt.ApplyHTTPOption(cfg)
|
||||||
}
|
}
|
||||||
|
return cfg
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *EnvOptionsReader) GetOptionsFromEnv() []GenericOption {
|
func getOptionsFromEnv() []GenericOption {
|
||||||
var opts []GenericOption
|
opts := []GenericOption{}
|
||||||
|
|
||||||
// Endpoint
|
DefaultEnvOptionsReader.Apply(
|
||||||
if v, ok := e.getEnvValue("TRACES_ENDPOINT"); ok {
|
envconfig.WithURL("ENDPOINT", func(u *url.URL) {
|
||||||
u, err := url.Parse(v)
|
opts = append(opts, withEndpointScheme(u))
|
||||||
// Ignore invalid values.
|
opts = append(opts, newSplitOption(func(cfg Config) Config {
|
||||||
if err == nil {
|
cfg.Traces.Endpoint = u.Host
|
||||||
// This is used to set the scheme for OTLP/HTTP.
|
// For OTLP/HTTP endpoint URLs without a per-signal
|
||||||
if insecureSchema(u.Scheme) {
|
// configuration, the passed endpoint is used as a base URL
|
||||||
opts = append(opts, WithInsecure())
|
// and the signals are sent to these paths relative to that.
|
||||||
} else {
|
cfg.Traces.URLPath = path.Join(u.Path, DefaultTracesPath)
|
||||||
opts = append(opts, WithSecure())
|
return cfg
|
||||||
}
|
}, withEndpointForGRPC(u)))
|
||||||
opts = append(opts, newSplitOption(func(cfg *Config) {
|
}),
|
||||||
|
envconfig.WithURL("TRACES_ENDPOINT", func(u *url.URL) {
|
||||||
|
opts = append(opts, withEndpointScheme(u))
|
||||||
|
opts = append(opts, newSplitOption(func(cfg Config) Config {
|
||||||
cfg.Traces.Endpoint = u.Host
|
cfg.Traces.Endpoint = u.Host
|
||||||
// For endpoint URLs for OTLP/HTTP per-signal variables, the
|
// For endpoint URLs for OTLP/HTTP per-signal variables, the
|
||||||
// URL MUST be used as-is without any modification. The only
|
// URL MUST be used as-is without any modification. The only
|
||||||
@ -85,137 +79,51 @@ func (e *EnvOptionsReader) GetOptionsFromEnv() []GenericOption {
|
|||||||
path = "/"
|
path = "/"
|
||||||
}
|
}
|
||||||
cfg.Traces.URLPath = path
|
cfg.Traces.URLPath = path
|
||||||
}, func(cfg *Config) {
|
return cfg
|
||||||
// For OTLP/gRPC endpoints, this is the target to which the
|
}, withEndpointForGRPC(u)))
|
||||||
// exporter is going to send telemetry.
|
}),
|
||||||
cfg.Traces.Endpoint = path.Join(u.Host, u.Path)
|
envconfig.WithTLSConfig("CERTIFICATE", func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }),
|
||||||
}))
|
envconfig.WithTLSConfig("TRACES_CERTIFICATE", func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }),
|
||||||
}
|
envconfig.WithHeaders("HEADERS", func(h map[string]string) { opts = append(opts, WithHeaders(h)) }),
|
||||||
} else if v, ok = e.getEnvValue("ENDPOINT"); ok {
|
envconfig.WithHeaders("TRACES_HEADERS", func(h map[string]string) { opts = append(opts, WithHeaders(h)) }),
|
||||||
u, err := url.Parse(v)
|
WithEnvCompression("COMPRESSION", func(c Compression) { opts = append(opts, WithCompression(c)) }),
|
||||||
// Ignore invalid values.
|
WithEnvCompression("TRACES_COMPRESSION", func(c Compression) { opts = append(opts, WithCompression(c)) }),
|
||||||
if err == nil {
|
envconfig.WithDuration("TIMEOUT", func(d time.Duration) { opts = append(opts, WithTimeout(d)) }),
|
||||||
// This is used to set the scheme for OTLP/HTTP.
|
envconfig.WithDuration("TRACES_TIMEOUT", func(d time.Duration) { opts = append(opts, WithTimeout(d)) }),
|
||||||
if insecureSchema(u.Scheme) {
|
)
|
||||||
opts = append(opts, WithInsecure())
|
|
||||||
} else {
|
|
||||||
opts = append(opts, WithSecure())
|
|
||||||
}
|
|
||||||
opts = append(opts, newSplitOption(func(cfg *Config) {
|
|
||||||
cfg.Traces.Endpoint = u.Host
|
|
||||||
// For OTLP/HTTP endpoint URLs without a per-signal
|
|
||||||
// configuration, the passed endpoint is used as a base URL
|
|
||||||
// and the signals are sent to these paths relative to that.
|
|
||||||
cfg.Traces.URLPath = path.Join(u.Path, DefaultTracesPath)
|
|
||||||
}, func(cfg *Config) {
|
|
||||||
// For OTLP/gRPC endpoints, this is the target to which the
|
|
||||||
// exporter is going to send telemetry.
|
|
||||||
cfg.Traces.Endpoint = path.Join(u.Host, u.Path)
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Certificate File
|
|
||||||
if path, ok := e.getEnvValue("CERTIFICATE"); ok {
|
|
||||||
if tls, err := e.readTLSConfig(path); err == nil {
|
|
||||||
opts = append(opts, WithTLSClientConfig(tls))
|
|
||||||
} else {
|
|
||||||
otel.Handle(fmt.Errorf("failed to configure otlp exporter certificate '%s': %w", path, err))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if path, ok := e.getEnvValue("TRACES_CERTIFICATE"); ok {
|
|
||||||
if tls, err := e.readTLSConfig(path); err == nil {
|
|
||||||
opts = append(opts, WithTLSClientConfig(tls))
|
|
||||||
} else {
|
|
||||||
otel.Handle(fmt.Errorf("failed to configure otlp traces exporter certificate '%s': %w", path, err))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Headers
|
|
||||||
if h, ok := e.getEnvValue("HEADERS"); ok {
|
|
||||||
opts = append(opts, WithHeaders(stringToHeader(h)))
|
|
||||||
}
|
|
||||||
if h, ok := e.getEnvValue("TRACES_HEADERS"); ok {
|
|
||||||
opts = append(opts, WithHeaders(stringToHeader(h)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compression
|
|
||||||
if c, ok := e.getEnvValue("COMPRESSION"); ok {
|
|
||||||
opts = append(opts, WithCompression(stringToCompression(c)))
|
|
||||||
}
|
|
||||||
if c, ok := e.getEnvValue("TRACES_COMPRESSION"); ok {
|
|
||||||
opts = append(opts, WithCompression(stringToCompression(c)))
|
|
||||||
}
|
|
||||||
// Timeout
|
|
||||||
if t, ok := e.getEnvValue("TIMEOUT"); ok {
|
|
||||||
if d, err := strconv.Atoi(t); err == nil {
|
|
||||||
opts = append(opts, WithTimeout(time.Duration(d)*time.Millisecond))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if t, ok := e.getEnvValue("TRACES_TIMEOUT"); ok {
|
|
||||||
if d, err := strconv.Atoi(t); err == nil {
|
|
||||||
opts = append(opts, WithTimeout(time.Duration(d)*time.Millisecond))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return opts
|
return opts
|
||||||
}
|
}
|
||||||
|
|
||||||
func insecureSchema(schema string) bool {
|
func withEndpointScheme(u *url.URL) GenericOption {
|
||||||
switch strings.ToLower(schema) {
|
switch strings.ToLower(u.Scheme) {
|
||||||
case "http", "unix":
|
case "http", "unix":
|
||||||
return true
|
return WithInsecure()
|
||||||
default:
|
default:
|
||||||
return false
|
return WithSecure()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// getEnvValue gets an OTLP environment variable value of the specified key using the GetEnv function.
|
func withEndpointForGRPC(u *url.URL) func(cfg Config) Config {
|
||||||
// This function already prepends the OTLP prefix to all key lookup.
|
return func(cfg Config) Config {
|
||||||
func (e *EnvOptionsReader) getEnvValue(key string) (string, bool) {
|
// For OTLP/gRPC endpoints, this is the target to which the
|
||||||
v := strings.TrimSpace(e.GetEnv(fmt.Sprintf("OTEL_EXPORTER_OTLP_%s", key)))
|
// exporter is going to send telemetry.
|
||||||
return v, v != ""
|
cfg.Traces.Endpoint = path.Join(u.Host, u.Path)
|
||||||
}
|
return cfg
|
||||||
|
|
||||||
func (e *EnvOptionsReader) readTLSConfig(path string) (*tls.Config, error) {
|
|
||||||
b, err := e.ReadFile(path)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
return CreateTLSConfig(b)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func stringToCompression(value string) Compression {
|
// WithEnvCompression retrieves the specified config and passes it to ConfigFn as a Compression.
|
||||||
switch value {
|
func WithEnvCompression(n string, fn func(Compression)) func(e *envconfig.EnvOptionsReader) {
|
||||||
case "gzip":
|
return func(e *envconfig.EnvOptionsReader) {
|
||||||
return GzipCompression
|
if v, ok := e.GetEnvValue(n); ok {
|
||||||
}
|
cp := NoCompression
|
||||||
|
switch v {
|
||||||
|
case "gzip":
|
||||||
|
cp = GzipCompression
|
||||||
|
}
|
||||||
|
|
||||||
return NoCompression
|
fn(cp)
|
||||||
}
|
|
||||||
|
|
||||||
func stringToHeader(value string) map[string]string {
|
|
||||||
headersPairs := strings.Split(value, ",")
|
|
||||||
headers := make(map[string]string)
|
|
||||||
|
|
||||||
for _, header := range headersPairs {
|
|
||||||
nameValue := strings.SplitN(header, "=", 2)
|
|
||||||
if len(nameValue) < 2 {
|
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
name, err := url.QueryUnescape(nameValue[0])
|
|
||||||
if err != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
trimmedName := strings.TrimSpace(name)
|
|
||||||
value, err := url.QueryUnescape(nameValue[1])
|
|
||||||
if err != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
trimmedValue := strings.TrimSpace(value)
|
|
||||||
|
|
||||||
headers[trimmedName] = trimmedValue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return headers
|
|
||||||
}
|
}
|
||||||
|
114
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/options.go
generated
vendored
114
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/options.go
generated
vendored
@ -22,8 +22,10 @@ import (
|
|||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/backoff"
|
"google.golang.org/grpc/backoff"
|
||||||
"google.golang.org/grpc/credentials"
|
"google.golang.org/grpc/credentials"
|
||||||
|
"google.golang.org/grpc/credentials/insecure"
|
||||||
"google.golang.org/grpc/encoding/gzip"
|
"google.golang.org/grpc/encoding/gzip"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/internal"
|
||||||
"go.opentelemetry.io/otel/exporters/otlp/internal/retry"
|
"go.opentelemetry.io/otel/exporters/otlp/internal/retry"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -64,27 +66,41 @@ type (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewDefaultConfig() Config {
|
// NewHTTPConfig returns a new Config with all settings applied from opts and
|
||||||
c := Config{
|
// any unset setting using the default HTTP config values.
|
||||||
|
func NewHTTPConfig(opts ...HTTPOption) Config {
|
||||||
|
cfg := Config{
|
||||||
Traces: SignalConfig{
|
Traces: SignalConfig{
|
||||||
Endpoint: fmt.Sprintf("%s:%d", DefaultCollectorHost, DefaultCollectorPort),
|
Endpoint: fmt.Sprintf("%s:%d", DefaultCollectorHost, DefaultCollectorHTTPPort),
|
||||||
URLPath: DefaultTracesPath,
|
URLPath: DefaultTracesPath,
|
||||||
Compression: NoCompression,
|
Compression: NoCompression,
|
||||||
Timeout: DefaultTimeout,
|
Timeout: DefaultTimeout,
|
||||||
},
|
},
|
||||||
RetryConfig: retry.DefaultConfig,
|
RetryConfig: retry.DefaultConfig,
|
||||||
}
|
}
|
||||||
|
cfg = ApplyHTTPEnvConfigs(cfg)
|
||||||
return c
|
for _, opt := range opts {
|
||||||
|
cfg = opt.ApplyHTTPOption(cfg)
|
||||||
|
}
|
||||||
|
cfg.Traces.URLPath = internal.CleanPath(cfg.Traces.URLPath, DefaultTracesPath)
|
||||||
|
return cfg
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGRPCConfig returns a new Config with all settings applied from opts and
|
// NewGRPCConfig returns a new Config with all settings applied from opts and
|
||||||
// any unset setting using the default gRPC config values.
|
// any unset setting using the default gRPC config values.
|
||||||
func NewGRPCConfig(opts ...GRPCOption) Config {
|
func NewGRPCConfig(opts ...GRPCOption) Config {
|
||||||
cfg := NewDefaultConfig()
|
cfg := Config{
|
||||||
ApplyGRPCEnvConfigs(&cfg)
|
Traces: SignalConfig{
|
||||||
|
Endpoint: fmt.Sprintf("%s:%d", DefaultCollectorHost, DefaultCollectorGRPCPort),
|
||||||
|
URLPath: DefaultTracesPath,
|
||||||
|
Compression: NoCompression,
|
||||||
|
Timeout: DefaultTimeout,
|
||||||
|
},
|
||||||
|
RetryConfig: retry.DefaultConfig,
|
||||||
|
}
|
||||||
|
cfg = ApplyGRPCEnvConfigs(cfg)
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
opt.ApplyGRPCOption(&cfg)
|
cfg = opt.ApplyGRPCOption(cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg.ServiceConfig != "" {
|
if cfg.ServiceConfig != "" {
|
||||||
@ -94,7 +110,7 @@ func NewGRPCConfig(opts ...GRPCOption) Config {
|
|||||||
if cfg.Traces.GRPCCredentials != nil {
|
if cfg.Traces.GRPCCredentials != nil {
|
||||||
cfg.DialOptions = append(cfg.DialOptions, grpc.WithTransportCredentials(cfg.Traces.GRPCCredentials))
|
cfg.DialOptions = append(cfg.DialOptions, grpc.WithTransportCredentials(cfg.Traces.GRPCCredentials))
|
||||||
} else if cfg.Traces.Insecure {
|
} else if cfg.Traces.Insecure {
|
||||||
cfg.DialOptions = append(cfg.DialOptions, grpc.WithInsecure())
|
cfg.DialOptions = append(cfg.DialOptions, grpc.WithTransportCredentials(insecure.NewCredentials()))
|
||||||
} else {
|
} else {
|
||||||
// Default to using the host's root CA.
|
// Default to using the host's root CA.
|
||||||
creds := credentials.NewTLS(nil)
|
creds := credentials.NewTLS(nil)
|
||||||
@ -121,8 +137,8 @@ func NewGRPCConfig(opts ...GRPCOption) Config {
|
|||||||
type (
|
type (
|
||||||
// GenericOption applies an option to the HTTP or gRPC driver.
|
// GenericOption applies an option to the HTTP or gRPC driver.
|
||||||
GenericOption interface {
|
GenericOption interface {
|
||||||
ApplyHTTPOption(*Config)
|
ApplyHTTPOption(Config) Config
|
||||||
ApplyGRPCOption(*Config)
|
ApplyGRPCOption(Config) Config
|
||||||
|
|
||||||
// A private method to prevent users implementing the
|
// A private method to prevent users implementing the
|
||||||
// interface and so future additions to it will not
|
// interface and so future additions to it will not
|
||||||
@ -132,7 +148,7 @@ type (
|
|||||||
|
|
||||||
// HTTPOption applies an option to the HTTP driver.
|
// HTTPOption applies an option to the HTTP driver.
|
||||||
HTTPOption interface {
|
HTTPOption interface {
|
||||||
ApplyHTTPOption(*Config)
|
ApplyHTTPOption(Config) Config
|
||||||
|
|
||||||
// A private method to prevent users implementing the
|
// A private method to prevent users implementing the
|
||||||
// interface and so future additions to it will not
|
// interface and so future additions to it will not
|
||||||
@ -142,7 +158,7 @@ type (
|
|||||||
|
|
||||||
// GRPCOption applies an option to the gRPC driver.
|
// GRPCOption applies an option to the gRPC driver.
|
||||||
GRPCOption interface {
|
GRPCOption interface {
|
||||||
ApplyGRPCOption(*Config)
|
ApplyGRPCOption(Config) Config
|
||||||
|
|
||||||
// A private method to prevent users implementing the
|
// A private method to prevent users implementing the
|
||||||
// interface and so future additions to it will not
|
// interface and so future additions to it will not
|
||||||
@ -154,128 +170,138 @@ type (
|
|||||||
// genericOption is an option that applies the same logic
|
// genericOption is an option that applies the same logic
|
||||||
// for both gRPC and HTTP.
|
// for both gRPC and HTTP.
|
||||||
type genericOption struct {
|
type genericOption struct {
|
||||||
fn func(*Config)
|
fn func(Config) Config
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *genericOption) ApplyGRPCOption(cfg *Config) {
|
func (g *genericOption) ApplyGRPCOption(cfg Config) Config {
|
||||||
g.fn(cfg)
|
return g.fn(cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *genericOption) ApplyHTTPOption(cfg *Config) {
|
func (g *genericOption) ApplyHTTPOption(cfg Config) Config {
|
||||||
g.fn(cfg)
|
return g.fn(cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (genericOption) private() {}
|
func (genericOption) private() {}
|
||||||
|
|
||||||
func newGenericOption(fn func(cfg *Config)) GenericOption {
|
func newGenericOption(fn func(cfg Config) Config) GenericOption {
|
||||||
return &genericOption{fn: fn}
|
return &genericOption{fn: fn}
|
||||||
}
|
}
|
||||||
|
|
||||||
// splitOption is an option that applies different logics
|
// splitOption is an option that applies different logics
|
||||||
// for gRPC and HTTP.
|
// for gRPC and HTTP.
|
||||||
type splitOption struct {
|
type splitOption struct {
|
||||||
httpFn func(*Config)
|
httpFn func(Config) Config
|
||||||
grpcFn func(*Config)
|
grpcFn func(Config) Config
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *splitOption) ApplyGRPCOption(cfg *Config) {
|
func (g *splitOption) ApplyGRPCOption(cfg Config) Config {
|
||||||
g.grpcFn(cfg)
|
return g.grpcFn(cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *splitOption) ApplyHTTPOption(cfg *Config) {
|
func (g *splitOption) ApplyHTTPOption(cfg Config) Config {
|
||||||
g.httpFn(cfg)
|
return g.httpFn(cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (splitOption) private() {}
|
func (splitOption) private() {}
|
||||||
|
|
||||||
func newSplitOption(httpFn func(cfg *Config), grpcFn func(cfg *Config)) GenericOption {
|
func newSplitOption(httpFn func(cfg Config) Config, grpcFn func(cfg Config) Config) GenericOption {
|
||||||
return &splitOption{httpFn: httpFn, grpcFn: grpcFn}
|
return &splitOption{httpFn: httpFn, grpcFn: grpcFn}
|
||||||
}
|
}
|
||||||
|
|
||||||
// httpOption is an option that is only applied to the HTTP driver.
|
// httpOption is an option that is only applied to the HTTP driver.
|
||||||
type httpOption struct {
|
type httpOption struct {
|
||||||
fn func(*Config)
|
fn func(Config) Config
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *httpOption) ApplyHTTPOption(cfg *Config) {
|
func (h *httpOption) ApplyHTTPOption(cfg Config) Config {
|
||||||
h.fn(cfg)
|
return h.fn(cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (httpOption) private() {}
|
func (httpOption) private() {}
|
||||||
|
|
||||||
func NewHTTPOption(fn func(cfg *Config)) HTTPOption {
|
func NewHTTPOption(fn func(cfg Config) Config) HTTPOption {
|
||||||
return &httpOption{fn: fn}
|
return &httpOption{fn: fn}
|
||||||
}
|
}
|
||||||
|
|
||||||
// grpcOption is an option that is only applied to the gRPC driver.
|
// grpcOption is an option that is only applied to the gRPC driver.
|
||||||
type grpcOption struct {
|
type grpcOption struct {
|
||||||
fn func(*Config)
|
fn func(Config) Config
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *grpcOption) ApplyGRPCOption(cfg *Config) {
|
func (h *grpcOption) ApplyGRPCOption(cfg Config) Config {
|
||||||
h.fn(cfg)
|
return h.fn(cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (grpcOption) private() {}
|
func (grpcOption) private() {}
|
||||||
|
|
||||||
func NewGRPCOption(fn func(cfg *Config)) GRPCOption {
|
func NewGRPCOption(fn func(cfg Config) Config) GRPCOption {
|
||||||
return &grpcOption{fn: fn}
|
return &grpcOption{fn: fn}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generic Options
|
// Generic Options
|
||||||
|
|
||||||
func WithEndpoint(endpoint string) GenericOption {
|
func WithEndpoint(endpoint string) GenericOption {
|
||||||
return newGenericOption(func(cfg *Config) {
|
return newGenericOption(func(cfg Config) Config {
|
||||||
cfg.Traces.Endpoint = endpoint
|
cfg.Traces.Endpoint = endpoint
|
||||||
|
return cfg
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithCompression(compression Compression) GenericOption {
|
func WithCompression(compression Compression) GenericOption {
|
||||||
return newGenericOption(func(cfg *Config) {
|
return newGenericOption(func(cfg Config) Config {
|
||||||
cfg.Traces.Compression = compression
|
cfg.Traces.Compression = compression
|
||||||
|
return cfg
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithURLPath(urlPath string) GenericOption {
|
func WithURLPath(urlPath string) GenericOption {
|
||||||
return newGenericOption(func(cfg *Config) {
|
return newGenericOption(func(cfg Config) Config {
|
||||||
cfg.Traces.URLPath = urlPath
|
cfg.Traces.URLPath = urlPath
|
||||||
|
return cfg
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithRetry(rc retry.Config) GenericOption {
|
func WithRetry(rc retry.Config) GenericOption {
|
||||||
return newGenericOption(func(cfg *Config) {
|
return newGenericOption(func(cfg Config) Config {
|
||||||
cfg.RetryConfig = rc
|
cfg.RetryConfig = rc
|
||||||
|
return cfg
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithTLSClientConfig(tlsCfg *tls.Config) GenericOption {
|
func WithTLSClientConfig(tlsCfg *tls.Config) GenericOption {
|
||||||
return newSplitOption(func(cfg *Config) {
|
return newSplitOption(func(cfg Config) Config {
|
||||||
cfg.Traces.TLSCfg = tlsCfg.Clone()
|
cfg.Traces.TLSCfg = tlsCfg.Clone()
|
||||||
}, func(cfg *Config) {
|
return cfg
|
||||||
|
}, func(cfg Config) Config {
|
||||||
cfg.Traces.GRPCCredentials = credentials.NewTLS(tlsCfg)
|
cfg.Traces.GRPCCredentials = credentials.NewTLS(tlsCfg)
|
||||||
|
return cfg
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithInsecure() GenericOption {
|
func WithInsecure() GenericOption {
|
||||||
return newGenericOption(func(cfg *Config) {
|
return newGenericOption(func(cfg Config) Config {
|
||||||
cfg.Traces.Insecure = true
|
cfg.Traces.Insecure = true
|
||||||
|
return cfg
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithSecure() GenericOption {
|
func WithSecure() GenericOption {
|
||||||
return newGenericOption(func(cfg *Config) {
|
return newGenericOption(func(cfg Config) Config {
|
||||||
cfg.Traces.Insecure = false
|
cfg.Traces.Insecure = false
|
||||||
|
return cfg
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithHeaders(headers map[string]string) GenericOption {
|
func WithHeaders(headers map[string]string) GenericOption {
|
||||||
return newGenericOption(func(cfg *Config) {
|
return newGenericOption(func(cfg Config) Config {
|
||||||
cfg.Traces.Headers = headers
|
cfg.Traces.Headers = headers
|
||||||
|
return cfg
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithTimeout(duration time.Duration) GenericOption {
|
func WithTimeout(duration time.Duration) GenericOption {
|
||||||
return newGenericOption(func(cfg *Config) {
|
return newGenericOption(func(cfg Config) Config {
|
||||||
cfg.Traces.Timeout = duration
|
cfg.Traces.Timeout = duration
|
||||||
|
return cfg
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -15,9 +15,10 @@
|
|||||||
package otlpconfig // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig"
|
package otlpconfig // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig"
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// DefaultCollectorPort is the port the Exporter will attempt connect to
|
// DefaultCollectorGRPCPort is the default gRPC port of the collector.
|
||||||
// if no collector port is provided.
|
DefaultCollectorGRPCPort uint16 = 4317
|
||||||
DefaultCollectorPort uint16 = 4317
|
// DefaultCollectorHTTPPort is the default HTTP port of the collector.
|
||||||
|
DefaultCollectorHTTPPort uint16 = 4318
|
||||||
// DefaultCollectorHost is the host address the Exporter will attempt
|
// DefaultCollectorHost is the host address the Exporter will attempt
|
||||||
// connect to if no collector address is provided.
|
// connect to if no collector address is provided.
|
||||||
DefaultCollectorHost string = "localhost"
|
DefaultCollectorHost string = "localhost"
|
||||||
@ -36,7 +37,7 @@ const (
|
|||||||
GzipCompression
|
GzipCompression
|
||||||
)
|
)
|
||||||
|
|
||||||
// Marshaler describes the kind of message format sent to the collector
|
// Marshaler describes the kind of message format sent to the collector.
|
||||||
type Marshaler int
|
type Marshaler int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -19,11 +19,11 @@ import (
|
|||||||
commonpb "go.opentelemetry.io/proto/otlp/common/v1"
|
commonpb "go.opentelemetry.io/proto/otlp/common/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
func InstrumentationLibrary(il instrumentation.Library) *commonpb.InstrumentationLibrary {
|
func InstrumentationScope(il instrumentation.Library) *commonpb.InstrumentationScope {
|
||||||
if il == (instrumentation.Library{}) {
|
if il == (instrumentation.Library{}) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return &commonpb.InstrumentationLibrary{
|
return &commonpb.InstrumentationScope{
|
||||||
Name: il.Name,
|
Name: il.Name,
|
||||||
Version: il.Version,
|
Version: il.Version,
|
||||||
}
|
}
|
||||||
|
68
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform/span.go
generated
vendored
68
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform/span.go
generated
vendored
@ -23,10 +23,6 @@ import (
|
|||||||
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
|
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
|
||||||
maxEventsPerSpan = 128
|
|
||||||
)
|
|
||||||
|
|
||||||
// Spans transforms a slice of OpenTelemetry spans into a slice of OTLP
|
// Spans transforms a slice of OpenTelemetry spans into a slice of OTLP
|
||||||
// ResourceSpans.
|
// ResourceSpans.
|
||||||
func Spans(sdl []tracesdk.ReadOnlySpan) []*tracepb.ResourceSpans {
|
func Spans(sdl []tracesdk.ReadOnlySpan) []*tracepb.ResourceSpans {
|
||||||
@ -36,11 +32,11 @@ func Spans(sdl []tracesdk.ReadOnlySpan) []*tracepb.ResourceSpans {
|
|||||||
|
|
||||||
rsm := make(map[attribute.Distinct]*tracepb.ResourceSpans)
|
rsm := make(map[attribute.Distinct]*tracepb.ResourceSpans)
|
||||||
|
|
||||||
type ilsKey struct {
|
type key struct {
|
||||||
r attribute.Distinct
|
r attribute.Distinct
|
||||||
il instrumentation.Library
|
il instrumentation.Library
|
||||||
}
|
}
|
||||||
ilsm := make(map[ilsKey]*tracepb.InstrumentationLibrarySpans)
|
ssm := make(map[key]*tracepb.ScopeSpans)
|
||||||
|
|
||||||
var resources int
|
var resources int
|
||||||
for _, sd := range sdl {
|
for _, sd := range sdl {
|
||||||
@ -49,30 +45,30 @@ func Spans(sdl []tracesdk.ReadOnlySpan) []*tracepb.ResourceSpans {
|
|||||||
}
|
}
|
||||||
|
|
||||||
rKey := sd.Resource().Equivalent()
|
rKey := sd.Resource().Equivalent()
|
||||||
iKey := ilsKey{
|
k := key{
|
||||||
r: rKey,
|
r: rKey,
|
||||||
il: sd.InstrumentationLibrary(),
|
il: sd.InstrumentationLibrary(),
|
||||||
}
|
}
|
||||||
ils, iOk := ilsm[iKey]
|
scopeSpan, iOk := ssm[k]
|
||||||
if !iOk {
|
if !iOk {
|
||||||
// Either the resource or instrumentation library were unknown.
|
// Either the resource or instrumentation library were unknown.
|
||||||
ils = &tracepb.InstrumentationLibrarySpans{
|
scopeSpan = &tracepb.ScopeSpans{
|
||||||
InstrumentationLibrary: InstrumentationLibrary(sd.InstrumentationLibrary()),
|
Scope: InstrumentationScope(sd.InstrumentationLibrary()),
|
||||||
Spans: []*tracepb.Span{},
|
Spans: []*tracepb.Span{},
|
||||||
SchemaUrl: sd.InstrumentationLibrary().SchemaURL,
|
SchemaUrl: sd.InstrumentationLibrary().SchemaURL,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ils.Spans = append(ils.Spans, span(sd))
|
scopeSpan.Spans = append(scopeSpan.Spans, span(sd))
|
||||||
ilsm[iKey] = ils
|
ssm[k] = scopeSpan
|
||||||
|
|
||||||
rs, rOk := rsm[rKey]
|
rs, rOk := rsm[rKey]
|
||||||
if !rOk {
|
if !rOk {
|
||||||
resources++
|
resources++
|
||||||
// The resource was unknown.
|
// The resource was unknown.
|
||||||
rs = &tracepb.ResourceSpans{
|
rs = &tracepb.ResourceSpans{
|
||||||
Resource: Resource(sd.Resource()),
|
Resource: Resource(sd.Resource()),
|
||||||
InstrumentationLibrarySpans: []*tracepb.InstrumentationLibrarySpans{ils},
|
ScopeSpans: []*tracepb.ScopeSpans{scopeSpan},
|
||||||
SchemaUrl: sd.Resource().SchemaURL(),
|
SchemaUrl: sd.Resource().SchemaURL(),
|
||||||
}
|
}
|
||||||
rsm[rKey] = rs
|
rsm[rKey] = rs
|
||||||
continue
|
continue
|
||||||
@ -82,9 +78,9 @@ func Spans(sdl []tracesdk.ReadOnlySpan) []*tracepb.ResourceSpans {
|
|||||||
// library lookup was unknown because if so we need to add it to the
|
// library lookup was unknown because if so we need to add it to the
|
||||||
// ResourceSpans. Otherwise, the instrumentation library has already
|
// ResourceSpans. Otherwise, the instrumentation library has already
|
||||||
// been seen and the append we did above will be included it in the
|
// been seen and the append we did above will be included it in the
|
||||||
// InstrumentationLibrarySpans reference.
|
// ScopeSpans reference.
|
||||||
if !iOk {
|
if !iOk {
|
||||||
rs.InstrumentationLibrarySpans = append(rs.InstrumentationLibrarySpans, ils)
|
rs.ScopeSpans = append(rs.ScopeSpans, scopeSpan)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,9 +158,10 @@ func links(links []tracesdk.Link) []*tracepb.Span_Link {
|
|||||||
sid := otLink.SpanContext.SpanID()
|
sid := otLink.SpanContext.SpanID()
|
||||||
|
|
||||||
sl = append(sl, &tracepb.Span_Link{
|
sl = append(sl, &tracepb.Span_Link{
|
||||||
TraceId: tid[:],
|
TraceId: tid[:],
|
||||||
SpanId: sid[:],
|
SpanId: sid[:],
|
||||||
Attributes: KeyValues(otLink.Attributes),
|
Attributes: KeyValues(otLink.Attributes),
|
||||||
|
DroppedAttributesCount: uint32(otLink.DroppedAttributeCount),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return sl
|
return sl
|
||||||
@ -176,29 +173,16 @@ func spanEvents(es []tracesdk.Event) []*tracepb.Span_Event {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
evCount := len(es)
|
events := make([]*tracepb.Span_Event, len(es))
|
||||||
if evCount > maxEventsPerSpan {
|
|
||||||
evCount = maxEventsPerSpan
|
|
||||||
}
|
|
||||||
events := make([]*tracepb.Span_Event, 0, evCount)
|
|
||||||
nEvents := 0
|
|
||||||
|
|
||||||
// Transform message events
|
// Transform message events
|
||||||
for _, e := range es {
|
for i := 0; i < len(es); i++ {
|
||||||
if nEvents >= maxEventsPerSpan {
|
events[i] = &tracepb.Span_Event{
|
||||||
break
|
Name: es[i].Name,
|
||||||
|
TimeUnixNano: uint64(es[i].Time.UnixNano()),
|
||||||
|
Attributes: KeyValues(es[i].Attributes),
|
||||||
|
DroppedAttributesCount: uint32(es[i].DroppedAttributeCount),
|
||||||
}
|
}
|
||||||
nEvents++
|
|
||||||
events = append(events,
|
|
||||||
&tracepb.Span_Event{
|
|
||||||
Name: e.Name,
|
|
||||||
TimeUnixNano: uint64(e.Time.UnixNano()),
|
|
||||||
Attributes: KeyValues(e.Attributes),
|
|
||||||
// TODO (rghetia) : Add Drop Counts when supported.
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return events
|
return events
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user