Upgrade OpenTelemetry dependencies
This commit upgrades the packages under go.opentelemetry.io/. Signed-off-by: Kazuyoshi Kato <katokazu@amazon.com>
This commit is contained in:
parent
28ffedd06b
commit
2fb739aa21
@ -8,7 +8,7 @@ require (
|
|||||||
github.com/gogo/googleapis v1.4.0
|
github.com/gogo/googleapis v1.4.0
|
||||||
github.com/gogo/protobuf v1.3.2
|
github.com/gogo/protobuf v1.3.2
|
||||||
github.com/opencontainers/go-digest v1.0.0
|
github.com/opencontainers/go-digest v1.0.0
|
||||||
google.golang.org/grpc v1.41.0
|
google.golang.org/grpc v1.43.0
|
||||||
)
|
)
|
||||||
|
|
||||||
replace (
|
replace (
|
||||||
|
@ -7,7 +7,10 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL
|
|||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
|
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
|
||||||
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
github.com/containerd/ttrpc v1.1.0 h1:GbtyLRxb0gOLR0TYQWt3O6B0NvT8tMdorEHqIQo/lWI=
|
github.com/containerd/ttrpc v1.1.0 h1:GbtyLRxb0gOLR0TYQWt3O6B0NvT8tMdorEHqIQo/lWI=
|
||||||
github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ=
|
github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ=
|
||||||
github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY=
|
github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY=
|
||||||
@ -130,8 +133,8 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8
|
|||||||
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
||||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||||
google.golang.org/grpc v1.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E=
|
google.golang.org/grpc v1.43.0 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM=
|
||||||
google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k=
|
google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
|
19
go.mod
19
go.mod
@ -28,6 +28,7 @@ require (
|
|||||||
github.com/docker/go-units v0.4.0
|
github.com/docker/go-units v0.4.0
|
||||||
github.com/emicklei/go-restful v2.9.5+incompatible
|
github.com/emicklei/go-restful v2.9.5+incompatible
|
||||||
github.com/fsnotify/fsnotify v1.4.9
|
github.com/fsnotify/fsnotify v1.4.9
|
||||||
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/gogo/googleapis v1.4.0
|
github.com/gogo/googleapis v1.4.0
|
||||||
github.com/gogo/protobuf v1.3.2
|
github.com/gogo/protobuf v1.3.2
|
||||||
github.com/google/go-cmp v0.5.6
|
github.com/google/go-cmp v0.5.6
|
||||||
@ -56,15 +57,17 @@ require (
|
|||||||
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.24.0
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0
|
||||||
go.opentelemetry.io/otel v1.0.1
|
go.opentelemetry.io/otel v1.3.0
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0
|
||||||
go.opentelemetry.io/otel/sdk v1.0.1
|
go.opentelemetry.io/otel/sdk v1.3.0
|
||||||
go.opentelemetry.io/otel/trace v1.0.1
|
go.opentelemetry.io/otel/trace v1.3.0
|
||||||
golang.org/x/net v0.0.0-20210825183410-e898025ed96a
|
golang.org/x/net v0.0.0-20211216030914-fe4d6282115f
|
||||||
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-20211025201205-69cdffdb9359
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e
|
||||||
google.golang.org/grpc v1.41.0
|
golang.org/x/text v0.3.7 // indirect
|
||||||
|
google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa // indirect
|
||||||
|
google.golang.org/grpc v1.43.0
|
||||||
google.golang.org/protobuf v1.27.1
|
google.golang.org/protobuf v1.27.1
|
||||||
gotest.tools/v3 v3.0.3
|
gotest.tools/v3 v3.0.3
|
||||||
k8s.io/api v0.22.0
|
k8s.io/api v0.22.0
|
||||||
|
64
go.sum
64
go.sum
@ -81,8 +81,9 @@ github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJm
|
|||||||
github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
|
github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
|
||||||
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
||||||
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 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ=
|
|
||||||
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/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=
|
||||||
@ -101,8 +102,11 @@ github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJ
|
|||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
|
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
|
||||||
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
|
github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
|
||||||
github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
|
github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
|
||||||
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
|
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
|
||||||
@ -224,8 +228,14 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V
|
|||||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||||
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
|
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
|
||||||
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 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc=
|
|
||||||
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.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/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/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||||
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=
|
||||||
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
|
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
|
||||||
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
||||||
@ -624,36 +634,38 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
|||||||
go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0=
|
go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0=
|
||||||
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.24.0 h1:1hCzM7mwQbFQgk3Q4lAVEsGV6NB4Uj6Jt3EU+OiSBc8=
|
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.24.0/go.mod h1:O0cG0vP6TP3c323kh70JmeG1jN69Sn9Z5HxgmeASFWY=
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w=
|
||||||
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.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg=
|
go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y=
|
||||||
go.opentelemetry.io/otel v1.0.1 h1:4XKyXmfqJLOQ7feyV5DB6gsBFZ0ltB8vLtp6pj4JIcc=
|
go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
|
||||||
go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU=
|
|
||||||
go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg=
|
go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg=
|
||||||
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/otlptrace v1.0.1 h1:ofMbch7i29qIUf7VtF+r0HRF6ac0SBaPSziSsKp7wkk=
|
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 h1:R/OBkMoGgfy2fLhs2QhkCI1w4HLEQX92GCcJB6SSdNk=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1/go.mod h1:Kv8liBeVNFkkkbilbgWRpV+wWuu+H5xdOT6HAgd30iw=
|
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/otlptracegrpc v1.0.1 h1:CFMFNoz+CGprjFAFy+RJFrfEe4GBia3RRm2a4fREvCA=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 h1:giGm8w67Ja7amYNfYMdme7xSp2pIxThWopw8+QP51Yk=
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1/go.mod h1:xOvWoTOrQjxjW61xtOmD/WKGRYb/P4NzRo3bs65U6Rk=
|
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/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY=
|
||||||
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.0.1 h1:wXxFEWGo7XfXupPwVJvTBOaPBC9FEg0wB8hMNrKk+cA=
|
go.opentelemetry.io/otel/sdk v1.3.0 h1:3278edCoH89MEJ0Ky8WQXVmDQv3FX4ZJ3Pp+9fJreAI=
|
||||||
go.opentelemetry.io/otel/sdk v1.0.1/go.mod h1:HrdXne+BiwsOHYYkBE5ysIcv2bvdZstxzmCQhxTcZkI=
|
go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
|
||||||
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.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs=
|
go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY=
|
||||||
go.opentelemetry.io/otel/trace v1.0.1 h1:StTeIH6Q3G4r0Fiw34LTokUFESZgIDUr0qIJ7mKmAfw=
|
go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
|
||||||
go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk=
|
|
||||||
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.9.0 h1:C0g6TWmQYvjKRnljRULLWUVJGy8Uvu0NEL/5frY2/t4=
|
go.opentelemetry.io/proto/otlp v0.11.0 h1:cLDgIBTf4lLOlztkhzAEdQsJ4Lj+i5Wc9k6Nn0K1VyU=
|
||||||
go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg=
|
go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ=
|
||||||
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=
|
||||||
|
go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
|
||||||
|
go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
||||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
||||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||||
@ -739,8 +751,9 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b
|
|||||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||||
golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20210825183410-e898025ed96a h1:bRuuGXV8wwSdGTB+CtJf+FjgO1APK1CoO39T4BN/XBw=
|
|
||||||
golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
|
golang.org/x/net v0.0.0-20211216030914-fe4d6282115f h1:hEYJvxw1lSnWIl8X9ofsYMklzaDs90JI2az5YMd4fPM=
|
||||||
|
golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
@ -824,8 +837,9 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359 h1:2B5p2L5IfGiD7+b9BOoRMC6DgObAVZV+Fsp050NqXik=
|
|
||||||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE=
|
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE=
|
||||||
@ -836,8 +850,9 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3
|
|||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
|
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
||||||
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
@ -891,6 +906,7 @@ golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4X
|
|||||||
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
|
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
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=
|
||||||
@ -930,11 +946,11 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp
|
|||||||
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
||||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||||
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||||
google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
|
||||||
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||||
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
||||||
google.golang.org/grpc v1.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E=
|
google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
||||||
google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k=
|
google.golang.org/grpc v1.43.0 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM=
|
||||||
|
google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
|
@ -18,7 +18,7 @@ require (
|
|||||||
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417
|
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/sirupsen/logrus v1.8.1
|
github.com/sirupsen/logrus v1.8.1
|
||||||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e
|
||||||
gotest.tools/v3 v3.0.3
|
gotest.tools/v3 v3.0.3
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -82,6 +82,7 @@ github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJm
|
|||||||
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
||||||
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/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=
|
||||||
@ -99,8 +100,11 @@ github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJ
|
|||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
|
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
|
||||||
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
|
github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
|
||||||
github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
|
github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
|
||||||
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
|
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
|
||||||
@ -213,6 +217,13 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG
|
|||||||
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
|
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
|
||||||
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.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/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/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||||
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=
|
||||||
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
|
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
|
||||||
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
||||||
@ -581,31 +592,31 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
|||||||
go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0=
|
go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0=
|
||||||
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.24.0 h1:1hCzM7mwQbFQgk3Q4lAVEsGV6NB4Uj6Jt3EU+OiSBc8=
|
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.24.0/go.mod h1:O0cG0vP6TP3c323kh70JmeG1jN69Sn9Z5HxgmeASFWY=
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w=
|
||||||
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.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg=
|
go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y=
|
||||||
go.opentelemetry.io/otel v1.0.1 h1:4XKyXmfqJLOQ7feyV5DB6gsBFZ0ltB8vLtp6pj4JIcc=
|
go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
|
||||||
go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU=
|
|
||||||
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/otlptrace v1.0.1/go.mod h1:Kv8liBeVNFkkkbilbgWRpV+wWuu+H5xdOT6HAgd30iw=
|
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/otlptracegrpc v1.0.1/go.mod h1:xOvWoTOrQjxjW61xtOmD/WKGRYb/P4NzRo3bs65U6Rk=
|
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/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY=
|
||||||
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.0.1/go.mod h1:HrdXne+BiwsOHYYkBE5ysIcv2bvdZstxzmCQhxTcZkI=
|
go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
|
||||||
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.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs=
|
go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY=
|
||||||
go.opentelemetry.io/otel/trace v1.0.1 h1:StTeIH6Q3G4r0Fiw34LTokUFESZgIDUr0qIJ7mKmAfw=
|
go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
|
||||||
go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk=
|
|
||||||
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.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg=
|
go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ=
|
||||||
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=
|
||||||
|
go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
||||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
||||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||||
@ -690,8 +701,9 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b
|
|||||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||||
golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20210825183410-e898025ed96a h1:bRuuGXV8wwSdGTB+CtJf+FjgO1APK1CoO39T4BN/XBw=
|
|
||||||
golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
|
golang.org/x/net v0.0.0-20211216030914-fe4d6282115f h1:hEYJvxw1lSnWIl8X9ofsYMklzaDs90JI2az5YMd4fPM=
|
||||||
|
golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
@ -776,8 +788,9 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210820121016-41cdb8703e55/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359 h1:2B5p2L5IfGiD7+b9BOoRMC6DgObAVZV+Fsp050NqXik=
|
|
||||||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
|
||||||
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
@ -787,8 +800,9 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3
|
|||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
|
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
||||||
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
@ -841,6 +855,7 @@ golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4X
|
|||||||
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
|
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
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=
|
||||||
@ -881,11 +896,11 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp
|
|||||||
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
||||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||||
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||||
google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
|
||||||
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||||
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
||||||
google.golang.org/grpc v1.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E=
|
google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
||||||
google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k=
|
google.golang.org/grpc v1.43.0 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM=
|
||||||
|
google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
|
29
vendor/github.com/go-logr/logr/.golangci.yaml
generated
vendored
Normal file
29
vendor/github.com/go-logr/logr/.golangci.yaml
generated
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
run:
|
||||||
|
timeout: 1m
|
||||||
|
tests: true
|
||||||
|
|
||||||
|
linters:
|
||||||
|
disable-all: true
|
||||||
|
enable:
|
||||||
|
- asciicheck
|
||||||
|
- deadcode
|
||||||
|
- errcheck
|
||||||
|
- forcetypeassert
|
||||||
|
- gocritic
|
||||||
|
- gofmt
|
||||||
|
- goimports
|
||||||
|
- gosimple
|
||||||
|
- govet
|
||||||
|
- ineffassign
|
||||||
|
- misspell
|
||||||
|
- revive
|
||||||
|
- staticcheck
|
||||||
|
- structcheck
|
||||||
|
- typecheck
|
||||||
|
- unused
|
||||||
|
- varcheck
|
||||||
|
|
||||||
|
issues:
|
||||||
|
exclude-use-default: false
|
||||||
|
max-issues-per-linter: 0
|
||||||
|
max-same-issues: 10
|
6
vendor/github.com/go-logr/logr/CHANGELOG.md
generated
vendored
Normal file
6
vendor/github.com/go-logr/logr/CHANGELOG.md
generated
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# CHANGELOG
|
||||||
|
|
||||||
|
## v1.0.0-rc1
|
||||||
|
|
||||||
|
This is the first logged release. Major changes (including breaking changes)
|
||||||
|
have occurred since earlier tags.
|
17
vendor/github.com/go-logr/logr/CONTRIBUTING.md
generated
vendored
Normal file
17
vendor/github.com/go-logr/logr/CONTRIBUTING.md
generated
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# Contributing
|
||||||
|
|
||||||
|
Logr is open to pull-requests, provided they fit within the intended scope of
|
||||||
|
the project. Specifically, this library aims to be VERY small and minimalist,
|
||||||
|
with no external dependencies.
|
||||||
|
|
||||||
|
## Compatibility
|
||||||
|
|
||||||
|
This project intends to follow [semantic versioning](http://semver.org) and
|
||||||
|
is very strict about compatibility. Any proposed changes MUST follow those
|
||||||
|
rules.
|
||||||
|
|
||||||
|
## Performance
|
||||||
|
|
||||||
|
As a logging library, logr must be as light-weight as possible. Any proposed
|
||||||
|
code change must include results of running the [benchmark](./benchmark)
|
||||||
|
before and after the change.
|
205
vendor/github.com/go-logr/logr/README.md
generated
vendored
205
vendor/github.com/go-logr/logr/README.md
generated
vendored
@ -1,62 +1,132 @@
|
|||||||
# A more minimal logging API for Go
|
# A minimal logging API for Go
|
||||||
|
|
||||||
|
[](https://pkg.go.dev/github.com/go-logr/logr)
|
||||||
|
|
||||||
|
logr offers an(other) opinion on how Go programs and libraries can do logging
|
||||||
|
without becoming coupled to a particular logging implementation. This is not
|
||||||
|
an implementation of logging - it is an API. In fact it is two APIs with two
|
||||||
|
different sets of users.
|
||||||
|
|
||||||
|
The `Logger` type is intended for application and library authors. It provides
|
||||||
|
a relatively small API which can be used everywhere you want to emit logs. It
|
||||||
|
defers the actual act of writing logs (to files, to stdout, or whatever) to the
|
||||||
|
`LogSink` interface.
|
||||||
|
|
||||||
|
The `LogSink` interface is intended for logging library implementers. It is a
|
||||||
|
pure interface which can be implemented by logging frameworks to provide the actual logging
|
||||||
|
functionality.
|
||||||
|
|
||||||
|
This decoupling allows application and library developers to write code in
|
||||||
|
terms of `logr.Logger` (which has very low dependency fan-out) while the
|
||||||
|
implementation of logging is managed "up stack" (e.g. in or near `main()`.)
|
||||||
|
Application developers can then switch out implementations as necessary.
|
||||||
|
|
||||||
|
Many people assert that libraries should not be logging, and as such efforts
|
||||||
|
like this are pointless. Those people are welcome to convince the authors of
|
||||||
|
the tens-of-thousands of libraries that *DO* write logs that they are all
|
||||||
|
wrong. In the meantime, logr takes a more practical approach.
|
||||||
|
|
||||||
|
## Typical usage
|
||||||
|
|
||||||
|
Somewhere, early in an application's life, it will make a decision about which
|
||||||
|
logging library (implementation) it actually wants to use. Something like:
|
||||||
|
|
||||||
|
```
|
||||||
|
func main() {
|
||||||
|
// ... other setup code ...
|
||||||
|
|
||||||
|
// Create the "root" logger. We have chosen the "logimpl" implementation,
|
||||||
|
// which takes some initial parameters and returns a logr.Logger.
|
||||||
|
logger := logimpl.New(param1, param2)
|
||||||
|
|
||||||
|
// ... other setup code ...
|
||||||
|
```
|
||||||
|
|
||||||
|
Most apps will call into other libraries, create structures to govern the flow,
|
||||||
|
etc. The `logr.Logger` object can be passed to these other libraries, stored
|
||||||
|
in structs, or even used as a package-global variable, if needed. For example:
|
||||||
|
|
||||||
|
```
|
||||||
|
app := createTheAppObject(logger)
|
||||||
|
app.Run()
|
||||||
|
```
|
||||||
|
|
||||||
|
Outside of this early setup, no other packages need to know about the choice of
|
||||||
|
implementation. They write logs in terms of the `logr.Logger` that they
|
||||||
|
received:
|
||||||
|
|
||||||
|
```
|
||||||
|
type appObject struct {
|
||||||
|
// ... other fields ...
|
||||||
|
logger logr.Logger
|
||||||
|
// ... other fields ...
|
||||||
|
}
|
||||||
|
|
||||||
|
func (app *appObject) Run() {
|
||||||
|
app.logger.Info("starting up", "timestamp", time.Now())
|
||||||
|
|
||||||
|
// ... app code ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Background
|
||||||
|
|
||||||
|
If the Go standard library had defined an interface for logging, this project
|
||||||
|
probably would not be needed. Alas, here we are.
|
||||||
|
|
||||||
|
### Inspiration
|
||||||
|
|
||||||
Before you consider this package, please read [this blog post by the
|
Before you consider this package, please read [this blog post by the
|
||||||
inimitable Dave Cheney][warning-makes-no-sense]. I really appreciate what
|
inimitable Dave Cheney][warning-makes-no-sense]. We really appreciate what
|
||||||
he has to say, and it largely aligns with my own experiences. Too many
|
he has to say, and it largely aligns with our own experiences.
|
||||||
choices of levels means inconsistent logs.
|
|
||||||
|
|
||||||
This package offers a purely abstract interface, based on these ideas but with
|
### Differences from Dave's ideas
|
||||||
a few twists. Code can depend on just this interface and have the actual
|
|
||||||
logging implementation be injected from callers. Ideally only `main()` knows
|
|
||||||
what logging implementation is being used.
|
|
||||||
|
|
||||||
# Differences from Dave's ideas
|
|
||||||
|
|
||||||
The main differences are:
|
The main differences are:
|
||||||
|
|
||||||
1) Dave basically proposes doing away with the notion of a logging API in favor
|
1. Dave basically proposes doing away with the notion of a logging API in favor
|
||||||
of `fmt.Printf()`. I disagree, especially when you consider things like output
|
of `fmt.Printf()`. We disagree, especially when you consider things like output
|
||||||
locations, timestamps, file and line decorations, and structured logging. I
|
locations, timestamps, file and line decorations, and structured logging. This
|
||||||
restrict the API to just 2 types of logs: info and error.
|
package restricts the logging API to just 2 types of logs: info and error.
|
||||||
|
|
||||||
Info logs are things you want to tell the user which are not errors. Error
|
Info logs are things you want to tell the user which are not errors. Error
|
||||||
logs are, well, errors. If your code receives an `error` from a subordinate
|
logs are, well, errors. If your code receives an `error` from a subordinate
|
||||||
function call and is logging that `error` *and not returning it*, use error
|
function call and is logging that `error` *and not returning it*, use error
|
||||||
logs.
|
logs.
|
||||||
|
|
||||||
2) Verbosity-levels on info logs. This gives developers a chance to indicate
|
2. Verbosity-levels on info logs. This gives developers a chance to indicate
|
||||||
arbitrary grades of importance for info logs, without assigning names with
|
arbitrary grades of importance for info logs, without assigning names with
|
||||||
semantic meaning such as "warning", "trace", and "debug". Superficially this
|
semantic meaning such as "warning", "trace", and "debug." Superficially this
|
||||||
may feel very similar, but the primary difference is the lack of semantics.
|
may feel very similar, but the primary difference is the lack of semantics.
|
||||||
Because verbosity is a numerical value, it's safe to assume that an app running
|
Because verbosity is a numerical value, it's safe to assume that an app running
|
||||||
with higher verbosity means more (and less important) logs will be generated.
|
with higher verbosity means more (and less important) logs will be generated.
|
||||||
|
|
||||||
This is a BETA grade API.
|
## Implementations (non-exhaustive)
|
||||||
|
|
||||||
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)
|
||||||
- **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**: [klogr](https://git.k8s.io/klog/klogr)
|
- **k8s.io/klog** (for Kubernetes): [klogr](https://git.k8s.io/klog/klogr)
|
||||||
- **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):
|
- **log** (the Go standard library logger): [stdr](https://github.com/go-logr/stdr)
|
||||||
[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)
|
||||||
|
|
||||||
# FAQ
|
## FAQ
|
||||||
|
|
||||||
## Conceptual
|
### Conceptual
|
||||||
|
|
||||||
## Why structured logging?
|
#### Why structured logging?
|
||||||
|
|
||||||
- **Structured logs are more easily queriable**: Since you've got
|
- **Structured logs are more easily queryable**: Since you've got
|
||||||
key-value pairs, it's much easier to query your structured logs for
|
key-value pairs, it's much easier to query your structured logs for
|
||||||
particular values by filtering on the contents of a particular key --
|
particular values by filtering on the contents of a particular key --
|
||||||
think searching request logs for error codes, Kubernetes reconcilers for
|
think searching request logs for error codes, Kubernetes reconcilers for
|
||||||
the name and namespace of the reconciled object, etc
|
the name and namespace of the reconciled object, etc.
|
||||||
|
|
||||||
- **Structured logging makes it easier to have cross-referencable logs**:
|
- **Structured logging makes it easier to have cross-referenceable logs**:
|
||||||
Similarly to searchability, if you maintain conventions around your
|
Similarly to searchability, if you maintain conventions around your
|
||||||
keys, it becomes easy to gather all log lines related to a particular
|
keys, it becomes easy to gather all log lines related to a particular
|
||||||
concept.
|
concept.
|
||||||
@ -65,15 +135,15 @@ There are implementations for the following logging libraries:
|
|||||||
structure to your logs, you've got more precise control over how much
|
structure to your logs, you've got more precise control over how much
|
||||||
information is logged -- you might choose in a particular configuration
|
information is logged -- you might choose in a particular configuration
|
||||||
to log certain keys but not others, only log lines where a certain key
|
to log certain keys but not others, only log lines where a certain key
|
||||||
matches a certain value, etc, instead of just having v-levels and names
|
matches a certain value, etc., instead of just having v-levels and names
|
||||||
to key off of.
|
to key off of.
|
||||||
|
|
||||||
- **Structured logs better represent structured data**: sometimes, the
|
- **Structured logs better represent structured data**: sometimes, the
|
||||||
data that you want to log is inherently structured (think tuple-link
|
data that you want to log is inherently structured (think tuple-link
|
||||||
objects). Structured logs allow you to preserve that structure when
|
objects.) Structured logs allow you to preserve that structure when
|
||||||
outputting.
|
outputting.
|
||||||
|
|
||||||
## Why V-levels?
|
#### Why V-levels?
|
||||||
|
|
||||||
**V-levels give operators an easy way to control the chattiness of log
|
**V-levels give operators an easy way to control the chattiness of log
|
||||||
operations**. V-levels provide a way for a given package to distinguish
|
operations**. V-levels provide a way for a given package to distinguish
|
||||||
@ -81,32 +151,32 @@ the relative importance or verbosity of a given log message. Then, if
|
|||||||
a particular logger or package is logging too many messages, the user
|
a particular logger or package is logging too many messages, the user
|
||||||
of the package can simply change the v-levels for that library.
|
of the package can simply change the v-levels for that library.
|
||||||
|
|
||||||
## Why not more named levels, like Warning?
|
#### Why not named levels, like Info/Warning/Error?
|
||||||
|
|
||||||
Read [Dave Cheney's post][warning-makes-no-sense]. Then read [Differences
|
Read [Dave Cheney's post][warning-makes-no-sense]. Then read [Differences
|
||||||
from Dave's ideas](#differences-from-daves-ideas).
|
from Dave's ideas](#differences-from-daves-ideas).
|
||||||
|
|
||||||
## Why not allow format strings, too?
|
#### Why not allow format strings, too?
|
||||||
|
|
||||||
**Format strings negate many of the benefits of structured logs**:
|
**Format strings negate many of the benefits of structured logs**:
|
||||||
|
|
||||||
- They're not easily searchable without resorting to fuzzy searching,
|
- They're not easily searchable without resorting to fuzzy searching,
|
||||||
regular expressions, etc
|
regular expressions, etc.
|
||||||
|
|
||||||
- They don't store structured data well, since contents are flattened into
|
- They don't store structured data well, since contents are flattened into
|
||||||
a string
|
a string.
|
||||||
|
|
||||||
- They're not cross-referencable
|
- They're not cross-referenceable.
|
||||||
|
|
||||||
- They don't compress easily, since the message is not constant
|
- They don't compress easily, since the message is not constant.
|
||||||
|
|
||||||
(unless you turn positional parameters into key-value pairs with numerical
|
(Unless you turn positional parameters into key-value pairs with numerical
|
||||||
keys, at which point you've gotten key-value logging with meaningless
|
keys, at which point you've gotten key-value logging with meaningless
|
||||||
keys)
|
keys.)
|
||||||
|
|
||||||
## Practical
|
### Practical
|
||||||
|
|
||||||
## Why key-value pairs, and not a map?
|
#### Why key-value pairs, and not a map?
|
||||||
|
|
||||||
Key-value pairs are *much* easier to optimize, especially around
|
Key-value pairs are *much* easier to optimize, especially around
|
||||||
allocations. Zap (a structured logger that inspired logr's interface) has
|
allocations. Zap (a structured logger that inspired logr's interface) has
|
||||||
@ -117,26 +187,26 @@ While the interface ends up being a little less obvious, you get
|
|||||||
potentially better performance, plus avoid making users type
|
potentially better performance, plus avoid making users type
|
||||||
`map[string]string{}` every time they want to log.
|
`map[string]string{}` every time they want to log.
|
||||||
|
|
||||||
## What if my V-levels differ between libraries?
|
#### What if my V-levels differ between libraries?
|
||||||
|
|
||||||
That's fine. Control your V-levels on a per-logger basis, and use the
|
That's fine. Control your V-levels on a per-logger basis, and use the
|
||||||
`WithName` function to pass different loggers to different libraries.
|
`WithName` method to pass different loggers to different libraries.
|
||||||
|
|
||||||
Generally, you should take care to ensure that you have relatively
|
Generally, you should take care to ensure that you have relatively
|
||||||
consistent V-levels within a given logger, however, as this makes deciding
|
consistent V-levels within a given logger, however, as this makes deciding
|
||||||
on what verbosity of logs to request easier.
|
on what verbosity of logs to request easier.
|
||||||
|
|
||||||
## But I *really* want to use a format string!
|
#### But I really want to use a format string!
|
||||||
|
|
||||||
That's not actually a question. Assuming your question is "how do
|
That's not actually a question. Assuming your question is "how do
|
||||||
I convert my mental model of logging with format strings to logging with
|
I convert my mental model of logging with format strings to logging with
|
||||||
constant messages":
|
constant messages":
|
||||||
|
|
||||||
1. figure out what the error actually is, as you'd write in a TL;DR style,
|
1. Figure out what the error actually is, as you'd write in a TL;DR style,
|
||||||
and use that as a message
|
and use that as a message.
|
||||||
|
|
||||||
2. For every place you'd write a format specifier, look to the word before
|
2. For every place you'd write a format specifier, look to the word before
|
||||||
it, and add that as a key value pair
|
it, and add that as a key value pair.
|
||||||
|
|
||||||
For instance, consider the following examples (all taken from spots in the
|
For instance, consider the following examples (all taken from spots in the
|
||||||
Kubernetes codebase):
|
Kubernetes codebase):
|
||||||
@ -150,34 +220,59 @@ Kubernetes codebase):
|
|||||||
response when requesting url", "attempt", retries, "after
|
response when requesting url", "attempt", retries, "after
|
||||||
seconds", seconds, "url", url)`
|
seconds", seconds, "url", url)`
|
||||||
|
|
||||||
If you *really* must use a format string, place it as a key value, and
|
If you *really* must use a format string, use it in a key's value, and
|
||||||
call `fmt.Sprintf` yourself -- for instance, `log.Printf("unable to
|
call `fmt.Sprintf` yourself. For instance: `log.Printf("unable to
|
||||||
reflect over type %T")` becomes `logger.Info("unable to reflect over
|
reflect over type %T")` becomes `logger.Info("unable to reflect over
|
||||||
type", "type", fmt.Sprintf("%T"))`. In general though, the cases where
|
type", "type", fmt.Sprintf("%T"))`. In general though, the cases where
|
||||||
this is necessary should be few and far between.
|
this is necessary should be few and far between.
|
||||||
|
|
||||||
## How do I choose my V-levels?
|
#### How do I choose my V-levels?
|
||||||
|
|
||||||
This is basically the only hard constraint: increase V-levels to denote
|
This is basically the only hard constraint: increase V-levels to denote
|
||||||
more verbose or more debug-y logs.
|
more verbose or more debug-y logs.
|
||||||
|
|
||||||
Otherwise, you can start out with `0` as "you always want to see this",
|
Otherwise, you can start out with `0` as "you always want to see this",
|
||||||
`1` as "common logging that you might *possibly* want to turn off", and
|
`1` as "common logging that you might *possibly* want to turn off", and
|
||||||
`10` as "I would like to performance-test your log collection stack".
|
`10` as "I would like to performance-test your log collection stack."
|
||||||
|
|
||||||
Then gradually choose levels in between as you need them, working your way
|
Then gradually choose levels in between as you need them, working your way
|
||||||
down from 10 (for debug and trace style logs) and up from 1 (for chattier
|
down from 10 (for debug and trace style logs) and up from 1 (for chattier
|
||||||
info-type logs).
|
info-type logs.)
|
||||||
|
|
||||||
## How do I choose my keys
|
#### How do I choose my keys?
|
||||||
|
|
||||||
- make your keys human-readable
|
Keys are fairly flexible, and can hold more or less any string
|
||||||
- constant keys are generally a good idea
|
value. For best compatibility with implementations and consistency
|
||||||
- be consistent across your codebase
|
with existing code in other projects, there are a few conventions you
|
||||||
- keys should naturally match parts of the message string
|
should consider.
|
||||||
|
|
||||||
|
- Make your keys human-readable.
|
||||||
|
- Constant keys are generally a good idea.
|
||||||
|
- Be consistent across your codebase.
|
||||||
|
- Keys should naturally match parts of the message string.
|
||||||
|
- Use lower case for simple keys and
|
||||||
|
[lowerCamelCase](https://en.wiktionary.org/wiki/lowerCamelCase) for
|
||||||
|
more complex ones. Kubernetes is one example of a project that has
|
||||||
|
[adopted that
|
||||||
|
convention](https://github.com/kubernetes/community/blob/HEAD/contributors/devel/sig-instrumentation/migration-to-structured-logging.md#name-arguments).
|
||||||
|
|
||||||
While key names are mostly unrestricted (and spaces are acceptable),
|
While key names are mostly unrestricted (and spaces are acceptable),
|
||||||
it's generally a good idea to stick to printable ascii characters, or at
|
it's generally a good idea to stick to printable ascii characters, or at
|
||||||
least match the general character set of your log lines.
|
least match the general character set of your log lines.
|
||||||
|
|
||||||
|
#### Why should keys be constant values?
|
||||||
|
|
||||||
|
The point of structured logging is to make later log processing easier. Your
|
||||||
|
keys are, effectively, the schema of each log message. If you use different
|
||||||
|
keys across instances of the same log line, you will make your structured logs
|
||||||
|
much harder to use. `Sprintf()` is for values, not for keys!
|
||||||
|
|
||||||
|
#### Why is this not a pure interface?
|
||||||
|
|
||||||
|
The Logger type is implemented as a struct in order to allow the Go compiler to
|
||||||
|
optimize things like high-V `Info` logs that are not triggered. Not all of
|
||||||
|
these implementations are implemented yet, but this structure was suggested as
|
||||||
|
a way to ensure they *can* be implemented. All of the real work is behind the
|
||||||
|
`LogSink` interface.
|
||||||
|
|
||||||
[warning-makes-no-sense]: http://dave.cheney.net/2015/11/05/lets-talk-about-logging
|
[warning-makes-no-sense]: http://dave.cheney.net/2015/11/05/lets-talk-about-logging
|
||||||
|
37
vendor/github.com/go-logr/logr/discard.go
generated
vendored
37
vendor/github.com/go-logr/logr/discard.go
generated
vendored
@ -16,36 +16,39 @@ limitations under the License.
|
|||||||
|
|
||||||
package logr
|
package logr
|
||||||
|
|
||||||
// Discard returns a valid Logger that discards all messages logged to it.
|
// Discard returns a Logger that discards all messages logged to it. It can be
|
||||||
// It can be used whenever the caller is not interested in the logs.
|
// used whenever the caller is not interested in the logs. Logger instances
|
||||||
|
// produced by this function always compare as equal.
|
||||||
func Discard() Logger {
|
func Discard() Logger {
|
||||||
return DiscardLogger{}
|
return Logger{
|
||||||
|
level: 0,
|
||||||
|
sink: discardLogSink{},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DiscardLogger is a Logger that discards all messages.
|
// discardLogSink is a LogSink that discards all messages.
|
||||||
type DiscardLogger struct{}
|
type discardLogSink struct{}
|
||||||
|
|
||||||
func (l DiscardLogger) Enabled() bool {
|
// Verify that it actually implements the interface
|
||||||
|
var _ LogSink = discardLogSink{}
|
||||||
|
|
||||||
|
func (l discardLogSink) Init(RuntimeInfo) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l discardLogSink) Enabled(int) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l DiscardLogger) Info(msg string, keysAndValues ...interface{}) {
|
func (l discardLogSink) Info(int, string, ...interface{}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l DiscardLogger) Error(err error, msg string, keysAndValues ...interface{}) {
|
func (l discardLogSink) Error(error, string, ...interface{}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l DiscardLogger) V(level int) Logger {
|
func (l discardLogSink) WithValues(...interface{}) LogSink {
|
||||||
return l
|
return l
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l DiscardLogger) WithValues(keysAndValues ...interface{}) Logger {
|
func (l discardLogSink) WithName(string) LogSink {
|
||||||
return l
|
return l
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l DiscardLogger) WithName(name string) Logger {
|
|
||||||
return l
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verify that it actually implements the interface
|
|
||||||
var _ Logger = DiscardLogger{}
|
|
||||||
|
759
vendor/github.com/go-logr/logr/funcr/funcr.go
generated
vendored
Normal file
759
vendor/github.com/go-logr/logr/funcr/funcr.go
generated
vendored
Normal file
@ -0,0 +1,759 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2021 The logr 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 funcr implements formatting of structured log messages and
|
||||||
|
// optionally captures the call site and timestamp.
|
||||||
|
//
|
||||||
|
// The simplest way to use it is via its implementation of a
|
||||||
|
// github.com/go-logr/logr.LogSink with output through an arbitrary
|
||||||
|
// "write" function. See New and NewJSON for details.
|
||||||
|
//
|
||||||
|
// Custom LogSinks
|
||||||
|
//
|
||||||
|
// For users who need more control, a funcr.Formatter can be embedded inside
|
||||||
|
// your own custom LogSink implementation. This is useful when the LogSink
|
||||||
|
// needs to implement additional methods, for example.
|
||||||
|
//
|
||||||
|
// Formatting
|
||||||
|
//
|
||||||
|
// This will respect logr.Marshaler, fmt.Stringer, and error interfaces for
|
||||||
|
// values which are being logged. When rendering a struct, funcr will use Go's
|
||||||
|
// standard JSON tags (all except "string").
|
||||||
|
package funcr
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding"
|
||||||
|
"fmt"
|
||||||
|
"path/filepath"
|
||||||
|
"reflect"
|
||||||
|
"runtime"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-logr/logr"
|
||||||
|
)
|
||||||
|
|
||||||
|
// New returns a logr.Logger which is implemented by an arbitrary function.
|
||||||
|
func New(fn func(prefix, args string), opts Options) logr.Logger {
|
||||||
|
return logr.New(newSink(fn, NewFormatter(opts)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewJSON returns a logr.Logger which is implemented by an arbitrary function
|
||||||
|
// and produces JSON output.
|
||||||
|
func NewJSON(fn func(obj string), opts Options) logr.Logger {
|
||||||
|
fnWrapper := func(_, obj string) {
|
||||||
|
fn(obj)
|
||||||
|
}
|
||||||
|
return logr.New(newSink(fnWrapper, NewFormatterJSON(opts)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Underlier exposes access to the underlying logging function. Since
|
||||||
|
// callers only have a logr.Logger, they have to know which
|
||||||
|
// implementation is in use, so this interface is less of an
|
||||||
|
// abstraction and more of a way to test type conversion.
|
||||||
|
type Underlier interface {
|
||||||
|
GetUnderlying() func(prefix, args string)
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSink(fn func(prefix, args string), formatter Formatter) logr.LogSink {
|
||||||
|
l := &fnlogger{
|
||||||
|
Formatter: formatter,
|
||||||
|
write: fn,
|
||||||
|
}
|
||||||
|
// For skipping fnlogger.Info and fnlogger.Error.
|
||||||
|
l.Formatter.AddCallDepth(1)
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
// Options carries parameters which influence the way logs are generated.
|
||||||
|
type Options struct {
|
||||||
|
// LogCaller tells funcr to add a "caller" key to some or all log lines.
|
||||||
|
// This has some overhead, so some users might not want it.
|
||||||
|
LogCaller MessageClass
|
||||||
|
|
||||||
|
// LogCallerFunc tells funcr to also log the calling function name. This
|
||||||
|
// has no effect if caller logging is not enabled (see Options.LogCaller).
|
||||||
|
LogCallerFunc bool
|
||||||
|
|
||||||
|
// LogTimestamp tells funcr to add a "ts" key to log lines. This has some
|
||||||
|
// overhead, so some users might not want it.
|
||||||
|
LogTimestamp bool
|
||||||
|
|
||||||
|
// TimestampFormat tells funcr how to render timestamps when LogTimestamp
|
||||||
|
// is enabled. If not specified, a default format will be used. For more
|
||||||
|
// details, see docs for Go's time.Layout.
|
||||||
|
TimestampFormat string
|
||||||
|
|
||||||
|
// Verbosity tells funcr which V logs to produce. Higher values enable
|
||||||
|
// more logs. Info logs at or below this level will be written, while logs
|
||||||
|
// above this level will be discarded.
|
||||||
|
Verbosity int
|
||||||
|
|
||||||
|
// RenderBuiltinsHook allows users to mutate the list of key-value pairs
|
||||||
|
// while a log line is being rendered. The kvList argument follows logr
|
||||||
|
// conventions - each pair of slice elements is comprised of a string key
|
||||||
|
// and an arbitrary value (verified and sanitized before calling this
|
||||||
|
// hook). The value returned must follow the same conventions. This hook
|
||||||
|
// can be used to audit or modify logged data. For example, you might want
|
||||||
|
// to prefix all of funcr's built-in keys with some string. This hook is
|
||||||
|
// only called for built-in (provided by funcr itself) key-value pairs.
|
||||||
|
// Equivalent hooks are offered for key-value pairs saved via
|
||||||
|
// logr.Logger.WithValues or Formatter.AddValues (see RenderValuesHook) and
|
||||||
|
// for user-provided pairs (see RenderArgsHook).
|
||||||
|
RenderBuiltinsHook func(kvList []interface{}) []interface{}
|
||||||
|
|
||||||
|
// RenderValuesHook is the same as RenderBuiltinsHook, except that it is
|
||||||
|
// only called for key-value pairs saved via logr.Logger.WithValues. See
|
||||||
|
// RenderBuiltinsHook for more details.
|
||||||
|
RenderValuesHook func(kvList []interface{}) []interface{}
|
||||||
|
|
||||||
|
// RenderArgsHook is the same as RenderBuiltinsHook, except that it is only
|
||||||
|
// called for key-value pairs passed directly to Info and Error. See
|
||||||
|
// RenderBuiltinsHook for more details.
|
||||||
|
RenderArgsHook func(kvList []interface{}) []interface{}
|
||||||
|
|
||||||
|
// MaxLogDepth tells funcr how many levels of nested fields (e.g. a struct
|
||||||
|
// that contains a struct, etc.) it may log. Every time it finds a struct,
|
||||||
|
// slice, array, or map the depth is increased by one. When the maximum is
|
||||||
|
// reached, the value will be converted to a string indicating that the max
|
||||||
|
// depth has been exceeded. If this field is not specified, a default
|
||||||
|
// value will be used.
|
||||||
|
MaxLogDepth int
|
||||||
|
}
|
||||||
|
|
||||||
|
// MessageClass indicates which category or categories of messages to consider.
|
||||||
|
type MessageClass int
|
||||||
|
|
||||||
|
const (
|
||||||
|
// None ignores all message classes.
|
||||||
|
None MessageClass = iota
|
||||||
|
// All considers all message classes.
|
||||||
|
All
|
||||||
|
// Info only considers info messages.
|
||||||
|
Info
|
||||||
|
// Error only considers error messages.
|
||||||
|
Error
|
||||||
|
)
|
||||||
|
|
||||||
|
// fnlogger inherits some of its LogSink implementation from Formatter
|
||||||
|
// and just needs to add some glue code.
|
||||||
|
type fnlogger struct {
|
||||||
|
Formatter
|
||||||
|
write func(prefix, args string)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l fnlogger) WithName(name string) logr.LogSink {
|
||||||
|
l.Formatter.AddName(name)
|
||||||
|
return &l
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l fnlogger) WithValues(kvList ...interface{}) logr.LogSink {
|
||||||
|
l.Formatter.AddValues(kvList)
|
||||||
|
return &l
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l fnlogger) WithCallDepth(depth int) logr.LogSink {
|
||||||
|
l.Formatter.AddCallDepth(depth)
|
||||||
|
return &l
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l fnlogger) Info(level int, msg string, kvList ...interface{}) {
|
||||||
|
prefix, args := l.FormatInfo(level, msg, kvList)
|
||||||
|
l.write(prefix, args)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l fnlogger) Error(err error, msg string, kvList ...interface{}) {
|
||||||
|
prefix, args := l.FormatError(err, msg, kvList)
|
||||||
|
l.write(prefix, args)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l fnlogger) GetUnderlying() func(prefix, args string) {
|
||||||
|
return l.write
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assert conformance to the interfaces.
|
||||||
|
var _ logr.LogSink = &fnlogger{}
|
||||||
|
var _ logr.CallDepthLogSink = &fnlogger{}
|
||||||
|
var _ Underlier = &fnlogger{}
|
||||||
|
|
||||||
|
// NewFormatter constructs a Formatter which emits a JSON-like key=value format.
|
||||||
|
func NewFormatter(opts Options) Formatter {
|
||||||
|
return newFormatter(opts, outputKeyValue)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFormatterJSON constructs a Formatter which emits strict JSON.
|
||||||
|
func NewFormatterJSON(opts Options) Formatter {
|
||||||
|
return newFormatter(opts, outputJSON)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Defaults for Options.
|
||||||
|
const defaultTimestampFormat = "2006-01-02 15:04:05.000000"
|
||||||
|
const defaultMaxLogDepth = 16
|
||||||
|
|
||||||
|
func newFormatter(opts Options, outfmt outputFormat) Formatter {
|
||||||
|
if opts.TimestampFormat == "" {
|
||||||
|
opts.TimestampFormat = defaultTimestampFormat
|
||||||
|
}
|
||||||
|
if opts.MaxLogDepth == 0 {
|
||||||
|
opts.MaxLogDepth = defaultMaxLogDepth
|
||||||
|
}
|
||||||
|
f := Formatter{
|
||||||
|
outputFormat: outfmt,
|
||||||
|
prefix: "",
|
||||||
|
values: nil,
|
||||||
|
depth: 0,
|
||||||
|
opts: opts,
|
||||||
|
}
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
|
// Formatter is an opaque struct which can be embedded in a LogSink
|
||||||
|
// implementation. It should be constructed with NewFormatter. Some of
|
||||||
|
// its methods directly implement logr.LogSink.
|
||||||
|
type Formatter struct {
|
||||||
|
outputFormat outputFormat
|
||||||
|
prefix string
|
||||||
|
values []interface{}
|
||||||
|
valuesStr string
|
||||||
|
depth int
|
||||||
|
opts Options
|
||||||
|
}
|
||||||
|
|
||||||
|
// outputFormat indicates which outputFormat to use.
|
||||||
|
type outputFormat int
|
||||||
|
|
||||||
|
const (
|
||||||
|
// outputKeyValue emits a JSON-like key=value format, but not strict JSON.
|
||||||
|
outputKeyValue outputFormat = iota
|
||||||
|
// outputJSON emits strict JSON.
|
||||||
|
outputJSON
|
||||||
|
)
|
||||||
|
|
||||||
|
// PseudoStruct is a list of key-value pairs that gets logged as a struct.
|
||||||
|
type PseudoStruct []interface{}
|
||||||
|
|
||||||
|
// render produces a log line, ready to use.
|
||||||
|
func (f Formatter) render(builtins, args []interface{}) string {
|
||||||
|
// Empirically bytes.Buffer is faster than strings.Builder for this.
|
||||||
|
buf := bytes.NewBuffer(make([]byte, 0, 1024))
|
||||||
|
if f.outputFormat == outputJSON {
|
||||||
|
buf.WriteByte('{')
|
||||||
|
}
|
||||||
|
vals := builtins
|
||||||
|
if hook := f.opts.RenderBuiltinsHook; hook != nil {
|
||||||
|
vals = hook(f.sanitize(vals))
|
||||||
|
}
|
||||||
|
f.flatten(buf, vals, false, false) // keys are ours, no need to escape
|
||||||
|
continuing := len(builtins) > 0
|
||||||
|
if len(f.valuesStr) > 0 {
|
||||||
|
if continuing {
|
||||||
|
if f.outputFormat == outputJSON {
|
||||||
|
buf.WriteByte(',')
|
||||||
|
} else {
|
||||||
|
buf.WriteByte(' ')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continuing = true
|
||||||
|
buf.WriteString(f.valuesStr)
|
||||||
|
}
|
||||||
|
vals = args
|
||||||
|
if hook := f.opts.RenderArgsHook; hook != nil {
|
||||||
|
vals = hook(f.sanitize(vals))
|
||||||
|
}
|
||||||
|
f.flatten(buf, vals, continuing, true) // escape user-provided keys
|
||||||
|
if f.outputFormat == outputJSON {
|
||||||
|
buf.WriteByte('}')
|
||||||
|
}
|
||||||
|
return buf.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
// flatten renders a list of key-value pairs into a buffer. If continuing is
|
||||||
|
// true, it assumes that the buffer has previous values and will emit a
|
||||||
|
// separator (which depends on the output format) before the first pair it
|
||||||
|
// writes. If escapeKeys is true, the keys are assumed to have
|
||||||
|
// non-JSON-compatible characters in them and must be evaluated for escapes.
|
||||||
|
//
|
||||||
|
// This function returns a potentially modified version of kvList, which
|
||||||
|
// ensures that there is a value for every key (adding a value if needed) and
|
||||||
|
// that each key is a string (substituting a key if needed).
|
||||||
|
func (f Formatter) flatten(buf *bytes.Buffer, kvList []interface{}, continuing bool, escapeKeys bool) []interface{} {
|
||||||
|
// This logic overlaps with sanitize() but saves one type-cast per key,
|
||||||
|
// which can be measurable.
|
||||||
|
if len(kvList)%2 != 0 {
|
||||||
|
kvList = append(kvList, noValue)
|
||||||
|
}
|
||||||
|
for i := 0; i < len(kvList); i += 2 {
|
||||||
|
k, ok := kvList[i].(string)
|
||||||
|
if !ok {
|
||||||
|
k = f.nonStringKey(kvList[i])
|
||||||
|
kvList[i] = k
|
||||||
|
}
|
||||||
|
v := kvList[i+1]
|
||||||
|
|
||||||
|
if i > 0 || continuing {
|
||||||
|
if f.outputFormat == outputJSON {
|
||||||
|
buf.WriteByte(',')
|
||||||
|
} else {
|
||||||
|
// In theory the format could be something we don't understand. In
|
||||||
|
// practice, we control it, so it won't be.
|
||||||
|
buf.WriteByte(' ')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if escapeKeys {
|
||||||
|
buf.WriteString(prettyString(k))
|
||||||
|
} else {
|
||||||
|
// this is faster
|
||||||
|
buf.WriteByte('"')
|
||||||
|
buf.WriteString(k)
|
||||||
|
buf.WriteByte('"')
|
||||||
|
}
|
||||||
|
if f.outputFormat == outputJSON {
|
||||||
|
buf.WriteByte(':')
|
||||||
|
} else {
|
||||||
|
buf.WriteByte('=')
|
||||||
|
}
|
||||||
|
buf.WriteString(f.pretty(v))
|
||||||
|
}
|
||||||
|
return kvList
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f Formatter) pretty(value interface{}) string {
|
||||||
|
return f.prettyWithFlags(value, 0, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
flagRawStruct = 0x1 // do not print braces on structs
|
||||||
|
)
|
||||||
|
|
||||||
|
// TODO: This is not fast. Most of the overhead goes here.
|
||||||
|
func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) string {
|
||||||
|
if depth > f.opts.MaxLogDepth {
|
||||||
|
return `"<max-log-depth-exceeded>"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle types that take full control of logging.
|
||||||
|
if v, ok := value.(logr.Marshaler); ok {
|
||||||
|
// Replace the value with what the type wants to get logged.
|
||||||
|
// That then gets handled below via reflection.
|
||||||
|
value = v.MarshalLog()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle types that want to format themselves.
|
||||||
|
switch v := value.(type) {
|
||||||
|
case fmt.Stringer:
|
||||||
|
value = v.String()
|
||||||
|
case error:
|
||||||
|
value = v.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handling the most common types without reflect is a small perf win.
|
||||||
|
switch v := value.(type) {
|
||||||
|
case bool:
|
||||||
|
return strconv.FormatBool(v)
|
||||||
|
case string:
|
||||||
|
return prettyString(v)
|
||||||
|
case int:
|
||||||
|
return strconv.FormatInt(int64(v), 10)
|
||||||
|
case int8:
|
||||||
|
return strconv.FormatInt(int64(v), 10)
|
||||||
|
case int16:
|
||||||
|
return strconv.FormatInt(int64(v), 10)
|
||||||
|
case int32:
|
||||||
|
return strconv.FormatInt(int64(v), 10)
|
||||||
|
case int64:
|
||||||
|
return strconv.FormatInt(int64(v), 10)
|
||||||
|
case uint:
|
||||||
|
return strconv.FormatUint(uint64(v), 10)
|
||||||
|
case uint8:
|
||||||
|
return strconv.FormatUint(uint64(v), 10)
|
||||||
|
case uint16:
|
||||||
|
return strconv.FormatUint(uint64(v), 10)
|
||||||
|
case uint32:
|
||||||
|
return strconv.FormatUint(uint64(v), 10)
|
||||||
|
case uint64:
|
||||||
|
return strconv.FormatUint(v, 10)
|
||||||
|
case uintptr:
|
||||||
|
return strconv.FormatUint(uint64(v), 10)
|
||||||
|
case float32:
|
||||||
|
return strconv.FormatFloat(float64(v), 'f', -1, 32)
|
||||||
|
case float64:
|
||||||
|
return strconv.FormatFloat(v, 'f', -1, 64)
|
||||||
|
case complex64:
|
||||||
|
return `"` + strconv.FormatComplex(complex128(v), 'f', -1, 64) + `"`
|
||||||
|
case complex128:
|
||||||
|
return `"` + strconv.FormatComplex(v, 'f', -1, 128) + `"`
|
||||||
|
case PseudoStruct:
|
||||||
|
buf := bytes.NewBuffer(make([]byte, 0, 1024))
|
||||||
|
v = f.sanitize(v)
|
||||||
|
if flags&flagRawStruct == 0 {
|
||||||
|
buf.WriteByte('{')
|
||||||
|
}
|
||||||
|
for i := 0; i < len(v); i += 2 {
|
||||||
|
if i > 0 {
|
||||||
|
buf.WriteByte(',')
|
||||||
|
}
|
||||||
|
// arbitrary keys might need escaping
|
||||||
|
buf.WriteString(prettyString(v[i].(string)))
|
||||||
|
buf.WriteByte(':')
|
||||||
|
buf.WriteString(f.prettyWithFlags(v[i+1], 0, depth+1))
|
||||||
|
}
|
||||||
|
if flags&flagRawStruct == 0 {
|
||||||
|
buf.WriteByte('}')
|
||||||
|
}
|
||||||
|
return buf.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
buf := bytes.NewBuffer(make([]byte, 0, 256))
|
||||||
|
t := reflect.TypeOf(value)
|
||||||
|
if t == nil {
|
||||||
|
return "null"
|
||||||
|
}
|
||||||
|
v := reflect.ValueOf(value)
|
||||||
|
switch t.Kind() {
|
||||||
|
case reflect.Bool:
|
||||||
|
return strconv.FormatBool(v.Bool())
|
||||||
|
case reflect.String:
|
||||||
|
return prettyString(v.String())
|
||||||
|
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||||
|
return strconv.FormatInt(int64(v.Int()), 10)
|
||||||
|
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
||||||
|
return strconv.FormatUint(uint64(v.Uint()), 10)
|
||||||
|
case reflect.Float32:
|
||||||
|
return strconv.FormatFloat(float64(v.Float()), 'f', -1, 32)
|
||||||
|
case reflect.Float64:
|
||||||
|
return strconv.FormatFloat(v.Float(), 'f', -1, 64)
|
||||||
|
case reflect.Complex64:
|
||||||
|
return `"` + strconv.FormatComplex(complex128(v.Complex()), 'f', -1, 64) + `"`
|
||||||
|
case reflect.Complex128:
|
||||||
|
return `"` + strconv.FormatComplex(v.Complex(), 'f', -1, 128) + `"`
|
||||||
|
case reflect.Struct:
|
||||||
|
if flags&flagRawStruct == 0 {
|
||||||
|
buf.WriteByte('{')
|
||||||
|
}
|
||||||
|
for i := 0; i < t.NumField(); i++ {
|
||||||
|
fld := t.Field(i)
|
||||||
|
if fld.PkgPath != "" {
|
||||||
|
// reflect says this field is only defined for non-exported fields.
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if !v.Field(i).CanInterface() {
|
||||||
|
// reflect isn't clear exactly what this means, but we can't use it.
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
name := ""
|
||||||
|
omitempty := false
|
||||||
|
if tag, found := fld.Tag.Lookup("json"); found {
|
||||||
|
if tag == "-" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if comma := strings.Index(tag, ","); comma != -1 {
|
||||||
|
if n := tag[:comma]; n != "" {
|
||||||
|
name = n
|
||||||
|
}
|
||||||
|
rest := tag[comma:]
|
||||||
|
if strings.Contains(rest, ",omitempty,") || strings.HasSuffix(rest, ",omitempty") {
|
||||||
|
omitempty = true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
name = tag
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if omitempty && isEmpty(v.Field(i)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if i > 0 {
|
||||||
|
buf.WriteByte(',')
|
||||||
|
}
|
||||||
|
if fld.Anonymous && fld.Type.Kind() == reflect.Struct && name == "" {
|
||||||
|
buf.WriteString(f.prettyWithFlags(v.Field(i).Interface(), flags|flagRawStruct, depth+1))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if name == "" {
|
||||||
|
name = fld.Name
|
||||||
|
}
|
||||||
|
// field names can't contain characters which need escaping
|
||||||
|
buf.WriteByte('"')
|
||||||
|
buf.WriteString(name)
|
||||||
|
buf.WriteByte('"')
|
||||||
|
buf.WriteByte(':')
|
||||||
|
buf.WriteString(f.prettyWithFlags(v.Field(i).Interface(), 0, depth+1))
|
||||||
|
}
|
||||||
|
if flags&flagRawStruct == 0 {
|
||||||
|
buf.WriteByte('}')
|
||||||
|
}
|
||||||
|
return buf.String()
|
||||||
|
case reflect.Slice, reflect.Array:
|
||||||
|
buf.WriteByte('[')
|
||||||
|
for i := 0; i < v.Len(); i++ {
|
||||||
|
if i > 0 {
|
||||||
|
buf.WriteByte(',')
|
||||||
|
}
|
||||||
|
e := v.Index(i)
|
||||||
|
buf.WriteString(f.prettyWithFlags(e.Interface(), 0, depth+1))
|
||||||
|
}
|
||||||
|
buf.WriteByte(']')
|
||||||
|
return buf.String()
|
||||||
|
case reflect.Map:
|
||||||
|
buf.WriteByte('{')
|
||||||
|
// This does not sort the map keys, for best perf.
|
||||||
|
it := v.MapRange()
|
||||||
|
i := 0
|
||||||
|
for it.Next() {
|
||||||
|
if i > 0 {
|
||||||
|
buf.WriteByte(',')
|
||||||
|
}
|
||||||
|
// If a map key supports TextMarshaler, use it.
|
||||||
|
keystr := ""
|
||||||
|
if m, ok := it.Key().Interface().(encoding.TextMarshaler); ok {
|
||||||
|
txt, err := m.MarshalText()
|
||||||
|
if err != nil {
|
||||||
|
keystr = fmt.Sprintf("<error-MarshalText: %s>", err.Error())
|
||||||
|
} else {
|
||||||
|
keystr = string(txt)
|
||||||
|
}
|
||||||
|
keystr = prettyString(keystr)
|
||||||
|
} else {
|
||||||
|
// prettyWithFlags will produce already-escaped values
|
||||||
|
keystr = f.prettyWithFlags(it.Key().Interface(), 0, depth+1)
|
||||||
|
if t.Key().Kind() != reflect.String {
|
||||||
|
// JSON only does string keys. Unlike Go's standard JSON, we'll
|
||||||
|
// convert just about anything to a string.
|
||||||
|
keystr = prettyString(keystr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buf.WriteString(keystr)
|
||||||
|
buf.WriteByte(':')
|
||||||
|
buf.WriteString(f.prettyWithFlags(it.Value().Interface(), 0, depth+1))
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
buf.WriteByte('}')
|
||||||
|
return buf.String()
|
||||||
|
case reflect.Ptr, reflect.Interface:
|
||||||
|
if v.IsNil() {
|
||||||
|
return "null"
|
||||||
|
}
|
||||||
|
return f.prettyWithFlags(v.Elem().Interface(), 0, depth)
|
||||||
|
}
|
||||||
|
return fmt.Sprintf(`"<unhandled-%s>"`, t.Kind().String())
|
||||||
|
}
|
||||||
|
|
||||||
|
func prettyString(s string) string {
|
||||||
|
// Avoid escaping (which does allocations) if we can.
|
||||||
|
if needsEscape(s) {
|
||||||
|
return strconv.Quote(s)
|
||||||
|
}
|
||||||
|
b := bytes.NewBuffer(make([]byte, 0, 1024))
|
||||||
|
b.WriteByte('"')
|
||||||
|
b.WriteString(s)
|
||||||
|
b.WriteByte('"')
|
||||||
|
return b.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
// needsEscape determines whether the input string needs to be escaped or not,
|
||||||
|
// without doing any allocations.
|
||||||
|
func needsEscape(s string) bool {
|
||||||
|
for _, r := range s {
|
||||||
|
if !strconv.IsPrint(r) || r == '\\' || r == '"' {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func isEmpty(v reflect.Value) bool {
|
||||||
|
switch v.Kind() {
|
||||||
|
case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
|
||||||
|
return v.Len() == 0
|
||||||
|
case reflect.Bool:
|
||||||
|
return !v.Bool()
|
||||||
|
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||||
|
return v.Int() == 0
|
||||||
|
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
||||||
|
return v.Uint() == 0
|
||||||
|
case reflect.Float32, reflect.Float64:
|
||||||
|
return v.Float() == 0
|
||||||
|
case reflect.Complex64, reflect.Complex128:
|
||||||
|
return v.Complex() == 0
|
||||||
|
case reflect.Interface, reflect.Ptr:
|
||||||
|
return v.IsNil()
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Caller represents the original call site for a log line, after considering
|
||||||
|
// logr.Logger.WithCallDepth and logr.Logger.WithCallStackHelper. The File and
|
||||||
|
// Line fields will always be provided, while the Func field is optional.
|
||||||
|
// Users can set the render hook fields in Options to examine logged key-value
|
||||||
|
// pairs, one of which will be {"caller", Caller} if the Options.LogCaller
|
||||||
|
// field is enabled for the given MessageClass.
|
||||||
|
type Caller struct {
|
||||||
|
// File is the basename of the file for this call site.
|
||||||
|
File string `json:"file"`
|
||||||
|
// Line is the line number in the file for this call site.
|
||||||
|
Line int `json:"line"`
|
||||||
|
// Func is the function name for this call site, or empty if
|
||||||
|
// Options.LogCallerFunc is not enabled.
|
||||||
|
Func string `json:"function,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f Formatter) caller() Caller {
|
||||||
|
// +1 for this frame, +1 for Info/Error.
|
||||||
|
pc, file, line, ok := runtime.Caller(f.depth + 2)
|
||||||
|
if !ok {
|
||||||
|
return Caller{"<unknown>", 0, ""}
|
||||||
|
}
|
||||||
|
fn := ""
|
||||||
|
if f.opts.LogCallerFunc {
|
||||||
|
if fp := runtime.FuncForPC(pc); fp != nil {
|
||||||
|
fn = fp.Name()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Caller{filepath.Base(file), line, fn}
|
||||||
|
}
|
||||||
|
|
||||||
|
const noValue = "<no-value>"
|
||||||
|
|
||||||
|
func (f Formatter) nonStringKey(v interface{}) string {
|
||||||
|
return fmt.Sprintf("<non-string-key: %s>", f.snippet(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
// snippet produces a short snippet string of an arbitrary value.
|
||||||
|
func (f Formatter) snippet(v interface{}) string {
|
||||||
|
const snipLen = 16
|
||||||
|
|
||||||
|
snip := f.pretty(v)
|
||||||
|
if len(snip) > snipLen {
|
||||||
|
snip = snip[:snipLen]
|
||||||
|
}
|
||||||
|
return snip
|
||||||
|
}
|
||||||
|
|
||||||
|
// sanitize ensures that a list of key-value pairs has a value for every key
|
||||||
|
// (adding a value if needed) and that each key is a string (substituting a key
|
||||||
|
// if needed).
|
||||||
|
func (f Formatter) sanitize(kvList []interface{}) []interface{} {
|
||||||
|
if len(kvList)%2 != 0 {
|
||||||
|
kvList = append(kvList, noValue)
|
||||||
|
}
|
||||||
|
for i := 0; i < len(kvList); i += 2 {
|
||||||
|
_, ok := kvList[i].(string)
|
||||||
|
if !ok {
|
||||||
|
kvList[i] = f.nonStringKey(kvList[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return kvList
|
||||||
|
}
|
||||||
|
|
||||||
|
// Init configures this Formatter from runtime info, such as the call depth
|
||||||
|
// imposed by logr itself.
|
||||||
|
// Note that this receiver is a pointer, so depth can be saved.
|
||||||
|
func (f *Formatter) Init(info logr.RuntimeInfo) {
|
||||||
|
f.depth += info.CallDepth
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enabled checks whether an info message at the given level should be logged.
|
||||||
|
func (f Formatter) Enabled(level int) bool {
|
||||||
|
return level <= f.opts.Verbosity
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetDepth returns the current depth of this Formatter. This is useful for
|
||||||
|
// implementations which do their own caller attribution.
|
||||||
|
func (f Formatter) GetDepth() int {
|
||||||
|
return f.depth
|
||||||
|
}
|
||||||
|
|
||||||
|
// FormatInfo renders an Info log message into strings. The prefix will be
|
||||||
|
// empty when no names were set (via AddNames), or when the output is
|
||||||
|
// configured for JSON.
|
||||||
|
func (f Formatter) FormatInfo(level int, msg string, kvList []interface{}) (prefix, argsStr string) {
|
||||||
|
args := make([]interface{}, 0, 64) // using a constant here impacts perf
|
||||||
|
prefix = f.prefix
|
||||||
|
if f.outputFormat == outputJSON {
|
||||||
|
args = append(args, "logger", prefix)
|
||||||
|
prefix = ""
|
||||||
|
}
|
||||||
|
if f.opts.LogTimestamp {
|
||||||
|
args = append(args, "ts", time.Now().Format(f.opts.TimestampFormat))
|
||||||
|
}
|
||||||
|
if policy := f.opts.LogCaller; policy == All || policy == Info {
|
||||||
|
args = append(args, "caller", f.caller())
|
||||||
|
}
|
||||||
|
args = append(args, "level", level, "msg", msg)
|
||||||
|
return prefix, f.render(args, kvList)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FormatError renders an Error log message into strings. The prefix will be
|
||||||
|
// empty when no names were set (via AddNames), or when the output is
|
||||||
|
// configured for JSON.
|
||||||
|
func (f Formatter) FormatError(err error, msg string, kvList []interface{}) (prefix, argsStr string) {
|
||||||
|
args := make([]interface{}, 0, 64) // using a constant here impacts perf
|
||||||
|
prefix = f.prefix
|
||||||
|
if f.outputFormat == outputJSON {
|
||||||
|
args = append(args, "logger", prefix)
|
||||||
|
prefix = ""
|
||||||
|
}
|
||||||
|
if f.opts.LogTimestamp {
|
||||||
|
args = append(args, "ts", time.Now().Format(f.opts.TimestampFormat))
|
||||||
|
}
|
||||||
|
if policy := f.opts.LogCaller; policy == All || policy == Error {
|
||||||
|
args = append(args, "caller", f.caller())
|
||||||
|
}
|
||||||
|
args = append(args, "msg", msg)
|
||||||
|
var loggableErr interface{}
|
||||||
|
if err != nil {
|
||||||
|
loggableErr = err.Error()
|
||||||
|
}
|
||||||
|
args = append(args, "error", loggableErr)
|
||||||
|
return f.prefix, f.render(args, kvList)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddName appends the specified name. funcr uses '/' characters to separate
|
||||||
|
// name elements. Callers should not pass '/' in the provided name string, but
|
||||||
|
// this library does not actually enforce that.
|
||||||
|
func (f *Formatter) AddName(name string) {
|
||||||
|
if len(f.prefix) > 0 {
|
||||||
|
f.prefix += "/"
|
||||||
|
}
|
||||||
|
f.prefix += name
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddValues adds key-value pairs to the set of saved values to be logged with
|
||||||
|
// each log line.
|
||||||
|
func (f *Formatter) AddValues(kvList []interface{}) {
|
||||||
|
// Three slice args forces a copy.
|
||||||
|
n := len(f.values)
|
||||||
|
f.values = append(f.values[:n:n], kvList...)
|
||||||
|
|
||||||
|
vals := f.values
|
||||||
|
if hook := f.opts.RenderValuesHook; hook != nil {
|
||||||
|
vals = hook(f.sanitize(vals))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pre-render values, so we don't have to do it on each Info/Error call.
|
||||||
|
buf := bytes.NewBuffer(make([]byte, 0, 1024))
|
||||||
|
f.flatten(buf, vals, false, true) // escape user-provided keys
|
||||||
|
f.valuesStr = buf.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddCallDepth increases the number of stack-frames to skip when attributing
|
||||||
|
// the log line to a file and line.
|
||||||
|
func (f *Formatter) AddCallDepth(depth int) {
|
||||||
|
f.depth += depth
|
||||||
|
}
|
2
vendor/github.com/go-logr/logr/go.mod
generated
vendored
2
vendor/github.com/go-logr/logr/go.mod
generated
vendored
@ -1,3 +1,3 @@
|
|||||||
module github.com/go-logr/logr
|
module github.com/go-logr/logr
|
||||||
|
|
||||||
go 1.14
|
go 1.16
|
||||||
|
549
vendor/github.com/go-logr/logr/logr.go
generated
vendored
549
vendor/github.com/go-logr/logr/logr.go
generated
vendored
@ -16,83 +16,104 @@ limitations under the License.
|
|||||||
|
|
||||||
// This design derives from Dave Cheney's blog:
|
// This design derives from Dave Cheney's blog:
|
||||||
// http://dave.cheney.net/2015/11/05/lets-talk-about-logging
|
// http://dave.cheney.net/2015/11/05/lets-talk-about-logging
|
||||||
//
|
|
||||||
// This is a BETA grade API. Until there is a significant 2nd implementation,
|
|
||||||
// I don't really know how it will change.
|
|
||||||
|
|
||||||
// Package logr defines abstract interfaces for logging. Packages can depend on
|
// Package logr defines a general-purpose logging API and abstract interfaces
|
||||||
// these interfaces and callers can implement logging in whatever way is
|
// to back that API. Packages in the Go ecosystem can depend on this package,
|
||||||
// appropriate.
|
// while callers can implement logging with whatever backend is appropriate.
|
||||||
//
|
//
|
||||||
// Usage
|
// Usage
|
||||||
//
|
//
|
||||||
// Logging is done using a Logger. Loggers can have name prefixes and named
|
// Logging is done using a Logger instance. Logger is a concrete type with
|
||||||
// values attached, so that all log messages logged with that Logger have some
|
// methods, which defers the actual logging to a LogSink interface. The main
|
||||||
// base context associated.
|
// methods of Logger are Info() and Error(). Arguments to Info() and Error()
|
||||||
|
// are key/value pairs rather than printf-style formatted strings, emphasizing
|
||||||
|
// "structured logging".
|
||||||
//
|
//
|
||||||
// The term "key" is used to refer to the name associated with a particular
|
// With Go's standard log package, we might write:
|
||||||
// value, to disambiguate it from the general Logger name.
|
// log.Printf("setting target value %s", targetValue)
|
||||||
//
|
//
|
||||||
// For instance, suppose we're trying to reconcile the state of an object, and
|
// With logr's structured logging, we'd write:
|
||||||
// we want to log that we've made some decision.
|
// logger.Info("setting target", "value", targetValue)
|
||||||
//
|
//
|
||||||
// With the traditional log package, we might write:
|
// Errors are much the same. Instead of:
|
||||||
|
// log.Printf("failed to open the pod bay door for user %s: %v", user, err)
|
||||||
|
//
|
||||||
|
// We'd write:
|
||||||
|
// logger.Error(err, "failed to open the pod bay door", "user", user)
|
||||||
|
//
|
||||||
|
// Info() and Error() are very similar, but they are separate methods so that
|
||||||
|
// LogSink implementations can choose to do things like attach additional
|
||||||
|
// information (such as stack traces) on calls to Error(). Error() messages are
|
||||||
|
// always logged, regardless of the current verbosity. If there is no error
|
||||||
|
// instance available, passing nil is valid.
|
||||||
|
//
|
||||||
|
// Verbosity
|
||||||
|
//
|
||||||
|
// Often we want to log information only when the application in "verbose
|
||||||
|
// mode". To write log lines that are more verbose, Logger has a V() method.
|
||||||
|
// The higher the V-level of a log line, the less critical it is considered.
|
||||||
|
// Log-lines with V-levels that are not enabled (as per the LogSink) will not
|
||||||
|
// be written. Level V(0) is the default, and logger.V(0).Info() has the same
|
||||||
|
// meaning as logger.Info(). Negative V-levels have the same meaning as V(0).
|
||||||
|
// Error messages do not have a verbosity level and are always logged.
|
||||||
|
//
|
||||||
|
// Where we might have written:
|
||||||
|
// if flVerbose >= 2 {
|
||||||
|
// log.Printf("an unusual thing happened")
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// We can write:
|
||||||
|
// logger.V(2).Info("an unusual thing happened")
|
||||||
|
//
|
||||||
|
// Logger Names
|
||||||
|
//
|
||||||
|
// Logger instances can have name strings so that all messages logged through
|
||||||
|
// that instance have additional context. For example, you might want to add
|
||||||
|
// a subsystem name:
|
||||||
|
//
|
||||||
|
// logger.WithName("compactor").Info("started", "time", time.Now())
|
||||||
|
//
|
||||||
|
// The WithName() method returns a new Logger, which can be passed to
|
||||||
|
// constructors or other functions for further use. Repeated use of WithName()
|
||||||
|
// will accumulate name "segments". These name segments will be joined in some
|
||||||
|
// way by the LogSink implementation. It is strongly recommended that name
|
||||||
|
// segments contain simple identifiers (letters, digits, and hyphen), and do
|
||||||
|
// not contain characters that could muddle the log output or confuse the
|
||||||
|
// joining operation (e.g. whitespace, commas, periods, slashes, brackets,
|
||||||
|
// quotes, etc).
|
||||||
|
//
|
||||||
|
// Saved Values
|
||||||
|
//
|
||||||
|
// Logger instances can store any number of key/value pairs, which will be
|
||||||
|
// logged alongside all messages logged through that instance. For example,
|
||||||
|
// you might want to create a Logger instance per managed object:
|
||||||
|
//
|
||||||
|
// With the standard log package, we might write:
|
||||||
// log.Printf("decided to set field foo to value %q for object %s/%s",
|
// log.Printf("decided to set field foo to value %q for object %s/%s",
|
||||||
// targetValue, object.Namespace, object.Name)
|
// targetValue, object.Namespace, object.Name)
|
||||||
//
|
//
|
||||||
// With logr's structured logging, we'd write:
|
// With logr we'd write:
|
||||||
// // elsewhere in the file, set up the logger to log with the prefix of
|
// // Elsewhere: set up the logger to log the object name.
|
||||||
// // "reconcilers", and the named value target-type=Foo, for extra context.
|
// obj.logger = mainLogger.WithValues(
|
||||||
// log := mainLogger.WithName("reconcilers").WithValues("target-type", "Foo")
|
// "name", obj.name, "namespace", obj.namespace)
|
||||||
//
|
//
|
||||||
// // later on...
|
// // later on...
|
||||||
// log.Info("setting foo on object", "value", targetValue, "object", object)
|
// obj.logger.Info("setting foo", "value", targetValue)
|
||||||
//
|
//
|
||||||
// Depending on our logging implementation, we could then make logging decisions
|
// Best Practices
|
||||||
// based on field values (like only logging such events for objects in a certain
|
|
||||||
// namespace), or copy the structured information into a structured log store.
|
|
||||||
//
|
//
|
||||||
// For logging errors, Logger has a method called Error. Suppose we wanted to
|
// Logger has very few hard rules, with the goal that LogSink implementations
|
||||||
// log an error while reconciling. With the traditional log package, we might
|
// might have a lot of freedom to differentiate. There are, however, some
|
||||||
// write:
|
// things to consider.
|
||||||
// log.Errorf("unable to reconcile object %s/%s: %v", object.Namespace, object.Name, err)
|
|
||||||
//
|
|
||||||
// With logr, we'd instead write:
|
|
||||||
// // assuming the above setup for log
|
|
||||||
// log.Error(err, "unable to reconcile object", "object", object)
|
|
||||||
//
|
|
||||||
// This functions similarly to:
|
|
||||||
// log.Info("unable to reconcile object", "error", err, "object", object)
|
|
||||||
//
|
|
||||||
// However, it ensures that a standard key for the error value ("error") is used
|
|
||||||
// across all error logging. Furthermore, certain implementations may choose to
|
|
||||||
// attach additional information (such as stack traces) on calls to Error, so
|
|
||||||
// it's preferred to use Error to log errors.
|
|
||||||
//
|
|
||||||
// Parts of a log line
|
|
||||||
//
|
|
||||||
// Each log message from a Logger has four types of context:
|
|
||||||
// logger name, log verbosity, log message, and the named values.
|
|
||||||
//
|
|
||||||
// The Logger name consists of a series of name "segments" added by successive
|
|
||||||
// calls to WithName. These name segments will be joined in some way by the
|
|
||||||
// underlying implementation. It is strongly recommended that name segments
|
|
||||||
// contain simple identifiers (letters, digits, and hyphen), and do not contain
|
|
||||||
// characters that could muddle the log output or confuse the joining operation
|
|
||||||
// (e.g. whitespace, commas, periods, slashes, brackets, quotes, etc).
|
|
||||||
//
|
|
||||||
// Log verbosity represents how little a log matters. Level zero, the default,
|
|
||||||
// matters most. Increasing levels matter less and less. Try to avoid lots of
|
|
||||||
// different verbosity levels, and instead provide useful keys, logger names,
|
|
||||||
// and log messages for users to filter on. It's illegal to pass a log level
|
|
||||||
// below zero.
|
|
||||||
//
|
//
|
||||||
// The log message consists of a constant message attached to the log line.
|
// The log message consists of a constant message attached to the log line.
|
||||||
// This should generally be a simple description of what's occurring, and should
|
// This should generally be a simple description of what's occurring, and should
|
||||||
// never be a format string.
|
// never be a format string. Variable information can then be attached using
|
||||||
|
// named values.
|
||||||
//
|
//
|
||||||
// Variable information can then be attached using named values (key/value
|
// Keys are arbitrary strings, but should generally be constant values. Values
|
||||||
// pairs). Keys are arbitrary strings, while values may be any Go value.
|
// may be any Go value, but how the value is formatted is determined by the
|
||||||
|
// LogSink implementation.
|
||||||
//
|
//
|
||||||
// Key Naming Conventions
|
// Key Naming Conventions
|
||||||
//
|
//
|
||||||
@ -102,6 +123,7 @@ limitations under the License.
|
|||||||
// * be constant (not dependent on input data)
|
// * be constant (not dependent on input data)
|
||||||
// * contain only printable characters
|
// * contain only printable characters
|
||||||
// * not contain whitespace or punctuation
|
// * not contain whitespace or punctuation
|
||||||
|
// * use lower case for simple keys and lowerCamelCase for more complex ones
|
||||||
//
|
//
|
||||||
// These guidelines help ensure that log data is processed properly regardless
|
// These guidelines help ensure that log data is processed properly regardless
|
||||||
// of the log implementation. For example, log implementations will try to
|
// of the log implementation. For example, log implementations will try to
|
||||||
@ -110,21 +132,22 @@ limitations under the License.
|
|||||||
// While users are generally free to use key names of their choice, it's
|
// While users are generally free to use key names of their choice, it's
|
||||||
// generally best to avoid using the following keys, as they're frequently used
|
// generally best to avoid using the following keys, as they're frequently used
|
||||||
// by implementations:
|
// by implementations:
|
||||||
//
|
// * "caller": the calling information (file/line) of a particular log line
|
||||||
// * `"caller"`: the calling information (file/line) of a particular log line.
|
// * "error": the underlying error value in the `Error` method
|
||||||
// * `"error"`: the underlying error value in the `Error` method.
|
// * "level": the log level
|
||||||
// * `"level"`: the log level.
|
// * "logger": the name of the associated logger
|
||||||
// * `"logger"`: the name of the associated logger.
|
// * "msg": the log message
|
||||||
// * `"msg"`: the log message.
|
// * "stacktrace": the stack trace associated with a particular log line or
|
||||||
// * `"stacktrace"`: the stack trace associated with a particular log line or
|
// error (often from the `Error` message)
|
||||||
// error (often from the `Error` message).
|
// * "ts": the timestamp for a log line
|
||||||
// * `"ts"`: the timestamp for a log line.
|
|
||||||
//
|
//
|
||||||
// Implementations are encouraged to make use of these keys to represent the
|
// Implementations are encouraged to make use of these keys to represent the
|
||||||
// above concepts, when necessary (for example, in a pure-JSON output form, it
|
// above concepts, when necessary (for example, in a pure-JSON output form, it
|
||||||
// would be necessary to represent at least message and timestamp as ordinary
|
// would be necessary to represent at least message and timestamp as ordinary
|
||||||
// named values).
|
// named values).
|
||||||
//
|
//
|
||||||
|
// Break Glass
|
||||||
|
//
|
||||||
// Implementations may choose to give callers access to the underlying
|
// Implementations may choose to give callers access to the underlying
|
||||||
// logging implementation. The recommended pattern for this is:
|
// logging implementation. The recommended pattern for this is:
|
||||||
// // Underlier exposes access to the underlying logging implementation.
|
// // Underlier exposes access to the underlying logging implementation.
|
||||||
@ -134,81 +157,222 @@ limitations under the License.
|
|||||||
// type Underlier interface {
|
// type Underlier interface {
|
||||||
// GetUnderlying() <underlying-type>
|
// GetUnderlying() <underlying-type>
|
||||||
// }
|
// }
|
||||||
|
//
|
||||||
|
// Logger grants access to the sink to enable type assertions like this:
|
||||||
|
// func DoSomethingWithImpl(log logr.Logger) {
|
||||||
|
// if underlier, ok := log.GetSink()(impl.Underlier) {
|
||||||
|
// implLogger := underlier.GetUnderlying()
|
||||||
|
// ...
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Custom `With*` functions can be implemented by copying the complete
|
||||||
|
// Logger struct and replacing the sink in the copy:
|
||||||
|
// // WithFooBar changes the foobar parameter in the log sink and returns a
|
||||||
|
// // new logger with that modified sink. It does nothing for loggers where
|
||||||
|
// // the sink doesn't support that parameter.
|
||||||
|
// func WithFoobar(log logr.Logger, foobar int) logr.Logger {
|
||||||
|
// if foobarLogSink, ok := log.GetSink()(FoobarSink); ok {
|
||||||
|
// log = log.WithSink(foobarLogSink.WithFooBar(foobar))
|
||||||
|
// }
|
||||||
|
// return log
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Don't use New to construct a new Logger with a LogSink retrieved from an
|
||||||
|
// existing Logger. Source code attribution might not work correctly and
|
||||||
|
// unexported fields in Logger get lost.
|
||||||
|
//
|
||||||
|
// Beware that the same LogSink instance may be shared by different logger
|
||||||
|
// instances. Calling functions that modify the LogSink will affect all of
|
||||||
|
// those.
|
||||||
package logr
|
package logr
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO: consider adding back in format strings if they're really needed
|
// New returns a new Logger instance. This is primarily used by libraries
|
||||||
// TODO: consider other bits of zap/zapcore functionality like ObjectMarshaller (for arbitrary objects)
|
// implementing LogSink, rather than end users.
|
||||||
// TODO: consider other bits of glog functionality like Flush, OutputStats
|
func New(sink LogSink) Logger {
|
||||||
|
logger := Logger{}
|
||||||
// Logger represents the ability to log messages, both errors and not.
|
logger.setSink(sink)
|
||||||
type Logger interface {
|
sink.Init(runtimeInfo)
|
||||||
// Enabled tests whether this Logger is enabled. For example, commandline
|
return logger
|
||||||
// flags might be used to set the logging verbosity and disable some info
|
|
||||||
// logs.
|
|
||||||
Enabled() bool
|
|
||||||
|
|
||||||
// Info logs a non-error message with the given key/value pairs as context.
|
|
||||||
//
|
|
||||||
// The msg argument should be used to add some constant description to
|
|
||||||
// the log line. The key/value pairs can then be used to add additional
|
|
||||||
// variable information. The key/value pairs should alternate string
|
|
||||||
// keys and arbitrary values.
|
|
||||||
Info(msg string, keysAndValues ...interface{})
|
|
||||||
|
|
||||||
// Error logs an error, with the given message and key/value pairs as context.
|
|
||||||
// It functions similarly to calling Info with the "error" named value, but may
|
|
||||||
// have unique behavior, and should be preferred for logging errors (see the
|
|
||||||
// package documentations for more information).
|
|
||||||
//
|
|
||||||
// The msg field should be used to add context to any underlying error,
|
|
||||||
// while the err field should be used to attach the actual error that
|
|
||||||
// triggered this log line, if present.
|
|
||||||
Error(err error, msg string, keysAndValues ...interface{})
|
|
||||||
|
|
||||||
// V returns an Logger value for a specific verbosity level, relative to
|
|
||||||
// this Logger. In other words, V values are additive. V higher verbosity
|
|
||||||
// level means a log message is less important. It's illegal to pass a log
|
|
||||||
// level less than zero.
|
|
||||||
V(level int) Logger
|
|
||||||
|
|
||||||
// WithValues adds some key-value pairs of context to a logger.
|
|
||||||
// See Info for documentation on how key/value pairs work.
|
|
||||||
WithValues(keysAndValues ...interface{}) Logger
|
|
||||||
|
|
||||||
// WithName adds a new element to the logger's name.
|
|
||||||
// Successive calls with WithName continue to append
|
|
||||||
// suffixes to the logger's name. It's strongly recommended
|
|
||||||
// that name segments contain only letters, digits, and hyphens
|
|
||||||
// (see the package documentation for more information).
|
|
||||||
WithName(name string) Logger
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// InfoLogger provides compatibility with code that relies on the v0.1.0
|
// setSink stores the sink and updates any related fields. It mutates the
|
||||||
// interface.
|
// logger and thus is only safe to use for loggers that are not currently being
|
||||||
//
|
// used concurrently.
|
||||||
// Deprecated: InfoLogger is an artifact of early versions of this API. New
|
func (l *Logger) setSink(sink LogSink) {
|
||||||
// users should never use it and existing users should use Logger instead. This
|
l.sink = sink
|
||||||
// will be removed in a future release.
|
}
|
||||||
type InfoLogger = Logger
|
|
||||||
|
|
||||||
|
// GetSink returns the stored sink.
|
||||||
|
func (l Logger) GetSink() LogSink {
|
||||||
|
return l.sink
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithSink returns a copy of the logger with the new sink.
|
||||||
|
func (l Logger) WithSink(sink LogSink) Logger {
|
||||||
|
l.setSink(sink)
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
// Logger is an interface to an abstract logging implementation. This is a
|
||||||
|
// concrete type for performance reasons, but all the real work is passed on to
|
||||||
|
// a LogSink. Implementations of LogSink should provide their own constructors
|
||||||
|
// that return Logger, not LogSink.
|
||||||
|
//
|
||||||
|
// The underlying sink can be accessed through GetSink and be modified through
|
||||||
|
// WithSink. This enables the implementation of custom extensions (see "Break
|
||||||
|
// Glass" in the package documentation). Normally the sink should be used only
|
||||||
|
// indirectly.
|
||||||
|
type Logger struct {
|
||||||
|
sink LogSink
|
||||||
|
level int
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enabled tests whether this Logger is enabled. For example, commandline
|
||||||
|
// flags might be used to set the logging verbosity and disable some info logs.
|
||||||
|
func (l Logger) Enabled() bool {
|
||||||
|
return l.sink.Enabled(l.level)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Info logs a non-error message with the given key/value pairs as context.
|
||||||
|
//
|
||||||
|
// The msg argument should be used to add some constant description to the log
|
||||||
|
// line. The key/value pairs can then be used to add additional variable
|
||||||
|
// information. The key/value pairs must alternate string keys and arbitrary
|
||||||
|
// values.
|
||||||
|
func (l Logger) Info(msg string, keysAndValues ...interface{}) {
|
||||||
|
if l.Enabled() {
|
||||||
|
if withHelper, ok := l.sink.(CallStackHelperLogSink); ok {
|
||||||
|
withHelper.GetCallStackHelper()()
|
||||||
|
}
|
||||||
|
l.sink.Info(l.level, msg, keysAndValues...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error logs an error, with the given message and key/value pairs as context.
|
||||||
|
// It functions similarly to Info, but may have unique behavior, and should be
|
||||||
|
// preferred for logging errors (see the package documentations for more
|
||||||
|
// information). The log message will always be emitted, regardless of
|
||||||
|
// verbosity level.
|
||||||
|
//
|
||||||
|
// The msg argument should be used to add context to any underlying error,
|
||||||
|
// while the err argument should be used to attach the actual error that
|
||||||
|
// triggered this log line, if present. The err parameter is optional
|
||||||
|
// and nil may be passed instead of an error instance.
|
||||||
|
func (l Logger) Error(err error, msg string, keysAndValues ...interface{}) {
|
||||||
|
if withHelper, ok := l.sink.(CallStackHelperLogSink); ok {
|
||||||
|
withHelper.GetCallStackHelper()()
|
||||||
|
}
|
||||||
|
l.sink.Error(err, msg, keysAndValues...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// V returns a new Logger instance for a specific verbosity level, relative to
|
||||||
|
// this Logger. In other words, V-levels are additive. A higher verbosity
|
||||||
|
// level means a log message is less important. Negative V-levels are treated
|
||||||
|
// as 0.
|
||||||
|
func (l Logger) V(level int) Logger {
|
||||||
|
if level < 0 {
|
||||||
|
level = 0
|
||||||
|
}
|
||||||
|
l.level += level
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithValues returns a new Logger instance with additional key/value pairs.
|
||||||
|
// See Info for documentation on how key/value pairs work.
|
||||||
|
func (l Logger) WithValues(keysAndValues ...interface{}) Logger {
|
||||||
|
l.setSink(l.sink.WithValues(keysAndValues...))
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithName returns a new Logger instance with the specified name element added
|
||||||
|
// to the Logger's name. Successive calls with WithName append additional
|
||||||
|
// suffixes to the Logger's name. It's strongly recommended that name segments
|
||||||
|
// contain only letters, digits, and hyphens (see the package documentation for
|
||||||
|
// more information).
|
||||||
|
func (l Logger) WithName(name string) Logger {
|
||||||
|
l.setSink(l.sink.WithName(name))
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithCallDepth returns a Logger instance that offsets the call stack by the
|
||||||
|
// specified number of frames when logging call site information, if possible.
|
||||||
|
// This is useful for users who have helper functions between the "real" call
|
||||||
|
// site and the actual calls to Logger methods. If depth is 0 the attribution
|
||||||
|
// should be to the direct caller of this function. If depth is 1 the
|
||||||
|
// attribution should skip 1 call frame, and so on. Successive calls to this
|
||||||
|
// are additive.
|
||||||
|
//
|
||||||
|
// If the underlying log implementation supports a WithCallDepth(int) method,
|
||||||
|
// it will be called and the result returned. If the implementation does not
|
||||||
|
// support CallDepthLogSink, the original Logger will be returned.
|
||||||
|
//
|
||||||
|
// To skip one level, WithCallStackHelper() should be used instead of
|
||||||
|
// WithCallDepth(1) because it works with implementions that support the
|
||||||
|
// CallDepthLogSink and/or CallStackHelperLogSink interfaces.
|
||||||
|
func (l Logger) WithCallDepth(depth int) Logger {
|
||||||
|
if withCallDepth, ok := l.sink.(CallDepthLogSink); ok {
|
||||||
|
l.setSink(withCallDepth.WithCallDepth(depth))
|
||||||
|
}
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithCallStackHelper returns a new Logger instance that skips the direct
|
||||||
|
// caller when logging call site information, if possible. This is useful for
|
||||||
|
// users who have helper functions between the "real" call site and the actual
|
||||||
|
// calls to Logger methods and want to support loggers which depend on marking
|
||||||
|
// each individual helper function, like loggers based on testing.T.
|
||||||
|
//
|
||||||
|
// In addition to using that new logger instance, callers also must call the
|
||||||
|
// returned function.
|
||||||
|
//
|
||||||
|
// If the underlying log implementation supports a WithCallDepth(int) method,
|
||||||
|
// WithCallDepth(1) will be called to produce a new logger. If it supports a
|
||||||
|
// WithCallStackHelper() method, that will be also called. If the
|
||||||
|
// implementation does not support either of these, the original Logger will be
|
||||||
|
// returned.
|
||||||
|
func (l Logger) WithCallStackHelper() (func(), Logger) {
|
||||||
|
var helper func()
|
||||||
|
if withCallDepth, ok := l.sink.(CallDepthLogSink); ok {
|
||||||
|
l.setSink(withCallDepth.WithCallDepth(1))
|
||||||
|
}
|
||||||
|
if withHelper, ok := l.sink.(CallStackHelperLogSink); ok {
|
||||||
|
helper = withHelper.GetCallStackHelper()
|
||||||
|
} else {
|
||||||
|
helper = func() {}
|
||||||
|
}
|
||||||
|
return helper, l
|
||||||
|
}
|
||||||
|
|
||||||
|
// contextKey is how we find Loggers in a context.Context.
|
||||||
type contextKey struct{}
|
type contextKey struct{}
|
||||||
|
|
||||||
// FromContext returns a Logger constructed from ctx or nil if no
|
// FromContext returns a Logger from ctx or an error if no Logger is found.
|
||||||
// logger details are found.
|
func FromContext(ctx context.Context) (Logger, error) {
|
||||||
func FromContext(ctx context.Context) Logger {
|
|
||||||
if v, ok := ctx.Value(contextKey{}).(Logger); ok {
|
if v, ok := ctx.Value(contextKey{}).(Logger); ok {
|
||||||
return v
|
return v, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return Logger{}, notFoundError{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FromContextOrDiscard returns a Logger constructed from ctx or a Logger
|
// notFoundError exists to carry an IsNotFound method.
|
||||||
// that discards all messages if no logger details are found.
|
type notFoundError struct{}
|
||||||
|
|
||||||
|
func (notFoundError) Error() string {
|
||||||
|
return "no logr.Logger was present"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (notFoundError) IsNotFound() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromContextOrDiscard returns a Logger from ctx. If no Logger is found, this
|
||||||
|
// returns a Logger that discards all log messages.
|
||||||
func FromContextOrDiscard(ctx context.Context) Logger {
|
func FromContextOrDiscard(ctx context.Context) Logger {
|
||||||
if v, ok := ctx.Value(contextKey{}).(Logger); ok {
|
if v, ok := ctx.Value(contextKey{}).(Logger); ok {
|
||||||
return v
|
return v
|
||||||
@ -217,12 +381,59 @@ func FromContextOrDiscard(ctx context.Context) Logger {
|
|||||||
return Discard()
|
return Discard()
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewContext returns a new context derived from ctx that embeds the Logger.
|
// NewContext returns a new Context, derived from ctx, which carries the
|
||||||
func NewContext(ctx context.Context, l Logger) context.Context {
|
// provided Logger.
|
||||||
return context.WithValue(ctx, contextKey{}, l)
|
func NewContext(ctx context.Context, logger Logger) context.Context {
|
||||||
|
return context.WithValue(ctx, contextKey{}, logger)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CallDepthLogger represents a Logger that knows how to climb the call stack
|
// RuntimeInfo holds information that the logr "core" library knows which
|
||||||
|
// LogSinks might want to know.
|
||||||
|
type RuntimeInfo struct {
|
||||||
|
// CallDepth is the number of call frames the logr library adds between the
|
||||||
|
// end-user and the LogSink. LogSink implementations which choose to print
|
||||||
|
// the original logging site (e.g. file & line) should climb this many
|
||||||
|
// additional frames to find it.
|
||||||
|
CallDepth int
|
||||||
|
}
|
||||||
|
|
||||||
|
// runtimeInfo is a static global. It must not be changed at run time.
|
||||||
|
var runtimeInfo = RuntimeInfo{
|
||||||
|
CallDepth: 1,
|
||||||
|
}
|
||||||
|
|
||||||
|
// LogSink represents a logging implementation. End-users will generally not
|
||||||
|
// interact with this type.
|
||||||
|
type LogSink interface {
|
||||||
|
// Init receives optional information about the logr library for LogSink
|
||||||
|
// implementations that need it.
|
||||||
|
Init(info RuntimeInfo)
|
||||||
|
|
||||||
|
// Enabled tests whether this LogSink is enabled at the specified V-level.
|
||||||
|
// For example, commandline flags might be used to set the logging
|
||||||
|
// verbosity and disable some info logs.
|
||||||
|
Enabled(level int) bool
|
||||||
|
|
||||||
|
// Info logs a non-error message with the given key/value pairs as context.
|
||||||
|
// The level argument is provided for optional logging. This method will
|
||||||
|
// only be called when Enabled(level) is true. See Logger.Info for more
|
||||||
|
// details.
|
||||||
|
Info(level int, msg string, keysAndValues ...interface{})
|
||||||
|
|
||||||
|
// Error logs an error, with the given message and key/value pairs as
|
||||||
|
// context. See Logger.Error for more details.
|
||||||
|
Error(err error, msg string, keysAndValues ...interface{})
|
||||||
|
|
||||||
|
// WithValues returns a new LogSink with additional key/value pairs. See
|
||||||
|
// Logger.WithValues for more details.
|
||||||
|
WithValues(keysAndValues ...interface{}) LogSink
|
||||||
|
|
||||||
|
// WithName returns a new LogSink with the specified name appended. See
|
||||||
|
// Logger.WithName for more details.
|
||||||
|
WithName(name string) LogSink
|
||||||
|
}
|
||||||
|
|
||||||
|
// CallDepthLogSink represents a Logger that knows how to climb the call stack
|
||||||
// to identify the original call site and can offset the depth by a specified
|
// to identify the original call site and can offset the depth by a specified
|
||||||
// number of frames. This is useful for users who have helper functions
|
// number of frames. This is useful for users who have helper functions
|
||||||
// between the "real" call site and the actual calls to Logger methods.
|
// between the "real" call site and the actual calls to Logger methods.
|
||||||
@ -232,35 +443,59 @@ func NewContext(ctx context.Context, l Logger) context.Context {
|
|||||||
//
|
//
|
||||||
// This is an optional interface and implementations are not required to
|
// This is an optional interface and implementations are not required to
|
||||||
// support it.
|
// support it.
|
||||||
type CallDepthLogger interface {
|
type CallDepthLogSink interface {
|
||||||
Logger
|
// WithCallDepth returns a LogSink that will offset the call
|
||||||
|
// stack by the specified number of frames when logging call
|
||||||
// WithCallDepth returns a Logger that will offset the call stack by the
|
// site information.
|
||||||
// specified number of frames when logging call site information. If depth
|
//
|
||||||
// is 0 the attribution should be to the direct caller of this method. If
|
// If depth is 0, the LogSink should skip exactly the number
|
||||||
// depth is 1 the attribution should skip 1 call frame, and so on.
|
// of call frames defined in RuntimeInfo.CallDepth when Info
|
||||||
|
// or Error are called, i.e. the attribution should be to the
|
||||||
|
// direct caller of Logger.Info or Logger.Error.
|
||||||
|
//
|
||||||
|
// If depth is 1 the attribution should skip 1 call frame, and so on.
|
||||||
// Successive calls to this are additive.
|
// Successive calls to this are additive.
|
||||||
WithCallDepth(depth int) Logger
|
WithCallDepth(depth int) LogSink
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithCallDepth returns a Logger that will offset the call stack by the
|
// CallStackHelperLogSink represents a Logger that knows how to climb
|
||||||
// specified number of frames when logging call site information, if possible.
|
// the call stack to identify the original call site and can skip
|
||||||
// This is useful for users who have helper functions between the "real" call
|
// intermediate helper functions if they mark themselves as
|
||||||
// site and the actual calls to Logger methods. If depth is 0 the attribution
|
// helper. Go's testing package uses that approach.
|
||||||
// should be to the direct caller of this function. If depth is 1 the
|
|
||||||
// attribution should skip 1 call frame, and so on. Successive calls to this
|
|
||||||
// are additive.
|
|
||||||
//
|
//
|
||||||
// If the underlying log implementation supports the CallDepthLogger interface,
|
// This is useful for users who have helper functions between the
|
||||||
// the WithCallDepth method will be called and the result returned. If the
|
// "real" call site and the actual calls to Logger methods.
|
||||||
// implementation does not support CallDepthLogger, the original Logger will be
|
// Implementations that log information about the call site (such as
|
||||||
// returned.
|
// file, function, or line) would otherwise log information about the
|
||||||
|
// intermediate helper functions.
|
||||||
//
|
//
|
||||||
// Callers which care about whether this was supported or not should test for
|
// This is an optional interface and implementations are not required
|
||||||
// CallDepthLogger support themselves.
|
// to support it. Implementations that choose to support this must not
|
||||||
func WithCallDepth(logger Logger, depth int) Logger {
|
// simply implement it as WithCallDepth(1), because
|
||||||
if decorator, ok := logger.(CallDepthLogger); ok {
|
// Logger.WithCallStackHelper will call both methods if they are
|
||||||
return decorator.WithCallDepth(depth)
|
// present. This should only be implemented for LogSinks that actually
|
||||||
}
|
// need it, as with testing.T.
|
||||||
return logger
|
type CallStackHelperLogSink interface {
|
||||||
|
// GetCallStackHelper returns a function that must be called
|
||||||
|
// to mark the direct caller as helper function when logging
|
||||||
|
// call site information.
|
||||||
|
GetCallStackHelper() func()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Marshaler is an optional interface that logged values may choose to
|
||||||
|
// implement. Loggers with structured output, such as JSON, should
|
||||||
|
// log the object return by the MarshalLog method instead of the
|
||||||
|
// original value.
|
||||||
|
type Marshaler interface {
|
||||||
|
// MarshalLog can be used to:
|
||||||
|
// - ensure that structs are not logged as strings when the original
|
||||||
|
// value has a String method: return a different type without a
|
||||||
|
// String method
|
||||||
|
// - select which fields of a complex type should get logged:
|
||||||
|
// return a simpler struct with fewer fields
|
||||||
|
// - log unexported fields: return a different struct
|
||||||
|
// with exported fields
|
||||||
|
//
|
||||||
|
// It may return any value of any type.
|
||||||
|
MarshalLog() interface{}
|
||||||
}
|
}
|
||||||
|
201
vendor/github.com/go-logr/stdr/LICENSE
generated
vendored
Normal file
201
vendor/github.com/go-logr/stdr/LICENSE
generated
vendored
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
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.
|
6
vendor/github.com/go-logr/stdr/README.md
generated
vendored
Normal file
6
vendor/github.com/go-logr/stdr/README.md
generated
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# Minimal Go logging using logr and Go's standard library
|
||||||
|
|
||||||
|
[](https://pkg.go.dev/github.com/go-logr/stdr)
|
||||||
|
|
||||||
|
This package implements the [logr interface](https://github.com/go-logr/logr)
|
||||||
|
in terms of Go's standard log package(https://pkg.go.dev/log).
|
5
vendor/github.com/go-logr/stdr/go.mod
generated
vendored
Normal file
5
vendor/github.com/go-logr/stdr/go.mod
generated
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
module github.com/go-logr/stdr
|
||||||
|
|
||||||
|
go 1.16
|
||||||
|
|
||||||
|
require github.com/go-logr/logr v1.2.2
|
2
vendor/github.com/go-logr/stdr/go.sum
generated
vendored
Normal file
2
vendor/github.com/go-logr/stdr/go.sum
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
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=
|
170
vendor/github.com/go-logr/stdr/stdr.go
generated
vendored
Normal file
170
vendor/github.com/go-logr/stdr/stdr.go
generated
vendored
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2019 The logr 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 stdr implements github.com/go-logr/logr.Logger in terms of
|
||||||
|
// Go's standard log package.
|
||||||
|
package stdr
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/go-logr/logr"
|
||||||
|
"github.com/go-logr/logr/funcr"
|
||||||
|
)
|
||||||
|
|
||||||
|
// The global verbosity level. See SetVerbosity().
|
||||||
|
var globalVerbosity int
|
||||||
|
|
||||||
|
// SetVerbosity sets the global level against which all info logs will be
|
||||||
|
// compared. If this is greater than or equal to the "V" of the logger, the
|
||||||
|
// message will be logged. A higher value here means more logs will be written.
|
||||||
|
// The previous verbosity value is returned. This is not concurrent-safe -
|
||||||
|
// callers must be sure to call it from only one goroutine.
|
||||||
|
func SetVerbosity(v int) int {
|
||||||
|
old := globalVerbosity
|
||||||
|
globalVerbosity = v
|
||||||
|
return old
|
||||||
|
}
|
||||||
|
|
||||||
|
// New returns a logr.Logger which is implemented by Go's standard log package,
|
||||||
|
// or something like it. If std is nil, this will use a default logger
|
||||||
|
// instead.
|
||||||
|
//
|
||||||
|
// Example: stdr.New(log.New(os.Stderr, "", log.LstdFlags|log.Lshortfile)))
|
||||||
|
func New(std StdLogger) logr.Logger {
|
||||||
|
return NewWithOptions(std, Options{})
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewWithOptions returns a logr.Logger which is implemented by Go's standard
|
||||||
|
// log package, or something like it. See New for details.
|
||||||
|
func NewWithOptions(std StdLogger, opts Options) logr.Logger {
|
||||||
|
if std == nil {
|
||||||
|
// Go's log.Default() is only available in 1.16 and higher.
|
||||||
|
std = log.New(os.Stderr, "", log.LstdFlags)
|
||||||
|
}
|
||||||
|
|
||||||
|
if opts.Depth < 0 {
|
||||||
|
opts.Depth = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
fopts := funcr.Options{
|
||||||
|
LogCaller: funcr.MessageClass(opts.LogCaller),
|
||||||
|
}
|
||||||
|
|
||||||
|
sl := &logger{
|
||||||
|
Formatter: funcr.NewFormatter(fopts),
|
||||||
|
std: std,
|
||||||
|
}
|
||||||
|
|
||||||
|
// For skipping our own logger.Info/Error.
|
||||||
|
sl.Formatter.AddCallDepth(1 + opts.Depth)
|
||||||
|
|
||||||
|
return logr.New(sl)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Options carries parameters which influence the way logs are generated.
|
||||||
|
type Options struct {
|
||||||
|
// Depth biases the assumed number of call frames to the "true" caller.
|
||||||
|
// This is useful when the calling code calls a function which then calls
|
||||||
|
// stdr (e.g. a logging shim to another API). Values less than zero will
|
||||||
|
// be treated as zero.
|
||||||
|
Depth int
|
||||||
|
|
||||||
|
// LogCaller tells stdr to add a "caller" key to some or all log lines.
|
||||||
|
// Go's log package has options to log this natively, too.
|
||||||
|
LogCaller MessageClass
|
||||||
|
|
||||||
|
// TODO: add an option to log the date/time
|
||||||
|
}
|
||||||
|
|
||||||
|
// MessageClass indicates which category or categories of messages to consider.
|
||||||
|
type MessageClass int
|
||||||
|
|
||||||
|
const (
|
||||||
|
// None ignores all message classes.
|
||||||
|
None MessageClass = iota
|
||||||
|
// All considers all message classes.
|
||||||
|
All
|
||||||
|
// Info only considers info messages.
|
||||||
|
Info
|
||||||
|
// Error only considers error messages.
|
||||||
|
Error
|
||||||
|
)
|
||||||
|
|
||||||
|
// StdLogger is the subset of the Go stdlib log.Logger API that is needed for
|
||||||
|
// this adapter.
|
||||||
|
type StdLogger interface {
|
||||||
|
// Output is the same as log.Output and log.Logger.Output.
|
||||||
|
Output(calldepth int, logline string) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type logger struct {
|
||||||
|
funcr.Formatter
|
||||||
|
std StdLogger
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ logr.LogSink = &logger{}
|
||||||
|
var _ logr.CallDepthLogSink = &logger{}
|
||||||
|
|
||||||
|
func (l logger) Enabled(level int) bool {
|
||||||
|
return globalVerbosity >= level
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l logger) Info(level int, msg string, kvList ...interface{}) {
|
||||||
|
prefix, args := l.FormatInfo(level, msg, kvList)
|
||||||
|
if prefix != "" {
|
||||||
|
args = prefix + ": " + args
|
||||||
|
}
|
||||||
|
_ = l.std.Output(l.Formatter.GetDepth()+1, args)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l logger) Error(err error, msg string, kvList ...interface{}) {
|
||||||
|
prefix, args := l.FormatError(err, msg, kvList)
|
||||||
|
if prefix != "" {
|
||||||
|
args = prefix + ": " + args
|
||||||
|
}
|
||||||
|
_ = l.std.Output(l.Formatter.GetDepth()+1, args)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l logger) WithName(name string) logr.LogSink {
|
||||||
|
l.Formatter.AddName(name)
|
||||||
|
return &l
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l logger) WithValues(kvList ...interface{}) logr.LogSink {
|
||||||
|
l.Formatter.AddValues(kvList)
|
||||||
|
return &l
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l logger) WithCallDepth(depth int) logr.LogSink {
|
||||||
|
l.Formatter.AddCallDepth(depth)
|
||||||
|
return &l
|
||||||
|
}
|
||||||
|
|
||||||
|
// Underlier exposes access to the underlying logging implementation. Since
|
||||||
|
// callers only have a logr.Logger, they have to know which implementation is
|
||||||
|
// in use, so this interface is less of an abstraction and more of way to test
|
||||||
|
// type conversion.
|
||||||
|
type Underlier interface {
|
||||||
|
GetUnderlying() StdLogger
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUnderlying returns the StdLogger underneath this logger. Since StdLogger
|
||||||
|
// is itself an interface, the result may or may not be a Go log.Logger.
|
||||||
|
func (l logger) GetUnderlying() StdLogger {
|
||||||
|
return l.std
|
||||||
|
}
|
@ -1,12 +1,12 @@
|
|||||||
module go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc
|
module go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc
|
||||||
|
|
||||||
go 1.15
|
go 1.16
|
||||||
|
|
||||||
replace go.opentelemetry.io/contrib => ../../../../
|
replace go.opentelemetry.io/contrib => ../../../../
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/golang/protobuf v1.5.2
|
github.com/golang/protobuf v1.5.2
|
||||||
go.opentelemetry.io/otel v1.0.0
|
go.opentelemetry.io/otel v1.3.0
|
||||||
go.opentelemetry.io/otel/trace v1.0.0
|
go.opentelemetry.io/otel/trace v1.3.0
|
||||||
google.golang.org/grpc v1.40.0
|
google.golang.org/grpc v1.42.0
|
||||||
)
|
)
|
||||||
|
@ -2,23 +2,30 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
|
|||||||
cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg=
|
cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg=
|
||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
|
||||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||||
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/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
|
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
|
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
|
github.com/go-logr/logr v1.2.1 h1:DX7uPQ4WgAWfoh+NGGlbJQswnYIVvz0SRlLS3rPZQDA=
|
||||||
|
github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
|
github.com/go-logr/stdr v1.2.0 h1:j4LrlVXgrbIWO83mmQUnK0Hi+YnbD+vzrE1z/EphbFE=
|
||||||
|
github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
|
||||||
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/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
@ -49,15 +56,14 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
|
|||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
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.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
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=
|
||||||
go.opentelemetry.io/otel v1.0.0 h1:qTTn6x71GVBvoafHK/yaRUmFzI4LcONZD0/kXxl5PHI=
|
go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y=
|
||||||
go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg=
|
go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
|
||||||
go.opentelemetry.io/otel/trace v1.0.0 h1:TSBr8GTEtKevYMG/2d21M989r5WJYVimhTHBKVEZuh4=
|
go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY=
|
||||||
go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs=
|
go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
|
||||||
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=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
@ -108,8 +114,8 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ
|
|||||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
||||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||||
google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q=
|
google.golang.org/grpc v1.42.0 h1:XT2/MFpuPFsEX2fWh3YQtHkZ+WYZFQRfaUgLZYj/p6A=
|
||||||
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
@ -122,7 +128,6 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
|
|||||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||||
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
|
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
|
||||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
@ -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.4.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ParseFullMethod returns a span name following the OpenTelemetry semantic
|
// ParseFullMethod returns a span name following the OpenTelemetry semantic
|
||||||
|
@ -16,7 +16,7 @@ package otelgrpc
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Semantic conventions for attribute keys for gRPC.
|
// Semantic conventions for attribute keys for gRPC.
|
||||||
|
@ -16,7 +16,7 @@ package 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.24.0"
|
return "0.27.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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
94
vendor/go.opentelemetry.io/otel/CHANGELOG.md
generated
vendored
94
vendor/go.opentelemetry.io/otel/CHANGELOG.md
generated
vendored
@ -8,6 +8,95 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [1.3.0] - 2021-12-10
|
||||||
|
|
||||||
|
### ⚠️ Notice ⚠️
|
||||||
|
|
||||||
|
We have updated the project minimum supported Go version to 1.16
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Added an internal Logger.
|
||||||
|
This can be used by the SDK and API to provide users with feedback of the internal state.
|
||||||
|
To enable verbose logs configure the logger which will print V(1) logs. For debugging information configure to print V(5) logs. (#2343)
|
||||||
|
- Add the `WithRetry` `Option` and the `RetryConfig` type to the `go.opentelemetry.io/otel/exporter/otel/otlpmetric/otlpmetrichttp` package to specify retry behavior consistently. (#2425)
|
||||||
|
- Add `SpanStatusFromHTTPStatusCodeAndSpanKind` to all `semconv` packages to return a span status code similar to `SpanStatusFromHTTPStatusCode`, but exclude `4XX` HTTP errors as span errors if the span is of server kind. (#2296)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- The `"go.opentelemetry.io/otel/exporter/otel/otlptrace/otlptracegrpc".Client` now uses the underlying gRPC `ClientConn` to handle name resolution, TCP connection establishment (with retries and backoff) and TLS handshakes, and handling errors on established connections by re-resolving the name and reconnecting. (#2329)
|
||||||
|
- The `"go.opentelemetry.io/otel/exporter/otel/otlpmetric/otlpmetricgrpc".Client` now uses the underlying gRPC `ClientConn` to handle name resolution, TCP connection establishment (with retries and backoff) and TLS handshakes, and handling errors on established connections by re-resolving the name and reconnecting. (#2425)
|
||||||
|
- The `"go.opentelemetry.io/otel/exporter/otel/otlpmetric/otlpmetricgrpc".RetrySettings` type is renamed to `RetryConfig`. (#2425)
|
||||||
|
- The `go.opentelemetry.io/otel/exporter/otel/*` gRPC exporters now default to using the host's root CA set if none are provided by the user and `WithInsecure` is not specified. (#2432)
|
||||||
|
- Change `resource.Default` to be evaluated the first time it is called, rather than on import. This allows the caller the option to update `OTEL_RESOURCE_ATTRIBUTES` first, such as with `os.Setenv`. (#2371)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- The `go.opentelemetry.io/otel/exporter/otel/*` exporters are updated to handle per-signal and universal endpoints according to the OpenTelemetry specification.
|
||||||
|
Any per-signal endpoint set via an `OTEL_EXPORTER_OTLP_<signal>_ENDPOINT` environment variable is now used without modification of the path.
|
||||||
|
When `OTEL_EXPORTER_OTLP_ENDPOINT` is set, if it contains a path, that path is used as a base path which per-signal paths are appended to. (#2433)
|
||||||
|
- Basic metric controller updated to use sync.Map to avoid blocking calls (#2381)
|
||||||
|
- The `go.opentelemetry.io/otel/exporter/jaeger` correctly sets the `otel.status_code` value to be a string of `ERROR` or `OK` instead of an integer code. (#2439, #2440)
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
- Deprecated the `"go.opentelemetry.io/otel/exporter/otel/otlpmetric/otlpmetrichttp".WithMaxAttempts` `Option`, use the new `WithRetry` `Option` instead. (#2425)
|
||||||
|
- Deprecated the `"go.opentelemetry.io/otel/exporter/otel/otlpmetric/otlpmetrichttp".WithBackoff` `Option`, use the new `WithRetry` `Option` instead. (#2425)
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Remove the metric Processor's ability to convert cumulative to delta aggregation temporality. (#2350)
|
||||||
|
- Remove the metric Bound Instruments interface and implementations. (#2399)
|
||||||
|
- Remove the metric MinMaxSumCount kind aggregation and the corresponding OTLP export path. (#2423)
|
||||||
|
- Metric SDK removes the "exact" aggregator for histogram instruments, as it performed a non-standard aggregation for OTLP export (creating repeated Gauge points) and worked its way into a number of confusing examples. (#2348)
|
||||||
|
|
||||||
|
## [1.2.0] - 2021-11-12
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Metric SDK `export.ExportKind`, `export.ExportKindSelector` types have been renamed to `aggregation.Temporality` and `aggregation.TemporalitySelector` respectively to keep in line with current specification and protocol along with built-in selectors (e.g., `aggregation.CumulativeTemporalitySelector`, ...). (#2274)
|
||||||
|
- The Metric `Exporter` interface now requires a `TemporalitySelector` method instead of an `ExportKindSelector`. (#2274)
|
||||||
|
- Metrics API cleanup. The `metric/sdkapi` package has been created to relocate the API-to-SDK interface:
|
||||||
|
- The following interface types simply moved from `metric` to `metric/sdkapi`: `Descriptor`, `MeterImpl`, `InstrumentImpl`, `SyncImpl`, `BoundSyncImpl`, `AsyncImpl`, `AsyncRunner`, `AsyncSingleRunner`, and `AsyncBatchRunner`
|
||||||
|
- The following struct types moved and are replaced with type aliases, since they are exposed to the user: `Observation`, `Measurement`.
|
||||||
|
- The No-op implementations of sync and async instruments are no longer exported, new functions `sdkapi.NewNoopAsyncInstrument()` and `sdkapi.NewNoopSyncInstrument()` are provided instead. (#2271)
|
||||||
|
- Update the SDK `BatchSpanProcessor` to export all queued spans when `ForceFlush` is called. (#2080, #2335)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add the `"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc".WithGRPCConn` option so the exporter can reuse an existing gRPC connection. (#2002)
|
||||||
|
- Added a new `schema` module to help parse Schema Files in OTEP 0152 format. (#2267)
|
||||||
|
- Added a new `MapCarrier` to the `go.opentelemetry.io/otel/propagation` package to hold propagated cross-cutting concerns as a `map[string]string` held in memory. (#2334)
|
||||||
|
|
||||||
|
## [1.1.0] - 2021-10-27
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add the `"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc".WithGRPCConn` option so the exporter can reuse an existing gRPC connection. (#2002)
|
||||||
|
- Add the `go.opentelemetry.io/otel/semconv/v1.7.0` package.
|
||||||
|
The package contains semantic conventions from the `v1.7.0` version of the OpenTelemetry specification. (#2320)
|
||||||
|
- Add the `go.opentelemetry.io/otel/semconv/v1.6.1` package.
|
||||||
|
The package contains semantic conventions from the `v1.6.1` version of the OpenTelemetry specification. (#2321)
|
||||||
|
- Add the `go.opentelemetry.io/otel/semconv/v1.5.0` package.
|
||||||
|
The package contains semantic conventions from the `v1.5.0` version of the OpenTelemetry specification. (#2322)
|
||||||
|
- When upgrading from the `semconv/v1.4.0` package note the following name changes:
|
||||||
|
- `K8SReplicasetUIDKey` -> `K8SReplicaSetUIDKey`
|
||||||
|
- `K8SReplicasetNameKey` -> `K8SReplicaSetNameKey`
|
||||||
|
- `K8SStatefulsetUIDKey` -> `K8SStatefulSetUIDKey`
|
||||||
|
- `k8SStatefulsetNameKey` -> `K8SStatefulSetNameKey`
|
||||||
|
- `K8SDaemonsetUIDKey` -> `K8SDaemonSetUIDKey`
|
||||||
|
- `K8SDaemonsetNameKey` -> `K8SDaemonSetNameKey`
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Links added to a span will be dropped by the SDK if they contain an invalid span context (#2275).
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- The `"go.opentelemetry.io/otel/semconv/v1.4.0".HTTPServerAttributesFromHTTPRequest` now correctly only sets the HTTP client IP attribute even if the connection was routed with proxies and there are multiple addresses in the `X-Forwarded-For` header. (#2282, #2284)
|
||||||
|
- The `"go.opentelemetry.io/otel/semconv/v1.4.0".NetAttributesFromHTTPRequest` function correctly handles IPv6 addresses as IP addresses and sets the correct net peer IP instead of the net peer hostname attribute. (#2283, #2285)
|
||||||
|
- The simple span processor shutdown method deterministically returns the exporter error status if it simultaneously finishes when the deadline is reached. (#2290, #2289)
|
||||||
|
|
||||||
## [1.0.1] - 2021-10-01
|
## [1.0.1] - 2021-10-01
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
@ -1550,7 +1639,10 @@ 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.0.1...HEAD
|
[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.3.0...HEAD
|
||||||
|
[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.1.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.1.0
|
||||||
[1.0.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.0.1
|
[1.0.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.0.1
|
||||||
[Metrics 0.24.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/metric/v0.24.0
|
[Metrics 0.24.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/metric/v0.24.0
|
||||||
[1.0.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.0.0
|
[1.0.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.0.0
|
||||||
|
2
vendor/go.opentelemetry.io/otel/CODEOWNERS
generated
vendored
2
vendor/go.opentelemetry.io/otel/CODEOWNERS
generated
vendored
@ -14,4 +14,4 @@
|
|||||||
|
|
||||||
* @jmacd @MrAlias @Aneurysm9 @evantorrie @XSAM @dashpole @paivagustavo @MadVikingGod @pellared
|
* @jmacd @MrAlias @Aneurysm9 @evantorrie @XSAM @dashpole @paivagustavo @MadVikingGod @pellared
|
||||||
|
|
||||||
CODEOWNERS @MrAlias @Aneurysm9
|
CODEOWNERS @MrAlias @Aneurysm9 @MadVikingGod
|
||||||
|
2
vendor/go.opentelemetry.io/otel/CONTRIBUTING.md
generated
vendored
2
vendor/go.opentelemetry.io/otel/CONTRIBUTING.md
generated
vendored
@ -481,11 +481,11 @@ Approvers:
|
|||||||
- [Sam Xie](https://github.com/XSAM)
|
- [Sam Xie](https://github.com/XSAM)
|
||||||
- [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
|
||||||
- [Aaron Clawson](https://github.com/MadVikingGod)
|
|
||||||
- [Robert Pająk](https://github.com/pellared), Splunk
|
- [Robert Pająk](https://github.com/pellared), Splunk
|
||||||
|
|
||||||
Maintainers:
|
Maintainers:
|
||||||
|
|
||||||
|
- [Aaron Clawson](https://github.com/MadVikingGod), LightStep
|
||||||
- [Anthony Mirabella](https://github.com/Aneurysm9), AWS
|
- [Anthony Mirabella](https://github.com/Aneurysm9), AWS
|
||||||
- [Tyler Yahn](https://github.com/MrAlias), Splunk
|
- [Tyler Yahn](https://github.com/MrAlias), Splunk
|
||||||
|
|
||||||
|
4
vendor/go.opentelemetry.io/otel/Makefile
generated
vendored
4
vendor/go.opentelemetry.io/otel/Makefile
generated
vendored
@ -80,7 +80,7 @@ examples:
|
|||||||
$(GO) build .); \
|
$(GO) build .); \
|
||||||
done
|
done
|
||||||
|
|
||||||
generate: $(STRINGER)
|
generate: $(STRINGER) $(PORTO)
|
||||||
set -e; for dir in $(ALL_GO_MOD_DIRS); do \
|
set -e; for dir in $(ALL_GO_MOD_DIRS); do \
|
||||||
echo "$(GO) generate $${dir}/..."; \
|
echo "$(GO) generate $${dir}/..."; \
|
||||||
(cd "$${dir}" && \
|
(cd "$${dir}" && \
|
||||||
@ -145,7 +145,7 @@ lint: misspell lint-modules | $(GOLANGCI_LINT)
|
|||||||
|
|
||||||
.PHONY: vanity-import-check
|
.PHONY: vanity-import-check
|
||||||
vanity-import-check: | $(PORTO)
|
vanity-import-check: | $(PORTO)
|
||||||
$(PORTO) -l .
|
$(PORTO) --include-internal -l .
|
||||||
|
|
||||||
.PHONY: misspell
|
.PHONY: misspell
|
||||||
misspell: | $(MISSPELL)
|
misspell: | $(MISSPELL)
|
||||||
|
17
vendor/go.opentelemetry.io/otel/README.md
generated
vendored
17
vendor/go.opentelemetry.io/otel/README.md
generated
vendored
@ -30,20 +30,27 @@ Project versioning information and stability guarantees can be found in the
|
|||||||
|
|
||||||
### Compatibility
|
### Compatibility
|
||||||
|
|
||||||
|
OpenTelemetry-Go attempts to track the current supported versions of the
|
||||||
|
[Go language](https://golang.org/doc/devel/release#policy). The release
|
||||||
|
schedule after a new minor version of go is as follows:
|
||||||
|
|
||||||
|
- The first release or one month, which ever is sooner, will add build steps for the new go version.
|
||||||
|
- The first release after three months will remove support for the oldest go version.
|
||||||
|
|
||||||
This project is tested on the following systems.
|
This project is tested on the following systems.
|
||||||
|
|
||||||
| OS | Go Version | Architecture |
|
| OS | Go Version | Architecture |
|
||||||
| ------- | ---------- | ------------ |
|
| ------- | ---------- | ------------ |
|
||||||
|
| Ubuntu | 1.17 | amd64 |
|
||||||
| Ubuntu | 1.16 | amd64 |
|
| Ubuntu | 1.16 | amd64 |
|
||||||
| Ubuntu | 1.15 | amd64 |
|
| Ubuntu | 1.17 | 386 |
|
||||||
| Ubuntu | 1.16 | 386 |
|
| Ubuntu | 1.16 | 386 |
|
||||||
| Ubuntu | 1.15 | 386 |
|
| MacOS | 1.17 | amd64 |
|
||||||
| MacOS | 1.16 | amd64 |
|
| MacOS | 1.16 | amd64 |
|
||||||
| MacOS | 1.15 | amd64 |
|
| Windows | 1.17 | amd64 |
|
||||||
| Windows | 1.16 | amd64 |
|
| Windows | 1.16 | amd64 |
|
||||||
| Windows | 1.15 | amd64 |
|
| Windows | 1.17 | 386 |
|
||||||
| Windows | 1.16 | 386 |
|
| Windows | 1.16 | 386 |
|
||||||
| Windows | 1.15 | 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.
|
||||||
|
2
vendor/go.opentelemetry.io/otel/attribute/type_string.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/attribute/type_string.go
generated
vendored
@ -1,6 +1,6 @@
|
|||||||
// Code generated by "stringer -type=Type"; DO NOT EDIT.
|
// Code generated by "stringer -type=Type"; DO NOT EDIT.
|
||||||
|
|
||||||
package attribute // import "go.opentelemetry.io/otel/attribute"
|
package attribute
|
||||||
|
|
||||||
import "strconv"
|
import "strconv"
|
||||||
|
|
||||||
|
201
vendor/go.opentelemetry.io/otel/exporters/otlp/internal/retry/LICENSE
generated
vendored
Normal file
201
vendor/go.opentelemetry.io/otel/exporters/otlp/internal/retry/LICENSE
generated
vendored
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
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.
|
72
vendor/go.opentelemetry.io/otel/exporters/otlp/internal/retry/go.mod
generated
vendored
Normal file
72
vendor/go.opentelemetry.io/otel/exporters/otlp/internal/retry/go.mod
generated
vendored
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
module go.opentelemetry.io/otel/exporters/otlp/internal/retry
|
||||||
|
|
||||||
|
go 1.16
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/cenkalti/backoff/v4 v4.1.2
|
||||||
|
github.com/stretchr/testify v1.7.0
|
||||||
|
)
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel => ../../../..
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/bridge/opencensus => ../../../../bridge/opencensus
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../../../bridge/opencensus/test
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/bridge/opentracing => ../../../../bridge/opentracing
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/example/fib => ../../../../example/fib
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/example/jaeger => ../../../../example/jaeger
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/example/namedtracer => ../../../../example/namedtracer
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/example/opencensus => ../../../../example/opencensus
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/example/otel-collector => ../../../../example/otel-collector
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/example/passthrough => ../../../../example/passthrough
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/example/prometheus => ../../../../example/prometheus
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/example/zipkin => ../../../../example/zipkin
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/exporters/jaeger => ../../../jaeger
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ./
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric => ../../otlpmetric
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc => ../../otlpmetric/otlpmetricgrpc
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp => ../../otlpmetric/otlpmetrichttp
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/exporters/otlp/otlptrace => ../../otlptrace
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc => ../../otlptrace/otlptracegrpc
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp => ../../otlptrace/otlptracehttp
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/exporters/prometheus => ../../../prometheus
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/exporters/stdout/stdoutmetric => ../../../stdout/stdoutmetric
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/exporters/stdout/stdouttrace => ../../../stdout/stdouttrace
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/exporters/zipkin => ../../../zipkin
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/internal/metric => ../../../../internal/metric
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/internal/tools => ../../../../internal/tools
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/metric => ../../../../metric
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/schema => ../../../../schema
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/sdk => ../../../../sdk
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/sdk/export/metric => ../../../../sdk/export/metric
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/sdk/metric => ../../../../sdk/metric
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/trace => ../../../../trace
|
13
vendor/go.opentelemetry.io/otel/exporters/otlp/internal/retry/go.sum
generated
vendored
Normal file
13
vendor/go.opentelemetry.io/otel/exporters/otlp/internal/retry/go.sum
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo=
|
||||||
|
github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
||||||
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||||
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
@ -12,7 +12,10 @@
|
|||||||
// 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 retry
|
// Package retry provides request retry functionality that can perform
|
||||||
|
// configurable exponential backoff for transient errors and honor any
|
||||||
|
// explicit throttle responses received.
|
||||||
|
package retry // import "go.opentelemetry.io/otel/exporters/otlp/internal/retry"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -54,8 +57,18 @@ type RequestFunc func(context.Context, func(context.Context) error) error
|
|||||||
|
|
||||||
// EvaluateFunc returns if an error is retry-able and if an explicit throttle
|
// EvaluateFunc returns if an error is retry-able and if an explicit throttle
|
||||||
// duration should be honored that was included in the error.
|
// duration should be honored that was included in the error.
|
||||||
|
//
|
||||||
|
// The function must return true if the error argument is retry-able,
|
||||||
|
// otherwise it must return false for the first return parameter.
|
||||||
|
//
|
||||||
|
// The function must return a non-zero time.Duration if the error contains
|
||||||
|
// explicit throttle duration that should be honored, otherwise it must return
|
||||||
|
// a zero valued time.Duration.
|
||||||
type EvaluateFunc func(error) (bool, time.Duration)
|
type EvaluateFunc func(error) (bool, time.Duration)
|
||||||
|
|
||||||
|
// RequestFunc returns a RequestFunc using the evaluate function to determine
|
||||||
|
// if requests can be retried and based on the exponential backoff
|
||||||
|
// configuration of c.
|
||||||
func (c Config) RequestFunc(evaluate EvaluateFunc) RequestFunc {
|
func (c Config) RequestFunc(evaluate EvaluateFunc) RequestFunc {
|
||||||
if !c.Enabled {
|
if !c.Enabled {
|
||||||
return func(ctx context.Context, fn func(context.Context) error) error {
|
return func(ctx context.Context, fn func(context.Context) error) error {
|
||||||
@ -122,7 +135,14 @@ func wait(ctx context.Context, delay time.Duration) error {
|
|||||||
|
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
|
// Handle the case where the timer and context deadline end
|
||||||
|
// simultaneously by prioritizing the timer expiration nil value
|
||||||
|
// response.
|
||||||
|
select {
|
||||||
|
case <-timer.C:
|
||||||
|
default:
|
||||||
return ctx.Err()
|
return ctx.Err()
|
||||||
|
}
|
||||||
case <-timer.C:
|
case <-timer.C:
|
||||||
}
|
}
|
||||||
|
|
6
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/README.md
generated
vendored
6
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/README.md
generated
vendored
@ -33,8 +33,10 @@ The `otlptracehttp` package implements a client for the span exporter that sends
|
|||||||
|
|
||||||
### Environment Variables
|
### Environment Variables
|
||||||
|
|
||||||
The following environment variables can be used
|
The following environment variables can be used (instead of options objects) to
|
||||||
(instead of options objects) to override the default configuration.
|
override the default configuration. For more information about how each of
|
||||||
|
these environment variables is interpreted, see [the OpenTelemetry
|
||||||
|
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 |
|
||||||
| ------------------------------------------------------------------------ |------------------------------ | ----------------------------------- |
|
| ------------------------------------------------------------------------ |------------------------------ | ----------------------------------- |
|
||||||
|
1
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/exporter.go
generated
vendored
1
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/exporter.go
generated
vendored
@ -20,7 +20,6 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform"
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform"
|
||||||
|
|
||||||
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
19
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/go.mod
generated
vendored
19
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/go.mod
generated
vendored
@ -1,17 +1,16 @@
|
|||||||
module go.opentelemetry.io/otel/exporters/otlp/otlptrace
|
module go.opentelemetry.io/otel/exporters/otlp/otlptrace
|
||||||
|
|
||||||
go 1.15
|
go 1.16
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/cenkalti/backoff/v4 v4.1.1
|
|
||||||
github.com/google/go-cmp v0.5.6
|
github.com/google/go-cmp v0.5.6
|
||||||
github.com/stretchr/testify v1.7.0
|
github.com/stretchr/testify v1.7.0
|
||||||
go.opentelemetry.io/otel v1.0.1
|
go.opentelemetry.io/otel v1.3.0
|
||||||
go.opentelemetry.io/otel/sdk v1.0.1
|
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0
|
||||||
go.opentelemetry.io/otel/trace v1.0.1
|
go.opentelemetry.io/otel/sdk v1.3.0
|
||||||
go.opentelemetry.io/proto/otlp v0.9.0
|
go.opentelemetry.io/otel/trace v1.3.0
|
||||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013
|
go.opentelemetry.io/proto/otlp v0.11.0
|
||||||
google.golang.org/grpc v1.41.0
|
google.golang.org/grpc v1.42.0
|
||||||
google.golang.org/protobuf v1.27.1
|
google.golang.org/protobuf v1.27.1
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -76,3 +75,7 @@ replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp => ../
|
|||||||
replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../../bridge/opencensus/test
|
replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../../bridge/opencensus/test
|
||||||
|
|
||||||
replace go.opentelemetry.io/otel/example/fib => ../../../example/fib
|
replace go.opentelemetry.io/otel/example/fib => ../../../example/fib
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/schema => ../../../schema
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../internal/retry
|
||||||
|
22
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/go.sum
generated
vendored
22
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/go.sum
generated
vendored
@ -2,24 +2,31 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
|
|||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||||
github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ=
|
github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo=
|
||||||
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/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/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
|
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
|
||||||
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
|
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
|
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
|
github.com/go-logr/logr v1.2.1 h1:DX7uPQ4WgAWfoh+NGGlbJQswnYIVvz0SRlLS3rPZQDA=
|
||||||
|
github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
|
github.com/go-logr/stdr v1.2.0 h1:j4LrlVXgrbIWO83mmQUnK0Hi+YnbD+vzrE1z/EphbFE=
|
||||||
|
github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
|
||||||
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/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
@ -56,8 +63,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
|
|||||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
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=
|
||||||
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.9.0 h1:C0g6TWmQYvjKRnljRULLWUVJGy8Uvu0NEL/5frY2/t4=
|
go.opentelemetry.io/proto/otlp v0.11.0 h1:cLDgIBTf4lLOlztkhzAEdQsJ4Lj+i5Wc9k6Nn0K1VyU=
|
||||||
go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg=
|
go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
@ -106,9 +113,8 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ
|
|||||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
||||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||||
google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
google.golang.org/grpc v1.42.0 h1:XT2/MFpuPFsEX2fWh3YQtHkZ+WYZFQRfaUgLZYj/p6A=
|
||||||
google.golang.org/grpc v1.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E=
|
google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
||||||
google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k=
|
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
|
332
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/connection/connection.go
generated
vendored
332
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/connection/connection.go
generated
vendored
@ -1,332 +0,0 @@
|
|||||||
// 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 connection
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"math/rand"
|
|
||||||
"sync"
|
|
||||||
"sync/atomic"
|
|
||||||
"time"
|
|
||||||
"unsafe"
|
|
||||||
|
|
||||||
"google.golang.org/genproto/googleapis/rpc/errdetails"
|
|
||||||
"google.golang.org/grpc/codes"
|
|
||||||
"google.golang.org/grpc/status"
|
|
||||||
|
|
||||||
"google.golang.org/grpc/encoding/gzip"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig"
|
|
||||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/retry"
|
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
"google.golang.org/grpc/metadata"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Connection struct {
|
|
||||||
// Ensure pointer is 64-bit aligned for atomic operations on both 32 and 64 bit machines.
|
|
||||||
lastConnectErrPtr unsafe.Pointer
|
|
||||||
|
|
||||||
// mu protects the Connection as it is accessed by the
|
|
||||||
// exporter goroutines and background Connection goroutine
|
|
||||||
mu sync.Mutex
|
|
||||||
cc *grpc.ClientConn
|
|
||||||
|
|
||||||
// these fields are read-only after constructor is finished
|
|
||||||
cfg otlpconfig.Config
|
|
||||||
SCfg otlpconfig.SignalConfig
|
|
||||||
requestFunc retry.RequestFunc
|
|
||||||
metadata metadata.MD
|
|
||||||
newConnectionHandler func(cc *grpc.ClientConn)
|
|
||||||
|
|
||||||
// these channels are created once
|
|
||||||
disconnectedCh chan bool
|
|
||||||
backgroundConnectionDoneCh chan struct{}
|
|
||||||
stopCh chan struct{}
|
|
||||||
|
|
||||||
// this is for tests, so they can replace the closing
|
|
||||||
// routine without a worry of modifying some global variable
|
|
||||||
// or changing it back to original after the test is done
|
|
||||||
closeBackgroundConnectionDoneCh func(ch chan struct{})
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewConnection(cfg otlpconfig.Config, sCfg otlpconfig.SignalConfig, handler func(cc *grpc.ClientConn)) *Connection {
|
|
||||||
c := new(Connection)
|
|
||||||
c.newConnectionHandler = handler
|
|
||||||
c.cfg = cfg
|
|
||||||
c.requestFunc = cfg.RetryConfig.RequestFunc(evaluate)
|
|
||||||
c.SCfg = sCfg
|
|
||||||
if len(c.SCfg.Headers) > 0 {
|
|
||||||
c.metadata = metadata.New(c.SCfg.Headers)
|
|
||||||
}
|
|
||||||
c.closeBackgroundConnectionDoneCh = func(ch chan struct{}) {
|
|
||||||
close(ch)
|
|
||||||
}
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Connection) StartConnection(ctx context.Context) error {
|
|
||||||
c.stopCh = make(chan struct{})
|
|
||||||
c.disconnectedCh = make(chan bool, 1)
|
|
||||||
c.backgroundConnectionDoneCh = make(chan struct{})
|
|
||||||
|
|
||||||
if err := c.connect(ctx); err == nil {
|
|
||||||
c.setStateConnected()
|
|
||||||
} else {
|
|
||||||
c.SetStateDisconnected(err)
|
|
||||||
}
|
|
||||||
go c.indefiniteBackgroundConnection()
|
|
||||||
|
|
||||||
// TODO: proper error handling when initializing connections.
|
|
||||||
// We can report permanent errors, e.g., invalid settings.
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Connection) LastConnectError() error {
|
|
||||||
errPtr := (*error)(atomic.LoadPointer(&c.lastConnectErrPtr))
|
|
||||||
if errPtr == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return *errPtr
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Connection) saveLastConnectError(err error) {
|
|
||||||
var errPtr *error
|
|
||||||
if err != nil {
|
|
||||||
errPtr = &err
|
|
||||||
}
|
|
||||||
atomic.StorePointer(&c.lastConnectErrPtr, unsafe.Pointer(errPtr))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Connection) SetStateDisconnected(err error) {
|
|
||||||
c.saveLastConnectError(err)
|
|
||||||
select {
|
|
||||||
case c.disconnectedCh <- true:
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
c.newConnectionHandler(nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Connection) setStateConnected() {
|
|
||||||
c.saveLastConnectError(nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Connection) Connected() bool {
|
|
||||||
return c.LastConnectError() == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
const defaultConnReattemptPeriod = 10 * time.Second
|
|
||||||
|
|
||||||
func (c *Connection) indefiniteBackgroundConnection() {
|
|
||||||
defer func() {
|
|
||||||
c.closeBackgroundConnectionDoneCh(c.backgroundConnectionDoneCh)
|
|
||||||
}()
|
|
||||||
|
|
||||||
connReattemptPeriod := c.cfg.ReconnectionPeriod
|
|
||||||
if connReattemptPeriod <= 0 {
|
|
||||||
connReattemptPeriod = defaultConnReattemptPeriod
|
|
||||||
}
|
|
||||||
|
|
||||||
// No strong seeding required, nano time can
|
|
||||||
// already help with pseudo uniqueness.
|
|
||||||
rng := rand.New(rand.NewSource(time.Now().UnixNano() + rand.Int63n(1024)))
|
|
||||||
|
|
||||||
// maxJitterNanos: 70% of the connectionReattemptPeriod
|
|
||||||
maxJitterNanos := int64(0.7 * float64(connReattemptPeriod))
|
|
||||||
|
|
||||||
for {
|
|
||||||
// Otherwise these will be the normal scenarios to enable
|
|
||||||
// reconnection if we trip out.
|
|
||||||
// 1. If we've stopped, return entirely
|
|
||||||
// 2. Otherwise block until we are disconnected, and
|
|
||||||
// then retry connecting
|
|
||||||
select {
|
|
||||||
case <-c.stopCh:
|
|
||||||
return
|
|
||||||
|
|
||||||
case <-c.disconnectedCh:
|
|
||||||
// Quickly check if we haven't stopped at the
|
|
||||||
// same time.
|
|
||||||
select {
|
|
||||||
case <-c.stopCh:
|
|
||||||
return
|
|
||||||
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
|
|
||||||
// Normal scenario that we'll wait for
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := c.connect(context.Background()); err == nil {
|
|
||||||
c.setStateConnected()
|
|
||||||
} else {
|
|
||||||
// this code is unreachable in most cases
|
|
||||||
// c.connect does not establish Connection
|
|
||||||
c.SetStateDisconnected(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply some jitter to avoid lockstep retrials of other
|
|
||||||
// collector-exporters. Lockstep retrials could result in an
|
|
||||||
// innocent DDOS, by clogging the machine's resources and network.
|
|
||||||
jitter := time.Duration(rng.Int63n(maxJitterNanos))
|
|
||||||
select {
|
|
||||||
case <-c.stopCh:
|
|
||||||
return
|
|
||||||
case <-time.After(connReattemptPeriod + jitter):
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Connection) connect(ctx context.Context) error {
|
|
||||||
cc, err := c.dialToCollector(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
c.setConnection(cc)
|
|
||||||
c.newConnectionHandler(cc)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// setConnection sets cc as the client Connection and returns true if
|
|
||||||
// the Connection state changed.
|
|
||||||
func (c *Connection) setConnection(cc *grpc.ClientConn) bool {
|
|
||||||
c.mu.Lock()
|
|
||||||
defer c.mu.Unlock()
|
|
||||||
|
|
||||||
// If previous clientConn is same as the current then just return.
|
|
||||||
// This doesn't happen right now as this func is only called with new ClientConn.
|
|
||||||
// It is more about future-proofing.
|
|
||||||
if c.cc == cc {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the previous clientConn was non-nil, close it
|
|
||||||
if c.cc != nil {
|
|
||||||
_ = c.cc.Close()
|
|
||||||
}
|
|
||||||
c.cc = cc
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Connection) dialToCollector(ctx context.Context) (*grpc.ClientConn, error) {
|
|
||||||
dialOpts := []grpc.DialOption{}
|
|
||||||
if c.cfg.ServiceConfig != "" {
|
|
||||||
dialOpts = append(dialOpts, grpc.WithDefaultServiceConfig(c.cfg.ServiceConfig))
|
|
||||||
}
|
|
||||||
if c.SCfg.GRPCCredentials != nil {
|
|
||||||
dialOpts = append(dialOpts, grpc.WithTransportCredentials(c.SCfg.GRPCCredentials))
|
|
||||||
} else if c.SCfg.Insecure {
|
|
||||||
dialOpts = append(dialOpts, grpc.WithInsecure())
|
|
||||||
}
|
|
||||||
if c.SCfg.Compression == otlpconfig.GzipCompression {
|
|
||||||
dialOpts = append(dialOpts, grpc.WithDefaultCallOptions(grpc.UseCompressor(gzip.Name)))
|
|
||||||
}
|
|
||||||
if len(c.cfg.DialOptions) != 0 {
|
|
||||||
dialOpts = append(dialOpts, c.cfg.DialOptions...)
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx, cancel := c.ContextWithStop(ctx)
|
|
||||||
defer cancel()
|
|
||||||
ctx = c.ContextWithMetadata(ctx)
|
|
||||||
return grpc.DialContext(ctx, c.SCfg.Endpoint, dialOpts...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Connection) ContextWithMetadata(ctx context.Context) context.Context {
|
|
||||||
if c.metadata.Len() > 0 {
|
|
||||||
return metadata.NewOutgoingContext(ctx, c.metadata)
|
|
||||||
}
|
|
||||||
return ctx
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Connection) Shutdown(ctx context.Context) error {
|
|
||||||
close(c.stopCh)
|
|
||||||
// Ensure that the backgroundConnector returns
|
|
||||||
select {
|
|
||||||
case <-c.backgroundConnectionDoneCh:
|
|
||||||
case <-ctx.Done():
|
|
||||||
return ctx.Err()
|
|
||||||
}
|
|
||||||
|
|
||||||
c.mu.Lock()
|
|
||||||
cc := c.cc
|
|
||||||
c.cc = nil
|
|
||||||
c.mu.Unlock()
|
|
||||||
|
|
||||||
if cc != nil {
|
|
||||||
return cc.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Connection) ContextWithStop(ctx context.Context) (context.Context, context.CancelFunc) {
|
|
||||||
// Unify the parent context Done signal with the Connection's
|
|
||||||
// stop channel.
|
|
||||||
ctx, cancel := context.WithCancel(ctx)
|
|
||||||
go func(ctx context.Context, cancel context.CancelFunc) {
|
|
||||||
select {
|
|
||||||
case <-ctx.Done():
|
|
||||||
// Nothing to do, either cancelled or deadline
|
|
||||||
// happened.
|
|
||||||
case <-c.stopCh:
|
|
||||||
cancel()
|
|
||||||
}
|
|
||||||
}(ctx, cancel)
|
|
||||||
return ctx, cancel
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Connection) DoRequest(ctx context.Context, fn func(context.Context) error) error {
|
|
||||||
ctx, cancel := c.ContextWithStop(ctx)
|
|
||||||
defer cancel()
|
|
||||||
return c.requestFunc(ctx, func(ctx context.Context) error {
|
|
||||||
err := fn(ctx)
|
|
||||||
// nil is converted to OK.
|
|
||||||
if status.Code(err) == codes.OK {
|
|
||||||
// Success.
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// evaluate returns if err is retry-able and a duration to wait for if an
|
|
||||||
// explicit throttle time is included in err.
|
|
||||||
func evaluate(err error) (bool, time.Duration) {
|
|
||||||
s := status.Convert(err)
|
|
||||||
switch s.Code() {
|
|
||||||
case codes.Canceled,
|
|
||||||
codes.DeadlineExceeded,
|
|
||||||
codes.ResourceExhausted,
|
|
||||||
codes.Aborted,
|
|
||||||
codes.OutOfRange,
|
|
||||||
codes.Unavailable,
|
|
||||||
codes.DataLoss:
|
|
||||||
return true, throttleDelay(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Not a retry-able error.
|
|
||||||
return false, 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// throttleDelay returns a duration to wait for if an explicit throttle time
|
|
||||||
// is included in the response status.
|
|
||||||
func throttleDelay(status *status.Status) time.Duration {
|
|
||||||
for _, detail := range status.Details() {
|
|
||||||
if t, ok := detail.(*errdetails.RetryInfo); ok {
|
|
||||||
return t.RetryDelay.AsDuration()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
@ -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 otlpconfig
|
package otlpconfig // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
@ -20,7 +20,7 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"path"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@ -28,24 +28,17 @@ import (
|
|||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
)
|
)
|
||||||
|
|
||||||
var httpSchemeRegexp = regexp.MustCompile(`(?i)^(http://|https://)`)
|
var DefaultEnvOptionsReader = EnvOptionsReader{
|
||||||
|
|
||||||
func ApplyGRPCEnvConfigs(cfg *Config) {
|
|
||||||
e := EnvOptionsReader{
|
|
||||||
GetEnv: os.Getenv,
|
GetEnv: os.Getenv,
|
||||||
ReadFile: ioutil.ReadFile,
|
ReadFile: ioutil.ReadFile,
|
||||||
}
|
}
|
||||||
|
|
||||||
e.ApplyGRPCEnvConfigs(cfg)
|
func ApplyGRPCEnvConfigs(cfg *Config) {
|
||||||
|
DefaultEnvOptionsReader.ApplyGRPCEnvConfigs(cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ApplyHTTPEnvConfigs(cfg *Config) {
|
func ApplyHTTPEnvConfigs(cfg *Config) {
|
||||||
e := EnvOptionsReader{
|
DefaultEnvOptionsReader.ApplyHTTPEnvConfigs(cfg)
|
||||||
GetEnv: os.Getenv,
|
|
||||||
ReadFile: ioutil.ReadFile,
|
|
||||||
}
|
|
||||||
|
|
||||||
e.ApplyHTTPEnvConfigs(cfg)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type EnvOptionsReader struct {
|
type EnvOptionsReader struct {
|
||||||
@ -71,23 +64,55 @@ func (e *EnvOptionsReader) GetOptionsFromEnv() []GenericOption {
|
|||||||
var opts []GenericOption
|
var opts []GenericOption
|
||||||
|
|
||||||
// Endpoint
|
// Endpoint
|
||||||
if v, ok := e.getEnvValue("ENDPOINT"); ok {
|
|
||||||
if isInsecureEndpoint(v) {
|
|
||||||
opts = append(opts, WithInsecure())
|
|
||||||
} else {
|
|
||||||
opts = append(opts, WithSecure())
|
|
||||||
}
|
|
||||||
|
|
||||||
opts = append(opts, WithEndpoint(trimSchema(v)))
|
|
||||||
}
|
|
||||||
if v, ok := e.getEnvValue("TRACES_ENDPOINT"); ok {
|
if v, ok := e.getEnvValue("TRACES_ENDPOINT"); ok {
|
||||||
if isInsecureEndpoint(v) {
|
u, err := url.Parse(v)
|
||||||
|
// Ignore invalid values.
|
||||||
|
if err == nil {
|
||||||
|
// This is used to set the scheme for OTLP/HTTP.
|
||||||
|
if insecureSchema(u.Scheme) {
|
||||||
opts = append(opts, WithInsecure())
|
opts = append(opts, WithInsecure())
|
||||||
} else {
|
} else {
|
||||||
opts = append(opts, WithSecure())
|
opts = append(opts, WithSecure())
|
||||||
}
|
}
|
||||||
|
opts = append(opts, newSplitOption(func(cfg *Config) {
|
||||||
opts = append(opts, WithEndpoint(trimSchema(v)))
|
cfg.Traces.Endpoint = u.Host
|
||||||
|
// For endpoint URLs for OTLP/HTTP per-signal variables, the
|
||||||
|
// URL MUST be used as-is without any modification. The only
|
||||||
|
// exception is that if an URL contains no path part, the root
|
||||||
|
// path / MUST be used.
|
||||||
|
path := u.Path
|
||||||
|
if path == "" {
|
||||||
|
path = "/"
|
||||||
|
}
|
||||||
|
cfg.Traces.URLPath = path
|
||||||
|
}, 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)
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
} else if v, ok = e.getEnvValue("ENDPOINT"); ok {
|
||||||
|
u, err := url.Parse(v)
|
||||||
|
// Ignore invalid values.
|
||||||
|
if err == nil {
|
||||||
|
// This is used to set the scheme for OTLP/HTTP.
|
||||||
|
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
|
// Certificate File
|
||||||
@ -136,12 +161,13 @@ func (e *EnvOptionsReader) GetOptionsFromEnv() []GenericOption {
|
|||||||
return opts
|
return opts
|
||||||
}
|
}
|
||||||
|
|
||||||
func isInsecureEndpoint(endpoint string) bool {
|
func insecureSchema(schema string) bool {
|
||||||
return strings.HasPrefix(strings.ToLower(endpoint), "http://") || strings.HasPrefix(strings.ToLower(endpoint), "unix://")
|
switch strings.ToLower(schema) {
|
||||||
}
|
case "http", "unix":
|
||||||
|
return true
|
||||||
func trimSchema(endpoint string) string {
|
default:
|
||||||
return httpSchemeRegexp.ReplaceAllString(endpoint, "")
|
return false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// getEnvValue gets an OTLP environment variable value of the specified key using the GetEnv function.
|
// getEnvValue gets an OTLP environment variable value of the specified key using the GetEnv function.
|
||||||
|
45
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/options.go
generated
vendored
45
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/options.go
generated
vendored
@ -20,9 +20,11 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
|
"google.golang.org/grpc/backoff"
|
||||||
"google.golang.org/grpc/credentials"
|
"google.golang.org/grpc/credentials"
|
||||||
|
"google.golang.org/grpc/encoding/gzip"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/retry"
|
"go.opentelemetry.io/otel/exporters/otlp/internal/retry"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -58,6 +60,7 @@ type (
|
|||||||
ReconnectionPeriod time.Duration
|
ReconnectionPeriod time.Duration
|
||||||
ServiceConfig string
|
ServiceConfig string
|
||||||
DialOptions []grpc.DialOption
|
DialOptions []grpc.DialOption
|
||||||
|
GRPCConn *grpc.ClientConn
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -75,6 +78,46 @@ func NewDefaultConfig() Config {
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewGRPCConfig returns a new Config with all settings applied from opts and
|
||||||
|
// any unset setting using the default gRPC config values.
|
||||||
|
func NewGRPCConfig(opts ...GRPCOption) Config {
|
||||||
|
cfg := NewDefaultConfig()
|
||||||
|
ApplyGRPCEnvConfigs(&cfg)
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt.ApplyGRPCOption(&cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg.ServiceConfig != "" {
|
||||||
|
cfg.DialOptions = append(cfg.DialOptions, grpc.WithDefaultServiceConfig(cfg.ServiceConfig))
|
||||||
|
}
|
||||||
|
// Priroritize GRPCCredentials over Insecure (passing both is an error).
|
||||||
|
if cfg.Traces.GRPCCredentials != nil {
|
||||||
|
cfg.DialOptions = append(cfg.DialOptions, grpc.WithTransportCredentials(cfg.Traces.GRPCCredentials))
|
||||||
|
} else if cfg.Traces.Insecure {
|
||||||
|
cfg.DialOptions = append(cfg.DialOptions, grpc.WithInsecure())
|
||||||
|
} else {
|
||||||
|
// Default to using the host's root CA.
|
||||||
|
creds := credentials.NewTLS(nil)
|
||||||
|
cfg.Traces.GRPCCredentials = creds
|
||||||
|
cfg.DialOptions = append(cfg.DialOptions, grpc.WithTransportCredentials(creds))
|
||||||
|
}
|
||||||
|
if cfg.Traces.Compression == GzipCompression {
|
||||||
|
cfg.DialOptions = append(cfg.DialOptions, grpc.WithDefaultCallOptions(grpc.UseCompressor(gzip.Name)))
|
||||||
|
}
|
||||||
|
if len(cfg.DialOptions) != 0 {
|
||||||
|
cfg.DialOptions = append(cfg.DialOptions, cfg.DialOptions...)
|
||||||
|
}
|
||||||
|
if cfg.ReconnectionPeriod != 0 {
|
||||||
|
p := grpc.ConnectParams{
|
||||||
|
Backoff: backoff.DefaultConfig,
|
||||||
|
MinConnectTimeout: cfg.ReconnectionPeriod,
|
||||||
|
}
|
||||||
|
cfg.DialOptions = append(cfg.DialOptions, grpc.WithConnectParams(p))
|
||||||
|
}
|
||||||
|
|
||||||
|
return cfg
|
||||||
|
}
|
||||||
|
|
||||||
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 {
|
||||||
|
2
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/tls.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/tls.go
generated
vendored
@ -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 otlpconfig
|
package otlpconfig // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
|
@ -12,13 +12,12 @@
|
|||||||
// 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 tracetransform
|
package tracetransform // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
commonpb "go.opentelemetry.io/proto/otlp/common/v1"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
commonpb "go.opentelemetry.io/proto/otlp/common/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
// KeyValues transforms a slice of attribute KeyValues into OTLP key-values.
|
// KeyValues transforms a slice of attribute KeyValues into OTLP key-values.
|
||||||
|
@ -12,12 +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 tracetransform
|
package tracetransform // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
commonpb "go.opentelemetry.io/proto/otlp/common/v1"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
"go.opentelemetry.io/otel/sdk/instrumentation"
|
||||||
|
commonpb "go.opentelemetry.io/proto/otlp/common/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
func InstrumentationLibrary(il instrumentation.Library) *commonpb.InstrumentationLibrary {
|
func InstrumentationLibrary(il instrumentation.Library) *commonpb.InstrumentationLibrary {
|
||||||
|
@ -12,12 +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 tracetransform
|
package tracetransform // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
resourcepb "go.opentelemetry.io/proto/otlp/resource/v1"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
resourcepb "go.opentelemetry.io/proto/otlp/resource/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Resource transforms a Resource into an OTLP Resource.
|
// Resource transforms a Resource into an OTLP Resource.
|
||||||
|
@ -12,16 +12,15 @@
|
|||||||
// 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 tracetransform
|
package tracetransform // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
"go.opentelemetry.io/otel/sdk/instrumentation"
|
||||||
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
271
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/client.go
generated
vendored
271
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/client.go
generated
vendored
@ -17,94 +17,259 @@ package otlptracegrpc // import "go.opentelemetry.io/otel/exporters/otlp/otlptra
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
"google.golang.org/genproto/googleapis/rpc/errdetails"
|
||||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/connection"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig"
|
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
|
"google.golang.org/grpc/codes"
|
||||||
|
"google.golang.org/grpc/metadata"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/internal/retry"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig"
|
||||||
coltracepb "go.opentelemetry.io/proto/otlp/collector/trace/v1"
|
coltracepb "go.opentelemetry.io/proto/otlp/collector/trace/v1"
|
||||||
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
|
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
type client struct {
|
type client struct {
|
||||||
connection *connection.Connection
|
endpoint string
|
||||||
|
dialOpts []grpc.DialOption
|
||||||
|
metadata metadata.MD
|
||||||
|
exportTimeout time.Duration
|
||||||
|
requestFunc retry.RequestFunc
|
||||||
|
|
||||||
lock sync.Mutex
|
// stopCtx is used as a parent context for all exports. Therefore, when it
|
||||||
tracesClient coltracepb.TraceServiceClient
|
// is canceled with the stopFunc all exports are canceled.
|
||||||
|
stopCtx context.Context
|
||||||
|
// stopFunc cancels stopCtx, stopping any active exports.
|
||||||
|
stopFunc context.CancelFunc
|
||||||
|
|
||||||
|
// ourConn keeps track of where conn was created: true if created here on
|
||||||
|
// Start, or false if passed with an option. This is important on Shutdown
|
||||||
|
// as the conn should only be closed if created here on start. Otherwise,
|
||||||
|
// it is up to the processes that passed the conn to close it.
|
||||||
|
ourConn bool
|
||||||
|
conn *grpc.ClientConn
|
||||||
|
tscMu sync.RWMutex
|
||||||
|
tsc coltracepb.TraceServiceClient
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Compile time check *client implements otlptrace.Client.
|
||||||
var _ otlptrace.Client = (*client)(nil)
|
var _ otlptrace.Client = (*client)(nil)
|
||||||
|
|
||||||
var (
|
|
||||||
errNoClient = errors.New("no client")
|
|
||||||
)
|
|
||||||
|
|
||||||
// NewClient creates a new gRPC trace client.
|
// NewClient creates a new gRPC trace client.
|
||||||
func NewClient(opts ...Option) otlptrace.Client {
|
func NewClient(opts ...Option) otlptrace.Client {
|
||||||
cfg := otlpconfig.NewDefaultConfig()
|
return newClient(opts...)
|
||||||
otlpconfig.ApplyGRPCEnvConfigs(&cfg)
|
}
|
||||||
for _, opt := range opts {
|
|
||||||
opt.applyGRPCOption(&cfg)
|
func newClient(opts ...Option) *client {
|
||||||
|
cfg := otlpconfig.NewGRPCConfig(asGRPCOptions(opts)...)
|
||||||
|
|
||||||
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
|
||||||
|
c := &client{
|
||||||
|
endpoint: cfg.Traces.Endpoint,
|
||||||
|
exportTimeout: cfg.Traces.Timeout,
|
||||||
|
requestFunc: cfg.RetryConfig.RequestFunc(retryable),
|
||||||
|
dialOpts: cfg.DialOptions,
|
||||||
|
stopCtx: ctx,
|
||||||
|
stopFunc: cancel,
|
||||||
|
conn: cfg.GRPCConn,
|
||||||
}
|
}
|
||||||
|
|
||||||
c := &client{}
|
if len(cfg.Traces.Headers) > 0 {
|
||||||
c.connection = connection.NewConnection(cfg, cfg.Traces, c.handleNewConnection)
|
c.metadata = metadata.New(cfg.Traces.Headers)
|
||||||
|
}
|
||||||
|
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *client) handleNewConnection(cc *grpc.ClientConn) {
|
// Start establishes a gRPC connection to the collector.
|
||||||
c.lock.Lock()
|
|
||||||
defer c.lock.Unlock()
|
|
||||||
if cc != nil {
|
|
||||||
c.tracesClient = coltracepb.NewTraceServiceClient(cc)
|
|
||||||
} else {
|
|
||||||
c.tracesClient = nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start establishes a connection to the collector.
|
|
||||||
func (c *client) Start(ctx context.Context) error {
|
func (c *client) Start(ctx context.Context) error {
|
||||||
return c.connection.StartConnection(ctx)
|
if c.conn == nil {
|
||||||
|
// If the caller did not provide a ClientConn when the client was
|
||||||
|
// created, create one using the configuration they did provide.
|
||||||
|
conn, err := grpc.DialContext(ctx, c.endpoint, c.dialOpts...)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Keep track that we own the lifecycle of this conn and need to close
|
||||||
|
// it on Shutdown.
|
||||||
|
c.ourConn = true
|
||||||
|
c.conn = conn
|
||||||
|
}
|
||||||
|
|
||||||
|
// The otlptrace.Client interface states this method is called just once,
|
||||||
|
// so no need to check if already started.
|
||||||
|
c.tscMu.Lock()
|
||||||
|
c.tsc = coltracepb.NewTraceServiceClient(c.conn)
|
||||||
|
c.tscMu.Unlock()
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop shuts down the connection to the collector.
|
var errAlreadyStopped = errors.New("the client is already stopped")
|
||||||
|
|
||||||
|
// Stop shuts down the client.
|
||||||
|
//
|
||||||
|
// Any active connections to a remote endpoint are closed if they were created
|
||||||
|
// by the client. Any gRPC connection passed during creation using
|
||||||
|
// WithGRPCConn will not be closed. It is the caller's responsibility to
|
||||||
|
// handle cleanup of that resource.
|
||||||
|
//
|
||||||
|
// This method synchronizes with the UploadTraces method of the client. It
|
||||||
|
// will wait for any active calls to that method to complete unimpeded, or it
|
||||||
|
// will cancel any active calls if ctx expires. If ctx expires, the context
|
||||||
|
// error will be forwarded as the returned error. All client held resources
|
||||||
|
// will still be released in this situation.
|
||||||
|
//
|
||||||
|
// If the client has already stopped, an error will be returned describing
|
||||||
|
// this.
|
||||||
func (c *client) Stop(ctx context.Context) error {
|
func (c *client) Stop(ctx context.Context) error {
|
||||||
return c.connection.Shutdown(ctx)
|
// Acquire the c.tscMu lock within the ctx lifetime.
|
||||||
|
acquired := make(chan struct{})
|
||||||
|
go func() {
|
||||||
|
c.tscMu.Lock()
|
||||||
|
close(acquired)
|
||||||
|
}()
|
||||||
|
var err error
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
// The Stop timeout is reached. Kill any remaining exports to force
|
||||||
|
// the clear of the lock and save the timeout error to return and
|
||||||
|
// signal the shutdown timed out before cleanly stopping.
|
||||||
|
c.stopFunc()
|
||||||
|
err = ctx.Err()
|
||||||
|
|
||||||
|
// To ensure the client is not left in a dirty state c.tsc needs to be
|
||||||
|
// set to nil. To avoid the race condition when doing this, ensure
|
||||||
|
// that all the exports are killed (initiated by c.stopFunc).
|
||||||
|
<-acquired
|
||||||
|
case <-acquired:
|
||||||
|
}
|
||||||
|
// Hold the tscMu lock for the rest of the function to ensure no new
|
||||||
|
// exports are started.
|
||||||
|
defer c.tscMu.Unlock()
|
||||||
|
|
||||||
|
// The otlptrace.Client interface states this method is called only
|
||||||
|
// once, but there is no guarantee it is called after Start. Ensure the
|
||||||
|
// client is started before doing anything and let the called know if they
|
||||||
|
// made a mistake.
|
||||||
|
if c.tsc == nil {
|
||||||
|
return errAlreadyStopped
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear c.tsc to signal the client is stopped.
|
||||||
|
c.tsc = nil
|
||||||
|
|
||||||
|
if c.ourConn {
|
||||||
|
closeErr := c.conn.Close()
|
||||||
|
// A context timeout error takes precedence over this error.
|
||||||
|
if err == nil && closeErr != nil {
|
||||||
|
err = closeErr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// UploadTraces sends a batch of spans to the collector.
|
var errShutdown = errors.New("the client is shutdown")
|
||||||
|
|
||||||
|
// UploadTraces sends a batch of spans.
|
||||||
|
//
|
||||||
|
// Retryable errors from the server will be handled according to any
|
||||||
|
// RetryConfig the client was created with.
|
||||||
func (c *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.ResourceSpans) error {
|
func (c *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.ResourceSpans) error {
|
||||||
if !c.connection.Connected() {
|
// Hold a read lock to ensure a shut down initiated after this starts does
|
||||||
return fmt.Errorf("traces exporter is disconnected from the server %s: %w", c.connection.SCfg.Endpoint, c.connection.LastConnectError())
|
// not abandon the export. This read lock acquire has less priority than a
|
||||||
|
// write lock acquire (i.e. Stop), meaning if the client is shutting down
|
||||||
|
// this will come after the shut down.
|
||||||
|
c.tscMu.RLock()
|
||||||
|
defer c.tscMu.RUnlock()
|
||||||
|
|
||||||
|
if c.tsc == nil {
|
||||||
|
return errShutdown
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx, cancel := c.connection.ContextWithStop(ctx)
|
ctx, cancel := c.exportContext(ctx)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
ctx, tCancel := context.WithTimeout(ctx, c.connection.SCfg.Timeout)
|
|
||||||
defer tCancel()
|
|
||||||
|
|
||||||
ctx = c.connection.ContextWithMetadata(ctx)
|
return c.requestFunc(ctx, func(iCtx context.Context) error {
|
||||||
err := func() error {
|
_, err := c.tsc.Export(iCtx, &coltracepb.ExportTraceServiceRequest{
|
||||||
c.lock.Lock()
|
|
||||||
defer c.lock.Unlock()
|
|
||||||
if c.tracesClient == nil {
|
|
||||||
return errNoClient
|
|
||||||
}
|
|
||||||
return c.connection.DoRequest(ctx, func(ctx context.Context) error {
|
|
||||||
_, err := c.tracesClient.Export(ctx, &coltracepb.ExportTraceServiceRequest{
|
|
||||||
ResourceSpans: protoSpans,
|
ResourceSpans: protoSpans,
|
||||||
})
|
})
|
||||||
return err
|
// nil is converted to OK.
|
||||||
})
|
if status.Code(err) == codes.OK {
|
||||||
}()
|
// Success.
|
||||||
if err != nil {
|
return nil
|
||||||
c.connection.SetStateDisconnected(err)
|
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// exportContext returns a copy of parent with an appropriate deadline and
|
||||||
|
// cancellation function.
|
||||||
|
//
|
||||||
|
// It is the callers responsibility to cancel the returned context once its
|
||||||
|
// use is complete, via the parent or directly with the returned CancelFunc, to
|
||||||
|
// ensure all resources are correctly released.
|
||||||
|
func (c *client) exportContext(parent context.Context) (context.Context, context.CancelFunc) {
|
||||||
|
var (
|
||||||
|
ctx context.Context
|
||||||
|
cancel context.CancelFunc
|
||||||
|
)
|
||||||
|
|
||||||
|
if c.exportTimeout > 0 {
|
||||||
|
ctx, cancel = context.WithTimeout(parent, c.exportTimeout)
|
||||||
|
} else {
|
||||||
|
ctx, cancel = context.WithCancel(parent)
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.metadata.Len() > 0 {
|
||||||
|
ctx = metadata.NewOutgoingContext(ctx, c.metadata)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unify the client stopCtx with the parent.
|
||||||
|
go func() {
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
case <-c.stopCtx.Done():
|
||||||
|
// Cancel the export as the shutdown has timed out.
|
||||||
|
cancel()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
return ctx, cancel
|
||||||
|
}
|
||||||
|
|
||||||
|
// retryable returns if err identifies a request that can be retried and a
|
||||||
|
// duration to wait for if an explicit throttle time is included in err.
|
||||||
|
func retryable(err error) (bool, time.Duration) {
|
||||||
|
//func retryable(err error) (bool, time.Duration) {
|
||||||
|
s := status.Convert(err)
|
||||||
|
switch s.Code() {
|
||||||
|
case codes.Canceled,
|
||||||
|
codes.DeadlineExceeded,
|
||||||
|
codes.ResourceExhausted,
|
||||||
|
codes.Aborted,
|
||||||
|
codes.OutOfRange,
|
||||||
|
codes.Unavailable,
|
||||||
|
codes.DataLoss:
|
||||||
|
return true, throttleDelay(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not a retry-able error.
|
||||||
|
return false, 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// throttleDelay returns a duration to wait for if an explicit throttle time
|
||||||
|
// is included in the response status.
|
||||||
|
func throttleDelay(status *status.Status) time.Duration {
|
||||||
|
for _, detail := range status.Details() {
|
||||||
|
if t, ok := detail.(*errdetails.RetryInfo); ok {
|
||||||
|
return t.RetryDelay.AsDuration()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
|
20
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/go.mod
generated
vendored
20
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/go.mod
generated
vendored
@ -1,14 +1,18 @@
|
|||||||
module go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
module go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
||||||
|
|
||||||
go 1.15
|
go 1.16
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/stretchr/testify v1.7.0
|
github.com/stretchr/testify v1.7.0
|
||||||
go.opentelemetry.io/otel v1.0.1
|
go.opentelemetry.io/otel v1.3.0
|
||||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1
|
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0
|
||||||
go.opentelemetry.io/otel/sdk v1.0.1
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0
|
||||||
go.opentelemetry.io/proto/otlp v0.9.0
|
go.opentelemetry.io/otel/sdk v1.3.0
|
||||||
google.golang.org/grpc v1.41.0
|
go.opentelemetry.io/proto/otlp v0.11.0
|
||||||
|
go.uber.org/goleak v1.1.12
|
||||||
|
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013
|
||||||
|
google.golang.org/grpc v1.42.0
|
||||||
|
google.golang.org/protobuf v1.27.1
|
||||||
)
|
)
|
||||||
|
|
||||||
replace go.opentelemetry.io/otel => ../../../..
|
replace go.opentelemetry.io/otel => ../../../..
|
||||||
@ -72,3 +76,7 @@ replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp => ../
|
|||||||
replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../../../bridge/opencensus/test
|
replace go.opentelemetry.io/otel/bridge/opencensus/test => ../../../../bridge/opencensus/test
|
||||||
|
|
||||||
replace go.opentelemetry.io/otel/example/fib => ../../../../example/fib
|
replace go.opentelemetry.io/otel/example/fib => ../../../../example/fib
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/schema => ../../../../schema
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../../internal/retry
|
||||||
|
57
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/go.sum
generated
vendored
57
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/go.sum
generated
vendored
@ -2,24 +2,31 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
|
|||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||||
github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ=
|
github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo=
|
||||||
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/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/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
|
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
|
||||||
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
|
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
|
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
|
github.com/go-logr/logr v1.2.1 h1:DX7uPQ4WgAWfoh+NGGlbJQswnYIVvz0SRlLS3rPZQDA=
|
||||||
|
github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
|
github.com/go-logr/stdr v1.2.0 h1:j4LrlVXgrbIWO83mmQUnK0Hi+YnbD+vzrE1z/EphbFE=
|
||||||
|
github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
|
||||||
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/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
@ -47,6 +54,11 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
|||||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
|
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/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||||
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
@ -55,41 +67,62 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
|
|||||||
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.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
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/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||||
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.9.0 h1:C0g6TWmQYvjKRnljRULLWUVJGy8Uvu0NEL/5frY2/t4=
|
go.opentelemetry.io/proto/otlp v0.11.0 h1:cLDgIBTf4lLOlztkhzAEdQsJ4Lj+i5Wc9k6Nn0K1VyU=
|
||||||
go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg=
|
go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ=
|
||||||
|
go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
|
||||||
|
go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
|
||||||
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0=
|
||||||
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7 h1:iGu644GcxtEcrInvDsQRCwJjtCIOlT2V7IRt6ah2Whw=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE=
|
||||||
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
|
||||||
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA=
|
||||||
|
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
|
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-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 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=
|
||||||
@ -106,9 +139,8 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ
|
|||||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
||||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||||
google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
google.golang.org/grpc v1.42.0 h1:XT2/MFpuPFsEX2fWh3YQtHkZ+WYZFQRfaUgLZYj/p6A=
|
||||||
google.golang.org/grpc v1.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E=
|
google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
||||||
google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k=
|
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
@ -122,8 +154,9 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
|
|||||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
|
google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
|
||||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||||
|
121
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/options.go
generated
vendored
121
vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/options.go
generated
vendored
@ -18,12 +18,12 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel"
|
|
||||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig"
|
|
||||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/retry"
|
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/credentials"
|
"google.golang.org/grpc/credentials"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/internal/retry"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Option applies an option to the gRPC driver.
|
// Option applies an option to the gRPC driver.
|
||||||
@ -31,8 +31,19 @@ type Option interface {
|
|||||||
applyGRPCOption(*otlpconfig.Config)
|
applyGRPCOption(*otlpconfig.Config)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RetryConfig defines configuration for retrying batches in case of export
|
func asGRPCOptions(opts []Option) []otlpconfig.GRPCOption {
|
||||||
// failure using an exponential backoff.
|
converted := make([]otlpconfig.GRPCOption, len(opts))
|
||||||
|
for i, o := range opts {
|
||||||
|
converted[i] = otlpconfig.NewGRPCOption(o.applyGRPCOption)
|
||||||
|
}
|
||||||
|
return converted
|
||||||
|
}
|
||||||
|
|
||||||
|
// RetryConfig defines configuration for retrying export of span batches that
|
||||||
|
// failed to be received by the target endpoint.
|
||||||
|
//
|
||||||
|
// This configuration does not define any network retry strategy. That is
|
||||||
|
// entirely handled by the gRPC ClientConn.
|
||||||
type RetryConfig retry.Config
|
type RetryConfig retry.Config
|
||||||
|
|
||||||
type wrappedOption struct {
|
type wrappedOption struct {
|
||||||
@ -43,22 +54,28 @@ func (w wrappedOption) applyGRPCOption(cfg *otlpconfig.Config) {
|
|||||||
w.ApplyGRPCOption(cfg)
|
w.ApplyGRPCOption(cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithInsecure disables client transport security for the exporter's gRPC connection
|
// WithInsecure disables client transport security for the exporter's gRPC
|
||||||
// just like grpc.WithInsecure() https://pkg.go.dev/google.golang.org/grpc#WithInsecure
|
// connection just like grpc.WithInsecure()
|
||||||
// does. Note, by default, client security is required unless WithInsecure is used.
|
// (https://pkg.go.dev/google.golang.org/grpc#WithInsecure) does. Note, by
|
||||||
|
// default, client security is required unless WithInsecure is used.
|
||||||
|
//
|
||||||
|
// This option has no effect if WithGRPCConn is used.
|
||||||
func WithInsecure() Option {
|
func WithInsecure() Option {
|
||||||
return wrappedOption{otlpconfig.WithInsecure()}
|
return wrappedOption{otlpconfig.WithInsecure()}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithEndpoint allows one to set the endpoint that the exporter will
|
// WithEndpoint sets the target endpoint the exporter will connect to. If
|
||||||
// connect to the collector on. If unset, it will instead try to use
|
// unset, localhost:4317 will be used as a default.
|
||||||
// connect to DefaultCollectorHost:DefaultCollectorPort.
|
//
|
||||||
|
// This option has no effect if WithGRPCConn is used.
|
||||||
func WithEndpoint(endpoint string) Option {
|
func WithEndpoint(endpoint string) Option {
|
||||||
return wrappedOption{otlpconfig.WithEndpoint(endpoint)}
|
return wrappedOption{otlpconfig.WithEndpoint(endpoint)}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithReconnectionPeriod allows one to set the delay between next connection attempt
|
// WithReconnectionPeriod set the minimum amount of time between connection
|
||||||
// after failing to connect with the collector.
|
// attempts to the target endpoint.
|
||||||
|
//
|
||||||
|
// This option has no effect if WithGRPCConn is used.
|
||||||
func WithReconnectionPeriod(rp time.Duration) Option {
|
func WithReconnectionPeriod(rp time.Duration) Option {
|
||||||
return wrappedOption{otlpconfig.NewGRPCOption(func(cfg *otlpconfig.Config) {
|
return wrappedOption{otlpconfig.NewGRPCOption(func(cfg *otlpconfig.Config) {
|
||||||
cfg.ReconnectionPeriod = rp
|
cfg.ReconnectionPeriod = rp
|
||||||
@ -75,25 +92,30 @@ func compressorToCompression(compressor string) otlpconfig.Compression {
|
|||||||
return otlpconfig.NoCompression
|
return otlpconfig.NoCompression
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithCompressor will set the compressor for the gRPC client to use when sending requests.
|
// WithCompressor sets the compressor for the gRPC client to use when sending
|
||||||
// It is the responsibility of the caller to ensure that the compressor set has been registered
|
// requests. It is the responsibility of the caller to ensure that the
|
||||||
// with google.golang.org/grpc/encoding. This can be done by encoding.RegisterCompressor. Some
|
// compressor set has been registered with google.golang.org/grpc/encoding.
|
||||||
// compressors auto-register on import, such as gzip, which can be registered by calling
|
// This can be done by encoding.RegisterCompressor. Some compressors
|
||||||
|
// auto-register on import, such as gzip, which can be registered by calling
|
||||||
// `import _ "google.golang.org/grpc/encoding/gzip"`.
|
// `import _ "google.golang.org/grpc/encoding/gzip"`.
|
||||||
|
//
|
||||||
|
// This option has no effect if WithGRPCConn is used.
|
||||||
func WithCompressor(compressor string) Option {
|
func WithCompressor(compressor string) Option {
|
||||||
return wrappedOption{otlpconfig.WithCompression(compressorToCompression(compressor))}
|
return wrappedOption{otlpconfig.WithCompression(compressorToCompression(compressor))}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithHeaders will send the provided headers with gRPC requests.
|
// WithHeaders will send the provided headers with each gRPC requests.
|
||||||
func WithHeaders(headers map[string]string) Option {
|
func WithHeaders(headers map[string]string) Option {
|
||||||
return wrappedOption{otlpconfig.WithHeaders(headers)}
|
return wrappedOption{otlpconfig.WithHeaders(headers)}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithTLSCredentials allows the connection to use TLS credentials
|
// WithTLSCredentials allows the connection to use TLS credentials when
|
||||||
// when talking to the server. It takes in grpc.TransportCredentials instead
|
// talking to the server. It takes in grpc.TransportCredentials instead of say
|
||||||
// of say a Certificate file or a tls.Certificate, because the retrieving of
|
// a Certificate file or a tls.Certificate, because the retrieving of these
|
||||||
// these credentials can be done in many ways e.g. plain file, in code tls.Config
|
// credentials can be done in many ways e.g. plain file, in code tls.Config or
|
||||||
// or by certificate rotation, so it is up to the caller to decide what to use.
|
// by certificate rotation, so it is up to the caller to decide what to use.
|
||||||
|
//
|
||||||
|
// This option has no effect if WithGRPCConn is used.
|
||||||
func WithTLSCredentials(creds credentials.TransportCredentials) Option {
|
func WithTLSCredentials(creds credentials.TransportCredentials) Option {
|
||||||
return wrappedOption{otlpconfig.NewGRPCOption(func(cfg *otlpconfig.Config) {
|
return wrappedOption{otlpconfig.NewGRPCOption(func(cfg *otlpconfig.Config) {
|
||||||
cfg.Traces.GRPCCredentials = creds
|
cfg.Traces.GRPCCredentials = creds
|
||||||
@ -101,32 +123,63 @@ func WithTLSCredentials(creds credentials.TransportCredentials) Option {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// WithServiceConfig defines the default gRPC service config used.
|
// WithServiceConfig defines the default gRPC service config used.
|
||||||
|
//
|
||||||
|
// This option has no effect if WithGRPCConn is used.
|
||||||
func WithServiceConfig(serviceConfig string) Option {
|
func WithServiceConfig(serviceConfig string) Option {
|
||||||
return wrappedOption{otlpconfig.NewGRPCOption(func(cfg *otlpconfig.Config) {
|
return wrappedOption{otlpconfig.NewGRPCOption(func(cfg *otlpconfig.Config) {
|
||||||
cfg.ServiceConfig = serviceConfig
|
cfg.ServiceConfig = serviceConfig
|
||||||
})}
|
})}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithDialOption opens support to any grpc.DialOption to be used. If it conflicts
|
// WithDialOption sets explicit grpc.DialOptions to use when making a
|
||||||
// with some other configuration the GRPC specified via the collector the ones here will
|
// connection. The options here are appended to the internal grpc.DialOptions
|
||||||
// take preference since they are set last.
|
// used so they will take precedence over any other internal grpc.DialOptions
|
||||||
|
// they might conflict with.
|
||||||
|
//
|
||||||
|
// This option has no effect if WithGRPCConn is used.
|
||||||
func WithDialOption(opts ...grpc.DialOption) Option {
|
func WithDialOption(opts ...grpc.DialOption) Option {
|
||||||
return wrappedOption{otlpconfig.NewGRPCOption(func(cfg *otlpconfig.Config) {
|
return wrappedOption{otlpconfig.NewGRPCOption(func(cfg *otlpconfig.Config) {
|
||||||
cfg.DialOptions = opts
|
cfg.DialOptions = opts
|
||||||
})}
|
})}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithTimeout tells the driver the max waiting time for the backend to process
|
// WithGRPCConn sets conn as the gRPC ClientConn used for all communication.
|
||||||
// each spans batch. If unset, the default will be 10 seconds.
|
//
|
||||||
|
// This option takes precedence over any other option that relates to
|
||||||
|
// establishing or persisting a gRPC connection to a target endpoint. Any
|
||||||
|
// other option of those types passed will be ignored.
|
||||||
|
//
|
||||||
|
// It is the callers responsibility to close the passed conn. The client
|
||||||
|
// Shutdown method will not close this connection.
|
||||||
|
func WithGRPCConn(conn *grpc.ClientConn) Option {
|
||||||
|
return wrappedOption{otlpconfig.NewGRPCOption(func(cfg *otlpconfig.Config) {
|
||||||
|
cfg.GRPCConn = conn
|
||||||
|
})}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithTimeout sets the max amount of time a client will attempt to export a
|
||||||
|
// batch of spans. This takes precedence over any retry settings defined with
|
||||||
|
// WithRetry, once this time limit has been reached the export is abandoned
|
||||||
|
// and the batch of spans is dropped.
|
||||||
|
//
|
||||||
|
// If unset, the default timeout will be set to 10 seconds.
|
||||||
func WithTimeout(duration time.Duration) Option {
|
func WithTimeout(duration time.Duration) Option {
|
||||||
return wrappedOption{otlpconfig.WithTimeout(duration)}
|
return wrappedOption{otlpconfig.WithTimeout(duration)}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithRetry configures the retry policy for transient errors that may occurs
|
// WithRetry sets the retry policy for transient retryable errors that may be
|
||||||
// when exporting traces. An exponential back-off algorithm is used to ensure
|
// returned by the target endpoint when exporting a batch of spans.
|
||||||
// endpoints are not overwhelmed with retries. If unset, the default retry
|
//
|
||||||
// policy will retry after 5 seconds and increase exponentially after each
|
// If the target endpoint responds with not only a retryable error, but
|
||||||
// error for a total of 1 minute.
|
// explicitly returns a backoff time in the response. That time will take
|
||||||
|
// precedence over these settings.
|
||||||
|
//
|
||||||
|
// These settings do not define any network retry strategy. That is entirely
|
||||||
|
// handled by the gRPC ClientConn.
|
||||||
|
//
|
||||||
|
// If unset, the default retry policy will be used. It will retry the export
|
||||||
|
// 5 seconds after receiving a retryable error and increase exponentially
|
||||||
|
// after each error for no more than a total time of 1 minute.
|
||||||
func WithRetry(settings RetryConfig) Option {
|
func WithRetry(settings RetryConfig) Option {
|
||||||
return wrappedOption{otlpconfig.WithRetry(retry.Config(settings))}
|
return wrappedOption{otlpconfig.WithRetry(retry.Config(settings))}
|
||||||
}
|
}
|
||||||
|
10
vendor/go.opentelemetry.io/otel/go.mod
generated
vendored
10
vendor/go.opentelemetry.io/otel/go.mod
generated
vendored
@ -1,11 +1,13 @@
|
|||||||
module go.opentelemetry.io/otel
|
module go.opentelemetry.io/otel
|
||||||
|
|
||||||
go 1.15
|
go 1.16
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/go-logr/logr v1.2.1
|
||||||
|
github.com/go-logr/stdr v1.2.0
|
||||||
github.com/google/go-cmp v0.5.6
|
github.com/google/go-cmp v0.5.6
|
||||||
github.com/stretchr/testify v1.7.0
|
github.com/stretchr/testify v1.7.0
|
||||||
go.opentelemetry.io/otel/trace v1.0.1
|
go.opentelemetry.io/otel/trace v1.3.0
|
||||||
)
|
)
|
||||||
|
|
||||||
replace go.opentelemetry.io/otel => ./
|
replace go.opentelemetry.io/otel => ./
|
||||||
@ -69,3 +71,7 @@ replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp => ./e
|
|||||||
replace go.opentelemetry.io/otel/bridge/opencensus/test => ./bridge/opencensus/test
|
replace go.opentelemetry.io/otel/bridge/opencensus/test => ./bridge/opencensus/test
|
||||||
|
|
||||||
replace go.opentelemetry.io/otel/example/fib => ./example/fib
|
replace go.opentelemetry.io/otel/example/fib => ./example/fib
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/schema => ./schema
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ./exporters/otlp/internal/retry
|
||||||
|
5
vendor/go.opentelemetry.io/otel/go.sum
generated
vendored
5
vendor/go.opentelemetry.io/otel/go.sum
generated
vendored
@ -1,5 +1,10 @@
|
|||||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
|
github.com/go-logr/logr v1.2.1 h1:DX7uPQ4WgAWfoh+NGGlbJQswnYIVvz0SRlLS3rPZQDA=
|
||||||
|
github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
|
github.com/go-logr/stdr v1.2.0 h1:j4LrlVXgrbIWO83mmQUnK0Hi+YnbD+vzrE1z/EphbFE=
|
||||||
|
github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
|
||||||
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
|
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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
65
vendor/go.opentelemetry.io/otel/handler.go
generated
vendored
65
vendor/go.opentelemetry.io/otel/handler.go
generated
vendored
@ -18,7 +18,6 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -28,44 +27,45 @@ var (
|
|||||||
// `Handle` and will be delegated to the registered ErrorHandler.
|
// `Handle` and will be delegated to the registered ErrorHandler.
|
||||||
globalErrorHandler = defaultErrorHandler()
|
globalErrorHandler = defaultErrorHandler()
|
||||||
|
|
||||||
// delegateErrorHandlerOnce ensures that a user provided ErrorHandler is
|
|
||||||
// only ever registered once.
|
|
||||||
delegateErrorHandlerOnce sync.Once
|
|
||||||
|
|
||||||
// Compile-time check that delegator implements ErrorHandler.
|
// Compile-time check that delegator implements ErrorHandler.
|
||||||
_ ErrorHandler = (*delegator)(nil)
|
_ ErrorHandler = (*delegator)(nil)
|
||||||
|
// Compile-time check that errLogger implements ErrorHandler.
|
||||||
|
_ ErrorHandler = (*errLogger)(nil)
|
||||||
)
|
)
|
||||||
|
|
||||||
type holder struct {
|
type delegator struct {
|
||||||
|
lock *sync.RWMutex
|
||||||
eh ErrorHandler
|
eh ErrorHandler
|
||||||
}
|
}
|
||||||
|
|
||||||
func defaultErrorHandler() *atomic.Value {
|
func (d *delegator) Handle(err error) {
|
||||||
v := &atomic.Value{}
|
d.lock.RLock()
|
||||||
v.Store(holder{eh: &delegator{l: log.New(os.Stderr, "", log.LstdFlags)}})
|
defer d.lock.RUnlock()
|
||||||
return v
|
d.eh.Handle(err)
|
||||||
}
|
|
||||||
|
|
||||||
// delegator logs errors if no delegate is set, otherwise they are delegated.
|
|
||||||
type delegator struct {
|
|
||||||
delegate atomic.Value
|
|
||||||
|
|
||||||
l *log.Logger
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// setDelegate sets the ErrorHandler delegate.
|
// setDelegate sets the ErrorHandler delegate.
|
||||||
func (h *delegator) setDelegate(d ErrorHandler) {
|
func (d *delegator) setDelegate(eh ErrorHandler) {
|
||||||
// It is critical this is guarded with delegateErrorHandlerOnce, if it is
|
d.lock.Lock()
|
||||||
// called again with a different concrete type it will panic.
|
defer d.lock.Unlock()
|
||||||
h.delegate.Store(d)
|
d.eh = eh
|
||||||
|
}
|
||||||
|
|
||||||
|
func defaultErrorHandler() *delegator {
|
||||||
|
return &delegator{
|
||||||
|
lock: &sync.RWMutex{},
|
||||||
|
eh: &errLogger{l: log.New(os.Stderr, "", log.LstdFlags)},
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// errLogger logs errors if no delegate is set, otherwise they are delegated.
|
||||||
|
type errLogger struct {
|
||||||
|
l *log.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle logs err if no delegate is set, otherwise it is delegated.
|
// Handle logs err if no delegate is set, otherwise it is delegated.
|
||||||
func (h *delegator) Handle(err error) {
|
func (h *errLogger) Handle(err error) {
|
||||||
if d := h.delegate.Load(); d != nil {
|
|
||||||
d.(ErrorHandler).Handle(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
h.l.Print(err)
|
h.l.Print(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ func (h *delegator) Handle(err error) {
|
|||||||
// Subsequent calls to SetErrorHandler after the first will not forward errors
|
// Subsequent calls to SetErrorHandler after the first will not forward errors
|
||||||
// to the new ErrorHandler for prior returned instances.
|
// to the new ErrorHandler for prior returned instances.
|
||||||
func GetErrorHandler() ErrorHandler {
|
func GetErrorHandler() ErrorHandler {
|
||||||
return globalErrorHandler.Load().(holder).eh
|
return globalErrorHandler
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetErrorHandler sets the global ErrorHandler to h.
|
// SetErrorHandler sets the global ErrorHandler to h.
|
||||||
@ -89,16 +89,7 @@ func GetErrorHandler() ErrorHandler {
|
|||||||
// ErrorHandler. Subsequent calls will set the global ErrorHandler, but not
|
// ErrorHandler. Subsequent calls will set the global ErrorHandler, but not
|
||||||
// delegate errors to h.
|
// delegate errors to h.
|
||||||
func SetErrorHandler(h ErrorHandler) {
|
func SetErrorHandler(h ErrorHandler) {
|
||||||
delegateErrorHandlerOnce.Do(func() {
|
globalErrorHandler.setDelegate(h)
|
||||||
current := GetErrorHandler()
|
|
||||||
if current == h {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if internalHandler, ok := current.(*delegator); ok {
|
|
||||||
internalHandler.setDelegate(h)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
globalErrorHandler.Store(holder{eh: h})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle is a convenience function for ErrorHandler().Handle(err)
|
// Handle is a convenience function for ErrorHandler().Handle(err)
|
||||||
|
2
vendor/go.opentelemetry.io/otel/internal/baggage/baggage.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/internal/baggage/baggage.go
generated
vendored
@ -21,7 +21,7 @@ this need this package would not need to exist and the
|
|||||||
`go.opentelemetry.io/otel/baggage` package would be the singular place where
|
`go.opentelemetry.io/otel/baggage` package would be the singular place where
|
||||||
W3C baggage is handled.
|
W3C baggage is handled.
|
||||||
*/
|
*/
|
||||||
package baggage
|
package baggage // import "go.opentelemetry.io/otel/internal/baggage"
|
||||||
|
|
||||||
// List is the collection of baggage members. The W3C allows for duplicates,
|
// List is the collection of baggage members. The W3C allows for duplicates,
|
||||||
// but OpenTelemetry does not, therefore, this is represented as a map.
|
// but OpenTelemetry does not, therefore, this is represented as a map.
|
||||||
|
2
vendor/go.opentelemetry.io/otel/internal/baggage/context.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/internal/baggage/context.go
generated
vendored
@ -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 baggage
|
package baggage // import "go.opentelemetry.io/otel/internal/baggage"
|
||||||
|
|
||||||
import "context"
|
import "context"
|
||||||
|
|
||||||
|
63
vendor/go.opentelemetry.io/otel/internal/global/internal_logging.go
generated
vendored
Normal file
63
vendor/go.opentelemetry.io/otel/internal/global/internal_logging.go
generated
vendored
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
// 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 global // import "go.opentelemetry.io/otel/internal/global"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/go-logr/logr"
|
||||||
|
"github.com/go-logr/stdr"
|
||||||
|
)
|
||||||
|
|
||||||
|
// globalLogger is the logging interface used within the otel api and sdk provide deatails of the internals.
|
||||||
|
//
|
||||||
|
// The default logger uses stdr which is backed by the standard `log.Logger`
|
||||||
|
// interface. This logger will only show messages at the Error Level.
|
||||||
|
var globalLogger logr.Logger = stdr.New(log.New(os.Stderr, "", log.LstdFlags|log.Lshortfile))
|
||||||
|
var globalLoggerLock = &sync.RWMutex{}
|
||||||
|
|
||||||
|
// SetLogger overrides the globalLogger with l.
|
||||||
|
//
|
||||||
|
// To see Info messages use a logger with `l.V(1).Enabled() == true`
|
||||||
|
// To see Debug messages use a logger with `l.V(5).Enabled() == true`
|
||||||
|
func SetLogger(l logr.Logger) {
|
||||||
|
globalLoggerLock.Lock()
|
||||||
|
defer globalLoggerLock.Unlock()
|
||||||
|
globalLogger = l
|
||||||
|
}
|
||||||
|
|
||||||
|
// Info prints messages about the general state of the API or SDK.
|
||||||
|
// This should usually be less then 5 messages a minute
|
||||||
|
func Info(msg string, keysAndValues ...interface{}) {
|
||||||
|
globalLoggerLock.RLock()
|
||||||
|
defer globalLoggerLock.RUnlock()
|
||||||
|
globalLogger.V(1).Info(msg, keysAndValues...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error prints messages about exceptional states of the API or SDK.
|
||||||
|
func Error(err error, msg string, keysAndValues ...interface{}) {
|
||||||
|
globalLoggerLock.RLock()
|
||||||
|
defer globalLoggerLock.RUnlock()
|
||||||
|
globalLogger.Error(err, msg, keysAndValues...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Debug prints messages about all internal changes in the API or SDK.
|
||||||
|
func Debug(msg string, keysAndValues ...interface{}) {
|
||||||
|
globalLoggerLock.RLock()
|
||||||
|
defer globalLoggerLock.RUnlock()
|
||||||
|
globalLogger.V(5).Info(msg, keysAndValues...)
|
||||||
|
}
|
2
vendor/go.opentelemetry.io/otel/internal/global/propagator.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/internal/global/propagator.go
generated
vendored
@ -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 global
|
package global // import "go.opentelemetry.io/otel/internal/global"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
2
vendor/go.opentelemetry.io/otel/internal/global/state.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/internal/global/state.go
generated
vendored
@ -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 global
|
package global // import "go.opentelemetry.io/otel/internal/global"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"sync"
|
"sync"
|
||||||
|
2
vendor/go.opentelemetry.io/otel/internal/global/trace.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/internal/global/trace.go
generated
vendored
@ -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 global
|
package global // import "go.opentelemetry.io/otel/internal/global"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This file contains the forwarding implementation of the TracerProvider used as
|
This file contains the forwarding implementation of the TracerProvider used as
|
||||||
|
2
vendor/go.opentelemetry.io/otel/internal/rawhelpers.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/internal/rawhelpers.go
generated
vendored
@ -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 internal
|
package internal // import "go.opentelemetry.io/otel/internal"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
26
vendor/go.opentelemetry.io/otel/internal_logging.go
generated
vendored
Normal file
26
vendor/go.opentelemetry.io/otel/internal_logging.go
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// 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 otel // import "go.opentelemetry.io/otel"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/go-logr/logr"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/internal/global"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SetLogger configures the logger used internally to opentelemetry.
|
||||||
|
func SetLogger(logger logr.Logger) {
|
||||||
|
global.SetLogger(logger)
|
||||||
|
}
|
2
vendor/go.opentelemetry.io/otel/propagation/baggage.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/propagation/baggage.go
generated
vendored
@ -25,7 +25,7 @@ const baggageHeader = "baggage"
|
|||||||
// Baggage is a propagator that supports the W3C Baggage format.
|
// Baggage is a propagator that supports the W3C Baggage format.
|
||||||
//
|
//
|
||||||
// This propagates user-defined baggage associated with a trace. The complete
|
// This propagates user-defined baggage associated with a trace. The complete
|
||||||
// specification is defined at https://w3c.github.io/baggage/.
|
// specification is defined at https://www.w3.org/TR/baggage/.
|
||||||
type Baggage struct{}
|
type Baggage struct{}
|
||||||
|
|
||||||
var _ TextMapPropagator = Baggage{}
|
var _ TextMapPropagator = Baggage{}
|
||||||
|
2
vendor/go.opentelemetry.io/otel/propagation/doc.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/propagation/doc.go
generated
vendored
@ -19,6 +19,6 @@ OpenTelemetry propagators are used to extract and inject context data from and
|
|||||||
into messages exchanged by applications. The propagator supported by this
|
into messages exchanged by applications. The propagator supported by this
|
||||||
package is the W3C Trace Context encoding
|
package is the W3C Trace Context encoding
|
||||||
(https://www.w3.org/TR/trace-context/), and W3C Baggage
|
(https://www.w3.org/TR/trace-context/), and W3C Baggage
|
||||||
(https://w3c.github.io/baggage/).
|
(https://www.w3.org/TR/baggage/).
|
||||||
*/
|
*/
|
||||||
package propagation // import "go.opentelemetry.io/otel/propagation"
|
package propagation // import "go.opentelemetry.io/otel/propagation"
|
||||||
|
26
vendor/go.opentelemetry.io/otel/propagation/propagation.go
generated
vendored
26
vendor/go.opentelemetry.io/otel/propagation/propagation.go
generated
vendored
@ -40,6 +40,32 @@ type TextMapCarrier interface {
|
|||||||
// must never be done outside of a new major release.
|
// must never be done outside of a new major release.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MapCarrier is a TextMapCarrier that uses a map held in memory as a storage
|
||||||
|
// medium for propagated key-value pairs.
|
||||||
|
type MapCarrier map[string]string
|
||||||
|
|
||||||
|
// Compile time check that MapCarrier implements the TextMapCarrier.
|
||||||
|
var _ TextMapCarrier = MapCarrier{}
|
||||||
|
|
||||||
|
// Get returns the value associated with the passed key.
|
||||||
|
func (c MapCarrier) Get(key string) string {
|
||||||
|
return c[key]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set stores the key-value pair.
|
||||||
|
func (c MapCarrier) Set(key, value string) {
|
||||||
|
c[key] = value
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keys lists the keys stored in this carrier.
|
||||||
|
func (c MapCarrier) Keys() []string {
|
||||||
|
keys := make([]string, 0, len(c))
|
||||||
|
for k := range c {
|
||||||
|
keys = append(keys, k)
|
||||||
|
}
|
||||||
|
return keys
|
||||||
|
}
|
||||||
|
|
||||||
// HeaderCarrier adapts http.Header to satisfy the TextMapCarrier interface.
|
// HeaderCarrier adapts http.Header to satisfy the TextMapCarrier interface.
|
||||||
type HeaderCarrier http.Header
|
type HeaderCarrier http.Header
|
||||||
|
|
||||||
|
2
vendor/go.opentelemetry.io/otel/sdk/internal/sanitize.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/sdk/internal/sanitize.go
generated
vendored
@ -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 internal
|
package internal // import "go.opentelemetry.io/otel/sdk/internal"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
2
vendor/go.opentelemetry.io/otel/sdk/resource/builtin.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/sdk/resource/builtin.go
generated
vendored
@ -22,7 +22,7 @@ import (
|
|||||||
|
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
2
vendor/go.opentelemetry.io/otel/sdk/resource/env.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/sdk/resource/env.go
generated
vendored
@ -21,7 +21,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
2
vendor/go.opentelemetry.io/otel/sdk/resource/os.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/sdk/resource/os.go
generated
vendored
@ -19,7 +19,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
|
||||||
)
|
)
|
||||||
|
|
||||||
type osDescriptionProvider func() (string, error)
|
type osDescriptionProvider func() (string, error)
|
||||||
|
1
vendor/go.opentelemetry.io/otel/sdk/resource/os_release_unix.go
generated
vendored
1
vendor/go.opentelemetry.io/otel/sdk/resource/os_release_unix.go
generated
vendored
@ -12,6 +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.
|
||||||
|
|
||||||
|
//go:build aix || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos
|
||||||
// +build aix dragonfly freebsd linux netbsd openbsd solaris zos
|
// +build aix dragonfly freebsd linux netbsd openbsd solaris zos
|
||||||
|
|
||||||
package resource // import "go.opentelemetry.io/otel/sdk/resource"
|
package resource // import "go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
2
vendor/go.opentelemetry.io/otel/sdk/resource/process.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/sdk/resource/process.go
generated
vendored
@ -22,7 +22,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
|
||||||
)
|
)
|
||||||
|
|
||||||
type pidProvider func() int
|
type pidProvider func() int
|
||||||
|
37
vendor/go.opentelemetry.io/otel/sdk/resource/resource.go
generated
vendored
37
vendor/go.opentelemetry.io/otel/sdk/resource/resource.go
generated
vendored
@ -18,6 +18,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
@ -37,25 +38,11 @@ type Resource struct {
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
emptyResource Resource
|
emptyResource Resource
|
||||||
|
defaultResource *Resource
|
||||||
defaultResource = func(r *Resource, err error) *Resource {
|
defaultResourceOnce sync.Once
|
||||||
if err != nil {
|
|
||||||
otel.Handle(err)
|
|
||||||
}
|
|
||||||
return r
|
|
||||||
}(
|
|
||||||
Detect(
|
|
||||||
context.Background(),
|
|
||||||
defaultServiceNameDetector{},
|
|
||||||
fromEnv{},
|
|
||||||
telemetrySDK{},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var errMergeConflictSchemaURL = errors.New("cannot merge resource due to conflicting Schema URL")
|
||||||
errMergeConflictSchemaURL = errors.New("cannot merge resource due to conflicting Schema URL")
|
|
||||||
)
|
|
||||||
|
|
||||||
// New returns a Resource combined from the user-provided detectors.
|
// New returns a Resource combined from the user-provided detectors.
|
||||||
func New(ctx context.Context, opts ...Option) (*Resource, error) {
|
func New(ctx context.Context, opts ...Option) (*Resource, error) {
|
||||||
@ -211,6 +198,22 @@ func Empty() *Resource {
|
|||||||
// Default returns an instance of Resource with a default
|
// Default returns an instance of Resource with a default
|
||||||
// "service.name" and OpenTelemetrySDK attributes.
|
// "service.name" and OpenTelemetrySDK attributes.
|
||||||
func Default() *Resource {
|
func Default() *Resource {
|
||||||
|
defaultResourceOnce.Do(func() {
|
||||||
|
var err error
|
||||||
|
defaultResource, err = Detect(
|
||||||
|
context.Background(),
|
||||||
|
defaultServiceNameDetector{},
|
||||||
|
fromEnv{},
|
||||||
|
telemetrySDK{},
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
otel.Handle(err)
|
||||||
|
}
|
||||||
|
// If Detect did not return a valid resource, fall back to emptyResource.
|
||||||
|
if defaultResource == nil {
|
||||||
|
defaultResource = &emptyResource
|
||||||
|
}
|
||||||
|
})
|
||||||
return defaultResource
|
return defaultResource
|
||||||
}
|
}
|
||||||
|
|
||||||
|
47
vendor/go.opentelemetry.io/otel/sdk/trace/batch_span_processor.go
generated
vendored
47
vendor/go.opentelemetry.io/otel/sdk/trace/batch_span_processor.go
generated
vendored
@ -22,6 +22,8 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
|
"go.opentelemetry.io/otel/internal/global"
|
||||||
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Defaults for BatchSpanProcessorOptions.
|
// Defaults for BatchSpanProcessorOptions.
|
||||||
@ -153,10 +155,29 @@ func (bsp *batchSpanProcessor) Shutdown(ctx context.Context) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type forceFlushSpan struct {
|
||||||
|
ReadOnlySpan
|
||||||
|
flushed chan struct{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f forceFlushSpan) SpanContext() trace.SpanContext {
|
||||||
|
return trace.NewSpanContext(trace.SpanContextConfig{TraceFlags: trace.FlagsSampled})
|
||||||
|
}
|
||||||
|
|
||||||
// ForceFlush exports all ended spans that have not yet been exported.
|
// ForceFlush exports all ended spans that have not yet been exported.
|
||||||
func (bsp *batchSpanProcessor) ForceFlush(ctx context.Context) error {
|
func (bsp *batchSpanProcessor) ForceFlush(ctx context.Context) error {
|
||||||
var err error
|
var err error
|
||||||
if bsp.e != nil {
|
if bsp.e != nil {
|
||||||
|
flushCh := make(chan struct{})
|
||||||
|
if bsp.enqueueBlockOnQueueFull(ctx, forceFlushSpan{flushed: flushCh}, true) {
|
||||||
|
select {
|
||||||
|
case <-flushCh:
|
||||||
|
// Processed any items in queue prior to ForceFlush being called
|
||||||
|
case <-ctx.Done():
|
||||||
|
return ctx.Err()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
wait := make(chan error)
|
wait := make(chan error)
|
||||||
go func() {
|
go func() {
|
||||||
wait <- bsp.exportSpans(ctx)
|
wait <- bsp.exportSpans(ctx)
|
||||||
@ -204,6 +225,7 @@ func WithBlocking() BatchSpanProcessorOption {
|
|||||||
|
|
||||||
// exportSpans is a subroutine of processing and draining the queue.
|
// exportSpans is a subroutine of processing and draining the queue.
|
||||||
func (bsp *batchSpanProcessor) exportSpans(ctx context.Context) error {
|
func (bsp *batchSpanProcessor) exportSpans(ctx context.Context) error {
|
||||||
|
|
||||||
bsp.timer.Reset(bsp.o.BatchTimeout)
|
bsp.timer.Reset(bsp.o.BatchTimeout)
|
||||||
|
|
||||||
bsp.batchMutex.Lock()
|
bsp.batchMutex.Lock()
|
||||||
@ -216,6 +238,7 @@ func (bsp *batchSpanProcessor) exportSpans(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if l := len(bsp.batch); l > 0 {
|
if l := len(bsp.batch); l > 0 {
|
||||||
|
global.Debug("exporting spans", "count", len(bsp.batch))
|
||||||
err := bsp.e.ExportSpans(ctx, bsp.batch)
|
err := bsp.e.ExportSpans(ctx, bsp.batch)
|
||||||
|
|
||||||
// A new batch is always created after exporting, even if the batch failed to be exported.
|
// A new batch is always created after exporting, even if the batch failed to be exported.
|
||||||
@ -248,6 +271,10 @@ func (bsp *batchSpanProcessor) processQueue() {
|
|||||||
otel.Handle(err)
|
otel.Handle(err)
|
||||||
}
|
}
|
||||||
case sd := <-bsp.queue:
|
case sd := <-bsp.queue:
|
||||||
|
if ffs, ok := sd.(forceFlushSpan); ok {
|
||||||
|
close(ffs.flushed)
|
||||||
|
continue
|
||||||
|
}
|
||||||
bsp.batchMutex.Lock()
|
bsp.batchMutex.Lock()
|
||||||
bsp.batch = append(bsp.batch, sd)
|
bsp.batch = append(bsp.batch, sd)
|
||||||
shouldExport := len(bsp.batch) >= bsp.o.MaxExportBatchSize
|
shouldExport := len(bsp.batch) >= bsp.o.MaxExportBatchSize
|
||||||
@ -296,8 +323,12 @@ func (bsp *batchSpanProcessor) drainQueue() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (bsp *batchSpanProcessor) enqueue(sd ReadOnlySpan) {
|
func (bsp *batchSpanProcessor) enqueue(sd ReadOnlySpan) {
|
||||||
|
bsp.enqueueBlockOnQueueFull(context.TODO(), sd, bsp.o.BlockOnQueueFull)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bsp *batchSpanProcessor) enqueueBlockOnQueueFull(ctx context.Context, sd ReadOnlySpan, block bool) bool {
|
||||||
if !sd.SpanContext().IsSampled() {
|
if !sd.SpanContext().IsSampled() {
|
||||||
return
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// This ensures the bsp.queue<- below does not panic as the
|
// This ensures the bsp.queue<- below does not panic as the
|
||||||
@ -317,18 +348,24 @@ func (bsp *batchSpanProcessor) enqueue(sd ReadOnlySpan) {
|
|||||||
|
|
||||||
select {
|
select {
|
||||||
case <-bsp.stopCh:
|
case <-bsp.stopCh:
|
||||||
return
|
return false
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
|
|
||||||
if bsp.o.BlockOnQueueFull {
|
if block {
|
||||||
bsp.queue <- sd
|
select {
|
||||||
return
|
case bsp.queue <- sd:
|
||||||
|
return true
|
||||||
|
case <-ctx.Done():
|
||||||
|
return false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case bsp.queue <- sd:
|
case bsp.queue <- sd:
|
||||||
|
return true
|
||||||
default:
|
default:
|
||||||
atomic.AddUint32(&bsp.dropped, 1)
|
atomic.AddUint32(&bsp.dropped, 1)
|
||||||
}
|
}
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
3
vendor/go.opentelemetry.io/otel/sdk/trace/provider.go
generated
vendored
3
vendor/go.opentelemetry.io/otel/sdk/trace/provider.go
generated
vendored
@ -21,10 +21,9 @@ import (
|
|||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
"go.opentelemetry.io/otel/trace"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
"go.opentelemetry.io/otel/sdk/instrumentation"
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
14
vendor/go.opentelemetry.io/otel/sdk/trace/simple_span_processor.go
generated
vendored
14
vendor/go.opentelemetry.io/otel/sdk/trace/simple_span_processor.go
generated
vendored
@ -88,11 +88,25 @@ func (ssp *simpleSpanProcessor) Shutdown(ctx context.Context) error {
|
|||||||
|
|
||||||
go shutdown()
|
go shutdown()
|
||||||
|
|
||||||
|
// Wait for the exporter to shut down or the deadline to expire.
|
||||||
select {
|
select {
|
||||||
case err = <-done:
|
case err = <-done:
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
|
// It is possible for the exporter to have immediately shut down
|
||||||
|
// and the context to be done simultaneously. In that case this
|
||||||
|
// outer select statement will randomly choose a case. This will
|
||||||
|
// result in a different returned error for similar scenarios.
|
||||||
|
// Instead, double check if the exporter shut down at the same
|
||||||
|
// time and return that error if so. This will ensure consistency
|
||||||
|
// as well as ensure the caller knows the exporter shut down
|
||||||
|
// successfully (they can already determine if the deadline is
|
||||||
|
// expired given they passed the context).
|
||||||
|
select {
|
||||||
|
case err = <-done:
|
||||||
|
default:
|
||||||
err = ctx.Err()
|
err = ctx.Err()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
7
vendor/go.opentelemetry.io/otel/sdk/trace/span.go
generated
vendored
7
vendor/go.opentelemetry.io/otel/sdk/trace/span.go
generated
vendored
@ -25,12 +25,11 @@ import (
|
|||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
|
|
||||||
"go.opentelemetry.io/otel/trace"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
"go.opentelemetry.io/otel/sdk/instrumentation"
|
||||||
"go.opentelemetry.io/otel/sdk/internal"
|
"go.opentelemetry.io/otel/sdk/internal"
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
|
||||||
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ReadOnlySpan allows reading information from the data structure underlying a
|
// ReadOnlySpan allows reading information from the data structure underlying a
|
||||||
@ -453,7 +452,7 @@ func (s *recordingSpan) Resource() *resource.Resource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *recordingSpan) addLink(link trace.Link) {
|
func (s *recordingSpan) addLink(link trace.Link) {
|
||||||
if !s.IsRecording() {
|
if !s.IsRecording() || !link.SpanContext.IsValid() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
s.mu.Lock()
|
s.mu.Lock()
|
||||||
|
3
vendor/go.opentelemetry.io/otel/sdk/trace/tracer.go
generated
vendored
3
vendor/go.opentelemetry.io/otel/sdk/trace/tracer.go
generated
vendored
@ -18,9 +18,8 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/trace"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/sdk/instrumentation"
|
"go.opentelemetry.io/otel/sdk/instrumentation"
|
||||||
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
type tracer struct {
|
type tracer struct {
|
||||||
|
96
vendor/go.opentelemetry.io/otel/semconv/v1.4.0/http.go
generated
vendored
96
vendor/go.opentelemetry.io/otel/semconv/v1.4.0/http.go
generated
vendored
@ -23,6 +23,7 @@ import (
|
|||||||
|
|
||||||
"go.opentelemetry.io/otel/attribute"
|
"go.opentelemetry.io/otel/attribute"
|
||||||
"go.opentelemetry.io/otel/codes"
|
"go.opentelemetry.io/otel/codes"
|
||||||
|
"go.opentelemetry.io/otel/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
// HTTP scheme attributes.
|
// HTTP scheme attributes.
|
||||||
@ -51,64 +52,22 @@ func NetAttributesFromHTTPRequest(network string, request *http.Request) []attri
|
|||||||
attrs = append(attrs, NetTransportOther)
|
attrs = append(attrs, NetTransportOther)
|
||||||
}
|
}
|
||||||
|
|
||||||
peerName, peerIP, peerPort := "", "", 0
|
peerIP, peerName, peerPort := hostIPNamePort(request.RemoteAddr)
|
||||||
{
|
if peerIP != "" {
|
||||||
hostPart := request.RemoteAddr
|
attrs = append(attrs, NetPeerIPKey.String(peerIP))
|
||||||
portPart := ""
|
|
||||||
if idx := strings.LastIndex(hostPart, ":"); idx >= 0 {
|
|
||||||
hostPart = request.RemoteAddr[:idx]
|
|
||||||
portPart = request.RemoteAddr[idx+1:]
|
|
||||||
}
|
|
||||||
if hostPart != "" {
|
|
||||||
if ip := net.ParseIP(hostPart); ip != nil {
|
|
||||||
peerIP = ip.String()
|
|
||||||
} else {
|
|
||||||
peerName = hostPart
|
|
||||||
}
|
|
||||||
|
|
||||||
if portPart != "" {
|
|
||||||
numPort, err := strconv.ParseUint(portPart, 10, 16)
|
|
||||||
if err == nil {
|
|
||||||
peerPort = (int)(numPort)
|
|
||||||
} else {
|
|
||||||
peerName, peerIP = "", ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if peerName != "" {
|
if peerName != "" {
|
||||||
attrs = append(attrs, NetPeerNameKey.String(peerName))
|
attrs = append(attrs, NetPeerNameKey.String(peerName))
|
||||||
}
|
}
|
||||||
if peerIP != "" {
|
|
||||||
attrs = append(attrs, NetPeerIPKey.String(peerIP))
|
|
||||||
}
|
|
||||||
if peerPort != 0 {
|
if peerPort != 0 {
|
||||||
attrs = append(attrs, NetPeerPortKey.Int(peerPort))
|
attrs = append(attrs, NetPeerPortKey.Int(peerPort))
|
||||||
}
|
}
|
||||||
|
|
||||||
hostIP, hostName, hostPort := "", "", 0
|
hostIP, hostName, hostPort := "", "", 0
|
||||||
for _, someHost := range []string{request.Host, request.Header.Get("Host"), request.URL.Host} {
|
for _, someHost := range []string{request.Host, request.Header.Get("Host"), request.URL.Host} {
|
||||||
hostPart := ""
|
hostIP, hostName, hostPort = hostIPNamePort(someHost)
|
||||||
if idx := strings.LastIndex(someHost, ":"); idx >= 0 {
|
if hostIP != "" || hostName != "" || hostPort != 0 {
|
||||||
strPort := someHost[idx+1:]
|
|
||||||
numPort, err := strconv.ParseUint(strPort, 10, 16)
|
|
||||||
if err == nil {
|
|
||||||
hostPort = (int)(numPort)
|
|
||||||
}
|
|
||||||
hostPart = someHost[:idx]
|
|
||||||
} else {
|
|
||||||
hostPart = someHost
|
|
||||||
}
|
|
||||||
if hostPart != "" {
|
|
||||||
ip := net.ParseIP(hostPart)
|
|
||||||
if ip != nil {
|
|
||||||
hostIP = ip.String()
|
|
||||||
} else {
|
|
||||||
hostName = hostPart
|
|
||||||
}
|
|
||||||
break
|
break
|
||||||
} else {
|
|
||||||
hostPort = 0
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if hostIP != "" {
|
if hostIP != "" {
|
||||||
@ -124,6 +83,30 @@ func NetAttributesFromHTTPRequest(network string, request *http.Request) []attri
|
|||||||
return attrs
|
return attrs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// hostIPNamePort extracts the IP address, name and (optional) port from hostWithPort.
|
||||||
|
// It handles both IPv4 and IPv6 addresses. If the host portion is not recognized
|
||||||
|
// as a valid IPv4 or IPv6 address, the `ip` result will be empty and the
|
||||||
|
// host portion will instead be returned in `name`.
|
||||||
|
func hostIPNamePort(hostWithPort string) (ip string, name string, port int) {
|
||||||
|
var (
|
||||||
|
hostPart, portPart string
|
||||||
|
parsedPort uint64
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
if hostPart, portPart, err = net.SplitHostPort(hostWithPort); err != nil {
|
||||||
|
hostPart, portPart = hostWithPort, ""
|
||||||
|
}
|
||||||
|
if parsedIP := net.ParseIP(hostPart); parsedIP != nil {
|
||||||
|
ip = parsedIP.String()
|
||||||
|
} else {
|
||||||
|
name = hostPart
|
||||||
|
}
|
||||||
|
if parsedPort, err = strconv.ParseUint(portPart, 10, 16); err == nil {
|
||||||
|
port = int(parsedPort)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// EndUserAttributesFromHTTPRequest generates attributes of the
|
// EndUserAttributesFromHTTPRequest generates attributes of the
|
||||||
// enduser namespace as specified by the OpenTelemetry specification
|
// enduser namespace as specified by the OpenTelemetry specification
|
||||||
// for a span.
|
// for a span.
|
||||||
@ -225,7 +208,9 @@ func HTTPServerAttributesFromHTTPRequest(serverName, route string, request *http
|
|||||||
attrs = append(attrs, HTTPRouteKey.String(route))
|
attrs = append(attrs, HTTPRouteKey.String(route))
|
||||||
}
|
}
|
||||||
if values, ok := request.Header["X-Forwarded-For"]; ok && len(values) > 0 {
|
if values, ok := request.Header["X-Forwarded-For"]; ok && len(values) > 0 {
|
||||||
attrs = append(attrs, HTTPClientIPKey.String(values[0]))
|
if addresses := strings.SplitN(values[0], ",", 2); len(addresses) > 0 {
|
||||||
|
attrs = append(attrs, HTTPClientIPKey.String(addresses[0]))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return append(attrs, httpCommonAttributesFromHTTPRequest(request)...)
|
return append(attrs, httpCommonAttributesFromHTTPRequest(request)...)
|
||||||
@ -285,6 +270,21 @@ func SpanStatusFromHTTPStatusCode(code int) (codes.Code, string) {
|
|||||||
return spanCode, ""
|
return spanCode, ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SpanStatusFromHTTPStatusCodeAndSpanKind generates a status code and a message
|
||||||
|
// as specified by the OpenTelemetry specification for a span.
|
||||||
|
// Exclude 4xx for SERVER to set the appropriate status.
|
||||||
|
func SpanStatusFromHTTPStatusCodeAndSpanKind(code int, spanKind trace.SpanKind) (codes.Code, string) {
|
||||||
|
spanCode, valid := validateHTTPStatusCode(code)
|
||||||
|
if !valid {
|
||||||
|
return spanCode, fmt.Sprintf("Invalid HTTP status code %d", code)
|
||||||
|
}
|
||||||
|
category := code / 100
|
||||||
|
if spanKind == trace.SpanKindServer && category == 4 {
|
||||||
|
return codes.Unset, ""
|
||||||
|
}
|
||||||
|
return spanCode, ""
|
||||||
|
}
|
||||||
|
|
||||||
// Validates the HTTP status code and returns corresponding span status code.
|
// Validates the HTTP status code and returns corresponding span status code.
|
||||||
// If the `code` is not a valid HTTP status code, returns span status Error
|
// If the `code` is not a valid HTTP status code, returns span status Error
|
||||||
// and false.
|
// and false.
|
||||||
|
20
vendor/go.opentelemetry.io/otel/semconv/v1.7.0/doc.go
generated
vendored
Normal file
20
vendor/go.opentelemetry.io/otel/semconv/v1.7.0/doc.go
generated
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
// 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 semconv implements OpenTelemetry semantic conventions.
|
||||||
|
//
|
||||||
|
// OpenTelemetry semantic conventions are agreed standardized naming
|
||||||
|
// patterns for OpenTelemetry things. This package represents the conventions
|
||||||
|
// as of the v1.7.0 version of the OpenTelemetry specification.
|
||||||
|
package semconv // import "go.opentelemetry.io/otel/semconv/v1.7.0"
|
20
vendor/go.opentelemetry.io/otel/semconv/v1.7.0/exception.go
generated
vendored
Normal file
20
vendor/go.opentelemetry.io/otel/semconv/v1.7.0/exception.go
generated
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
// 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 semconv // import "go.opentelemetry.io/otel/semconv/v1.7.0"
|
||||||
|
|
||||||
|
const (
|
||||||
|
// ExceptionEventName is the name of the Span event representing an exception.
|
||||||
|
ExceptionEventName = "exception"
|
||||||
|
)
|
312
vendor/go.opentelemetry.io/otel/semconv/v1.7.0/http.go
generated
vendored
Normal file
312
vendor/go.opentelemetry.io/otel/semconv/v1.7.0/http.go
generated
vendored
Normal file
@ -0,0 +1,312 @@
|
|||||||
|
// 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 semconv // import "go.opentelemetry.io/otel/semconv/v1.7.0"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/trace"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/codes"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HTTP scheme attributes.
|
||||||
|
var (
|
||||||
|
HTTPSchemeHTTP = HTTPSchemeKey.String("http")
|
||||||
|
HTTPSchemeHTTPS = HTTPSchemeKey.String("https")
|
||||||
|
)
|
||||||
|
|
||||||
|
// NetAttributesFromHTTPRequest generates attributes of the net
|
||||||
|
// namespace as specified by the OpenTelemetry specification for a
|
||||||
|
// span. The network parameter is a string that net.Dial function
|
||||||
|
// from standard library can understand.
|
||||||
|
func NetAttributesFromHTTPRequest(network string, request *http.Request) []attribute.KeyValue {
|
||||||
|
attrs := []attribute.KeyValue{}
|
||||||
|
|
||||||
|
switch network {
|
||||||
|
case "tcp", "tcp4", "tcp6":
|
||||||
|
attrs = append(attrs, NetTransportTCP)
|
||||||
|
case "udp", "udp4", "udp6":
|
||||||
|
attrs = append(attrs, NetTransportUDP)
|
||||||
|
case "ip", "ip4", "ip6":
|
||||||
|
attrs = append(attrs, NetTransportIP)
|
||||||
|
case "unix", "unixgram", "unixpacket":
|
||||||
|
attrs = append(attrs, NetTransportUnix)
|
||||||
|
default:
|
||||||
|
attrs = append(attrs, NetTransportOther)
|
||||||
|
}
|
||||||
|
|
||||||
|
peerIP, peerName, peerPort := hostIPNamePort(request.RemoteAddr)
|
||||||
|
if peerIP != "" {
|
||||||
|
attrs = append(attrs, NetPeerIPKey.String(peerIP))
|
||||||
|
}
|
||||||
|
if peerName != "" {
|
||||||
|
attrs = append(attrs, NetPeerNameKey.String(peerName))
|
||||||
|
}
|
||||||
|
if peerPort != 0 {
|
||||||
|
attrs = append(attrs, NetPeerPortKey.Int(peerPort))
|
||||||
|
}
|
||||||
|
|
||||||
|
hostIP, hostName, hostPort := "", "", 0
|
||||||
|
for _, someHost := range []string{request.Host, request.Header.Get("Host"), request.URL.Host} {
|
||||||
|
hostIP, hostName, hostPort = hostIPNamePort(someHost)
|
||||||
|
if hostIP != "" || hostName != "" || hostPort != 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if hostIP != "" {
|
||||||
|
attrs = append(attrs, NetHostIPKey.String(hostIP))
|
||||||
|
}
|
||||||
|
if hostName != "" {
|
||||||
|
attrs = append(attrs, NetHostNameKey.String(hostName))
|
||||||
|
}
|
||||||
|
if hostPort != 0 {
|
||||||
|
attrs = append(attrs, NetHostPortKey.Int(hostPort))
|
||||||
|
}
|
||||||
|
|
||||||
|
return attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// hostIPNamePort extracts the IP address, name and (optional) port from hostWithPort.
|
||||||
|
// It handles both IPv4 and IPv6 addresses. If the host portion is not recognized
|
||||||
|
// as a valid IPv4 or IPv6 address, the `ip` result will be empty and the
|
||||||
|
// host portion will instead be returned in `name`.
|
||||||
|
func hostIPNamePort(hostWithPort string) (ip string, name string, port int) {
|
||||||
|
var (
|
||||||
|
hostPart, portPart string
|
||||||
|
parsedPort uint64
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
if hostPart, portPart, err = net.SplitHostPort(hostWithPort); err != nil {
|
||||||
|
hostPart, portPart = hostWithPort, ""
|
||||||
|
}
|
||||||
|
if parsedIP := net.ParseIP(hostPart); parsedIP != nil {
|
||||||
|
ip = parsedIP.String()
|
||||||
|
} else {
|
||||||
|
name = hostPart
|
||||||
|
}
|
||||||
|
if parsedPort, err = strconv.ParseUint(portPart, 10, 16); err == nil {
|
||||||
|
port = int(parsedPort)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// EndUserAttributesFromHTTPRequest generates attributes of the
|
||||||
|
// enduser namespace as specified by the OpenTelemetry specification
|
||||||
|
// for a span.
|
||||||
|
func EndUserAttributesFromHTTPRequest(request *http.Request) []attribute.KeyValue {
|
||||||
|
if username, _, ok := request.BasicAuth(); ok {
|
||||||
|
return []attribute.KeyValue{EnduserIDKey.String(username)}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTPClientAttributesFromHTTPRequest generates attributes of the
|
||||||
|
// http namespace as specified by the OpenTelemetry specification for
|
||||||
|
// a span on the client side.
|
||||||
|
func HTTPClientAttributesFromHTTPRequest(request *http.Request) []attribute.KeyValue {
|
||||||
|
attrs := []attribute.KeyValue{}
|
||||||
|
|
||||||
|
if request.Method != "" {
|
||||||
|
attrs = append(attrs, HTTPMethodKey.String(request.Method))
|
||||||
|
} else {
|
||||||
|
attrs = append(attrs, HTTPMethodKey.String(http.MethodGet))
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove any username/password info that may be in the URL
|
||||||
|
// before adding it to the attributes
|
||||||
|
userinfo := request.URL.User
|
||||||
|
request.URL.User = nil
|
||||||
|
|
||||||
|
attrs = append(attrs, HTTPURLKey.String(request.URL.String()))
|
||||||
|
|
||||||
|
// restore any username/password info that was removed
|
||||||
|
request.URL.User = userinfo
|
||||||
|
|
||||||
|
return append(attrs, httpCommonAttributesFromHTTPRequest(request)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func httpCommonAttributesFromHTTPRequest(request *http.Request) []attribute.KeyValue {
|
||||||
|
attrs := []attribute.KeyValue{}
|
||||||
|
if ua := request.UserAgent(); ua != "" {
|
||||||
|
attrs = append(attrs, HTTPUserAgentKey.String(ua))
|
||||||
|
}
|
||||||
|
if request.ContentLength > 0 {
|
||||||
|
attrs = append(attrs, HTTPRequestContentLengthKey.Int64(request.ContentLength))
|
||||||
|
}
|
||||||
|
|
||||||
|
return append(attrs, httpBasicAttributesFromHTTPRequest(request)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func httpBasicAttributesFromHTTPRequest(request *http.Request) []attribute.KeyValue {
|
||||||
|
// as these attributes are used by HTTPServerMetricAttributesFromHTTPRequest, they should be low-cardinality
|
||||||
|
attrs := []attribute.KeyValue{}
|
||||||
|
|
||||||
|
if request.TLS != nil {
|
||||||
|
attrs = append(attrs, HTTPSchemeHTTPS)
|
||||||
|
} else {
|
||||||
|
attrs = append(attrs, HTTPSchemeHTTP)
|
||||||
|
}
|
||||||
|
|
||||||
|
if request.Host != "" {
|
||||||
|
attrs = append(attrs, HTTPHostKey.String(request.Host))
|
||||||
|
}
|
||||||
|
|
||||||
|
flavor := ""
|
||||||
|
if request.ProtoMajor == 1 {
|
||||||
|
flavor = fmt.Sprintf("1.%d", request.ProtoMinor)
|
||||||
|
} else if request.ProtoMajor == 2 {
|
||||||
|
flavor = "2"
|
||||||
|
}
|
||||||
|
if flavor != "" {
|
||||||
|
attrs = append(attrs, HTTPFlavorKey.String(flavor))
|
||||||
|
}
|
||||||
|
|
||||||
|
return attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTPServerMetricAttributesFromHTTPRequest generates low-cardinality attributes
|
||||||
|
// to be used with server-side HTTP metrics.
|
||||||
|
func HTTPServerMetricAttributesFromHTTPRequest(serverName string, request *http.Request) []attribute.KeyValue {
|
||||||
|
attrs := []attribute.KeyValue{}
|
||||||
|
if serverName != "" {
|
||||||
|
attrs = append(attrs, HTTPServerNameKey.String(serverName))
|
||||||
|
}
|
||||||
|
return append(attrs, httpBasicAttributesFromHTTPRequest(request)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTPServerAttributesFromHTTPRequest generates attributes of the
|
||||||
|
// http namespace as specified by the OpenTelemetry specification for
|
||||||
|
// a span on the server side. Currently, only basic authentication is
|
||||||
|
// supported.
|
||||||
|
func HTTPServerAttributesFromHTTPRequest(serverName, route string, request *http.Request) []attribute.KeyValue {
|
||||||
|
attrs := []attribute.KeyValue{
|
||||||
|
HTTPMethodKey.String(request.Method),
|
||||||
|
HTTPTargetKey.String(request.RequestURI),
|
||||||
|
}
|
||||||
|
|
||||||
|
if serverName != "" {
|
||||||
|
attrs = append(attrs, HTTPServerNameKey.String(serverName))
|
||||||
|
}
|
||||||
|
if route != "" {
|
||||||
|
attrs = append(attrs, HTTPRouteKey.String(route))
|
||||||
|
}
|
||||||
|
if values, ok := request.Header["X-Forwarded-For"]; ok && len(values) > 0 {
|
||||||
|
if addresses := strings.SplitN(values[0], ",", 2); len(addresses) > 0 {
|
||||||
|
attrs = append(attrs, HTTPClientIPKey.String(addresses[0]))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return append(attrs, httpCommonAttributesFromHTTPRequest(request)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTPAttributesFromHTTPStatusCode generates attributes of the http
|
||||||
|
// namespace as specified by the OpenTelemetry specification for a
|
||||||
|
// span.
|
||||||
|
func HTTPAttributesFromHTTPStatusCode(code int) []attribute.KeyValue {
|
||||||
|
attrs := []attribute.KeyValue{
|
||||||
|
HTTPStatusCodeKey.Int(code),
|
||||||
|
}
|
||||||
|
return attrs
|
||||||
|
}
|
||||||
|
|
||||||
|
type codeRange struct {
|
||||||
|
fromInclusive int
|
||||||
|
toInclusive int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r codeRange) contains(code int) bool {
|
||||||
|
return r.fromInclusive <= code && code <= r.toInclusive
|
||||||
|
}
|
||||||
|
|
||||||
|
var validRangesPerCategory = map[int][]codeRange{
|
||||||
|
1: {
|
||||||
|
{http.StatusContinue, http.StatusEarlyHints},
|
||||||
|
},
|
||||||
|
2: {
|
||||||
|
{http.StatusOK, http.StatusAlreadyReported},
|
||||||
|
{http.StatusIMUsed, http.StatusIMUsed},
|
||||||
|
},
|
||||||
|
3: {
|
||||||
|
{http.StatusMultipleChoices, http.StatusUseProxy},
|
||||||
|
{http.StatusTemporaryRedirect, http.StatusPermanentRedirect},
|
||||||
|
},
|
||||||
|
4: {
|
||||||
|
{http.StatusBadRequest, http.StatusTeapot}, // yes, teapot is so useful…
|
||||||
|
{http.StatusMisdirectedRequest, http.StatusUpgradeRequired},
|
||||||
|
{http.StatusPreconditionRequired, http.StatusTooManyRequests},
|
||||||
|
{http.StatusRequestHeaderFieldsTooLarge, http.StatusRequestHeaderFieldsTooLarge},
|
||||||
|
{http.StatusUnavailableForLegalReasons, http.StatusUnavailableForLegalReasons},
|
||||||
|
},
|
||||||
|
5: {
|
||||||
|
{http.StatusInternalServerError, http.StatusLoopDetected},
|
||||||
|
{http.StatusNotExtended, http.StatusNetworkAuthenticationRequired},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// SpanStatusFromHTTPStatusCode generates a status code and a message
|
||||||
|
// as specified by the OpenTelemetry specification for a span.
|
||||||
|
func SpanStatusFromHTTPStatusCode(code int) (codes.Code, string) {
|
||||||
|
spanCode, valid := validateHTTPStatusCode(code)
|
||||||
|
if !valid {
|
||||||
|
return spanCode, fmt.Sprintf("Invalid HTTP status code %d", code)
|
||||||
|
}
|
||||||
|
return spanCode, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// SpanStatusFromHTTPStatusCodeAndSpanKind generates a status code and a message
|
||||||
|
// as specified by the OpenTelemetry specification for a span.
|
||||||
|
// Exclude 4xx for SERVER to set the appropriate status.
|
||||||
|
func SpanStatusFromHTTPStatusCodeAndSpanKind(code int, spanKind trace.SpanKind) (codes.Code, string) {
|
||||||
|
spanCode, valid := validateHTTPStatusCode(code)
|
||||||
|
if !valid {
|
||||||
|
return spanCode, fmt.Sprintf("Invalid HTTP status code %d", code)
|
||||||
|
}
|
||||||
|
category := code / 100
|
||||||
|
if spanKind == trace.SpanKindServer && category == 4 {
|
||||||
|
return codes.Unset, ""
|
||||||
|
}
|
||||||
|
return spanCode, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validates the HTTP status code and returns corresponding span status code.
|
||||||
|
// If the `code` is not a valid HTTP status code, returns span status Error
|
||||||
|
// and false.
|
||||||
|
func validateHTTPStatusCode(code int) (codes.Code, bool) {
|
||||||
|
category := code / 100
|
||||||
|
ranges, ok := validRangesPerCategory[category]
|
||||||
|
if !ok {
|
||||||
|
return codes.Error, false
|
||||||
|
}
|
||||||
|
ok = false
|
||||||
|
for _, crange := range ranges {
|
||||||
|
ok = crange.contains(code)
|
||||||
|
if ok {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
return codes.Error, false
|
||||||
|
}
|
||||||
|
if category > 0 && category < 4 {
|
||||||
|
return codes.Unset, true
|
||||||
|
}
|
||||||
|
return codes.Error, true
|
||||||
|
}
|
946
vendor/go.opentelemetry.io/otel/semconv/v1.7.0/resource.go
generated
vendored
Normal file
946
vendor/go.opentelemetry.io/otel/semconv/v1.7.0/resource.go
generated
vendored
Normal file
@ -0,0 +1,946 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
// Code generated from semantic convention specification. DO NOT EDIT.
|
||||||
|
|
||||||
|
package semconv // import "go.opentelemetry.io/otel/semconv/v1.7.0"
|
||||||
|
|
||||||
|
import "go.opentelemetry.io/otel/attribute"
|
||||||
|
|
||||||
|
// A cloud environment (e.g. GCP, Azure, AWS)
|
||||||
|
const (
|
||||||
|
// Name of the cloud provider.
|
||||||
|
//
|
||||||
|
// Type: Enum
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
CloudProviderKey = attribute.Key("cloud.provider")
|
||||||
|
// The cloud account ID the resource is assigned to.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '111111111111', 'opentelemetry'
|
||||||
|
CloudAccountIDKey = attribute.Key("cloud.account.id")
|
||||||
|
// The geographical region the resource is running. Refer to your provider's docs
|
||||||
|
// to see the available regions, for example [Alibaba Cloud
|
||||||
|
// regions](https://www.alibabacloud.com/help/doc-detail/40654.htm), [AWS
|
||||||
|
// regions](https://aws.amazon.com/about-aws/global-infrastructure/regions_az/),
|
||||||
|
// [Azure regions](https://azure.microsoft.com/en-us/global-
|
||||||
|
// infrastructure/geographies/), or [Google Cloud
|
||||||
|
// regions](https://cloud.google.com/about/locations).
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'us-central1', 'us-east-1'
|
||||||
|
CloudRegionKey = attribute.Key("cloud.region")
|
||||||
|
// Cloud regions often have multiple, isolated locations known as zones to
|
||||||
|
// increase availability. Availability zone represents the zone where the resource
|
||||||
|
// is running.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'us-east-1c'
|
||||||
|
// Note: Availability zones are called "zones" on Alibaba Cloud and Google Cloud.
|
||||||
|
CloudAvailabilityZoneKey = attribute.Key("cloud.availability_zone")
|
||||||
|
// The cloud platform in use.
|
||||||
|
//
|
||||||
|
// Type: Enum
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Note: The prefix of the service SHOULD match the one specified in
|
||||||
|
// `cloud.provider`.
|
||||||
|
CloudPlatformKey = attribute.Key("cloud.platform")
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// Alibaba Cloud
|
||||||
|
CloudProviderAlibabaCloud = CloudProviderKey.String("alibaba_cloud")
|
||||||
|
// Amazon Web Services
|
||||||
|
CloudProviderAWS = CloudProviderKey.String("aws")
|
||||||
|
// Microsoft Azure
|
||||||
|
CloudProviderAzure = CloudProviderKey.String("azure")
|
||||||
|
// Google Cloud Platform
|
||||||
|
CloudProviderGCP = CloudProviderKey.String("gcp")
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// Alibaba Cloud Elastic Compute Service
|
||||||
|
CloudPlatformAlibabaCloudECS = CloudPlatformKey.String("alibaba_cloud_ecs")
|
||||||
|
// Alibaba Cloud Function Compute
|
||||||
|
CloudPlatformAlibabaCloudFc = CloudPlatformKey.String("alibaba_cloud_fc")
|
||||||
|
// AWS Elastic Compute Cloud
|
||||||
|
CloudPlatformAWSEC2 = CloudPlatformKey.String("aws_ec2")
|
||||||
|
// AWS Elastic Container Service
|
||||||
|
CloudPlatformAWSECS = CloudPlatformKey.String("aws_ecs")
|
||||||
|
// AWS Elastic Kubernetes Service
|
||||||
|
CloudPlatformAWSEKS = CloudPlatformKey.String("aws_eks")
|
||||||
|
// AWS Lambda
|
||||||
|
CloudPlatformAWSLambda = CloudPlatformKey.String("aws_lambda")
|
||||||
|
// AWS Elastic Beanstalk
|
||||||
|
CloudPlatformAWSElasticBeanstalk = CloudPlatformKey.String("aws_elastic_beanstalk")
|
||||||
|
// Azure Virtual Machines
|
||||||
|
CloudPlatformAzureVM = CloudPlatformKey.String("azure_vm")
|
||||||
|
// Azure Container Instances
|
||||||
|
CloudPlatformAzureContainerInstances = CloudPlatformKey.String("azure_container_instances")
|
||||||
|
// Azure Kubernetes Service
|
||||||
|
CloudPlatformAzureAKS = CloudPlatformKey.String("azure_aks")
|
||||||
|
// Azure Functions
|
||||||
|
CloudPlatformAzureFunctions = CloudPlatformKey.String("azure_functions")
|
||||||
|
// Azure App Service
|
||||||
|
CloudPlatformAzureAppService = CloudPlatformKey.String("azure_app_service")
|
||||||
|
// Google Cloud Compute Engine (GCE)
|
||||||
|
CloudPlatformGCPComputeEngine = CloudPlatformKey.String("gcp_compute_engine")
|
||||||
|
// Google Cloud Run
|
||||||
|
CloudPlatformGCPCloudRun = CloudPlatformKey.String("gcp_cloud_run")
|
||||||
|
// Google Cloud Kubernetes Engine (GKE)
|
||||||
|
CloudPlatformGCPKubernetesEngine = CloudPlatformKey.String("gcp_kubernetes_engine")
|
||||||
|
// Google Cloud Functions (GCF)
|
||||||
|
CloudPlatformGCPCloudFunctions = CloudPlatformKey.String("gcp_cloud_functions")
|
||||||
|
// Google Cloud App Engine (GAE)
|
||||||
|
CloudPlatformGCPAppEngine = CloudPlatformKey.String("gcp_app_engine")
|
||||||
|
)
|
||||||
|
|
||||||
|
// Resources used by AWS Elastic Container Service (ECS).
|
||||||
|
const (
|
||||||
|
// The Amazon Resource Name (ARN) of an [ECS container instance](https://docs.aws.
|
||||||
|
// amazon.com/AmazonECS/latest/developerguide/ECS_instances.html).
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'arn:aws:ecs:us-
|
||||||
|
// west-1:123456789123:container/32624152-9086-4f0e-acae-1a75b14fe4d9'
|
||||||
|
AWSECSContainerARNKey = attribute.Key("aws.ecs.container.arn")
|
||||||
|
// The ARN of an [ECS cluster](https://docs.aws.amazon.com/AmazonECS/latest/develo
|
||||||
|
// perguide/clusters.html).
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'arn:aws:ecs:us-west-2:123456789123:cluster/my-cluster'
|
||||||
|
AWSECSClusterARNKey = attribute.Key("aws.ecs.cluster.arn")
|
||||||
|
// The [launch type](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/l
|
||||||
|
// aunch_types.html) for an ECS task.
|
||||||
|
//
|
||||||
|
// Type: Enum
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
AWSECSLaunchtypeKey = attribute.Key("aws.ecs.launchtype")
|
||||||
|
// The ARN of an [ECS task definition](https://docs.aws.amazon.com/AmazonECS/lates
|
||||||
|
// t/developerguide/task_definitions.html).
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'arn:aws:ecs:us-
|
||||||
|
// west-1:123456789123:task/10838bed-421f-43ef-870a-f43feacbbb5b'
|
||||||
|
AWSECSTaskARNKey = attribute.Key("aws.ecs.task.arn")
|
||||||
|
// The task definition family this task definition is a member of.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'opentelemetry-family'
|
||||||
|
AWSECSTaskFamilyKey = attribute.Key("aws.ecs.task.family")
|
||||||
|
// The revision for this task definition.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '8', '26'
|
||||||
|
AWSECSTaskRevisionKey = attribute.Key("aws.ecs.task.revision")
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// ec2
|
||||||
|
AWSECSLaunchtypeEC2 = AWSECSLaunchtypeKey.String("ec2")
|
||||||
|
// fargate
|
||||||
|
AWSECSLaunchtypeFargate = AWSECSLaunchtypeKey.String("fargate")
|
||||||
|
)
|
||||||
|
|
||||||
|
// Resources used by AWS Elastic Kubernetes Service (EKS).
|
||||||
|
const (
|
||||||
|
// The ARN of an EKS cluster.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'arn:aws:ecs:us-west-2:123456789123:cluster/my-cluster'
|
||||||
|
AWSEKSClusterARNKey = attribute.Key("aws.eks.cluster.arn")
|
||||||
|
)
|
||||||
|
|
||||||
|
// Resources specific to Amazon Web Services.
|
||||||
|
const (
|
||||||
|
// The name(s) of the AWS log group(s) an application is writing to.
|
||||||
|
//
|
||||||
|
// Type: string[]
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '/aws/lambda/my-function', 'opentelemetry-service'
|
||||||
|
// Note: Multiple log groups must be supported for cases like multi-container
|
||||||
|
// applications, where a single application has sidecar containers, and each write
|
||||||
|
// to their own log group.
|
||||||
|
AWSLogGroupNamesKey = attribute.Key("aws.log.group.names")
|
||||||
|
// The Amazon Resource Name(s) (ARN) of the AWS log group(s).
|
||||||
|
//
|
||||||
|
// Type: string[]
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'arn:aws:logs:us-west-1:123456789012:log-group:/aws/my/group:*'
|
||||||
|
// Note: See the [log group ARN format
|
||||||
|
// documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-
|
||||||
|
// access-control-overview-cwl.html#CWL_ARN_Format).
|
||||||
|
AWSLogGroupARNsKey = attribute.Key("aws.log.group.arns")
|
||||||
|
// The name(s) of the AWS log stream(s) an application is writing to.
|
||||||
|
//
|
||||||
|
// Type: string[]
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'logs/main/10838bed-421f-43ef-870a-f43feacbbb5b'
|
||||||
|
AWSLogStreamNamesKey = attribute.Key("aws.log.stream.names")
|
||||||
|
// The ARN(s) of the AWS log stream(s).
|
||||||
|
//
|
||||||
|
// Type: string[]
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'arn:aws:logs:us-west-1:123456789012:log-group:/aws/my/group:log-
|
||||||
|
// stream:logs/main/10838bed-421f-43ef-870a-f43feacbbb5b'
|
||||||
|
// Note: See the [log stream ARN format
|
||||||
|
// documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-
|
||||||
|
// access-control-overview-cwl.html#CWL_ARN_Format). One log group can contain
|
||||||
|
// several log streams, so these ARNs necessarily identify both a log group and a
|
||||||
|
// log stream.
|
||||||
|
AWSLogStreamARNsKey = attribute.Key("aws.log.stream.arns")
|
||||||
|
)
|
||||||
|
|
||||||
|
// A container instance.
|
||||||
|
const (
|
||||||
|
// Container name.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'opentelemetry-autoconf'
|
||||||
|
ContainerNameKey = attribute.Key("container.name")
|
||||||
|
// Container ID. Usually a UUID, as for example used to [identify Docker
|
||||||
|
// containers](https://docs.docker.com/engine/reference/run/#container-
|
||||||
|
// identification). The UUID might be abbreviated.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'a3bf90e006b2'
|
||||||
|
ContainerIDKey = attribute.Key("container.id")
|
||||||
|
// The container runtime managing this container.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'docker', 'containerd', 'rkt'
|
||||||
|
ContainerRuntimeKey = attribute.Key("container.runtime")
|
||||||
|
// Name of the image the container was built on.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'gcr.io/opentelemetry/operator'
|
||||||
|
ContainerImageNameKey = attribute.Key("container.image.name")
|
||||||
|
// Container image tag.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '0.1'
|
||||||
|
ContainerImageTagKey = attribute.Key("container.image.tag")
|
||||||
|
)
|
||||||
|
|
||||||
|
// The software deployment.
|
||||||
|
const (
|
||||||
|
// Name of the [deployment
|
||||||
|
// environment](https://en.wikipedia.org/wiki/Deployment_environment) (aka
|
||||||
|
// deployment tier).
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'staging', 'production'
|
||||||
|
DeploymentEnvironmentKey = attribute.Key("deployment.environment")
|
||||||
|
)
|
||||||
|
|
||||||
|
// The device on which the process represented by this resource is running.
|
||||||
|
const (
|
||||||
|
// A unique identifier representing the device
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '2ab2916d-a51f-4ac8-80ee-45ac31a28092'
|
||||||
|
// Note: The device identifier MUST only be defined using the values outlined
|
||||||
|
// below. This value is not an advertising identifier and MUST NOT be used as
|
||||||
|
// such. On iOS (Swift or Objective-C), this value MUST be equal to the [vendor id
|
||||||
|
// entifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-iden
|
||||||
|
// tifierforvendor). On Android (Java or Kotlin), this value MUST be equal to the
|
||||||
|
// Firebase Installation ID or a globally unique UUID which is persisted across
|
||||||
|
// sessions in your application. More information can be found
|
||||||
|
// [here](https://developer.android.com/training/articles/user-data-ids) on best
|
||||||
|
// practices and exact implementation details. Caution should be taken when
|
||||||
|
// storing personal data or anything which can identify a user. GDPR and data
|
||||||
|
// protection laws may apply, ensure you do your own due diligence.
|
||||||
|
DeviceIDKey = attribute.Key("device.id")
|
||||||
|
// The model identifier for the device
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'iPhone3,4', 'SM-G920F'
|
||||||
|
// Note: It's recommended this value represents a machine readable version of the
|
||||||
|
// model identifier rather than the market or consumer-friendly name of the
|
||||||
|
// device.
|
||||||
|
DeviceModelIdentifierKey = attribute.Key("device.model.identifier")
|
||||||
|
// The marketing name for the device model
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'iPhone 6s Plus', 'Samsung Galaxy S6'
|
||||||
|
// Note: It's recommended this value represents a human readable version of the
|
||||||
|
// device model rather than a machine readable alternative.
|
||||||
|
DeviceModelNameKey = attribute.Key("device.model.name")
|
||||||
|
)
|
||||||
|
|
||||||
|
// A serverless instance.
|
||||||
|
const (
|
||||||
|
// The name of the single function that this runtime instance executes.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: Always
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'my-function'
|
||||||
|
// Note: This is the name of the function as configured/deployed on the FaaS
|
||||||
|
// platform and is usually different from the name of the callback function (which
|
||||||
|
// may be stored in the
|
||||||
|
// [`code.namespace`/`code.function`](../../trace/semantic_conventions/span-
|
||||||
|
// general.md#source-code-attributes) span attributes).
|
||||||
|
FaaSNameKey = attribute.Key("faas.name")
|
||||||
|
// The unique ID of the single function that this runtime instance executes.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'arn:aws:lambda:us-west-2:123456789012:function:my-function'
|
||||||
|
// Note: Depending on the cloud provider, use:
|
||||||
|
|
||||||
|
// * **AWS Lambda:** The function
|
||||||
|
// [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-
|
||||||
|
// namespaces.html).
|
||||||
|
// Take care not to use the "invoked ARN" directly but replace any
|
||||||
|
// [alias suffix](https://docs.aws.amazon.com/lambda/latest/dg/configuration-
|
||||||
|
// aliases.html) with the resolved function version, as the same runtime instance
|
||||||
|
// may be invokable with multiple
|
||||||
|
// different aliases.
|
||||||
|
// * **GCP:** The [URI of the resource](https://cloud.google.com/iam/docs/full-
|
||||||
|
// resource-names)
|
||||||
|
// * **Azure:** The [Fully Qualified Resource ID](https://docs.microsoft.com/en-
|
||||||
|
// us/rest/api/resources/resources/get-by-id).
|
||||||
|
|
||||||
|
// On some providers, it may not be possible to determine the full ID at startup,
|
||||||
|
// which is why this field cannot be made required. For example, on AWS the
|
||||||
|
// account ID
|
||||||
|
// part of the ARN is not available without calling another AWS API
|
||||||
|
// which may be deemed too slow for a short-running lambda function.
|
||||||
|
// As an alternative, consider setting `faas.id` as a span attribute instead.
|
||||||
|
FaaSIDKey = attribute.Key("faas.id")
|
||||||
|
// The immutable version of the function being executed.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '26', 'pinkfroid-00002'
|
||||||
|
// Note: Depending on the cloud provider and platform, use:
|
||||||
|
|
||||||
|
// * **AWS Lambda:** The [function
|
||||||
|
// version](https://docs.aws.amazon.com/lambda/latest/dg/configuration-
|
||||||
|
// versions.html)
|
||||||
|
// (an integer represented as a decimal string).
|
||||||
|
// * **Google Cloud Run:** The
|
||||||
|
// [revision](https://cloud.google.com/run/docs/managing/revisions)
|
||||||
|
// (i.e., the function name plus the revision suffix).
|
||||||
|
// * **Google Cloud Functions:** The value of the
|
||||||
|
// [`K_REVISION` environment
|
||||||
|
// variable](https://cloud.google.com/functions/docs/env-
|
||||||
|
// var#runtime_environment_variables_set_automatically).
|
||||||
|
// * **Azure Functions:** Not applicable. Do not set this attribute.
|
||||||
|
FaaSVersionKey = attribute.Key("faas.version")
|
||||||
|
// The execution environment ID as a string, that will be potentially reused for
|
||||||
|
// other invocations to the same function/function version.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '2021/06/28/[$LATEST]2f399eb14537447da05ab2a2e39309de'
|
||||||
|
// Note: * **AWS Lambda:** Use the (full) log stream name.
|
||||||
|
FaaSInstanceKey = attribute.Key("faas.instance")
|
||||||
|
// The amount of memory available to the serverless function in MiB.
|
||||||
|
//
|
||||||
|
// Type: int
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 128
|
||||||
|
// Note: It's recommended to set this attribute since e.g. too little memory can
|
||||||
|
// easily stop a Java AWS Lambda function from working correctly. On AWS Lambda,
|
||||||
|
// the environment variable `AWS_LAMBDA_FUNCTION_MEMORY_SIZE` provides this
|
||||||
|
// information.
|
||||||
|
FaaSMaxMemoryKey = attribute.Key("faas.max_memory")
|
||||||
|
)
|
||||||
|
|
||||||
|
// A host is defined as a general computing instance.
|
||||||
|
const (
|
||||||
|
// Unique host ID. For Cloud, this must be the instance_id assigned by the cloud
|
||||||
|
// provider.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'opentelemetry-test'
|
||||||
|
HostIDKey = attribute.Key("host.id")
|
||||||
|
// Name of the host. On Unix systems, it may contain what the hostname command
|
||||||
|
// returns, or the fully qualified hostname, or another name specified by the
|
||||||
|
// user.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'opentelemetry-test'
|
||||||
|
HostNameKey = attribute.Key("host.name")
|
||||||
|
// Type of host. For Cloud, this must be the machine type.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'n1-standard-1'
|
||||||
|
HostTypeKey = attribute.Key("host.type")
|
||||||
|
// The CPU architecture the host system is running on.
|
||||||
|
//
|
||||||
|
// Type: Enum
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
HostArchKey = attribute.Key("host.arch")
|
||||||
|
// Name of the VM image or OS install the host was instantiated from.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'infra-ami-eks-worker-node-7d4ec78312', 'CentOS-8-x86_64-1905'
|
||||||
|
HostImageNameKey = attribute.Key("host.image.name")
|
||||||
|
// VM image ID. For Cloud, this value is from the provider.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'ami-07b06b442921831e5'
|
||||||
|
HostImageIDKey = attribute.Key("host.image.id")
|
||||||
|
// The version string of the VM image as defined in [Version
|
||||||
|
// Attributes](README.md#version-attributes).
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '0.1'
|
||||||
|
HostImageVersionKey = attribute.Key("host.image.version")
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// AMD64
|
||||||
|
HostArchAMD64 = HostArchKey.String("amd64")
|
||||||
|
// ARM32
|
||||||
|
HostArchARM32 = HostArchKey.String("arm32")
|
||||||
|
// ARM64
|
||||||
|
HostArchARM64 = HostArchKey.String("arm64")
|
||||||
|
// Itanium
|
||||||
|
HostArchIA64 = HostArchKey.String("ia64")
|
||||||
|
// 32-bit PowerPC
|
||||||
|
HostArchPPC32 = HostArchKey.String("ppc32")
|
||||||
|
// 64-bit PowerPC
|
||||||
|
HostArchPPC64 = HostArchKey.String("ppc64")
|
||||||
|
// 32-bit x86
|
||||||
|
HostArchX86 = HostArchKey.String("x86")
|
||||||
|
)
|
||||||
|
|
||||||
|
// A Kubernetes Cluster.
|
||||||
|
const (
|
||||||
|
// The name of the cluster.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'opentelemetry-cluster'
|
||||||
|
K8SClusterNameKey = attribute.Key("k8s.cluster.name")
|
||||||
|
)
|
||||||
|
|
||||||
|
// A Kubernetes Node object.
|
||||||
|
const (
|
||||||
|
// The name of the Node.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'node-1'
|
||||||
|
K8SNodeNameKey = attribute.Key("k8s.node.name")
|
||||||
|
// The UID of the Node.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '1eb3a0c6-0477-4080-a9cb-0cb7db65c6a2'
|
||||||
|
K8SNodeUIDKey = attribute.Key("k8s.node.uid")
|
||||||
|
)
|
||||||
|
|
||||||
|
// A Kubernetes Namespace.
|
||||||
|
const (
|
||||||
|
// The name of the namespace that the pod is running in.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'default'
|
||||||
|
K8SNamespaceNameKey = attribute.Key("k8s.namespace.name")
|
||||||
|
)
|
||||||
|
|
||||||
|
// A Kubernetes Pod object.
|
||||||
|
const (
|
||||||
|
// The UID of the Pod.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff'
|
||||||
|
K8SPodUIDKey = attribute.Key("k8s.pod.uid")
|
||||||
|
// The name of the Pod.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'opentelemetry-pod-autoconf'
|
||||||
|
K8SPodNameKey = attribute.Key("k8s.pod.name")
|
||||||
|
)
|
||||||
|
|
||||||
|
// A container in a [PodTemplate](https://kubernetes.io/docs/concepts/workloads/pods/#pod-templates).
|
||||||
|
const (
|
||||||
|
// The name of the Container in a Pod template.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'redis'
|
||||||
|
K8SContainerNameKey = attribute.Key("k8s.container.name")
|
||||||
|
)
|
||||||
|
|
||||||
|
// A Kubernetes ReplicaSet object.
|
||||||
|
const (
|
||||||
|
// The UID of the ReplicaSet.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff'
|
||||||
|
K8SReplicaSetUIDKey = attribute.Key("k8s.replicaset.uid")
|
||||||
|
// The name of the ReplicaSet.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'opentelemetry'
|
||||||
|
K8SReplicaSetNameKey = attribute.Key("k8s.replicaset.name")
|
||||||
|
)
|
||||||
|
|
||||||
|
// A Kubernetes Deployment object.
|
||||||
|
const (
|
||||||
|
// The UID of the Deployment.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff'
|
||||||
|
K8SDeploymentUIDKey = attribute.Key("k8s.deployment.uid")
|
||||||
|
// The name of the Deployment.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'opentelemetry'
|
||||||
|
K8SDeploymentNameKey = attribute.Key("k8s.deployment.name")
|
||||||
|
)
|
||||||
|
|
||||||
|
// A Kubernetes StatefulSet object.
|
||||||
|
const (
|
||||||
|
// The UID of the StatefulSet.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff'
|
||||||
|
K8SStatefulSetUIDKey = attribute.Key("k8s.statefulset.uid")
|
||||||
|
// The name of the StatefulSet.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'opentelemetry'
|
||||||
|
K8SStatefulSetNameKey = attribute.Key("k8s.statefulset.name")
|
||||||
|
)
|
||||||
|
|
||||||
|
// A Kubernetes DaemonSet object.
|
||||||
|
const (
|
||||||
|
// The UID of the DaemonSet.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff'
|
||||||
|
K8SDaemonSetUIDKey = attribute.Key("k8s.daemonset.uid")
|
||||||
|
// The name of the DaemonSet.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'opentelemetry'
|
||||||
|
K8SDaemonSetNameKey = attribute.Key("k8s.daemonset.name")
|
||||||
|
)
|
||||||
|
|
||||||
|
// A Kubernetes Job object.
|
||||||
|
const (
|
||||||
|
// The UID of the Job.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff'
|
||||||
|
K8SJobUIDKey = attribute.Key("k8s.job.uid")
|
||||||
|
// The name of the Job.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'opentelemetry'
|
||||||
|
K8SJobNameKey = attribute.Key("k8s.job.name")
|
||||||
|
)
|
||||||
|
|
||||||
|
// A Kubernetes CronJob object.
|
||||||
|
const (
|
||||||
|
// The UID of the CronJob.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff'
|
||||||
|
K8SCronJobUIDKey = attribute.Key("k8s.cronjob.uid")
|
||||||
|
// The name of the CronJob.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'opentelemetry'
|
||||||
|
K8SCronJobNameKey = attribute.Key("k8s.cronjob.name")
|
||||||
|
)
|
||||||
|
|
||||||
|
// The operating system (OS) on which the process represented by this resource is running.
|
||||||
|
const (
|
||||||
|
// The operating system type.
|
||||||
|
//
|
||||||
|
// Type: Enum
|
||||||
|
// Required: Always
|
||||||
|
// Stability: stable
|
||||||
|
OSTypeKey = attribute.Key("os.type")
|
||||||
|
// Human readable (not intended to be parsed) OS version information, like e.g.
|
||||||
|
// reported by `ver` or `lsb_release -a` commands.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'Microsoft Windows [Version 10.0.18363.778]', 'Ubuntu 18.04.1 LTS'
|
||||||
|
OSDescriptionKey = attribute.Key("os.description")
|
||||||
|
// Human readable operating system name.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'iOS', 'Android', 'Ubuntu'
|
||||||
|
OSNameKey = attribute.Key("os.name")
|
||||||
|
// The version string of the operating system as defined in [Version
|
||||||
|
// Attributes](../../resource/semantic_conventions/README.md#version-attributes).
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '14.2.1', '18.04.1'
|
||||||
|
OSVersionKey = attribute.Key("os.version")
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// Microsoft Windows
|
||||||
|
OSTypeWindows = OSTypeKey.String("windows")
|
||||||
|
// Linux
|
||||||
|
OSTypeLinux = OSTypeKey.String("linux")
|
||||||
|
// Apple Darwin
|
||||||
|
OSTypeDarwin = OSTypeKey.String("darwin")
|
||||||
|
// FreeBSD
|
||||||
|
OSTypeFreeBSD = OSTypeKey.String("freebsd")
|
||||||
|
// NetBSD
|
||||||
|
OSTypeNetBSD = OSTypeKey.String("netbsd")
|
||||||
|
// OpenBSD
|
||||||
|
OSTypeOpenBSD = OSTypeKey.String("openbsd")
|
||||||
|
// DragonFly BSD
|
||||||
|
OSTypeDragonflyBSD = OSTypeKey.String("dragonflybsd")
|
||||||
|
// HP-UX (Hewlett Packard Unix)
|
||||||
|
OSTypeHPUX = OSTypeKey.String("hpux")
|
||||||
|
// AIX (Advanced Interactive eXecutive)
|
||||||
|
OSTypeAIX = OSTypeKey.String("aix")
|
||||||
|
// Oracle Solaris
|
||||||
|
OSTypeSolaris = OSTypeKey.String("solaris")
|
||||||
|
// IBM z/OS
|
||||||
|
OSTypeZOS = OSTypeKey.String("z_os")
|
||||||
|
)
|
||||||
|
|
||||||
|
// An operating system process.
|
||||||
|
const (
|
||||||
|
// Process identifier (PID).
|
||||||
|
//
|
||||||
|
// Type: int
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 1234
|
||||||
|
ProcessPIDKey = attribute.Key("process.pid")
|
||||||
|
// The name of the process executable. On Linux based systems, can be set to the
|
||||||
|
// `Name` in `proc/[pid]/status`. On Windows, can be set to the base name of
|
||||||
|
// `GetProcessImageFileNameW`.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: See below
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'otelcol'
|
||||||
|
ProcessExecutableNameKey = attribute.Key("process.executable.name")
|
||||||
|
// The full path to the process executable. On Linux based systems, can be set to
|
||||||
|
// the target of `proc/[pid]/exe`. On Windows, can be set to the result of
|
||||||
|
// `GetProcessImageFileNameW`.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: See below
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '/usr/bin/cmd/otelcol'
|
||||||
|
ProcessExecutablePathKey = attribute.Key("process.executable.path")
|
||||||
|
// The command used to launch the process (i.e. the command name). On Linux based
|
||||||
|
// systems, can be set to the zeroth string in `proc/[pid]/cmdline`. On Windows,
|
||||||
|
// can be set to the first parameter extracted from `GetCommandLineW`.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: See below
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'cmd/otelcol'
|
||||||
|
ProcessCommandKey = attribute.Key("process.command")
|
||||||
|
// The full command used to launch the process as a single string representing the
|
||||||
|
// full command. On Windows, can be set to the result of `GetCommandLineW`. Do not
|
||||||
|
// set this if you have to assemble it just for monitoring; use
|
||||||
|
// `process.command_args` instead.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: See below
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'C:\\cmd\\otecol --config="my directory\\config.yaml"'
|
||||||
|
ProcessCommandLineKey = attribute.Key("process.command_line")
|
||||||
|
// All the command arguments (including the command/executable itself) as received
|
||||||
|
// by the process. On Linux-based systems (and some other Unixoid systems
|
||||||
|
// supporting procfs), can be set according to the list of null-delimited strings
|
||||||
|
// extracted from `proc/[pid]/cmdline`. For libc-based executables, this would be
|
||||||
|
// the full argv vector passed to `main`.
|
||||||
|
//
|
||||||
|
// Type: string[]
|
||||||
|
// Required: See below
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'cmd/otecol', '--config=config.yaml'
|
||||||
|
ProcessCommandArgsKey = attribute.Key("process.command_args")
|
||||||
|
// The username of the user that owns the process.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'root'
|
||||||
|
ProcessOwnerKey = attribute.Key("process.owner")
|
||||||
|
)
|
||||||
|
|
||||||
|
// The single (language) runtime instance which is monitored.
|
||||||
|
const (
|
||||||
|
// The name of the runtime of this process. For compiled native binaries, this
|
||||||
|
// SHOULD be the name of the compiler.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'OpenJDK Runtime Environment'
|
||||||
|
ProcessRuntimeNameKey = attribute.Key("process.runtime.name")
|
||||||
|
// The version of the runtime of this process, as returned by the runtime without
|
||||||
|
// modification.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '14.0.2'
|
||||||
|
ProcessRuntimeVersionKey = attribute.Key("process.runtime.version")
|
||||||
|
// An additional description about the runtime of the process, for example a
|
||||||
|
// specific vendor customization of the runtime environment.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'Eclipse OpenJ9 Eclipse OpenJ9 VM openj9-0.21.0'
|
||||||
|
ProcessRuntimeDescriptionKey = attribute.Key("process.runtime.description")
|
||||||
|
)
|
||||||
|
|
||||||
|
// A service instance.
|
||||||
|
const (
|
||||||
|
// Logical name of the service.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: Always
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'shoppingcart'
|
||||||
|
// Note: MUST be the same for all instances of horizontally scaled services. If
|
||||||
|
// the value was not specified, SDKs MUST fallback to `unknown_service:`
|
||||||
|
// concatenated with [`process.executable.name`](process.md#process), e.g.
|
||||||
|
// `unknown_service:bash`. If `process.executable.name` is not available, the
|
||||||
|
// value MUST be set to `unknown_service`.
|
||||||
|
ServiceNameKey = attribute.Key("service.name")
|
||||||
|
// A namespace for `service.name`.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'Shop'
|
||||||
|
// Note: A string value having a meaning that helps to distinguish a group of
|
||||||
|
// services, for example the team name that owns a group of services.
|
||||||
|
// `service.name` is expected to be unique within the same namespace. If
|
||||||
|
// `service.namespace` is not specified in the Resource then `service.name` is
|
||||||
|
// expected to be unique for all services that have no explicit namespace defined
|
||||||
|
// (so the empty/unspecified namespace is simply one more valid namespace). Zero-
|
||||||
|
// length namespace string is assumed equal to unspecified namespace.
|
||||||
|
ServiceNamespaceKey = attribute.Key("service.namespace")
|
||||||
|
// The string ID of the service instance.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '627cc493-f310-47de-96bd-71410b7dec09'
|
||||||
|
// Note: MUST be unique for each instance of the same
|
||||||
|
// `service.namespace,service.name` pair (in other words
|
||||||
|
// `service.namespace,service.name,service.instance.id` triplet MUST be globally
|
||||||
|
// unique). The ID helps to distinguish instances of the same service that exist
|
||||||
|
// at the same time (e.g. instances of a horizontally scaled service). It is
|
||||||
|
// preferable for the ID to be persistent and stay the same for the lifetime of
|
||||||
|
// the service instance, however it is acceptable that the ID is ephemeral and
|
||||||
|
// changes during important lifetime events for the service (e.g. service
|
||||||
|
// restarts). If the service has no inherent unique ID that can be used as the
|
||||||
|
// value of this attribute it is recommended to generate a random Version 1 or
|
||||||
|
// Version 4 RFC 4122 UUID (services aiming for reproducible UUIDs may also use
|
||||||
|
// Version 5, see RFC 4122 for more recommendations).
|
||||||
|
ServiceInstanceIDKey = attribute.Key("service.instance.id")
|
||||||
|
// The version string of the service API or implementation.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '2.0.0'
|
||||||
|
ServiceVersionKey = attribute.Key("service.version")
|
||||||
|
)
|
||||||
|
|
||||||
|
// The telemetry SDK used to capture data recorded by the instrumentation libraries.
|
||||||
|
const (
|
||||||
|
// The name of the telemetry SDK as defined above.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'opentelemetry'
|
||||||
|
TelemetrySDKNameKey = attribute.Key("telemetry.sdk.name")
|
||||||
|
// The language of the telemetry SDK.
|
||||||
|
//
|
||||||
|
// Type: Enum
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
TelemetrySDKLanguageKey = attribute.Key("telemetry.sdk.language")
|
||||||
|
// The version string of the telemetry SDK.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '1.2.3'
|
||||||
|
TelemetrySDKVersionKey = attribute.Key("telemetry.sdk.version")
|
||||||
|
// The version string of the auto instrumentation agent, if used.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '1.2.3'
|
||||||
|
TelemetryAutoVersionKey = attribute.Key("telemetry.auto.version")
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// cpp
|
||||||
|
TelemetrySDKLanguageCPP = TelemetrySDKLanguageKey.String("cpp")
|
||||||
|
// dotnet
|
||||||
|
TelemetrySDKLanguageDotnet = TelemetrySDKLanguageKey.String("dotnet")
|
||||||
|
// erlang
|
||||||
|
TelemetrySDKLanguageErlang = TelemetrySDKLanguageKey.String("erlang")
|
||||||
|
// go
|
||||||
|
TelemetrySDKLanguageGo = TelemetrySDKLanguageKey.String("go")
|
||||||
|
// java
|
||||||
|
TelemetrySDKLanguageJava = TelemetrySDKLanguageKey.String("java")
|
||||||
|
// nodejs
|
||||||
|
TelemetrySDKLanguageNodejs = TelemetrySDKLanguageKey.String("nodejs")
|
||||||
|
// php
|
||||||
|
TelemetrySDKLanguagePHP = TelemetrySDKLanguageKey.String("php")
|
||||||
|
// python
|
||||||
|
TelemetrySDKLanguagePython = TelemetrySDKLanguageKey.String("python")
|
||||||
|
// ruby
|
||||||
|
TelemetrySDKLanguageRuby = TelemetrySDKLanguageKey.String("ruby")
|
||||||
|
// webjs
|
||||||
|
TelemetrySDKLanguageWebjs = TelemetrySDKLanguageKey.String("webjs")
|
||||||
|
)
|
||||||
|
|
||||||
|
// Resource describing the packaged software running the application code. Web engines are typically executed using process.runtime.
|
||||||
|
const (
|
||||||
|
// The name of the web engine.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: Always
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'WildFly'
|
||||||
|
WebEngineNameKey = attribute.Key("webengine.name")
|
||||||
|
// The version of the web engine.
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: '21.0.0'
|
||||||
|
WebEngineVersionKey = attribute.Key("webengine.version")
|
||||||
|
// Additional description of the web engine (e.g. detailed version and edition
|
||||||
|
// information).
|
||||||
|
//
|
||||||
|
// Type: string
|
||||||
|
// Required: No
|
||||||
|
// Stability: stable
|
||||||
|
// Examples: 'WildFly Full 21.0.0.Final (WildFly Core 13.0.1.Final) - 2.2.2.Final'
|
||||||
|
WebEngineDescriptionKey = attribute.Key("webengine.description")
|
||||||
|
)
|
20
vendor/go.opentelemetry.io/otel/semconv/v1.7.0/schema.go
generated
vendored
Normal file
20
vendor/go.opentelemetry.io/otel/semconv/v1.7.0/schema.go
generated
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
// 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 semconv // import "go.opentelemetry.io/otel/semconv/v1.7.0"
|
||||||
|
|
||||||
|
// SchemaURL is the schema URL that matches the version of the semantic conventions
|
||||||
|
// that this package defines. Semconv packages starting from v1.4.0 must declare
|
||||||
|
// non-empty schema URL in the form https://opentelemetry.io/schemas/<version>
|
||||||
|
const SchemaURL = "https://opentelemetry.io/schemas/v1.7.0"
|
1558
vendor/go.opentelemetry.io/otel/semconv/v1.7.0/trace.go
generated
vendored
Normal file
1558
vendor/go.opentelemetry.io/otel/semconv/v1.7.0/trace.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2
vendor/go.opentelemetry.io/otel/trace/config.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/trace/config.go
generated
vendored
@ -259,7 +259,7 @@ func WithStackTrace(b bool) SpanEndEventOption {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// WithLinks adds links to a Span. The links are added to the existing Span
|
// WithLinks adds links to a Span. The links are added to the existing Span
|
||||||
// links, i.e. this does not overwrite.
|
// links, i.e. this does not overwrite. Links with invalid span context are ignored.
|
||||||
func WithLinks(links ...Link) SpanStartOption {
|
func WithLinks(links ...Link) SpanStartOption {
|
||||||
return spanOptionFunc(func(cfg *SpanConfig) {
|
return spanOptionFunc(func(cfg *SpanConfig) {
|
||||||
cfg.links = append(cfg.links, links...)
|
cfg.links = append(cfg.links, links...)
|
||||||
|
8
vendor/go.opentelemetry.io/otel/trace/go.mod
generated
vendored
8
vendor/go.opentelemetry.io/otel/trace/go.mod
generated
vendored
@ -1,6 +1,6 @@
|
|||||||
module go.opentelemetry.io/otel/trace
|
module go.opentelemetry.io/otel/trace
|
||||||
|
|
||||||
go 1.15
|
go 1.16
|
||||||
|
|
||||||
replace go.opentelemetry.io/otel => ../
|
replace go.opentelemetry.io/otel => ../
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ replace go.opentelemetry.io/otel/trace => ./
|
|||||||
require (
|
require (
|
||||||
github.com/google/go-cmp v0.5.6
|
github.com/google/go-cmp v0.5.6
|
||||||
github.com/stretchr/testify v1.7.0
|
github.com/stretchr/testify v1.7.0
|
||||||
go.opentelemetry.io/otel v1.0.1
|
go.opentelemetry.io/otel v1.3.0
|
||||||
)
|
)
|
||||||
|
|
||||||
replace go.opentelemetry.io/otel/example/passthrough => ../example/passthrough
|
replace go.opentelemetry.io/otel/example/passthrough => ../example/passthrough
|
||||||
@ -69,3 +69,7 @@ replace go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp => ../
|
|||||||
replace go.opentelemetry.io/otel/bridge/opencensus/test => ../bridge/opencensus/test
|
replace go.opentelemetry.io/otel/bridge/opencensus/test => ../bridge/opencensus/test
|
||||||
|
|
||||||
replace go.opentelemetry.io/otel/example/fib => ../example/fib
|
replace go.opentelemetry.io/otel/example/fib => ../example/fib
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/schema => ../schema
|
||||||
|
|
||||||
|
replace go.opentelemetry.io/otel/exporters/otlp/internal/retry => ../exporters/otlp/internal/retry
|
||||||
|
3
vendor/go.opentelemetry.io/otel/trace/go.sum
generated
vendored
3
vendor/go.opentelemetry.io/otel/trace/go.sum
generated
vendored
@ -1,5 +1,8 @@
|
|||||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
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/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
|
||||||
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
|
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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
2
vendor/go.opentelemetry.io/otel/version.go
generated
vendored
2
vendor/go.opentelemetry.io/otel/version.go
generated
vendored
@ -16,5 +16,5 @@ package otel // import "go.opentelemetry.io/otel"
|
|||||||
|
|
||||||
// Version is the current release version of OpenTelemetry in use.
|
// Version is the current release version of OpenTelemetry in use.
|
||||||
func Version() string {
|
func Version() string {
|
||||||
return "1.0.1"
|
return "1.3.0"
|
||||||
}
|
}
|
||||||
|
11
vendor/go.opentelemetry.io/otel/versions.yaml
generated
vendored
11
vendor/go.opentelemetry.io/otel/versions.yaml
generated
vendored
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
module-sets:
|
module-sets:
|
||||||
stable-v1:
|
stable-v1:
|
||||||
version: v1.0.1
|
version: v1.3.0
|
||||||
modules:
|
modules:
|
||||||
- go.opentelemetry.io/otel
|
- go.opentelemetry.io/otel
|
||||||
- go.opentelemetry.io/otel/bridge/opentracing
|
- go.opentelemetry.io/otel/bridge/opentracing
|
||||||
@ -29,11 +29,12 @@ module-sets:
|
|||||||
- go.opentelemetry.io/otel/exporters/otlp/otlptrace
|
- go.opentelemetry.io/otel/exporters/otlp/otlptrace
|
||||||
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
||||||
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp
|
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp
|
||||||
|
- go.opentelemetry.io/otel/exporters/otlp/internal/retry
|
||||||
- go.opentelemetry.io/otel/exporters/stdout/stdouttrace
|
- go.opentelemetry.io/otel/exporters/stdout/stdouttrace
|
||||||
- go.opentelemetry.io/otel/trace
|
- go.opentelemetry.io/otel/trace
|
||||||
- go.opentelemetry.io/otel/sdk
|
- go.opentelemetry.io/otel/sdk
|
||||||
experimental-metrics:
|
experimental-metrics:
|
||||||
version: v0.24.0
|
version: v0.26.0
|
||||||
modules:
|
modules:
|
||||||
- go.opentelemetry.io/otel/example/prometheus
|
- go.opentelemetry.io/otel/example/prometheus
|
||||||
- go.opentelemetry.io/otel/exporters/otlp/otlpmetric
|
- go.opentelemetry.io/otel/exporters/otlp/otlpmetric
|
||||||
@ -45,8 +46,12 @@ module-sets:
|
|||||||
- go.opentelemetry.io/otel/metric
|
- go.opentelemetry.io/otel/metric
|
||||||
- go.opentelemetry.io/otel/sdk/export/metric
|
- go.opentelemetry.io/otel/sdk/export/metric
|
||||||
- go.opentelemetry.io/otel/sdk/metric
|
- go.opentelemetry.io/otel/sdk/metric
|
||||||
|
experimental-schema:
|
||||||
|
version: v0.0.1
|
||||||
|
modules:
|
||||||
|
- go.opentelemetry.io/otel/schema
|
||||||
bridge:
|
bridge:
|
||||||
version: v0.24.0
|
version: v0.26.0
|
||||||
modules:
|
modules:
|
||||||
- go.opentelemetry.io/otel/bridge/opencensus
|
- go.opentelemetry.io/otel/bridge/opencensus
|
||||||
- go.opentelemetry.io/otel/bridge/opencensus/test
|
- go.opentelemetry.io/otel/bridge/opencensus/test
|
||||||
|
2
vendor/go.opentelemetry.io/proto/otlp/common/v1/common.pb.go
generated
vendored
2
vendor/go.opentelemetry.io/proto/otlp/common/v1/common.pb.go
generated
vendored
@ -48,7 +48,7 @@ type AnyValue struct {
|
|||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
// The value is one of the listed fields. It is valid for all values to be unspecified
|
// The value is one of the listed fields. It is valid for all values to be unspecified
|
||||||
// in which case this AnyValue is considered to be "null".
|
// in which case this AnyValue is considered to be "empty".
|
||||||
//
|
//
|
||||||
// Types that are assignable to Value:
|
// Types that are assignable to Value:
|
||||||
// *AnyValue_StringValue
|
// *AnyValue_StringValue
|
||||||
|
546
vendor/go.opentelemetry.io/proto/otlp/trace/v1/trace.pb.go
generated
vendored
546
vendor/go.opentelemetry.io/proto/otlp/trace/v1/trace.pb.go
generated
vendored
@ -112,7 +112,7 @@ func (x Span_SpanKind) Number() protoreflect.EnumNumber {
|
|||||||
|
|
||||||
// Deprecated: Use Span_SpanKind.Descriptor instead.
|
// Deprecated: Use Span_SpanKind.Descriptor instead.
|
||||||
func (Span_SpanKind) EnumDescriptor() ([]byte, []int) {
|
func (Span_SpanKind) EnumDescriptor() ([]byte, []int) {
|
||||||
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{2, 0}
|
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{3, 0}
|
||||||
}
|
}
|
||||||
|
|
||||||
type Status_DeprecatedStatusCode int32
|
type Status_DeprecatedStatusCode int32
|
||||||
@ -203,7 +203,7 @@ func (x Status_DeprecatedStatusCode) Number() protoreflect.EnumNumber {
|
|||||||
|
|
||||||
// Deprecated: Use Status_DeprecatedStatusCode.Descriptor instead.
|
// Deprecated: Use Status_DeprecatedStatusCode.Descriptor instead.
|
||||||
func (Status_DeprecatedStatusCode) EnumDescriptor() ([]byte, []int) {
|
func (Status_DeprecatedStatusCode) EnumDescriptor() ([]byte, []int) {
|
||||||
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{3, 0}
|
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{4, 0}
|
||||||
}
|
}
|
||||||
|
|
||||||
// For the semantics of status codes see
|
// For the semantics of status codes see
|
||||||
@ -258,7 +258,69 @@ func (x Status_StatusCode) Number() protoreflect.EnumNumber {
|
|||||||
|
|
||||||
// Deprecated: Use Status_StatusCode.Descriptor instead.
|
// Deprecated: Use Status_StatusCode.Descriptor instead.
|
||||||
func (Status_StatusCode) EnumDescriptor() ([]byte, []int) {
|
func (Status_StatusCode) EnumDescriptor() ([]byte, []int) {
|
||||||
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{3, 1}
|
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{4, 1}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TracesData represents the traces data that can be stored in a persistent storage,
|
||||||
|
// OR can be embedded by other protocols that transfer OTLP traces data but do
|
||||||
|
// not implement the OTLP protocol.
|
||||||
|
//
|
||||||
|
// The main difference between this message and collector protocol is that
|
||||||
|
// in this message there will not be any "control" or "metadata" specific to
|
||||||
|
// OTLP protocol.
|
||||||
|
//
|
||||||
|
// When new fields are added into this message, the OTLP request MUST be updated
|
||||||
|
// as well.
|
||||||
|
type TracesData struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
// An array of ResourceSpans.
|
||||||
|
// For data coming from a single resource this array will typically contain
|
||||||
|
// one element. Intermediary nodes that receive data from multiple origins
|
||||||
|
// typically batch the data before forwarding further and in that case this
|
||||||
|
// array will contain multiple elements.
|
||||||
|
ResourceSpans []*ResourceSpans `protobuf:"bytes,1,rep,name=resource_spans,json=resourceSpans,proto3" json:"resource_spans,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *TracesData) Reset() {
|
||||||
|
*x = TracesData{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[0]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *TracesData) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*TracesData) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *TracesData) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[0]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use TracesData.ProtoReflect.Descriptor instead.
|
||||||
|
func (*TracesData) Descriptor() ([]byte, []int) {
|
||||||
|
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{0}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *TracesData) GetResourceSpans() []*ResourceSpans {
|
||||||
|
if x != nil {
|
||||||
|
return x.ResourceSpans
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// A collection of InstrumentationLibrarySpans from a Resource.
|
// A collection of InstrumentationLibrarySpans from a Resource.
|
||||||
@ -281,7 +343,7 @@ type ResourceSpans struct {
|
|||||||
func (x *ResourceSpans) Reset() {
|
func (x *ResourceSpans) Reset() {
|
||||||
*x = ResourceSpans{}
|
*x = ResourceSpans{}
|
||||||
if protoimpl.UnsafeEnabled {
|
if protoimpl.UnsafeEnabled {
|
||||||
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[0]
|
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[1]
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
ms.StoreMessageInfo(mi)
|
ms.StoreMessageInfo(mi)
|
||||||
}
|
}
|
||||||
@ -294,7 +356,7 @@ func (x *ResourceSpans) String() string {
|
|||||||
func (*ResourceSpans) ProtoMessage() {}
|
func (*ResourceSpans) ProtoMessage() {}
|
||||||
|
|
||||||
func (x *ResourceSpans) ProtoReflect() protoreflect.Message {
|
func (x *ResourceSpans) ProtoReflect() protoreflect.Message {
|
||||||
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[0]
|
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[1]
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
if ms.LoadMessageInfo() == nil {
|
if ms.LoadMessageInfo() == nil {
|
||||||
@ -307,7 +369,7 @@ func (x *ResourceSpans) ProtoReflect() protoreflect.Message {
|
|||||||
|
|
||||||
// Deprecated: Use ResourceSpans.ProtoReflect.Descriptor instead.
|
// Deprecated: Use ResourceSpans.ProtoReflect.Descriptor instead.
|
||||||
func (*ResourceSpans) Descriptor() ([]byte, []int) {
|
func (*ResourceSpans) Descriptor() ([]byte, []int) {
|
||||||
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{0}
|
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{1}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *ResourceSpans) GetResource() *v1.Resource {
|
func (x *ResourceSpans) GetResource() *v1.Resource {
|
||||||
@ -350,7 +412,7 @@ type InstrumentationLibrarySpans struct {
|
|||||||
func (x *InstrumentationLibrarySpans) Reset() {
|
func (x *InstrumentationLibrarySpans) Reset() {
|
||||||
*x = InstrumentationLibrarySpans{}
|
*x = InstrumentationLibrarySpans{}
|
||||||
if protoimpl.UnsafeEnabled {
|
if protoimpl.UnsafeEnabled {
|
||||||
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[1]
|
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[2]
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
ms.StoreMessageInfo(mi)
|
ms.StoreMessageInfo(mi)
|
||||||
}
|
}
|
||||||
@ -363,7 +425,7 @@ func (x *InstrumentationLibrarySpans) String() string {
|
|||||||
func (*InstrumentationLibrarySpans) ProtoMessage() {}
|
func (*InstrumentationLibrarySpans) ProtoMessage() {}
|
||||||
|
|
||||||
func (x *InstrumentationLibrarySpans) ProtoReflect() protoreflect.Message {
|
func (x *InstrumentationLibrarySpans) ProtoReflect() protoreflect.Message {
|
||||||
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[1]
|
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[2]
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
if ms.LoadMessageInfo() == nil {
|
if ms.LoadMessageInfo() == nil {
|
||||||
@ -376,7 +438,7 @@ func (x *InstrumentationLibrarySpans) ProtoReflect() protoreflect.Message {
|
|||||||
|
|
||||||
// Deprecated: Use InstrumentationLibrarySpans.ProtoReflect.Descriptor instead.
|
// Deprecated: Use InstrumentationLibrarySpans.ProtoReflect.Descriptor instead.
|
||||||
func (*InstrumentationLibrarySpans) Descriptor() ([]byte, []int) {
|
func (*InstrumentationLibrarySpans) Descriptor() ([]byte, []int) {
|
||||||
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{1}
|
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{2}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *InstrumentationLibrarySpans) GetInstrumentationLibrary() *v11.InstrumentationLibrary {
|
func (x *InstrumentationLibrarySpans) GetInstrumentationLibrary() *v11.InstrumentationLibrary {
|
||||||
@ -447,9 +509,7 @@ type Span struct {
|
|||||||
// This makes it easier to correlate spans in different traces.
|
// This makes it easier to correlate spans in different traces.
|
||||||
//
|
//
|
||||||
// This field is semantically required to be set to non-empty string.
|
// This field is semantically required to be set to non-empty string.
|
||||||
// When null or empty string received - receiver may use string "name"
|
// Empty value is equivalent to an unknown span name.
|
||||||
// as a replacement. There might be smarted algorithms implemented by
|
|
||||||
// receiver to fix the empty span name.
|
|
||||||
//
|
//
|
||||||
// This field is required.
|
// This field is required.
|
||||||
Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"`
|
Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"`
|
||||||
@ -471,14 +531,16 @@ type Span struct {
|
|||||||
//
|
//
|
||||||
// This field is semantically required and it is expected that end_time >= start_time.
|
// This field is semantically required and it is expected that end_time >= start_time.
|
||||||
EndTimeUnixNano uint64 `protobuf:"fixed64,8,opt,name=end_time_unix_nano,json=endTimeUnixNano,proto3" json:"end_time_unix_nano,omitempty"`
|
EndTimeUnixNano uint64 `protobuf:"fixed64,8,opt,name=end_time_unix_nano,json=endTimeUnixNano,proto3" json:"end_time_unix_nano,omitempty"`
|
||||||
// attributes is a collection of key/value pairs. The value can be a string,
|
// attributes is a collection of key/value pairs. Note, global attributes
|
||||||
// an integer, a double or the Boolean values `true` or `false`. Note, global attributes
|
|
||||||
// like server name can be set using the resource API. Examples of attributes:
|
// like server name can be set using the resource API. Examples of attributes:
|
||||||
//
|
//
|
||||||
// "/http/user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
|
// "/http/user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
|
||||||
// "/http/server_latency": 300
|
// "/http/server_latency": 300
|
||||||
// "abc.com/myattribute": true
|
// "abc.com/myattribute": true
|
||||||
// "abc.com/score": 10.239
|
// "abc.com/score": 10.239
|
||||||
|
//
|
||||||
|
// The OpenTelemetry API specification further restricts the allowed value types:
|
||||||
|
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/common/common.md#attributes
|
||||||
Attributes []*v11.KeyValue `protobuf:"bytes,9,rep,name=attributes,proto3" json:"attributes,omitempty"`
|
Attributes []*v11.KeyValue `protobuf:"bytes,9,rep,name=attributes,proto3" json:"attributes,omitempty"`
|
||||||
// dropped_attributes_count is the number of attributes that were discarded. Attributes
|
// dropped_attributes_count is the number of attributes that were discarded. Attributes
|
||||||
// can be discarded because their keys are too long or because there are too many
|
// can be discarded because their keys are too long or because there are too many
|
||||||
@ -503,7 +565,7 @@ type Span struct {
|
|||||||
func (x *Span) Reset() {
|
func (x *Span) Reset() {
|
||||||
*x = Span{}
|
*x = Span{}
|
||||||
if protoimpl.UnsafeEnabled {
|
if protoimpl.UnsafeEnabled {
|
||||||
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[2]
|
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[3]
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
ms.StoreMessageInfo(mi)
|
ms.StoreMessageInfo(mi)
|
||||||
}
|
}
|
||||||
@ -516,7 +578,7 @@ func (x *Span) String() string {
|
|||||||
func (*Span) ProtoMessage() {}
|
func (*Span) ProtoMessage() {}
|
||||||
|
|
||||||
func (x *Span) ProtoReflect() protoreflect.Message {
|
func (x *Span) ProtoReflect() protoreflect.Message {
|
||||||
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[2]
|
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[3]
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
if ms.LoadMessageInfo() == nil {
|
if ms.LoadMessageInfo() == nil {
|
||||||
@ -529,7 +591,7 @@ func (x *Span) ProtoReflect() protoreflect.Message {
|
|||||||
|
|
||||||
// Deprecated: Use Span.ProtoReflect.Descriptor instead.
|
// Deprecated: Use Span.ProtoReflect.Descriptor instead.
|
||||||
func (*Span) Descriptor() ([]byte, []int) {
|
func (*Span) Descriptor() ([]byte, []int) {
|
||||||
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{2}
|
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{3}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *Span) GetTraceId() []byte {
|
func (x *Span) GetTraceId() []byte {
|
||||||
@ -662,7 +724,7 @@ type Status struct {
|
|||||||
func (x *Status) Reset() {
|
func (x *Status) Reset() {
|
||||||
*x = Status{}
|
*x = Status{}
|
||||||
if protoimpl.UnsafeEnabled {
|
if protoimpl.UnsafeEnabled {
|
||||||
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[3]
|
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[4]
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
ms.StoreMessageInfo(mi)
|
ms.StoreMessageInfo(mi)
|
||||||
}
|
}
|
||||||
@ -675,7 +737,7 @@ func (x *Status) String() string {
|
|||||||
func (*Status) ProtoMessage() {}
|
func (*Status) ProtoMessage() {}
|
||||||
|
|
||||||
func (x *Status) ProtoReflect() protoreflect.Message {
|
func (x *Status) ProtoReflect() protoreflect.Message {
|
||||||
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[3]
|
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[4]
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
if ms.LoadMessageInfo() == nil {
|
if ms.LoadMessageInfo() == nil {
|
||||||
@ -688,7 +750,7 @@ func (x *Status) ProtoReflect() protoreflect.Message {
|
|||||||
|
|
||||||
// Deprecated: Use Status.ProtoReflect.Descriptor instead.
|
// Deprecated: Use Status.ProtoReflect.Descriptor instead.
|
||||||
func (*Status) Descriptor() ([]byte, []int) {
|
func (*Status) Descriptor() ([]byte, []int) {
|
||||||
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{3}
|
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{4}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deprecated: Do not use.
|
// Deprecated: Do not use.
|
||||||
@ -735,7 +797,7 @@ type Span_Event struct {
|
|||||||
func (x *Span_Event) Reset() {
|
func (x *Span_Event) Reset() {
|
||||||
*x = Span_Event{}
|
*x = Span_Event{}
|
||||||
if protoimpl.UnsafeEnabled {
|
if protoimpl.UnsafeEnabled {
|
||||||
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[4]
|
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[5]
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
ms.StoreMessageInfo(mi)
|
ms.StoreMessageInfo(mi)
|
||||||
}
|
}
|
||||||
@ -748,7 +810,7 @@ func (x *Span_Event) String() string {
|
|||||||
func (*Span_Event) ProtoMessage() {}
|
func (*Span_Event) ProtoMessage() {}
|
||||||
|
|
||||||
func (x *Span_Event) ProtoReflect() protoreflect.Message {
|
func (x *Span_Event) ProtoReflect() protoreflect.Message {
|
||||||
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[4]
|
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[5]
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
if ms.LoadMessageInfo() == nil {
|
if ms.LoadMessageInfo() == nil {
|
||||||
@ -761,7 +823,7 @@ func (x *Span_Event) ProtoReflect() protoreflect.Message {
|
|||||||
|
|
||||||
// Deprecated: Use Span_Event.ProtoReflect.Descriptor instead.
|
// Deprecated: Use Span_Event.ProtoReflect.Descriptor instead.
|
||||||
func (*Span_Event) Descriptor() ([]byte, []int) {
|
func (*Span_Event) Descriptor() ([]byte, []int) {
|
||||||
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{2, 0}
|
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{3, 0}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *Span_Event) GetTimeUnixNano() uint64 {
|
func (x *Span_Event) GetTimeUnixNano() uint64 {
|
||||||
@ -818,7 +880,7 @@ type Span_Link struct {
|
|||||||
func (x *Span_Link) Reset() {
|
func (x *Span_Link) Reset() {
|
||||||
*x = Span_Link{}
|
*x = Span_Link{}
|
||||||
if protoimpl.UnsafeEnabled {
|
if protoimpl.UnsafeEnabled {
|
||||||
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[5]
|
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[6]
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
ms.StoreMessageInfo(mi)
|
ms.StoreMessageInfo(mi)
|
||||||
}
|
}
|
||||||
@ -831,7 +893,7 @@ func (x *Span_Link) String() string {
|
|||||||
func (*Span_Link) ProtoMessage() {}
|
func (*Span_Link) ProtoMessage() {}
|
||||||
|
|
||||||
func (x *Span_Link) ProtoReflect() protoreflect.Message {
|
func (x *Span_Link) ProtoReflect() protoreflect.Message {
|
||||||
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[5]
|
mi := &file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[6]
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
if ms.LoadMessageInfo() == nil {
|
if ms.LoadMessageInfo() == nil {
|
||||||
@ -844,7 +906,7 @@ func (x *Span_Link) ProtoReflect() protoreflect.Message {
|
|||||||
|
|
||||||
// Deprecated: Use Span_Link.ProtoReflect.Descriptor instead.
|
// Deprecated: Use Span_Link.ProtoReflect.Descriptor instead.
|
||||||
func (*Span_Link) Descriptor() ([]byte, []int) {
|
func (*Span_Link) Descriptor() ([]byte, []int) {
|
||||||
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{2, 1}
|
return file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP(), []int{3, 1}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *Span_Link) GetTraceId() []byte {
|
func (x *Span_Link) GetTraceId() []byte {
|
||||||
@ -895,189 +957,195 @@ var file_opentelemetry_proto_trace_v1_trace_proto_rawDesc = []byte{
|
|||||||
0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65,
|
0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65,
|
||||||
0x74, 0x72, 0x79, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
|
0x74, 0x72, 0x79, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
|
||||||
0x63, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70,
|
0x63, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70,
|
||||||
0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf4, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
|
0x72, 0x6f, 0x74, 0x6f, 0x22, 0x60, 0x0a, 0x0a, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x44, 0x61,
|
||||||
0x65, 0x53, 0x70, 0x61, 0x6e, 0x73, 0x12, 0x45, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
|
0x74, 0x61, 0x12, 0x52, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73,
|
||||||
0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74,
|
0x70, 0x61, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6f, 0x70, 0x65,
|
||||||
0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72,
|
|
||||||
0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75,
|
|
||||||
0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x7d, 0x0a,
|
|
||||||
0x1d, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
|
|
||||||
0x5f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x70, 0x61, 0x6e, 0x73, 0x18, 0x02,
|
|
||||||
0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d,
|
|
||||||
0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65,
|
|
||||||
0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74,
|
|
||||||
0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x53, 0x70, 0x61, 0x6e, 0x73, 0x52,
|
|
||||||
0x1b, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
|
|
||||||
0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x53, 0x70, 0x61, 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x0a,
|
|
||||||
0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
|
|
||||||
0x52, 0x09, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x55, 0x72, 0x6c, 0x22, 0xe6, 0x01, 0x0a, 0x1b,
|
|
||||||
0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c,
|
|
||||||
0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x53, 0x70, 0x61, 0x6e, 0x73, 0x12, 0x6e, 0x0a, 0x17, 0x69,
|
|
||||||
0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c,
|
|
||||||
0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6f,
|
|
||||||
0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f,
|
|
||||||
0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73,
|
|
||||||
0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72,
|
|
||||||
0x61, 0x72, 0x79, 0x52, 0x16, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61,
|
|
||||||
0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x12, 0x38, 0x0a, 0x05, 0x73,
|
|
||||||
0x70, 0x61, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x70, 0x65,
|
|
||||||
0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
||||||
0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x52, 0x05,
|
0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72,
|
||||||
0x73, 0x70, 0x61, 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f,
|
0x63, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x73, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63,
|
||||||
0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x63, 0x68, 0x65, 0x6d,
|
0x65, 0x53, 0x70, 0x61, 0x6e, 0x73, 0x22, 0xf4, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x6f, 0x75,
|
||||||
0x61, 0x55, 0x72, 0x6c, 0x22, 0x9c, 0x0a, 0x0a, 0x04, 0x53, 0x70, 0x61, 0x6e, 0x12, 0x19, 0x0a,
|
0x72, 0x63, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x73, 0x12, 0x45, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f,
|
||||||
0x08, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52,
|
0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x70, 0x65,
|
||||||
0x07, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x70, 0x61, 0x6e,
|
|
||||||
0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x70, 0x61, 0x6e, 0x49,
|
|
||||||
0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65,
|
|
||||||
0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61,
|
|
||||||
0x74, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x70, 0x61,
|
|
||||||
0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x65,
|
|
||||||
0x6e, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
|
|
||||||
0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x04,
|
|
||||||
0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x70, 0x65,
|
|
||||||
0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
||||||
0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x2e, 0x53,
|
0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73,
|
||||||
0x70, 0x61, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x2f, 0x0a,
|
0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12,
|
||||||
0x14, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, 0x69, 0x78,
|
0x7d, 0x0a, 0x1d, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69,
|
||||||
0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x06, 0x52, 0x11, 0x73, 0x74, 0x61,
|
0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x70, 0x61, 0x6e, 0x73,
|
||||||
0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x2b,
|
0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c,
|
||||||
0x0a, 0x12, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f,
|
0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x74, 0x72, 0x61,
|
||||||
0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x06, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x54,
|
0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74,
|
||||||
0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x47, 0x0a, 0x0a, 0x61,
|
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x53, 0x70, 0x61, 0x6e,
|
||||||
0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32,
|
0x73, 0x52, 0x1b, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69,
|
||||||
0x27, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e,
|
0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x53, 0x70, 0x61, 0x6e, 0x73, 0x12, 0x1d,
|
||||||
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e,
|
0x0a, 0x0a, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01,
|
||||||
0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
|
0x28, 0x09, 0x52, 0x09, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x55, 0x72, 0x6c, 0x22, 0xe6, 0x01,
|
||||||
0x75, 0x74, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f,
|
0x0a, 0x1b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f,
|
||||||
0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74,
|
0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x53, 0x70, 0x61, 0x6e, 0x73, 0x12, 0x6e, 0x0a,
|
||||||
0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x41,
|
0x17, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
|
||||||
0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x40,
|
0x5f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35,
|
||||||
0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28,
|
|
||||||
0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70,
|
0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70,
|
||||||
0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70,
|
0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x49,
|
||||||
0x61, 0x6e, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73,
|
0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69,
|
||||||
0x12, 0x30, 0x0a, 0x14, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e,
|
0x62, 0x72, 0x61, 0x72, 0x79, 0x52, 0x16, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e,
|
||||||
0x74, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12,
|
0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x12, 0x38, 0x0a,
|
||||||
0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75,
|
0x05, 0x73, 0x70, 0x61, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6f,
|
||||||
0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28,
|
0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f,
|
||||||
0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72,
|
0x74, 0x6f, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x6e,
|
||||||
0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31,
|
0x52, 0x05, 0x73, 0x70, 0x61, 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x68, 0x65, 0x6d,
|
||||||
0x2e, 0x53, 0x70, 0x61, 0x6e, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x6b,
|
0x61, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x63, 0x68,
|
||||||
0x73, 0x12, 0x2e, 0x0a, 0x13, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6e,
|
0x65, 0x6d, 0x61, 0x55, 0x72, 0x6c, 0x22, 0x9c, 0x0a, 0x0a, 0x04, 0x53, 0x70, 0x61, 0x6e, 0x12,
|
||||||
0x6b, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11,
|
|
||||||
0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e,
|
|
||||||
0x74, 0x12, 0x3c, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28,
|
|
||||||
0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72,
|
|
||||||
0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31,
|
|
||||||
0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a,
|
|
||||||
0xc4, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x74, 0x69, 0x6d,
|
|
||||||
0x65, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28,
|
|
||||||
0x06, 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x12,
|
|
||||||
0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
|
|
||||||
0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
|
|
||||||
0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65,
|
|
||||||
0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f,
|
|
||||||
0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65,
|
|
||||||
0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x18,
|
|
||||||
0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
|
|
||||||
0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16,
|
|
||||||
0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
|
|
||||||
0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0xde, 0x01, 0x0a, 0x04, 0x4c, 0x69, 0x6e, 0x6b, 0x12,
|
|
||||||
0x19, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
|
0x19, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
|
||||||
0x0c, 0x52, 0x07, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x70,
|
0x0c, 0x52, 0x07, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x70,
|
||||||
0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x70, 0x61,
|
0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x70, 0x61,
|
||||||
0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61,
|
0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61,
|
||||||
0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x63, 0x65, 0x53,
|
0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x63, 0x65, 0x53,
|
||||||
0x74, 0x61, 0x74, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
|
0x74, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73,
|
||||||
0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74,
|
0x70, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x70, 0x61,
|
||||||
0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63,
|
0x72, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
|
||||||
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75,
|
0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f,
|
||||||
0x65, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x38, 0x0a,
|
0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f,
|
||||||
0x18, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
|
0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f,
|
||||||
0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52,
|
0x74, 0x6f, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x6e,
|
||||||
0x16, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
|
0x2e, 0x53, 0x70, 0x61, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12,
|
||||||
0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x53, 0x70, 0x61, 0x6e,
|
0x2f, 0x0a, 0x14, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e,
|
||||||
0x4b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x50, 0x41, 0x4e, 0x5f, 0x4b, 0x49, 0x4e,
|
0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x06, 0x52, 0x11, 0x73,
|
||||||
0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,
|
0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f,
|
||||||
0x16, 0x0a, 0x12, 0x53, 0x50, 0x41, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x49, 0x4e, 0x54,
|
0x12, 0x2b, 0x0a, 0x12, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, 0x69,
|
||||||
0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x50, 0x41, 0x4e, 0x5f,
|
0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x06, 0x52, 0x0f, 0x65, 0x6e,
|
||||||
0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x10, 0x02, 0x12, 0x14, 0x0a,
|
0x64, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x47, 0x0a,
|
||||||
0x10, 0x53, 0x50, 0x41, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4c, 0x49, 0x45, 0x4e,
|
0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28,
|
||||||
0x54, 0x10, 0x03, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x50, 0x41, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44,
|
0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72,
|
||||||
0x5f, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x45, 0x52, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x53,
|
0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76,
|
||||||
0x50, 0x41, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x55, 0x4d, 0x45,
|
0x31, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72,
|
||||||
0x52, 0x10, 0x05, 0x22, 0xfc, 0x07, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x66,
|
0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65,
|
||||||
0x0a, 0x0f, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x64,
|
0x64, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75,
|
||||||
0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x39, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65,
|
0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65,
|
||||||
0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x74, 0x72,
|
0x64, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74,
|
||||||
0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x44, 0x65,
|
0x12, 0x40, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b,
|
||||||
0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f,
|
0x32, 0x28, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79,
|
||||||
0x64, 0x65, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74,
|
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e,
|
||||||
0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
|
0x53, 0x70, 0x61, 0x6e, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e,
|
||||||
0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
|
0x74, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x65, 0x76,
|
||||||
0x12, 0x43, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f,
|
0x65, 0x6e, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d,
|
||||||
0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70,
|
0x52, 0x12, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x43,
|
||||||
0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74,
|
0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x0d, 0x20,
|
||||||
0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x52,
|
0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65,
|
||||||
0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0xda, 0x05, 0x0a, 0x14, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63,
|
0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e,
|
||||||
0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d,
|
0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x05, 0x6c, 0x69,
|
||||||
0x0a, 0x19, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41,
|
0x6e, 0x6b, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6c,
|
||||||
0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x4b, 0x10, 0x00, 0x12, 0x24, 0x0a,
|
0x69, 0x6e, 0x6b, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d,
|
||||||
0x20, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54,
|
0x52, 0x11, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x43, 0x6f,
|
||||||
0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45,
|
0x75, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20,
|
||||||
0x44, 0x10, 0x01, 0x12, 0x28, 0x0a, 0x24, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45,
|
0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65,
|
||||||
0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e,
|
0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e,
|
||||||
0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x2b, 0x0a,
|
0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
|
||||||
0x27, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54,
|
0x73, 0x1a, 0xc4, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x74,
|
||||||
0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f,
|
0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x01, 0x20,
|
||||||
0x41, 0x52, 0x47, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x2c, 0x0a, 0x28, 0x44, 0x45,
|
0x01, 0x28, 0x06, 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e,
|
||||||
|
0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||||
|
0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
|
||||||
|
0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x70, 0x65, 0x6e,
|
||||||
|
0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
|
||||||
|
0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c,
|
||||||
|
0x75, 0x65, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x38,
|
||||||
|
0x0a, 0x18, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
|
||||||
|
0x75, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d,
|
||||||
|
0x52, 0x16, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
|
||||||
|
0x74, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0xde, 0x01, 0x0a, 0x04, 0x4c, 0x69, 0x6e,
|
||||||
|
0x6b, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
|
||||||
|
0x01, 0x28, 0x0c, 0x52, 0x07, 0x74, 0x72, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07,
|
||||||
|
0x73, 0x70, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73,
|
||||||
|
0x70, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x73,
|
||||||
|
0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x63,
|
||||||
|
0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
|
||||||
|
0x75, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x70, 0x65,
|
||||||
|
0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
||||||
|
0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61,
|
||||||
|
0x6c, 0x75, 0x65, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12,
|
||||||
|
0x38, 0x0a, 0x18, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69,
|
||||||
|
0x62, 0x75, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28,
|
||||||
|
0x0d, 0x52, 0x16, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62,
|
||||||
|
0x75, 0x74, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x53, 0x70,
|
||||||
|
0x61, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x50, 0x41, 0x4e, 0x5f, 0x4b,
|
||||||
|
0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10,
|
||||||
|
0x00, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x50, 0x41, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x49,
|
||||||
|
0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x50, 0x41,
|
||||||
|
0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x10, 0x02, 0x12,
|
||||||
|
0x14, 0x0a, 0x10, 0x53, 0x50, 0x41, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4c, 0x49,
|
||||||
|
0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x50, 0x41, 0x4e, 0x5f, 0x4b, 0x49,
|
||||||
|
0x4e, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x45, 0x52, 0x10, 0x04, 0x12, 0x16, 0x0a,
|
||||||
|
0x12, 0x53, 0x50, 0x41, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x55,
|
||||||
|
0x4d, 0x45, 0x52, 0x10, 0x05, 0x22, 0xfc, 0x07, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
|
||||||
|
0x12, 0x66, 0x0a, 0x0f, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x63,
|
||||||
|
0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x39, 0x2e, 0x6f, 0x70, 0x65, 0x6e,
|
||||||
|
0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
|
||||||
|
0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e,
|
||||||
|
0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
|
||||||
|
0x43, 0x6f, 0x64, 0x65, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63,
|
||||||
|
0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73,
|
||||||
|
0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,
|
||||||
|
0x67, 0x65, 0x12, 0x43, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e,
|
||||||
|
0x32, 0x2f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79,
|
||||||
|
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e,
|
||||||
|
0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64,
|
||||||
|
0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0xda, 0x05, 0x0a, 0x14, 0x44, 0x65, 0x70, 0x72,
|
||||||
|
0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65,
|
||||||
|
0x12, 0x1d, 0x0a, 0x19, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53,
|
||||||
|
0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x4b, 0x10, 0x00, 0x12,
|
||||||
|
0x24, 0x0a, 0x20, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54,
|
||||||
|
0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c,
|
||||||
|
0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x28, 0x0a, 0x24, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41,
|
||||||
|
0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f,
|
||||||
|
0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12,
|
||||||
|
0x2b, 0x0a, 0x27, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54,
|
||||||
|
0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49,
|
||||||
|
0x44, 0x5f, 0x41, 0x52, 0x47, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x2c, 0x0a, 0x28,
|
||||||
|
0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55,
|
||||||
|
0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x44, 0x45, 0x41, 0x44, 0x4c, 0x49, 0x4e, 0x45, 0x5f,
|
||||||
|
0x45, 0x58, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x04, 0x12, 0x24, 0x0a, 0x20, 0x44, 0x45,
|
||||||
0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f,
|
0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f,
|
||||||
0x43, 0x4f, 0x44, 0x45, 0x5f, 0x44, 0x45, 0x41, 0x44, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x45, 0x58,
|
0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x05,
|
||||||
0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x04, 0x12, 0x24, 0x0a, 0x20, 0x44, 0x45, 0x50, 0x52,
|
0x12, 0x29, 0x0a, 0x25, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53,
|
||||||
0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f,
|
0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41,
|
||||||
0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x05, 0x12, 0x29,
|
0x44, 0x59, 0x5f, 0x45, 0x58, 0x49, 0x53, 0x54, 0x53, 0x10, 0x06, 0x12, 0x2c, 0x0a, 0x28, 0x44,
|
||||||
0x0a, 0x25, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41,
|
0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53,
|
||||||
0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59,
|
0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e,
|
||||||
0x5f, 0x45, 0x58, 0x49, 0x53, 0x54, 0x53, 0x10, 0x06, 0x12, 0x2c, 0x0a, 0x28, 0x44, 0x45, 0x50,
|
0x5f, 0x44, 0x45, 0x4e, 0x49, 0x45, 0x44, 0x10, 0x07, 0x12, 0x2d, 0x0a, 0x29, 0x44, 0x45, 0x50,
|
||||||
0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43,
|
0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43,
|
||||||
0x4f, 0x44, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x44,
|
0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x45, 0x58, 0x48,
|
||||||
0x45, 0x4e, 0x49, 0x45, 0x44, 0x10, 0x07, 0x12, 0x2d, 0x0a, 0x29, 0x44, 0x45, 0x50, 0x52, 0x45,
|
0x41, 0x55, 0x53, 0x54, 0x45, 0x44, 0x10, 0x08, 0x12, 0x2e, 0x0a, 0x2a, 0x44, 0x45, 0x50, 0x52,
|
||||||
0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44,
|
|
||||||
0x45, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x45, 0x58, 0x48, 0x41, 0x55,
|
|
||||||
0x53, 0x54, 0x45, 0x44, 0x10, 0x08, 0x12, 0x2e, 0x0a, 0x2a, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43,
|
|
||||||
0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45,
|
|
||||||
0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x50, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x44, 0x49,
|
|
||||||
0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x22, 0x0a, 0x1e, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43,
|
|
||||||
0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45,
|
|
||||||
0x5f, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, 0x0a, 0x12, 0x27, 0x0a, 0x23, 0x44, 0x45,
|
|
||||||
0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f,
|
|
||||||
0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x52, 0x41, 0x4e, 0x47,
|
|
||||||
0x45, 0x10, 0x0b, 0x12, 0x28, 0x0a, 0x24, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45,
|
|
||||||
0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e,
|
|
||||||
0x49, 0x4d, 0x50, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x45, 0x44, 0x10, 0x0c, 0x12, 0x29, 0x0a,
|
|
||||||
0x25, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54,
|
|
||||||
0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c,
|
|
||||||
0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x0d, 0x12, 0x26, 0x0a, 0x22, 0x44, 0x45, 0x50, 0x52,
|
|
||||||
0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f,
|
0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f,
|
||||||
0x44, 0x45, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0e,
|
0x44, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x50, 0x52, 0x45, 0x43, 0x4f, 0x4e,
|
||||||
0x12, 0x24, 0x0a, 0x20, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53,
|
0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x22, 0x0a, 0x1e, 0x44, 0x45, 0x50, 0x52,
|
||||||
0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f,
|
0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f,
|
||||||
0x4c, 0x4f, 0x53, 0x53, 0x10, 0x0f, 0x12, 0x2a, 0x0a, 0x26, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43,
|
0x44, 0x45, 0x5f, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, 0x0a, 0x12, 0x27, 0x0a, 0x23,
|
||||||
0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45,
|
0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55,
|
||||||
0x5f, 0x55, 0x4e, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4e, 0x54, 0x49, 0x43, 0x41, 0x54, 0x45, 0x44,
|
0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x52, 0x41,
|
||||||
0x10, 0x10, 0x22, 0x4e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65,
|
0x4e, 0x47, 0x45, 0x10, 0x0b, 0x12, 0x28, 0x0a, 0x24, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41,
|
||||||
0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f,
|
0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f,
|
||||||
0x55, 0x4e, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55,
|
0x55, 0x4e, 0x49, 0x4d, 0x50, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x45, 0x44, 0x10, 0x0c, 0x12,
|
||||||
0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x53,
|
0x29, 0x0a, 0x25, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54,
|
||||||
0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52,
|
0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e,
|
||||||
0x10, 0x02, 0x42, 0x58, 0x0a, 0x1f, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c,
|
0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x0d, 0x12, 0x26, 0x0a, 0x22, 0x44, 0x45,
|
||||||
0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x74, 0x72, 0x61,
|
0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f,
|
||||||
0x63, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x54, 0x72, 0x61, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74,
|
0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45,
|
||||||
0x6f, 0x50, 0x01, 0x5a, 0x27, 0x67, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65,
|
0x10, 0x0e, 0x12, 0x24, 0x0a, 0x20, 0x44, 0x45, 0x50, 0x52, 0x45, 0x43, 0x41, 0x54, 0x45, 0x44,
|
||||||
0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x69, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6f,
|
0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x44, 0x41, 0x54,
|
||||||
0x74, 0x6c, 0x70, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72,
|
0x41, 0x5f, 0x4c, 0x4f, 0x53, 0x53, 0x10, 0x0f, 0x12, 0x2a, 0x0a, 0x26, 0x44, 0x45, 0x50, 0x52,
|
||||||
0x6f, 0x74, 0x6f, 0x33,
|
0x45, 0x43, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f,
|
||||||
|
0x44, 0x45, 0x5f, 0x55, 0x4e, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4e, 0x54, 0x49, 0x43, 0x41, 0x54,
|
||||||
|
0x45, 0x44, 0x10, 0x10, 0x22, 0x4e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f,
|
||||||
|
0x64, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44,
|
||||||
|
0x45, 0x5f, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41,
|
||||||
|
0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x15, 0x0a,
|
||||||
|
0x11, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x45, 0x52, 0x52,
|
||||||
|
0x4f, 0x52, 0x10, 0x02, 0x42, 0x58, 0x0a, 0x1f, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74,
|
||||||
|
0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x74,
|
||||||
|
0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x54, 0x72, 0x61, 0x63, 0x65, 0x50, 0x72,
|
||||||
|
0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x27, 0x67, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x65,
|
||||||
|
0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x69, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
||||||
|
0x2f, 0x6f, 0x74, 0x6c, 0x70, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2f, 0x76, 0x31, 0x62, 0x06,
|
||||||
|
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -1093,40 +1161,42 @@ func file_opentelemetry_proto_trace_v1_trace_proto_rawDescGZIP() []byte {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var file_opentelemetry_proto_trace_v1_trace_proto_enumTypes = make([]protoimpl.EnumInfo, 3)
|
var file_opentelemetry_proto_trace_v1_trace_proto_enumTypes = make([]protoimpl.EnumInfo, 3)
|
||||||
var file_opentelemetry_proto_trace_v1_trace_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
|
var file_opentelemetry_proto_trace_v1_trace_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
|
||||||
var file_opentelemetry_proto_trace_v1_trace_proto_goTypes = []interface{}{
|
var file_opentelemetry_proto_trace_v1_trace_proto_goTypes = []interface{}{
|
||||||
(Span_SpanKind)(0), // 0: opentelemetry.proto.trace.v1.Span.SpanKind
|
(Span_SpanKind)(0), // 0: opentelemetry.proto.trace.v1.Span.SpanKind
|
||||||
(Status_DeprecatedStatusCode)(0), // 1: opentelemetry.proto.trace.v1.Status.DeprecatedStatusCode
|
(Status_DeprecatedStatusCode)(0), // 1: opentelemetry.proto.trace.v1.Status.DeprecatedStatusCode
|
||||||
(Status_StatusCode)(0), // 2: opentelemetry.proto.trace.v1.Status.StatusCode
|
(Status_StatusCode)(0), // 2: opentelemetry.proto.trace.v1.Status.StatusCode
|
||||||
(*ResourceSpans)(nil), // 3: opentelemetry.proto.trace.v1.ResourceSpans
|
(*TracesData)(nil), // 3: opentelemetry.proto.trace.v1.TracesData
|
||||||
(*InstrumentationLibrarySpans)(nil), // 4: opentelemetry.proto.trace.v1.InstrumentationLibrarySpans
|
(*ResourceSpans)(nil), // 4: opentelemetry.proto.trace.v1.ResourceSpans
|
||||||
(*Span)(nil), // 5: opentelemetry.proto.trace.v1.Span
|
(*InstrumentationLibrarySpans)(nil), // 5: opentelemetry.proto.trace.v1.InstrumentationLibrarySpans
|
||||||
(*Status)(nil), // 6: opentelemetry.proto.trace.v1.Status
|
(*Span)(nil), // 6: opentelemetry.proto.trace.v1.Span
|
||||||
(*Span_Event)(nil), // 7: opentelemetry.proto.trace.v1.Span.Event
|
(*Status)(nil), // 7: opentelemetry.proto.trace.v1.Status
|
||||||
(*Span_Link)(nil), // 8: opentelemetry.proto.trace.v1.Span.Link
|
(*Span_Event)(nil), // 8: opentelemetry.proto.trace.v1.Span.Event
|
||||||
(*v1.Resource)(nil), // 9: opentelemetry.proto.resource.v1.Resource
|
(*Span_Link)(nil), // 9: opentelemetry.proto.trace.v1.Span.Link
|
||||||
(*v11.InstrumentationLibrary)(nil), // 10: opentelemetry.proto.common.v1.InstrumentationLibrary
|
(*v1.Resource)(nil), // 10: opentelemetry.proto.resource.v1.Resource
|
||||||
(*v11.KeyValue)(nil), // 11: opentelemetry.proto.common.v1.KeyValue
|
(*v11.InstrumentationLibrary)(nil), // 11: opentelemetry.proto.common.v1.InstrumentationLibrary
|
||||||
|
(*v11.KeyValue)(nil), // 12: opentelemetry.proto.common.v1.KeyValue
|
||||||
}
|
}
|
||||||
var file_opentelemetry_proto_trace_v1_trace_proto_depIdxs = []int32{
|
var file_opentelemetry_proto_trace_v1_trace_proto_depIdxs = []int32{
|
||||||
9, // 0: opentelemetry.proto.trace.v1.ResourceSpans.resource:type_name -> opentelemetry.proto.resource.v1.Resource
|
4, // 0: opentelemetry.proto.trace.v1.TracesData.resource_spans:type_name -> opentelemetry.proto.trace.v1.ResourceSpans
|
||||||
4, // 1: opentelemetry.proto.trace.v1.ResourceSpans.instrumentation_library_spans:type_name -> opentelemetry.proto.trace.v1.InstrumentationLibrarySpans
|
10, // 1: opentelemetry.proto.trace.v1.ResourceSpans.resource:type_name -> opentelemetry.proto.resource.v1.Resource
|
||||||
10, // 2: opentelemetry.proto.trace.v1.InstrumentationLibrarySpans.instrumentation_library:type_name -> opentelemetry.proto.common.v1.InstrumentationLibrary
|
5, // 2: opentelemetry.proto.trace.v1.ResourceSpans.instrumentation_library_spans:type_name -> opentelemetry.proto.trace.v1.InstrumentationLibrarySpans
|
||||||
5, // 3: opentelemetry.proto.trace.v1.InstrumentationLibrarySpans.spans:type_name -> opentelemetry.proto.trace.v1.Span
|
11, // 3: opentelemetry.proto.trace.v1.InstrumentationLibrarySpans.instrumentation_library:type_name -> opentelemetry.proto.common.v1.InstrumentationLibrary
|
||||||
0, // 4: opentelemetry.proto.trace.v1.Span.kind:type_name -> opentelemetry.proto.trace.v1.Span.SpanKind
|
6, // 4: opentelemetry.proto.trace.v1.InstrumentationLibrarySpans.spans:type_name -> opentelemetry.proto.trace.v1.Span
|
||||||
11, // 5: opentelemetry.proto.trace.v1.Span.attributes:type_name -> opentelemetry.proto.common.v1.KeyValue
|
0, // 5: opentelemetry.proto.trace.v1.Span.kind:type_name -> opentelemetry.proto.trace.v1.Span.SpanKind
|
||||||
7, // 6: opentelemetry.proto.trace.v1.Span.events:type_name -> opentelemetry.proto.trace.v1.Span.Event
|
12, // 6: opentelemetry.proto.trace.v1.Span.attributes:type_name -> opentelemetry.proto.common.v1.KeyValue
|
||||||
8, // 7: opentelemetry.proto.trace.v1.Span.links:type_name -> opentelemetry.proto.trace.v1.Span.Link
|
8, // 7: opentelemetry.proto.trace.v1.Span.events:type_name -> opentelemetry.proto.trace.v1.Span.Event
|
||||||
6, // 8: opentelemetry.proto.trace.v1.Span.status:type_name -> opentelemetry.proto.trace.v1.Status
|
9, // 8: opentelemetry.proto.trace.v1.Span.links:type_name -> opentelemetry.proto.trace.v1.Span.Link
|
||||||
1, // 9: opentelemetry.proto.trace.v1.Status.deprecated_code:type_name -> opentelemetry.proto.trace.v1.Status.DeprecatedStatusCode
|
7, // 9: opentelemetry.proto.trace.v1.Span.status:type_name -> opentelemetry.proto.trace.v1.Status
|
||||||
2, // 10: opentelemetry.proto.trace.v1.Status.code:type_name -> opentelemetry.proto.trace.v1.Status.StatusCode
|
1, // 10: opentelemetry.proto.trace.v1.Status.deprecated_code:type_name -> opentelemetry.proto.trace.v1.Status.DeprecatedStatusCode
|
||||||
11, // 11: opentelemetry.proto.trace.v1.Span.Event.attributes:type_name -> opentelemetry.proto.common.v1.KeyValue
|
2, // 11: opentelemetry.proto.trace.v1.Status.code:type_name -> opentelemetry.proto.trace.v1.Status.StatusCode
|
||||||
11, // 12: opentelemetry.proto.trace.v1.Span.Link.attributes:type_name -> opentelemetry.proto.common.v1.KeyValue
|
12, // 12: opentelemetry.proto.trace.v1.Span.Event.attributes:type_name -> opentelemetry.proto.common.v1.KeyValue
|
||||||
13, // [13:13] is the sub-list for method output_type
|
12, // 13: opentelemetry.proto.trace.v1.Span.Link.attributes:type_name -> opentelemetry.proto.common.v1.KeyValue
|
||||||
13, // [13:13] is the sub-list for method input_type
|
14, // [14:14] is the sub-list for method output_type
|
||||||
13, // [13:13] is the sub-list for extension type_name
|
14, // [14:14] is the sub-list for method input_type
|
||||||
13, // [13:13] is the sub-list for extension extendee
|
14, // [14:14] is the sub-list for extension type_name
|
||||||
0, // [0:13] is the sub-list for field type_name
|
14, // [14:14] is the sub-list for extension extendee
|
||||||
|
0, // [0:14] is the sub-list for field type_name
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() { file_opentelemetry_proto_trace_v1_trace_proto_init() }
|
func init() { file_opentelemetry_proto_trace_v1_trace_proto_init() }
|
||||||
@ -1136,7 +1206,7 @@ func file_opentelemetry_proto_trace_v1_trace_proto_init() {
|
|||||||
}
|
}
|
||||||
if !protoimpl.UnsafeEnabled {
|
if !protoimpl.UnsafeEnabled {
|
||||||
file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||||
switch v := v.(*ResourceSpans); i {
|
switch v := v.(*TracesData); i {
|
||||||
case 0:
|
case 0:
|
||||||
return &v.state
|
return &v.state
|
||||||
case 1:
|
case 1:
|
||||||
@ -1148,7 +1218,7 @@ func file_opentelemetry_proto_trace_v1_trace_proto_init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
|
file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
|
||||||
switch v := v.(*InstrumentationLibrarySpans); i {
|
switch v := v.(*ResourceSpans); i {
|
||||||
case 0:
|
case 0:
|
||||||
return &v.state
|
return &v.state
|
||||||
case 1:
|
case 1:
|
||||||
@ -1160,7 +1230,7 @@ func file_opentelemetry_proto_trace_v1_trace_proto_init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
|
file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
|
||||||
switch v := v.(*Span); i {
|
switch v := v.(*InstrumentationLibrarySpans); i {
|
||||||
case 0:
|
case 0:
|
||||||
return &v.state
|
return &v.state
|
||||||
case 1:
|
case 1:
|
||||||
@ -1172,7 +1242,7 @@ func file_opentelemetry_proto_trace_v1_trace_proto_init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
|
file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
|
||||||
switch v := v.(*Status); i {
|
switch v := v.(*Span); i {
|
||||||
case 0:
|
case 0:
|
||||||
return &v.state
|
return &v.state
|
||||||
case 1:
|
case 1:
|
||||||
@ -1184,7 +1254,7 @@ func file_opentelemetry_proto_trace_v1_trace_proto_init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
|
file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
|
||||||
switch v := v.(*Span_Event); i {
|
switch v := v.(*Status); i {
|
||||||
case 0:
|
case 0:
|
||||||
return &v.state
|
return &v.state
|
||||||
case 1:
|
case 1:
|
||||||
@ -1196,6 +1266,18 @@ func file_opentelemetry_proto_trace_v1_trace_proto_init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
|
file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*Span_Event); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_opentelemetry_proto_trace_v1_trace_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
|
||||||
switch v := v.(*Span_Link); i {
|
switch v := v.(*Span_Link); i {
|
||||||
case 0:
|
case 0:
|
||||||
return &v.state
|
return &v.state
|
||||||
@ -1214,7 +1296,7 @@ func file_opentelemetry_proto_trace_v1_trace_proto_init() {
|
|||||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||||
RawDescriptor: file_opentelemetry_proto_trace_v1_trace_proto_rawDesc,
|
RawDescriptor: file_opentelemetry_proto_trace_v1_trace_proto_rawDesc,
|
||||||
NumEnums: 3,
|
NumEnums: 3,
|
||||||
NumMessages: 6,
|
NumMessages: 7,
|
||||||
NumExtensions: 0,
|
NumExtensions: 0,
|
||||||
NumServices: 0,
|
NumServices: 0,
|
||||||
},
|
},
|
||||||
|
47
vendor/golang.org/x/net/http2/client_conn_pool.go
generated
vendored
47
vendor/golang.org/x/net/http2/client_conn_pool.go
generated
vendored
@ -16,6 +16,12 @@ import (
|
|||||||
|
|
||||||
// ClientConnPool manages a pool of HTTP/2 client connections.
|
// ClientConnPool manages a pool of HTTP/2 client connections.
|
||||||
type ClientConnPool interface {
|
type ClientConnPool interface {
|
||||||
|
// GetClientConn returns a specific HTTP/2 connection (usually
|
||||||
|
// a TLS-TCP connection) to an HTTP/2 server. On success, the
|
||||||
|
// returned ClientConn accounts for the upcoming RoundTrip
|
||||||
|
// call, so the caller should not omit it. If the caller needs
|
||||||
|
// to, ClientConn.RoundTrip can be called with a bogus
|
||||||
|
// new(http.Request) to release the stream reservation.
|
||||||
GetClientConn(req *http.Request, addr string) (*ClientConn, error)
|
GetClientConn(req *http.Request, addr string) (*ClientConn, error)
|
||||||
MarkDead(*ClientConn)
|
MarkDead(*ClientConn)
|
||||||
}
|
}
|
||||||
@ -42,7 +48,7 @@ type clientConnPool struct {
|
|||||||
conns map[string][]*ClientConn // key is host:port
|
conns map[string][]*ClientConn // key is host:port
|
||||||
dialing map[string]*dialCall // currently in-flight dials
|
dialing map[string]*dialCall // currently in-flight dials
|
||||||
keys map[*ClientConn][]string
|
keys map[*ClientConn][]string
|
||||||
addConnCalls map[string]*addConnCall // in-flight addConnIfNeede calls
|
addConnCalls map[string]*addConnCall // in-flight addConnIfNeeded calls
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *clientConnPool) GetClientConn(req *http.Request, addr string) (*ClientConn, error) {
|
func (p *clientConnPool) GetClientConn(req *http.Request, addr string) (*ClientConn, error) {
|
||||||
@ -54,28 +60,8 @@ const (
|
|||||||
noDialOnMiss = false
|
noDialOnMiss = false
|
||||||
)
|
)
|
||||||
|
|
||||||
// shouldTraceGetConn reports whether getClientConn should call any
|
|
||||||
// ClientTrace.GetConn hook associated with the http.Request.
|
|
||||||
//
|
|
||||||
// This complexity is needed to avoid double calls of the GetConn hook
|
|
||||||
// during the back-and-forth between net/http and x/net/http2 (when the
|
|
||||||
// net/http.Transport is upgraded to also speak http2), as well as support
|
|
||||||
// the case where x/net/http2 is being used directly.
|
|
||||||
func (p *clientConnPool) shouldTraceGetConn(st clientConnIdleState) bool {
|
|
||||||
// If our Transport wasn't made via ConfigureTransport, always
|
|
||||||
// trace the GetConn hook if provided, because that means the
|
|
||||||
// http2 package is being used directly and it's the one
|
|
||||||
// dialing, as opposed to net/http.
|
|
||||||
if _, ok := p.t.ConnPool.(noDialClientConnPool); !ok {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
// Otherwise, only use the GetConn hook if this connection has
|
|
||||||
// been used previously for other requests. For fresh
|
|
||||||
// connections, the net/http package does the dialing.
|
|
||||||
return !st.freshConn
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMiss bool) (*ClientConn, error) {
|
func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMiss bool) (*ClientConn, error) {
|
||||||
|
// TODO(dneil): Dial a new connection when t.DisableKeepAlives is set?
|
||||||
if isConnectionCloseRequest(req) && dialOnMiss {
|
if isConnectionCloseRequest(req) && dialOnMiss {
|
||||||
// It gets its own connection.
|
// It gets its own connection.
|
||||||
traceGetConn(req, addr)
|
traceGetConn(req, addr)
|
||||||
@ -89,10 +75,14 @@ func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMis
|
|||||||
for {
|
for {
|
||||||
p.mu.Lock()
|
p.mu.Lock()
|
||||||
for _, cc := range p.conns[addr] {
|
for _, cc := range p.conns[addr] {
|
||||||
if st := cc.idleState(); st.canTakeNewRequest {
|
if cc.ReserveNewRequest() {
|
||||||
if p.shouldTraceGetConn(st) {
|
// When a connection is presented to us by the net/http package,
|
||||||
|
// the GetConn hook has already been called.
|
||||||
|
// Don't call it a second time here.
|
||||||
|
if !cc.getConnCalled {
|
||||||
traceGetConn(req, addr)
|
traceGetConn(req, addr)
|
||||||
}
|
}
|
||||||
|
cc.getConnCalled = false
|
||||||
p.mu.Unlock()
|
p.mu.Unlock()
|
||||||
return cc, nil
|
return cc, nil
|
||||||
}
|
}
|
||||||
@ -108,7 +98,13 @@ func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMis
|
|||||||
if shouldRetryDial(call, req) {
|
if shouldRetryDial(call, req) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
return call.res, call.err
|
cc, err := call.res, call.err
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if cc.ReserveNewRequest() {
|
||||||
|
return cc, nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,6 +201,7 @@ func (c *addConnCall) run(t *Transport, key string, tc *tls.Conn) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
c.err = err
|
c.err = err
|
||||||
} else {
|
} else {
|
||||||
|
cc.getConnCalled = true // already called by the net/http package
|
||||||
p.addConnLocked(key, cc)
|
p.addConnLocked(key, cc)
|
||||||
}
|
}
|
||||||
delete(p.addConnCalls, key)
|
delete(p.addConnCalls, key)
|
||||||
|
12
vendor/golang.org/x/net/http2/errors.go
generated
vendored
12
vendor/golang.org/x/net/http2/errors.go
generated
vendored
@ -53,6 +53,13 @@ func (e ErrCode) String() string {
|
|||||||
return fmt.Sprintf("unknown error code 0x%x", uint32(e))
|
return fmt.Sprintf("unknown error code 0x%x", uint32(e))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e ErrCode) stringToken() string {
|
||||||
|
if s, ok := errCodeName[e]; ok {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("ERR_UNKNOWN_%d", uint32(e))
|
||||||
|
}
|
||||||
|
|
||||||
// ConnectionError is an error that results in the termination of the
|
// ConnectionError is an error that results in the termination of the
|
||||||
// entire connection.
|
// entire connection.
|
||||||
type ConnectionError ErrCode
|
type ConnectionError ErrCode
|
||||||
@ -67,6 +74,11 @@ type StreamError struct {
|
|||||||
Cause error // optional additional detail
|
Cause error // optional additional detail
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// errFromPeer is a sentinel error value for StreamError.Cause to
|
||||||
|
// indicate that the StreamError was sent from the peer over the wire
|
||||||
|
// and wasn't locally generated in the Transport.
|
||||||
|
var errFromPeer = errors.New("received from peer")
|
||||||
|
|
||||||
func streamError(id uint32, code ErrCode) StreamError {
|
func streamError(id uint32, code ErrCode) StreamError {
|
||||||
return StreamError{StreamID: id, Code: code}
|
return StreamError{StreamID: id, Code: code}
|
||||||
}
|
}
|
||||||
|
62
vendor/golang.org/x/net/http2/frame.go
generated
vendored
62
vendor/golang.org/x/net/http2/frame.go
generated
vendored
@ -122,7 +122,7 @@ var flagName = map[FrameType]map[Flags]string{
|
|||||||
// a frameParser parses a frame given its FrameHeader and payload
|
// a frameParser parses a frame given its FrameHeader and payload
|
||||||
// bytes. The length of payload will always equal fh.Length (which
|
// bytes. The length of payload will always equal fh.Length (which
|
||||||
// might be 0).
|
// might be 0).
|
||||||
type frameParser func(fc *frameCache, fh FrameHeader, payload []byte) (Frame, error)
|
type frameParser func(fc *frameCache, fh FrameHeader, countError func(string), payload []byte) (Frame, error)
|
||||||
|
|
||||||
var frameParsers = map[FrameType]frameParser{
|
var frameParsers = map[FrameType]frameParser{
|
||||||
FrameData: parseDataFrame,
|
FrameData: parseDataFrame,
|
||||||
@ -267,6 +267,11 @@ type Framer struct {
|
|||||||
lastFrame Frame
|
lastFrame Frame
|
||||||
errDetail error
|
errDetail error
|
||||||
|
|
||||||
|
// countError is a non-nil func that's called on a frame parse
|
||||||
|
// error with some unique error path token. It's initialized
|
||||||
|
// from Transport.CountError or Server.CountError.
|
||||||
|
countError func(errToken string)
|
||||||
|
|
||||||
// lastHeaderStream is non-zero if the last frame was an
|
// lastHeaderStream is non-zero if the last frame was an
|
||||||
// unfinished HEADERS/CONTINUATION.
|
// unfinished HEADERS/CONTINUATION.
|
||||||
lastHeaderStream uint32
|
lastHeaderStream uint32
|
||||||
@ -426,6 +431,7 @@ func NewFramer(w io.Writer, r io.Reader) *Framer {
|
|||||||
fr := &Framer{
|
fr := &Framer{
|
||||||
w: w,
|
w: w,
|
||||||
r: r,
|
r: r,
|
||||||
|
countError: func(string) {},
|
||||||
logReads: logFrameReads,
|
logReads: logFrameReads,
|
||||||
logWrites: logFrameWrites,
|
logWrites: logFrameWrites,
|
||||||
debugReadLoggerf: log.Printf,
|
debugReadLoggerf: log.Printf,
|
||||||
@ -500,7 +506,7 @@ func (fr *Framer) ReadFrame() (Frame, error) {
|
|||||||
if _, err := io.ReadFull(fr.r, payload); err != nil {
|
if _, err := io.ReadFull(fr.r, payload); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
f, err := typeFrameParser(fh.Type)(fr.frameCache, fh, payload)
|
f, err := typeFrameParser(fh.Type)(fr.frameCache, fh, fr.countError, payload)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if ce, ok := err.(connError); ok {
|
if ce, ok := err.(connError); ok {
|
||||||
return nil, fr.connError(ce.Code, ce.Reason)
|
return nil, fr.connError(ce.Code, ce.Reason)
|
||||||
@ -588,13 +594,14 @@ func (f *DataFrame) Data() []byte {
|
|||||||
return f.data
|
return f.data
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseDataFrame(fc *frameCache, fh FrameHeader, payload []byte) (Frame, error) {
|
func parseDataFrame(fc *frameCache, fh FrameHeader, countError func(string), payload []byte) (Frame, error) {
|
||||||
if fh.StreamID == 0 {
|
if fh.StreamID == 0 {
|
||||||
// DATA frames MUST be associated with a stream. If a
|
// DATA frames MUST be associated with a stream. If a
|
||||||
// DATA frame is received whose stream identifier
|
// DATA frame is received whose stream identifier
|
||||||
// field is 0x0, the recipient MUST respond with a
|
// field is 0x0, the recipient MUST respond with a
|
||||||
// connection error (Section 5.4.1) of type
|
// connection error (Section 5.4.1) of type
|
||||||
// PROTOCOL_ERROR.
|
// PROTOCOL_ERROR.
|
||||||
|
countError("frame_data_stream_0")
|
||||||
return nil, connError{ErrCodeProtocol, "DATA frame with stream ID 0"}
|
return nil, connError{ErrCodeProtocol, "DATA frame with stream ID 0"}
|
||||||
}
|
}
|
||||||
f := fc.getDataFrame()
|
f := fc.getDataFrame()
|
||||||
@ -605,6 +612,7 @@ func parseDataFrame(fc *frameCache, fh FrameHeader, payload []byte) (Frame, erro
|
|||||||
var err error
|
var err error
|
||||||
payload, padSize, err = readByte(payload)
|
payload, padSize, err = readByte(payload)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
countError("frame_data_pad_byte_short")
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -613,6 +621,7 @@ func parseDataFrame(fc *frameCache, fh FrameHeader, payload []byte) (Frame, erro
|
|||||||
// length of the frame payload, the recipient MUST
|
// length of the frame payload, the recipient MUST
|
||||||
// treat this as a connection error.
|
// treat this as a connection error.
|
||||||
// Filed: https://github.com/http2/http2-spec/issues/610
|
// Filed: https://github.com/http2/http2-spec/issues/610
|
||||||
|
countError("frame_data_pad_too_big")
|
||||||
return nil, connError{ErrCodeProtocol, "pad size larger than data payload"}
|
return nil, connError{ErrCodeProtocol, "pad size larger than data payload"}
|
||||||
}
|
}
|
||||||
f.data = payload[:len(payload)-int(padSize)]
|
f.data = payload[:len(payload)-int(padSize)]
|
||||||
@ -695,7 +704,7 @@ type SettingsFrame struct {
|
|||||||
p []byte
|
p []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseSettingsFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) {
|
func parseSettingsFrame(_ *frameCache, fh FrameHeader, countError func(string), p []byte) (Frame, error) {
|
||||||
if fh.Flags.Has(FlagSettingsAck) && fh.Length > 0 {
|
if fh.Flags.Has(FlagSettingsAck) && fh.Length > 0 {
|
||||||
// When this (ACK 0x1) bit is set, the payload of the
|
// When this (ACK 0x1) bit is set, the payload of the
|
||||||
// SETTINGS frame MUST be empty. Receipt of a
|
// SETTINGS frame MUST be empty. Receipt of a
|
||||||
@ -703,6 +712,7 @@ func parseSettingsFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error)
|
|||||||
// field value other than 0 MUST be treated as a
|
// field value other than 0 MUST be treated as a
|
||||||
// connection error (Section 5.4.1) of type
|
// connection error (Section 5.4.1) of type
|
||||||
// FRAME_SIZE_ERROR.
|
// FRAME_SIZE_ERROR.
|
||||||
|
countError("frame_settings_ack_with_length")
|
||||||
return nil, ConnectionError(ErrCodeFrameSize)
|
return nil, ConnectionError(ErrCodeFrameSize)
|
||||||
}
|
}
|
||||||
if fh.StreamID != 0 {
|
if fh.StreamID != 0 {
|
||||||
@ -713,14 +723,17 @@ func parseSettingsFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error)
|
|||||||
// field is anything other than 0x0, the endpoint MUST
|
// field is anything other than 0x0, the endpoint MUST
|
||||||
// respond with a connection error (Section 5.4.1) of
|
// respond with a connection error (Section 5.4.1) of
|
||||||
// type PROTOCOL_ERROR.
|
// type PROTOCOL_ERROR.
|
||||||
|
countError("frame_settings_has_stream")
|
||||||
return nil, ConnectionError(ErrCodeProtocol)
|
return nil, ConnectionError(ErrCodeProtocol)
|
||||||
}
|
}
|
||||||
if len(p)%6 != 0 {
|
if len(p)%6 != 0 {
|
||||||
|
countError("frame_settings_mod_6")
|
||||||
// Expecting even number of 6 byte settings.
|
// Expecting even number of 6 byte settings.
|
||||||
return nil, ConnectionError(ErrCodeFrameSize)
|
return nil, ConnectionError(ErrCodeFrameSize)
|
||||||
}
|
}
|
||||||
f := &SettingsFrame{FrameHeader: fh, p: p}
|
f := &SettingsFrame{FrameHeader: fh, p: p}
|
||||||
if v, ok := f.Value(SettingInitialWindowSize); ok && v > (1<<31)-1 {
|
if v, ok := f.Value(SettingInitialWindowSize); ok && v > (1<<31)-1 {
|
||||||
|
countError("frame_settings_window_size_too_big")
|
||||||
// Values above the maximum flow control window size of 2^31 - 1 MUST
|
// Values above the maximum flow control window size of 2^31 - 1 MUST
|
||||||
// be treated as a connection error (Section 5.4.1) of type
|
// be treated as a connection error (Section 5.4.1) of type
|
||||||
// FLOW_CONTROL_ERROR.
|
// FLOW_CONTROL_ERROR.
|
||||||
@ -832,11 +845,13 @@ type PingFrame struct {
|
|||||||
|
|
||||||
func (f *PingFrame) IsAck() bool { return f.Flags.Has(FlagPingAck) }
|
func (f *PingFrame) IsAck() bool { return f.Flags.Has(FlagPingAck) }
|
||||||
|
|
||||||
func parsePingFrame(_ *frameCache, fh FrameHeader, payload []byte) (Frame, error) {
|
func parsePingFrame(_ *frameCache, fh FrameHeader, countError func(string), payload []byte) (Frame, error) {
|
||||||
if len(payload) != 8 {
|
if len(payload) != 8 {
|
||||||
|
countError("frame_ping_length")
|
||||||
return nil, ConnectionError(ErrCodeFrameSize)
|
return nil, ConnectionError(ErrCodeFrameSize)
|
||||||
}
|
}
|
||||||
if fh.StreamID != 0 {
|
if fh.StreamID != 0 {
|
||||||
|
countError("frame_ping_has_stream")
|
||||||
return nil, ConnectionError(ErrCodeProtocol)
|
return nil, ConnectionError(ErrCodeProtocol)
|
||||||
}
|
}
|
||||||
f := &PingFrame{FrameHeader: fh}
|
f := &PingFrame{FrameHeader: fh}
|
||||||
@ -872,11 +887,13 @@ func (f *GoAwayFrame) DebugData() []byte {
|
|||||||
return f.debugData
|
return f.debugData
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseGoAwayFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) {
|
func parseGoAwayFrame(_ *frameCache, fh FrameHeader, countError func(string), p []byte) (Frame, error) {
|
||||||
if fh.StreamID != 0 {
|
if fh.StreamID != 0 {
|
||||||
|
countError("frame_goaway_has_stream")
|
||||||
return nil, ConnectionError(ErrCodeProtocol)
|
return nil, ConnectionError(ErrCodeProtocol)
|
||||||
}
|
}
|
||||||
if len(p) < 8 {
|
if len(p) < 8 {
|
||||||
|
countError("frame_goaway_short")
|
||||||
return nil, ConnectionError(ErrCodeFrameSize)
|
return nil, ConnectionError(ErrCodeFrameSize)
|
||||||
}
|
}
|
||||||
return &GoAwayFrame{
|
return &GoAwayFrame{
|
||||||
@ -912,7 +929,7 @@ func (f *UnknownFrame) Payload() []byte {
|
|||||||
return f.p
|
return f.p
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseUnknownFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) {
|
func parseUnknownFrame(_ *frameCache, fh FrameHeader, countError func(string), p []byte) (Frame, error) {
|
||||||
return &UnknownFrame{fh, p}, nil
|
return &UnknownFrame{fh, p}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -923,8 +940,9 @@ type WindowUpdateFrame struct {
|
|||||||
Increment uint32 // never read with high bit set
|
Increment uint32 // never read with high bit set
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseWindowUpdateFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) {
|
func parseWindowUpdateFrame(_ *frameCache, fh FrameHeader, countError func(string), p []byte) (Frame, error) {
|
||||||
if len(p) != 4 {
|
if len(p) != 4 {
|
||||||
|
countError("frame_windowupdate_bad_len")
|
||||||
return nil, ConnectionError(ErrCodeFrameSize)
|
return nil, ConnectionError(ErrCodeFrameSize)
|
||||||
}
|
}
|
||||||
inc := binary.BigEndian.Uint32(p[:4]) & 0x7fffffff // mask off high reserved bit
|
inc := binary.BigEndian.Uint32(p[:4]) & 0x7fffffff // mask off high reserved bit
|
||||||
@ -936,8 +954,10 @@ func parseWindowUpdateFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, err
|
|||||||
// control window MUST be treated as a connection
|
// control window MUST be treated as a connection
|
||||||
// error (Section 5.4.1).
|
// error (Section 5.4.1).
|
||||||
if fh.StreamID == 0 {
|
if fh.StreamID == 0 {
|
||||||
|
countError("frame_windowupdate_zero_inc_conn")
|
||||||
return nil, ConnectionError(ErrCodeProtocol)
|
return nil, ConnectionError(ErrCodeProtocol)
|
||||||
}
|
}
|
||||||
|
countError("frame_windowupdate_zero_inc_stream")
|
||||||
return nil, streamError(fh.StreamID, ErrCodeProtocol)
|
return nil, streamError(fh.StreamID, ErrCodeProtocol)
|
||||||
}
|
}
|
||||||
return &WindowUpdateFrame{
|
return &WindowUpdateFrame{
|
||||||
@ -988,7 +1008,7 @@ func (f *HeadersFrame) HasPriority() bool {
|
|||||||
return f.FrameHeader.Flags.Has(FlagHeadersPriority)
|
return f.FrameHeader.Flags.Has(FlagHeadersPriority)
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseHeadersFrame(_ *frameCache, fh FrameHeader, p []byte) (_ Frame, err error) {
|
func parseHeadersFrame(_ *frameCache, fh FrameHeader, countError func(string), p []byte) (_ Frame, err error) {
|
||||||
hf := &HeadersFrame{
|
hf := &HeadersFrame{
|
||||||
FrameHeader: fh,
|
FrameHeader: fh,
|
||||||
}
|
}
|
||||||
@ -997,11 +1017,13 @@ func parseHeadersFrame(_ *frameCache, fh FrameHeader, p []byte) (_ Frame, err er
|
|||||||
// is received whose stream identifier field is 0x0, the recipient MUST
|
// is received whose stream identifier field is 0x0, the recipient MUST
|
||||||
// respond with a connection error (Section 5.4.1) of type
|
// respond with a connection error (Section 5.4.1) of type
|
||||||
// PROTOCOL_ERROR.
|
// PROTOCOL_ERROR.
|
||||||
|
countError("frame_headers_zero_stream")
|
||||||
return nil, connError{ErrCodeProtocol, "HEADERS frame with stream ID 0"}
|
return nil, connError{ErrCodeProtocol, "HEADERS frame with stream ID 0"}
|
||||||
}
|
}
|
||||||
var padLength uint8
|
var padLength uint8
|
||||||
if fh.Flags.Has(FlagHeadersPadded) {
|
if fh.Flags.Has(FlagHeadersPadded) {
|
||||||
if p, padLength, err = readByte(p); err != nil {
|
if p, padLength, err = readByte(p); err != nil {
|
||||||
|
countError("frame_headers_pad_short")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1009,16 +1031,19 @@ func parseHeadersFrame(_ *frameCache, fh FrameHeader, p []byte) (_ Frame, err er
|
|||||||
var v uint32
|
var v uint32
|
||||||
p, v, err = readUint32(p)
|
p, v, err = readUint32(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
countError("frame_headers_prio_short")
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
hf.Priority.StreamDep = v & 0x7fffffff
|
hf.Priority.StreamDep = v & 0x7fffffff
|
||||||
hf.Priority.Exclusive = (v != hf.Priority.StreamDep) // high bit was set
|
hf.Priority.Exclusive = (v != hf.Priority.StreamDep) // high bit was set
|
||||||
p, hf.Priority.Weight, err = readByte(p)
|
p, hf.Priority.Weight, err = readByte(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
countError("frame_headers_prio_weight_short")
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(p)-int(padLength) <= 0 {
|
if len(p)-int(padLength) < 0 {
|
||||||
|
countError("frame_headers_pad_too_big")
|
||||||
return nil, streamError(fh.StreamID, ErrCodeProtocol)
|
return nil, streamError(fh.StreamID, ErrCodeProtocol)
|
||||||
}
|
}
|
||||||
hf.headerFragBuf = p[:len(p)-int(padLength)]
|
hf.headerFragBuf = p[:len(p)-int(padLength)]
|
||||||
@ -1125,11 +1150,13 @@ func (p PriorityParam) IsZero() bool {
|
|||||||
return p == PriorityParam{}
|
return p == PriorityParam{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func parsePriorityFrame(_ *frameCache, fh FrameHeader, payload []byte) (Frame, error) {
|
func parsePriorityFrame(_ *frameCache, fh FrameHeader, countError func(string), payload []byte) (Frame, error) {
|
||||||
if fh.StreamID == 0 {
|
if fh.StreamID == 0 {
|
||||||
|
countError("frame_priority_zero_stream")
|
||||||
return nil, connError{ErrCodeProtocol, "PRIORITY frame with stream ID 0"}
|
return nil, connError{ErrCodeProtocol, "PRIORITY frame with stream ID 0"}
|
||||||
}
|
}
|
||||||
if len(payload) != 5 {
|
if len(payload) != 5 {
|
||||||
|
countError("frame_priority_bad_length")
|
||||||
return nil, connError{ErrCodeFrameSize, fmt.Sprintf("PRIORITY frame payload size was %d; want 5", len(payload))}
|
return nil, connError{ErrCodeFrameSize, fmt.Sprintf("PRIORITY frame payload size was %d; want 5", len(payload))}
|
||||||
}
|
}
|
||||||
v := binary.BigEndian.Uint32(payload[:4])
|
v := binary.BigEndian.Uint32(payload[:4])
|
||||||
@ -1172,11 +1199,13 @@ type RSTStreamFrame struct {
|
|||||||
ErrCode ErrCode
|
ErrCode ErrCode
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseRSTStreamFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) {
|
func parseRSTStreamFrame(_ *frameCache, fh FrameHeader, countError func(string), p []byte) (Frame, error) {
|
||||||
if len(p) != 4 {
|
if len(p) != 4 {
|
||||||
|
countError("frame_rststream_bad_len")
|
||||||
return nil, ConnectionError(ErrCodeFrameSize)
|
return nil, ConnectionError(ErrCodeFrameSize)
|
||||||
}
|
}
|
||||||
if fh.StreamID == 0 {
|
if fh.StreamID == 0 {
|
||||||
|
countError("frame_rststream_zero_stream")
|
||||||
return nil, ConnectionError(ErrCodeProtocol)
|
return nil, ConnectionError(ErrCodeProtocol)
|
||||||
}
|
}
|
||||||
return &RSTStreamFrame{fh, ErrCode(binary.BigEndian.Uint32(p[:4]))}, nil
|
return &RSTStreamFrame{fh, ErrCode(binary.BigEndian.Uint32(p[:4]))}, nil
|
||||||
@ -1202,8 +1231,9 @@ type ContinuationFrame struct {
|
|||||||
headerFragBuf []byte
|
headerFragBuf []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseContinuationFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) {
|
func parseContinuationFrame(_ *frameCache, fh FrameHeader, countError func(string), p []byte) (Frame, error) {
|
||||||
if fh.StreamID == 0 {
|
if fh.StreamID == 0 {
|
||||||
|
countError("frame_continuation_zero_stream")
|
||||||
return nil, connError{ErrCodeProtocol, "CONTINUATION frame with stream ID 0"}
|
return nil, connError{ErrCodeProtocol, "CONTINUATION frame with stream ID 0"}
|
||||||
}
|
}
|
||||||
return &ContinuationFrame{fh, p}, nil
|
return &ContinuationFrame{fh, p}, nil
|
||||||
@ -1252,7 +1282,7 @@ func (f *PushPromiseFrame) HeadersEnded() bool {
|
|||||||
return f.FrameHeader.Flags.Has(FlagPushPromiseEndHeaders)
|
return f.FrameHeader.Flags.Has(FlagPushPromiseEndHeaders)
|
||||||
}
|
}
|
||||||
|
|
||||||
func parsePushPromise(_ *frameCache, fh FrameHeader, p []byte) (_ Frame, err error) {
|
func parsePushPromise(_ *frameCache, fh FrameHeader, countError func(string), p []byte) (_ Frame, err error) {
|
||||||
pp := &PushPromiseFrame{
|
pp := &PushPromiseFrame{
|
||||||
FrameHeader: fh,
|
FrameHeader: fh,
|
||||||
}
|
}
|
||||||
@ -1263,6 +1293,7 @@ func parsePushPromise(_ *frameCache, fh FrameHeader, p []byte) (_ Frame, err err
|
|||||||
// with. If the stream identifier field specifies the value
|
// with. If the stream identifier field specifies the value
|
||||||
// 0x0, a recipient MUST respond with a connection error
|
// 0x0, a recipient MUST respond with a connection error
|
||||||
// (Section 5.4.1) of type PROTOCOL_ERROR.
|
// (Section 5.4.1) of type PROTOCOL_ERROR.
|
||||||
|
countError("frame_pushpromise_zero_stream")
|
||||||
return nil, ConnectionError(ErrCodeProtocol)
|
return nil, ConnectionError(ErrCodeProtocol)
|
||||||
}
|
}
|
||||||
// The PUSH_PROMISE frame includes optional padding.
|
// The PUSH_PROMISE frame includes optional padding.
|
||||||
@ -1270,18 +1301,21 @@ func parsePushPromise(_ *frameCache, fh FrameHeader, p []byte) (_ Frame, err err
|
|||||||
var padLength uint8
|
var padLength uint8
|
||||||
if fh.Flags.Has(FlagPushPromisePadded) {
|
if fh.Flags.Has(FlagPushPromisePadded) {
|
||||||
if p, padLength, err = readByte(p); err != nil {
|
if p, padLength, err = readByte(p); err != nil {
|
||||||
|
countError("frame_pushpromise_pad_short")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
p, pp.PromiseID, err = readUint32(p)
|
p, pp.PromiseID, err = readUint32(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
countError("frame_pushpromise_promiseid_short")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
pp.PromiseID = pp.PromiseID & (1<<31 - 1)
|
pp.PromiseID = pp.PromiseID & (1<<31 - 1)
|
||||||
|
|
||||||
if int(padLength) > len(p) {
|
if int(padLength) > len(p) {
|
||||||
// like the DATA frame, error out if padding is longer than the body.
|
// like the DATA frame, error out if padding is longer than the body.
|
||||||
|
countError("frame_pushpromise_pad_too_big")
|
||||||
return nil, ConnectionError(ErrCodeProtocol)
|
return nil, ConnectionError(ErrCodeProtocol)
|
||||||
}
|
}
|
||||||
pp.headerFragBuf = p[:len(p)-int(padLength)]
|
pp.headerFragBuf = p[:len(p)-int(padLength)]
|
||||||
|
16
vendor/golang.org/x/net/http2/hpack/huffman.go
generated
vendored
16
vendor/golang.org/x/net/http2/hpack/huffman.go
generated
vendored
@ -140,12 +140,12 @@ func buildRootHuffmanNode() {
|
|||||||
panic("unexpected size")
|
panic("unexpected size")
|
||||||
}
|
}
|
||||||
lazyRootHuffmanNode = newInternalNode()
|
lazyRootHuffmanNode = newInternalNode()
|
||||||
for i, code := range huffmanCodes {
|
// allocate a leaf node for each of the 256 symbols
|
||||||
addDecoderNode(byte(i), code, huffmanCodeLen[i])
|
leaves := new([256]node)
|
||||||
}
|
|
||||||
}
|
for sym, code := range huffmanCodes {
|
||||||
|
codeLen := huffmanCodeLen[sym]
|
||||||
|
|
||||||
func addDecoderNode(sym byte, code uint32, codeLen uint8) {
|
|
||||||
cur := lazyRootHuffmanNode
|
cur := lazyRootHuffmanNode
|
||||||
for codeLen > 8 {
|
for codeLen > 8 {
|
||||||
codeLen -= 8
|
codeLen -= 8
|
||||||
@ -157,8 +157,12 @@ func addDecoderNode(sym byte, code uint32, codeLen uint8) {
|
|||||||
}
|
}
|
||||||
shift := 8 - codeLen
|
shift := 8 - codeLen
|
||||||
start, end := int(uint8(code<<shift)), int(1<<shift)
|
start, end := int(uint8(code<<shift)), int(1<<shift)
|
||||||
|
|
||||||
|
leaves[sym].sym = byte(sym)
|
||||||
|
leaves[sym].codeLen = codeLen
|
||||||
for i := start; i < start+end; i++ {
|
for i := start; i < start+end; i++ {
|
||||||
cur.children[i] = &node{sym: sym, codeLen: codeLen}
|
cur.children[i] = &leaves[sym]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
11
vendor/golang.org/x/net/http2/pipe.go
generated
vendored
11
vendor/golang.org/x/net/http2/pipe.go
generated
vendored
@ -30,6 +30,17 @@ type pipeBuffer interface {
|
|||||||
io.Reader
|
io.Reader
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// setBuffer initializes the pipe buffer.
|
||||||
|
// It has no effect if the pipe is already closed.
|
||||||
|
func (p *pipe) setBuffer(b pipeBuffer) {
|
||||||
|
p.mu.Lock()
|
||||||
|
defer p.mu.Unlock()
|
||||||
|
if p.err != nil || p.breakErr != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
p.b = b
|
||||||
|
}
|
||||||
|
|
||||||
func (p *pipe) Len() int {
|
func (p *pipe) Len() int {
|
||||||
p.mu.Lock()
|
p.mu.Lock()
|
||||||
defer p.mu.Unlock()
|
defer p.mu.Unlock()
|
||||||
|
109
vendor/golang.org/x/net/http2/server.go
generated
vendored
109
vendor/golang.org/x/net/http2/server.go
generated
vendored
@ -130,6 +130,12 @@ type Server struct {
|
|||||||
// If nil, a default scheduler is chosen.
|
// If nil, a default scheduler is chosen.
|
||||||
NewWriteScheduler func() WriteScheduler
|
NewWriteScheduler func() WriteScheduler
|
||||||
|
|
||||||
|
// CountError, if non-nil, is called on HTTP/2 server errors.
|
||||||
|
// It's intended to increment a metric for monitoring, such
|
||||||
|
// as an expvar or Prometheus metric.
|
||||||
|
// The errType consists of only ASCII word characters.
|
||||||
|
CountError func(errType string)
|
||||||
|
|
||||||
// Internal state. This is a pointer (rather than embedded directly)
|
// Internal state. This is a pointer (rather than embedded directly)
|
||||||
// so that we don't embed a Mutex in this struct, which will make the
|
// so that we don't embed a Mutex in this struct, which will make the
|
||||||
// struct non-copyable, which might break some callers.
|
// struct non-copyable, which might break some callers.
|
||||||
@ -405,6 +411,9 @@ func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) {
|
|||||||
sc.hpackEncoder = hpack.NewEncoder(&sc.headerWriteBuf)
|
sc.hpackEncoder = hpack.NewEncoder(&sc.headerWriteBuf)
|
||||||
|
|
||||||
fr := NewFramer(sc.bw, c)
|
fr := NewFramer(sc.bw, c)
|
||||||
|
if s.CountError != nil {
|
||||||
|
fr.countError = s.CountError
|
||||||
|
}
|
||||||
fr.ReadMetaHeaders = hpack.NewDecoder(initialHeaderTableSize, nil)
|
fr.ReadMetaHeaders = hpack.NewDecoder(initialHeaderTableSize, nil)
|
||||||
fr.MaxHeaderListSize = sc.maxHeaderListSize()
|
fr.MaxHeaderListSize = sc.maxHeaderListSize()
|
||||||
fr.SetMaxReadFrameSize(s.maxReadFrameSize())
|
fr.SetMaxReadFrameSize(s.maxReadFrameSize())
|
||||||
@ -710,7 +719,15 @@ func (sc *serverConn) canonicalHeader(v string) string {
|
|||||||
sc.canonHeader = make(map[string]string)
|
sc.canonHeader = make(map[string]string)
|
||||||
}
|
}
|
||||||
cv = http.CanonicalHeaderKey(v)
|
cv = http.CanonicalHeaderKey(v)
|
||||||
|
// maxCachedCanonicalHeaders is an arbitrarily-chosen limit on the number of
|
||||||
|
// entries in the canonHeader cache. This should be larger than the number
|
||||||
|
// of unique, uncommon header keys likely to be sent by the peer, while not
|
||||||
|
// so high as to permit unreasonable memory usage if the peer sends an unbounded
|
||||||
|
// number of unique header keys.
|
||||||
|
const maxCachedCanonicalHeaders = 32
|
||||||
|
if len(sc.canonHeader) < maxCachedCanonicalHeaders {
|
||||||
sc.canonHeader[v] = cv
|
sc.canonHeader[v] = cv
|
||||||
|
}
|
||||||
return cv
|
return cv
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1399,7 +1416,7 @@ func (sc *serverConn) processFrame(f Frame) error {
|
|||||||
// First frame received must be SETTINGS.
|
// First frame received must be SETTINGS.
|
||||||
if !sc.sawFirstSettings {
|
if !sc.sawFirstSettings {
|
||||||
if _, ok := f.(*SettingsFrame); !ok {
|
if _, ok := f.(*SettingsFrame); !ok {
|
||||||
return ConnectionError(ErrCodeProtocol)
|
return sc.countError("first_settings", ConnectionError(ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
sc.sawFirstSettings = true
|
sc.sawFirstSettings = true
|
||||||
}
|
}
|
||||||
@ -1424,7 +1441,7 @@ func (sc *serverConn) processFrame(f Frame) error {
|
|||||||
case *PushPromiseFrame:
|
case *PushPromiseFrame:
|
||||||
// A client cannot push. Thus, servers MUST treat the receipt of a PUSH_PROMISE
|
// A client cannot push. Thus, servers MUST treat the receipt of a PUSH_PROMISE
|
||||||
// frame as a connection error (Section 5.4.1) of type PROTOCOL_ERROR.
|
// frame as a connection error (Section 5.4.1) of type PROTOCOL_ERROR.
|
||||||
return ConnectionError(ErrCodeProtocol)
|
return sc.countError("push_promise", ConnectionError(ErrCodeProtocol))
|
||||||
default:
|
default:
|
||||||
sc.vlogf("http2: server ignoring frame: %v", f.Header())
|
sc.vlogf("http2: server ignoring frame: %v", f.Header())
|
||||||
return nil
|
return nil
|
||||||
@ -1444,7 +1461,7 @@ func (sc *serverConn) processPing(f *PingFrame) error {
|
|||||||
// identifier field value other than 0x0, the recipient MUST
|
// identifier field value other than 0x0, the recipient MUST
|
||||||
// respond with a connection error (Section 5.4.1) of type
|
// respond with a connection error (Section 5.4.1) of type
|
||||||
// PROTOCOL_ERROR."
|
// PROTOCOL_ERROR."
|
||||||
return ConnectionError(ErrCodeProtocol)
|
return sc.countError("ping_on_stream", ConnectionError(ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
if sc.inGoAway && sc.goAwayCode != ErrCodeNo {
|
if sc.inGoAway && sc.goAwayCode != ErrCodeNo {
|
||||||
return nil
|
return nil
|
||||||
@ -1463,7 +1480,7 @@ func (sc *serverConn) processWindowUpdate(f *WindowUpdateFrame) error {
|
|||||||
// or PRIORITY on a stream in this state MUST be
|
// or PRIORITY on a stream in this state MUST be
|
||||||
// treated as a connection error (Section 5.4.1) of
|
// treated as a connection error (Section 5.4.1) of
|
||||||
// type PROTOCOL_ERROR."
|
// type PROTOCOL_ERROR."
|
||||||
return ConnectionError(ErrCodeProtocol)
|
return sc.countError("stream_idle", ConnectionError(ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
if st == nil {
|
if st == nil {
|
||||||
// "WINDOW_UPDATE can be sent by a peer that has sent a
|
// "WINDOW_UPDATE can be sent by a peer that has sent a
|
||||||
@ -1474,7 +1491,7 @@ func (sc *serverConn) processWindowUpdate(f *WindowUpdateFrame) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if !st.flow.add(int32(f.Increment)) {
|
if !st.flow.add(int32(f.Increment)) {
|
||||||
return streamError(f.StreamID, ErrCodeFlowControl)
|
return sc.countError("bad_flow", streamError(f.StreamID, ErrCodeFlowControl))
|
||||||
}
|
}
|
||||||
default: // connection-level flow control
|
default: // connection-level flow control
|
||||||
if !sc.flow.add(int32(f.Increment)) {
|
if !sc.flow.add(int32(f.Increment)) {
|
||||||
@ -1495,7 +1512,7 @@ func (sc *serverConn) processResetStream(f *RSTStreamFrame) error {
|
|||||||
// identifying an idle stream is received, the
|
// identifying an idle stream is received, the
|
||||||
// recipient MUST treat this as a connection error
|
// recipient MUST treat this as a connection error
|
||||||
// (Section 5.4.1) of type PROTOCOL_ERROR.
|
// (Section 5.4.1) of type PROTOCOL_ERROR.
|
||||||
return ConnectionError(ErrCodeProtocol)
|
return sc.countError("reset_idle_stream", ConnectionError(ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
if st != nil {
|
if st != nil {
|
||||||
st.cancelCtx()
|
st.cancelCtx()
|
||||||
@ -1547,7 +1564,7 @@ func (sc *serverConn) processSettings(f *SettingsFrame) error {
|
|||||||
// Why is the peer ACKing settings we never sent?
|
// Why is the peer ACKing settings we never sent?
|
||||||
// The spec doesn't mention this case, but
|
// The spec doesn't mention this case, but
|
||||||
// hang up on them anyway.
|
// hang up on them anyway.
|
||||||
return ConnectionError(ErrCodeProtocol)
|
return sc.countError("ack_mystery", ConnectionError(ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -1555,7 +1572,7 @@ func (sc *serverConn) processSettings(f *SettingsFrame) error {
|
|||||||
// This isn't actually in the spec, but hang up on
|
// This isn't actually in the spec, but hang up on
|
||||||
// suspiciously large settings frames or those with
|
// suspiciously large settings frames or those with
|
||||||
// duplicate entries.
|
// duplicate entries.
|
||||||
return ConnectionError(ErrCodeProtocol)
|
return sc.countError("settings_big_or_dups", ConnectionError(ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
if err := f.ForeachSetting(sc.processSetting); err != nil {
|
if err := f.ForeachSetting(sc.processSetting); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -1622,7 +1639,7 @@ func (sc *serverConn) processSettingInitialWindowSize(val uint32) error {
|
|||||||
// control window to exceed the maximum size as a
|
// control window to exceed the maximum size as a
|
||||||
// connection error (Section 5.4.1) of type
|
// connection error (Section 5.4.1) of type
|
||||||
// FLOW_CONTROL_ERROR."
|
// FLOW_CONTROL_ERROR."
|
||||||
return ConnectionError(ErrCodeFlowControl)
|
return sc.countError("setting_win_size", ConnectionError(ErrCodeFlowControl))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@ -1655,7 +1672,7 @@ func (sc *serverConn) processData(f *DataFrame) error {
|
|||||||
// or PRIORITY on a stream in this state MUST be
|
// or PRIORITY on a stream in this state MUST be
|
||||||
// treated as a connection error (Section 5.4.1) of
|
// treated as a connection error (Section 5.4.1) of
|
||||||
// type PROTOCOL_ERROR."
|
// type PROTOCOL_ERROR."
|
||||||
return ConnectionError(ErrCodeProtocol)
|
return sc.countError("data_on_idle", ConnectionError(ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
|
|
||||||
// "If a DATA frame is received whose stream is not in "open"
|
// "If a DATA frame is received whose stream is not in "open"
|
||||||
@ -1672,7 +1689,7 @@ func (sc *serverConn) processData(f *DataFrame) error {
|
|||||||
// and return any flow control bytes since we're not going
|
// and return any flow control bytes since we're not going
|
||||||
// to consume them.
|
// to consume them.
|
||||||
if sc.inflow.available() < int32(f.Length) {
|
if sc.inflow.available() < int32(f.Length) {
|
||||||
return streamError(id, ErrCodeFlowControl)
|
return sc.countError("data_flow", streamError(id, ErrCodeFlowControl))
|
||||||
}
|
}
|
||||||
// Deduct the flow control from inflow, since we're
|
// Deduct the flow control from inflow, since we're
|
||||||
// going to immediately add it back in
|
// going to immediately add it back in
|
||||||
@ -1685,7 +1702,7 @@ func (sc *serverConn) processData(f *DataFrame) error {
|
|||||||
// Already have a stream error in flight. Don't send another.
|
// Already have a stream error in flight. Don't send another.
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return streamError(id, ErrCodeStreamClosed)
|
return sc.countError("closed", streamError(id, ErrCodeStreamClosed))
|
||||||
}
|
}
|
||||||
if st.body == nil {
|
if st.body == nil {
|
||||||
panic("internal error: should have a body in this state")
|
panic("internal error: should have a body in this state")
|
||||||
@ -1697,12 +1714,12 @@ func (sc *serverConn) processData(f *DataFrame) error {
|
|||||||
// RFC 7540, sec 8.1.2.6: A request or response is also malformed if the
|
// RFC 7540, sec 8.1.2.6: A request or response is also malformed if the
|
||||||
// value of a content-length header field does not equal the sum of the
|
// value of a content-length header field does not equal the sum of the
|
||||||
// DATA frame payload lengths that form the body.
|
// DATA frame payload lengths that form the body.
|
||||||
return streamError(id, ErrCodeProtocol)
|
return sc.countError("send_too_much", streamError(id, ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
if f.Length > 0 {
|
if f.Length > 0 {
|
||||||
// Check whether the client has flow control quota.
|
// Check whether the client has flow control quota.
|
||||||
if st.inflow.available() < int32(f.Length) {
|
if st.inflow.available() < int32(f.Length) {
|
||||||
return streamError(id, ErrCodeFlowControl)
|
return sc.countError("flow_on_data_length", streamError(id, ErrCodeFlowControl))
|
||||||
}
|
}
|
||||||
st.inflow.take(int32(f.Length))
|
st.inflow.take(int32(f.Length))
|
||||||
|
|
||||||
@ -1710,7 +1727,7 @@ func (sc *serverConn) processData(f *DataFrame) error {
|
|||||||
wrote, err := st.body.Write(data)
|
wrote, err := st.body.Write(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sc.sendWindowUpdate(nil, int(f.Length)-wrote)
|
sc.sendWindowUpdate(nil, int(f.Length)-wrote)
|
||||||
return streamError(id, ErrCodeStreamClosed)
|
return sc.countError("body_write_err", streamError(id, ErrCodeStreamClosed))
|
||||||
}
|
}
|
||||||
if wrote != len(data) {
|
if wrote != len(data) {
|
||||||
panic("internal error: bad Writer")
|
panic("internal error: bad Writer")
|
||||||
@ -1796,7 +1813,7 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error {
|
|||||||
// stream identifier MUST respond with a connection error
|
// stream identifier MUST respond with a connection error
|
||||||
// (Section 5.4.1) of type PROTOCOL_ERROR.
|
// (Section 5.4.1) of type PROTOCOL_ERROR.
|
||||||
if id%2 != 1 {
|
if id%2 != 1 {
|
||||||
return ConnectionError(ErrCodeProtocol)
|
return sc.countError("headers_even", ConnectionError(ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
// A HEADERS frame can be used to create a new stream or
|
// A HEADERS frame can be used to create a new stream or
|
||||||
// send a trailer for an open one. If we already have a stream
|
// send a trailer for an open one. If we already have a stream
|
||||||
@ -1813,7 +1830,7 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error {
|
|||||||
// this state, it MUST respond with a stream error (Section 5.4.2) of
|
// this state, it MUST respond with a stream error (Section 5.4.2) of
|
||||||
// type STREAM_CLOSED.
|
// type STREAM_CLOSED.
|
||||||
if st.state == stateHalfClosedRemote {
|
if st.state == stateHalfClosedRemote {
|
||||||
return streamError(id, ErrCodeStreamClosed)
|
return sc.countError("headers_half_closed", streamError(id, ErrCodeStreamClosed))
|
||||||
}
|
}
|
||||||
return st.processTrailerHeaders(f)
|
return st.processTrailerHeaders(f)
|
||||||
}
|
}
|
||||||
@ -1824,7 +1841,7 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error {
|
|||||||
// receives an unexpected stream identifier MUST respond with
|
// receives an unexpected stream identifier MUST respond with
|
||||||
// a connection error (Section 5.4.1) of type PROTOCOL_ERROR.
|
// a connection error (Section 5.4.1) of type PROTOCOL_ERROR.
|
||||||
if id <= sc.maxClientStreamID {
|
if id <= sc.maxClientStreamID {
|
||||||
return ConnectionError(ErrCodeProtocol)
|
return sc.countError("stream_went_down", ConnectionError(ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
sc.maxClientStreamID = id
|
sc.maxClientStreamID = id
|
||||||
|
|
||||||
@ -1841,14 +1858,14 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error {
|
|||||||
if sc.curClientStreams+1 > sc.advMaxStreams {
|
if sc.curClientStreams+1 > sc.advMaxStreams {
|
||||||
if sc.unackedSettings == 0 {
|
if sc.unackedSettings == 0 {
|
||||||
// They should know better.
|
// They should know better.
|
||||||
return streamError(id, ErrCodeProtocol)
|
return sc.countError("over_max_streams", streamError(id, ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
// Assume it's a network race, where they just haven't
|
// Assume it's a network race, where they just haven't
|
||||||
// received our last SETTINGS update. But actually
|
// received our last SETTINGS update. But actually
|
||||||
// this can't happen yet, because we don't yet provide
|
// this can't happen yet, because we don't yet provide
|
||||||
// a way for users to adjust server parameters at
|
// a way for users to adjust server parameters at
|
||||||
// runtime.
|
// runtime.
|
||||||
return streamError(id, ErrCodeRefusedStream)
|
return sc.countError("over_max_streams_race", streamError(id, ErrCodeRefusedStream))
|
||||||
}
|
}
|
||||||
|
|
||||||
initialState := stateOpen
|
initialState := stateOpen
|
||||||
@ -1858,7 +1875,7 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error {
|
|||||||
st := sc.newStream(id, 0, initialState)
|
st := sc.newStream(id, 0, initialState)
|
||||||
|
|
||||||
if f.HasPriority() {
|
if f.HasPriority() {
|
||||||
if err := checkPriority(f.StreamID, f.Priority); err != nil {
|
if err := sc.checkPriority(f.StreamID, f.Priority); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
sc.writeSched.AdjustStream(st.id, f.Priority)
|
sc.writeSched.AdjustStream(st.id, f.Priority)
|
||||||
@ -1902,15 +1919,15 @@ func (st *stream) processTrailerHeaders(f *MetaHeadersFrame) error {
|
|||||||
sc := st.sc
|
sc := st.sc
|
||||||
sc.serveG.check()
|
sc.serveG.check()
|
||||||
if st.gotTrailerHeader {
|
if st.gotTrailerHeader {
|
||||||
return ConnectionError(ErrCodeProtocol)
|
return sc.countError("dup_trailers", ConnectionError(ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
st.gotTrailerHeader = true
|
st.gotTrailerHeader = true
|
||||||
if !f.StreamEnded() {
|
if !f.StreamEnded() {
|
||||||
return streamError(st.id, ErrCodeProtocol)
|
return sc.countError("trailers_not_ended", streamError(st.id, ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(f.PseudoFields()) > 0 {
|
if len(f.PseudoFields()) > 0 {
|
||||||
return streamError(st.id, ErrCodeProtocol)
|
return sc.countError("trailers_pseudo", streamError(st.id, ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
if st.trailer != nil {
|
if st.trailer != nil {
|
||||||
for _, hf := range f.RegularFields() {
|
for _, hf := range f.RegularFields() {
|
||||||
@ -1919,7 +1936,7 @@ func (st *stream) processTrailerHeaders(f *MetaHeadersFrame) error {
|
|||||||
// TODO: send more details to the peer somehow. But http2 has
|
// TODO: send more details to the peer somehow. But http2 has
|
||||||
// no way to send debug data at a stream level. Discuss with
|
// no way to send debug data at a stream level. Discuss with
|
||||||
// HTTP folk.
|
// HTTP folk.
|
||||||
return streamError(st.id, ErrCodeProtocol)
|
return sc.countError("trailers_bogus", streamError(st.id, ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
st.trailer[key] = append(st.trailer[key], hf.Value)
|
st.trailer[key] = append(st.trailer[key], hf.Value)
|
||||||
}
|
}
|
||||||
@ -1928,13 +1945,13 @@ func (st *stream) processTrailerHeaders(f *MetaHeadersFrame) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkPriority(streamID uint32, p PriorityParam) error {
|
func (sc *serverConn) checkPriority(streamID uint32, p PriorityParam) error {
|
||||||
if streamID == p.StreamDep {
|
if streamID == p.StreamDep {
|
||||||
// Section 5.3.1: "A stream cannot depend on itself. An endpoint MUST treat
|
// Section 5.3.1: "A stream cannot depend on itself. An endpoint MUST treat
|
||||||
// this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR."
|
// this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR."
|
||||||
// Section 5.3.3 says that a stream can depend on one of its dependencies,
|
// Section 5.3.3 says that a stream can depend on one of its dependencies,
|
||||||
// so it's only self-dependencies that are forbidden.
|
// so it's only self-dependencies that are forbidden.
|
||||||
return streamError(streamID, ErrCodeProtocol)
|
return sc.countError("priority", streamError(streamID, ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -1943,7 +1960,7 @@ func (sc *serverConn) processPriority(f *PriorityFrame) error {
|
|||||||
if sc.inGoAway {
|
if sc.inGoAway {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if err := checkPriority(f.StreamID, f.PriorityParam); err != nil {
|
if err := sc.checkPriority(f.StreamID, f.PriorityParam); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
sc.writeSched.AdjustStream(f.StreamID, f.PriorityParam)
|
sc.writeSched.AdjustStream(f.StreamID, f.PriorityParam)
|
||||||
@ -2000,7 +2017,7 @@ func (sc *serverConn) newWriterAndRequest(st *stream, f *MetaHeadersFrame) (*res
|
|||||||
isConnect := rp.method == "CONNECT"
|
isConnect := rp.method == "CONNECT"
|
||||||
if isConnect {
|
if isConnect {
|
||||||
if rp.path != "" || rp.scheme != "" || rp.authority == "" {
|
if rp.path != "" || rp.scheme != "" || rp.authority == "" {
|
||||||
return nil, nil, streamError(f.StreamID, ErrCodeProtocol)
|
return nil, nil, sc.countError("bad_connect", streamError(f.StreamID, ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
} else if rp.method == "" || rp.path == "" || (rp.scheme != "https" && rp.scheme != "http") {
|
} else if rp.method == "" || rp.path == "" || (rp.scheme != "https" && rp.scheme != "http") {
|
||||||
// See 8.1.2.6 Malformed Requests and Responses:
|
// See 8.1.2.6 Malformed Requests and Responses:
|
||||||
@ -2013,13 +2030,13 @@ func (sc *serverConn) newWriterAndRequest(st *stream, f *MetaHeadersFrame) (*res
|
|||||||
// "All HTTP/2 requests MUST include exactly one valid
|
// "All HTTP/2 requests MUST include exactly one valid
|
||||||
// value for the :method, :scheme, and :path
|
// value for the :method, :scheme, and :path
|
||||||
// pseudo-header fields"
|
// pseudo-header fields"
|
||||||
return nil, nil, streamError(f.StreamID, ErrCodeProtocol)
|
return nil, nil, sc.countError("bad_path_method", streamError(f.StreamID, ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
|
|
||||||
bodyOpen := !f.StreamEnded()
|
bodyOpen := !f.StreamEnded()
|
||||||
if rp.method == "HEAD" && bodyOpen {
|
if rp.method == "HEAD" && bodyOpen {
|
||||||
// HEAD requests can't have bodies
|
// HEAD requests can't have bodies
|
||||||
return nil, nil, streamError(f.StreamID, ErrCodeProtocol)
|
return nil, nil, sc.countError("head_body", streamError(f.StreamID, ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
|
|
||||||
rp.header = make(http.Header)
|
rp.header = make(http.Header)
|
||||||
@ -2102,7 +2119,7 @@ func (sc *serverConn) newWriterAndRequestNoBody(st *stream, rp requestParam) (*r
|
|||||||
var err error
|
var err error
|
||||||
url_, err = url.ParseRequestURI(rp.path)
|
url_, err = url.ParseRequestURI(rp.path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, streamError(st.id, ErrCodeProtocol)
|
return nil, nil, sc.countError("bad_path", streamError(st.id, ErrCodeProtocol))
|
||||||
}
|
}
|
||||||
requestURI = rp.path
|
requestURI = rp.path
|
||||||
}
|
}
|
||||||
@ -2985,3 +3002,31 @@ func h1ServerKeepAlivesDisabled(hs *http.Server) bool {
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sc *serverConn) countError(name string, err error) error {
|
||||||
|
if sc == nil || sc.srv == nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
f := sc.srv.CountError
|
||||||
|
if f == nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var typ string
|
||||||
|
var code ErrCode
|
||||||
|
switch e := err.(type) {
|
||||||
|
case ConnectionError:
|
||||||
|
typ = "conn"
|
||||||
|
code = ErrCode(e)
|
||||||
|
case StreamError:
|
||||||
|
typ = "stream"
|
||||||
|
code = ErrCode(e.Code)
|
||||||
|
default:
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
codeStr := errCodeName[code]
|
||||||
|
if codeStr == "" {
|
||||||
|
codeStr = strconv.Itoa(int(code))
|
||||||
|
}
|
||||||
|
f(fmt.Sprintf("%s_%s_%s", typ, codeStr, name))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
1396
vendor/golang.org/x/net/http2/transport.go
generated
vendored
1396
vendor/golang.org/x/net/http2/transport.go
generated
vendored
File diff suppressed because it is too large
Load Diff
4
vendor/golang.org/x/net/http2/writesched.go
generated
vendored
4
vendor/golang.org/x/net/http2/writesched.go
generated
vendored
@ -32,7 +32,8 @@ type WriteScheduler interface {
|
|||||||
|
|
||||||
// Pop dequeues the next frame to write. Returns false if no frames can
|
// Pop dequeues the next frame to write. Returns false if no frames can
|
||||||
// be written. Frames with a given wr.StreamID() are Pop'd in the same
|
// be written. Frames with a given wr.StreamID() are Pop'd in the same
|
||||||
// order they are Push'd. No frames should be discarded except by CloseStream.
|
// order they are Push'd, except RST_STREAM frames. No frames should be
|
||||||
|
// discarded except by CloseStream.
|
||||||
Pop() (wr FrameWriteRequest, ok bool)
|
Pop() (wr FrameWriteRequest, ok bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,6 +53,7 @@ type FrameWriteRequest struct {
|
|||||||
|
|
||||||
// stream is the stream on which this frame will be written.
|
// stream is the stream on which this frame will be written.
|
||||||
// nil for non-stream frames like PING and SETTINGS.
|
// nil for non-stream frames like PING and SETTINGS.
|
||||||
|
// nil for RST_STREAM streams, which use the StreamError.StreamID field instead.
|
||||||
stream *stream
|
stream *stream
|
||||||
|
|
||||||
// done, if non-nil, must be a buffered channel with space for
|
// done, if non-nil, must be a buffered channel with space for
|
||||||
|
6
vendor/golang.org/x/net/http2/writesched_random.go
generated
vendored
6
vendor/golang.org/x/net/http2/writesched_random.go
generated
vendored
@ -45,11 +45,11 @@ func (ws *randomWriteScheduler) AdjustStream(streamID uint32, priority PriorityP
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ws *randomWriteScheduler) Push(wr FrameWriteRequest) {
|
func (ws *randomWriteScheduler) Push(wr FrameWriteRequest) {
|
||||||
id := wr.StreamID()
|
if wr.isControl() {
|
||||||
if id == 0 {
|
|
||||||
ws.zero.push(wr)
|
ws.zero.push(wr)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
id := wr.StreamID()
|
||||||
q, ok := ws.sq[id]
|
q, ok := ws.sq[id]
|
||||||
if !ok {
|
if !ok {
|
||||||
q = ws.queuePool.get()
|
q = ws.queuePool.get()
|
||||||
@ -59,7 +59,7 @@ func (ws *randomWriteScheduler) Push(wr FrameWriteRequest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ws *randomWriteScheduler) Pop() (FrameWriteRequest, bool) {
|
func (ws *randomWriteScheduler) Pop() (FrameWriteRequest, bool) {
|
||||||
// Control frames first.
|
// Control and RST_STREAM frames first.
|
||||||
if !ws.zero.empty() {
|
if !ws.zero.empty() {
|
||||||
return ws.zero.shift(), true
|
return ws.zero.shift(), true
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user