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:
		| @@ -8,7 +8,7 @@ require ( | ||||
| 	github.com/gogo/googleapis v1.4.0 | ||||
| 	github.com/gogo/protobuf v1.3.2 | ||||
| 	github.com/opencontainers/go-digest v1.0.0 | ||||
| 	google.golang.org/grpc v1.41.0 | ||||
| 	google.golang.org/grpc v1.43.0 | ||||
| ) | ||||
|  | ||||
| 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/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-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/containerd/ttrpc v1.1.0 h1:GbtyLRxb0gOLR0TYQWt3O6B0NvT8tMdorEHqIQo/lWI= | ||||
| github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= | ||||
| 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.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= | ||||
| 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.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-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | ||||
| 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/emicklei/go-restful v2.9.5+incompatible | ||||
| 	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/protobuf v1.3.2 | ||||
| 	github.com/google/go-cmp v0.5.6 | ||||
| @@ -56,15 +57,17 @@ require ( | ||||
| 	github.com/urfave/cli v1.22.2 | ||||
| 	github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5 | ||||
| 	go.etcd.io/bbolt v1.3.6 | ||||
| 	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.24.0 | ||||
| 	go.opentelemetry.io/otel v1.0.1 | ||||
| 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1 | ||||
| 	go.opentelemetry.io/otel/sdk v1.0.1 | ||||
| 	go.opentelemetry.io/otel/trace v1.0.1 | ||||
| 	golang.org/x/net v0.0.0-20210825183410-e898025ed96a | ||||
| 	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0 | ||||
| 	go.opentelemetry.io/otel v1.3.0 | ||||
| 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0 | ||||
| 	go.opentelemetry.io/otel/sdk v1.3.0 | ||||
| 	go.opentelemetry.io/otel/trace v1.3.0 | ||||
| 	golang.org/x/net v0.0.0-20211216030914-fe4d6282115f | ||||
| 	golang.org/x/sync v0.0.0-20210220032951-036812b2e83c | ||||
| 	golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359 | ||||
| 	google.golang.org/grpc v1.41.0 | ||||
| 	golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e | ||||
| 	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 | ||||
| 	gotest.tools/v3 v3.0.3 | ||||
| 	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/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= | ||||
| 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.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/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= | ||||
| @@ -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/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-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-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/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= | ||||
| 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-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.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 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.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= | ||||
| 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/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.24.0 h1:1hCzM7mwQbFQgk3Q4lAVEsGV6NB4Uj6Jt3EU+OiSBc8= | ||||
| 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 h1:Ky1MObd188aGbgb5OgNnwGuEEwI9MVIcc7rBW6zk5Ak= | ||||
| go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= | ||||
| go.opentelemetry.io/contrib/instrumentation/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 v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg= | ||||
| go.opentelemetry.io/otel v1.0.1 h1:4XKyXmfqJLOQ7feyV5DB6gsBFZ0ltB8vLtp6pj4JIcc= | ||||
| go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU= | ||||
| go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= | ||||
| go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= | ||||
| go.opentelemetry.io/otel/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/otlptrace v1.0.1 h1:ofMbch7i29qIUf7VtF+r0HRF6ac0SBaPSziSsKp7wkk= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1/go.mod h1:Kv8liBeVNFkkkbilbgWRpV+wWuu+H5xdOT6HAgd30iw= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1 h1:CFMFNoz+CGprjFAFy+RJFrfEe4GBia3RRm2a4fREvCA= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1/go.mod h1:xOvWoTOrQjxjW61xtOmD/WKGRYb/P4NzRo3bs65U6Rk= | ||||
| go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 h1:R/OBkMoGgfy2fLhs2QhkCI1w4HLEQX92GCcJB6SSdNk= | ||||
| go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 h1:giGm8w67Ja7amYNfYMdme7xSp2pIxThWopw8+QP51Yk= | ||||
| 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/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 v1.0.1 h1:wXxFEWGo7XfXupPwVJvTBOaPBC9FEg0wB8hMNrKk+cA= | ||||
| go.opentelemetry.io/otel/sdk v1.0.1/go.mod h1:HrdXne+BiwsOHYYkBE5ysIcv2bvdZstxzmCQhxTcZkI= | ||||
| go.opentelemetry.io/otel/sdk v1.3.0 h1:3278edCoH89MEJ0Ky8WQXVmDQv3FX4ZJ3Pp+9fJreAI= | ||||
| go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= | ||||
| go.opentelemetry.io/otel/sdk/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/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.0.1 h1:StTeIH6Q3G4r0Fiw34LTokUFESZgIDUr0qIJ7mKmAfw= | ||||
| go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk= | ||||
| go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= | ||||
| go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= | ||||
| go.opentelemetry.io/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.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= | ||||
| go.opentelemetry.io/proto/otlp v0.11.0 h1:cLDgIBTf4lLOlztkhzAEdQsJ4Lj+i5Wc9k6Nn0K1VyU= | ||||
| 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.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.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.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= | ||||
| 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-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-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-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-20190226205417-e64efc72b421/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-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-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-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-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||||
| 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.3/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.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-20190308202827-9d24e82272b4/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-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | ||||
| 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-20191011141410-1b5146add898/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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= | ||||
| 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.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= | ||||
| google.golang.org/grpc v1.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E= | ||||
| google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= | ||||
| google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= | ||||
| 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-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | ||||
| 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/pkg/errors v0.9.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 | ||||
| ) | ||||
|  | ||||
|   | ||||
| @@ -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/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.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= | ||||
| 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-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/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-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-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/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= | ||||
| 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.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 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.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= | ||||
| 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/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.24.0 h1:1hCzM7mwQbFQgk3Q4lAVEsGV6NB4Uj6Jt3EU+OiSBc8= | ||||
| 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 h1:Ky1MObd188aGbgb5OgNnwGuEEwI9MVIcc7rBW6zk5Ak= | ||||
| go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= | ||||
| go.opentelemetry.io/contrib/instrumentation/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 v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg= | ||||
| go.opentelemetry.io/otel v1.0.1 h1:4XKyXmfqJLOQ7feyV5DB6gsBFZ0ltB8vLtp6pj4JIcc= | ||||
| go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU= | ||||
| go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= | ||||
| go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= | ||||
| go.opentelemetry.io/otel/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/otlptrace/otlptracegrpc v1.0.1/go.mod h1:xOvWoTOrQjxjW61xtOmD/WKGRYb/P4NzRo3bs65U6Rk= | ||||
| go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= | ||||
| go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/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/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 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/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 v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs= | ||||
| go.opentelemetry.io/otel/trace v1.0.1 h1:StTeIH6Q3G4r0Fiw34LTokUFESZgIDUr0qIJ7mKmAfw= | ||||
| go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk= | ||||
| go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= | ||||
| go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= | ||||
| go.opentelemetry.io/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.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.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= | ||||
| 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/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-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-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-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-20190226205417-e64efc72b421/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-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-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-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-20201126162022-7de9c90e9dd1/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.3/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.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-20190308202827-9d24e82272b4/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-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | ||||
| 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-20191011141410-1b5146add898/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.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= | ||||
| 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.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= | ||||
| google.golang.org/grpc v1.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E= | ||||
| google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= | ||||
| google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= | ||||
| 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-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | ||||
| 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 | ||||
| inimitable Dave Cheney][warning-makes-no-sense].  I really appreciate what | ||||
| he has to say, and it largely aligns with my own experiences.  Too many | ||||
| choices of levels means inconsistent logs. | ||||
| inimitable Dave Cheney][warning-makes-no-sense].  We really appreciate what | ||||
| he has to say, and it largely aligns with our own experiences. | ||||
|  | ||||
| This package offers a purely abstract interface, based on these ideas but with | ||||
| 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 | ||||
| ### Differences from Dave's ideas | ||||
|  | ||||
| The main differences are: | ||||
|  | ||||
| 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 | ||||
| locations, timestamps, file and line decorations, and structured logging.  I | ||||
| restrict the API to just 2 types of logs: info and error. | ||||
| 1. Dave basically proposes doing away with the notion of a logging API in favor | ||||
| of `fmt.Printf()`.  We disagree, especially when you consider things like output | ||||
| locations, timestamps, file and line decorations, and structured logging.  This | ||||
| 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 | ||||
| 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 | ||||
| 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 | ||||
| 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. | ||||
| 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. | ||||
|  | ||||
| This is a BETA grade API. | ||||
| ## Implementations (non-exhaustive) | ||||
|  | ||||
| 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) | ||||
| - **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) | ||||
| - **log** (the Go standard library logger): | ||||
|   [stdr](https://github.com/go-logr/stdr) | ||||
| - **log** (the Go standard library logger): [stdr](https://github.com/go-logr/stdr) | ||||
| - **github.com/sirupsen/logrus**: [logrusr](https://github.com/bombsimon/logrusr) | ||||
| - **github.com/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) | ||||
| - **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 | ||||
|   particular values by filtering on the contents of a particular key -- | ||||
|   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 | ||||
|   keys, it becomes easy to gather all log lines related to a particular | ||||
|   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 | ||||
|   information is logged -- you might choose in a particular configuration | ||||
|   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. | ||||
|  | ||||
| - **Structured logs better represent structured data**: sometimes, the | ||||
|   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. | ||||
|  | ||||
| ## Why V-levels? | ||||
| #### Why V-levels? | ||||
|  | ||||
| **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 | ||||
| @@ -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 | ||||
| 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 | ||||
| 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**: | ||||
|  | ||||
| - 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 | ||||
|   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) | ||||
| 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 | ||||
| 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 | ||||
| `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 | ||||
| `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 | ||||
| consistent V-levels within a given logger, however, as this makes deciding | ||||
| 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 | ||||
| I convert my mental model of logging with format strings to logging with | ||||
| constant messages": | ||||
|  | ||||
| 1. figure out what the error actually is, as you'd write in a TL;DR style, | ||||
|    and use that as a message | ||||
| 1. Figure out what the error actually is, as you'd write in a TL;DR style, | ||||
|    and use that as a message. | ||||
|  | ||||
| 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 | ||||
| Kubernetes codebase): | ||||
| @@ -150,34 +220,59 @@ Kubernetes codebase): | ||||
|   response when requesting url", "attempt", retries, "after | ||||
|   seconds", seconds, "url", url)` | ||||
|  | ||||
| If you *really* must use a format string, place it as a key value, and | ||||
| call `fmt.Sprintf` yourself -- for instance, `log.Printf("unable to | ||||
| 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 | ||||
| reflect over type %T")` becomes `logger.Info("unable to reflect over | ||||
| type", "type", fmt.Sprintf("%T"))`.  In general though, the cases where | ||||
| 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 | ||||
| more verbose or more debug-y logs. | ||||
|  | ||||
| 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 | ||||
| `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 | ||||
| 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 | ||||
| - constant keys are generally a good idea | ||||
| - be consistent across your codebase | ||||
| - keys should naturally match parts of the message string | ||||
| Keys are fairly flexible, and can hold more or less any string | ||||
| value. For best compatibility with implementations and consistency | ||||
| with existing code in other projects, there are a few conventions you | ||||
| 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), | ||||
| it's generally a good idea to stick to printable ascii characters, or at | ||||
| 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 | ||||
|   | ||||
							
								
								
									
										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 | ||||
|  | ||||
| // Discard returns a valid Logger that discards all messages logged to it. | ||||
| // It can be used whenever the caller is not interested in the logs. | ||||
| // Discard returns a Logger that discards all messages logged to it.  It can be | ||||
| // used whenever the caller is not interested in the logs.  Logger instances | ||||
| // produced by this function always compare as equal. | ||||
| func Discard() Logger { | ||||
| 	return DiscardLogger{} | ||||
| 	return Logger{ | ||||
| 		level: 0, | ||||
| 		sink:  discardLogSink{}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // DiscardLogger is a Logger that discards all messages. | ||||
| type DiscardLogger struct{} | ||||
| // discardLogSink is a LogSink that discards all messages. | ||||
| 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 | ||||
| } | ||||
|  | ||||
| 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 | ||||
| } | ||||
|  | ||||
| func (l DiscardLogger) WithValues(keysAndValues ...interface{}) Logger { | ||||
| func (l discardLogSink) WithName(string) LogSink { | ||||
| 	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 | ||||
|  | ||||
| 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: | ||||
| //     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 | ||||
| // these interfaces and callers can implement logging in whatever way is | ||||
| // appropriate. | ||||
| // Package logr defines a general-purpose logging API and abstract interfaces | ||||
| // to back that API.  Packages in the Go ecosystem can depend on this package, | ||||
| // while callers can implement logging with whatever backend is appropriate. | ||||
| // | ||||
| // Usage | ||||
| // | ||||
| // Logging is done using a Logger.  Loggers can have name prefixes and named | ||||
| // values attached, so that all log messages logged with that Logger have some | ||||
| // base context associated. | ||||
| // Logging is done using a Logger instance.  Logger is a concrete type with | ||||
| // methods, which defers the actual logging to a LogSink interface.  The main | ||||
| // 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 | ||||
| // value, to disambiguate it from the general Logger name. | ||||
| // With Go's standard log package, we might write: | ||||
| //   log.Printf("setting target value %s", targetValue) | ||||
| // | ||||
| // For instance, suppose we're trying to reconcile the state of an object, and | ||||
| // we want to log that we've made some decision. | ||||
| // With logr's structured logging, we'd write: | ||||
| //   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", | ||||
| //       targetValue, object.Namespace, object.Name) | ||||
| // | ||||
| // With logr's structured logging, we'd write: | ||||
| //   // elsewhere in the file, set up the logger to log with the prefix of | ||||
| //   // "reconcilers", and the named value target-type=Foo, for extra context. | ||||
| //   log := mainLogger.WithName("reconcilers").WithValues("target-type", "Foo") | ||||
| // With logr we'd write: | ||||
| //   // Elsewhere: set up the logger to log the object name. | ||||
| //   obj.logger = mainLogger.WithValues( | ||||
| //       "name", obj.name, "namespace", obj.namespace) | ||||
| // | ||||
| //   // 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 | ||||
| // 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. | ||||
| // Best Practices | ||||
| // | ||||
| // For logging errors, Logger has a method called Error.  Suppose we wanted to | ||||
| // log an error while reconciling.  With the traditional log package, we might | ||||
| // write: | ||||
| //   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. | ||||
| // Logger has very few hard rules, with the goal that LogSink implementations | ||||
| // might have a lot of freedom to differentiate.  There are, however, some | ||||
| // things to consider. | ||||
| // | ||||
| // 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 | ||||
| // 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 | ||||
| // pairs).  Keys are arbitrary strings, while values may be any Go value. | ||||
| // Keys are arbitrary strings, but should generally be constant values.  Values | ||||
| // may be any Go value, but how the value is formatted is determined by the | ||||
| // LogSink implementation. | ||||
| // | ||||
| // Key Naming Conventions | ||||
| // | ||||
| @@ -102,6 +123,7 @@ limitations under the License. | ||||
| //   * be constant (not dependent on input data) | ||||
| //   * contain only printable characters | ||||
| //   * 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 | ||||
| // 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 | ||||
| // generally best to avoid using the following keys, as they're frequently used | ||||
| // by implementations: | ||||
| // | ||||
| //   * `"caller"`: the calling information (file/line) of a particular log line. | ||||
| //   * `"error"`: the underlying error value in the `Error` method. | ||||
| //   * `"level"`: the log level. | ||||
| //   * `"logger"`: the name of the associated logger. | ||||
| //   * `"msg"`: the log message. | ||||
| //   * `"stacktrace"`: the stack trace associated with a particular log line or | ||||
| //                     error (often from the `Error` message). | ||||
| //   * `"ts"`: the timestamp for a log line. | ||||
| //   * "caller": the calling information (file/line) of a particular log line | ||||
| //   * "error": the underlying error value in the `Error` method | ||||
| //   * "level": the log level | ||||
| //   * "logger": the name of the associated logger | ||||
| //   * "msg": the log message | ||||
| //   * "stacktrace": the stack trace associated with a particular log line or | ||||
| //                   error (often from the `Error` message) | ||||
| //   * "ts": the timestamp for a log line | ||||
| // | ||||
| // 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 | ||||
| // would be necessary to represent at least message and timestamp as ordinary | ||||
| // named values). | ||||
| // | ||||
| // Break Glass | ||||
| // | ||||
| // Implementations may choose to give callers access to the underlying | ||||
| // logging implementation.  The recommended pattern for this is: | ||||
| //   // Underlier exposes access to the underlying logging implementation. | ||||
| @@ -134,81 +157,222 @@ limitations under the License. | ||||
| //   type Underlier interface { | ||||
| //       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 | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| ) | ||||
|  | ||||
| // TODO: consider adding back in format strings if they're really needed | ||||
| // TODO: consider other bits of zap/zapcore functionality like ObjectMarshaller (for arbitrary objects) | ||||
| // TODO: consider other bits of glog functionality like Flush, OutputStats | ||||
|  | ||||
| // Logger represents the ability to log messages, both errors and not. | ||||
| type Logger interface { | ||||
| 	// Enabled tests whether this Logger is enabled.  For example, commandline | ||||
| 	// 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 | ||||
| // New returns a new Logger instance.  This is primarily used by libraries | ||||
| // implementing LogSink, rather than end users. | ||||
| func New(sink LogSink) Logger { | ||||
| 	logger := Logger{} | ||||
| 	logger.setSink(sink) | ||||
| 	sink.Init(runtimeInfo) | ||||
| 	return logger | ||||
| } | ||||
|  | ||||
| // InfoLogger provides compatibility with code that relies on the v0.1.0 | ||||
| // interface. | ||||
| // | ||||
| // Deprecated: InfoLogger is an artifact of early versions of this API.  New | ||||
| // users should never use it and existing users should use Logger instead. This | ||||
| // will be removed in a future release. | ||||
| type InfoLogger = Logger | ||||
| // setSink stores the sink and updates any related fields. It mutates the | ||||
| // logger and thus is only safe to use for loggers that are not currently being | ||||
| // used concurrently. | ||||
| func (l *Logger) setSink(sink LogSink) { | ||||
| 	l.sink = sink | ||||
| } | ||||
|  | ||||
| // 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{} | ||||
|  | ||||
| // FromContext returns a Logger constructed from ctx or nil if no | ||||
| // logger details are found. | ||||
| func FromContext(ctx context.Context) Logger { | ||||
| // FromContext returns a Logger from ctx or an error if no Logger is found. | ||||
| func FromContext(ctx context.Context) (Logger, error) { | ||||
| 	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 | ||||
| // that discards all messages if no logger details are found. | ||||
| // notFoundError exists to carry an IsNotFound method. | ||||
| 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 { | ||||
| 	if v, ok := ctx.Value(contextKey{}).(Logger); ok { | ||||
| 		return v | ||||
| @@ -217,12 +381,59 @@ func FromContextOrDiscard(ctx context.Context) Logger { | ||||
| 	return Discard() | ||||
| } | ||||
|  | ||||
| // NewContext returns a new context derived from ctx that embeds the Logger. | ||||
| func NewContext(ctx context.Context, l Logger) context.Context { | ||||
| 	return context.WithValue(ctx, contextKey{}, l) | ||||
| // NewContext returns a new Context, derived from ctx, which carries the | ||||
| // provided Logger. | ||||
| 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 | ||||
| // number of frames.  This is useful for users who have helper functions | ||||
| // 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 | ||||
| // support it. | ||||
| type CallDepthLogger interface { | ||||
| 	Logger | ||||
|  | ||||
| 	// WithCallDepth returns a Logger that will offset the call stack by the | ||||
| 	// 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 | ||||
| 	// depth is 1 the attribution should skip 1 call frame, and so on. | ||||
| type CallDepthLogSink interface { | ||||
| 	// WithCallDepth returns a LogSink that will offset the call | ||||
| 	// stack by the specified number of frames when logging call | ||||
| 	// site information. | ||||
| 	// | ||||
| 	// If depth is 0, the LogSink should skip exactly the number | ||||
| 	// 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. | ||||
| 	WithCallDepth(depth int) Logger | ||||
| 	WithCallDepth(depth int) LogSink | ||||
| } | ||||
|  | ||||
| // WithCallDepth returns a Logger that will offset 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. | ||||
| // CallStackHelperLogSink represents a Logger that knows how to climb | ||||
| // the call stack to identify the original call site and can skip | ||||
| // intermediate helper functions if they mark themselves as | ||||
| // helper. Go's testing package uses that approach. | ||||
| // | ||||
| // If the underlying log implementation supports the CallDepthLogger interface, | ||||
| // the WithCallDepth method will be called and the result returned.  If the | ||||
| // implementation does not support CallDepthLogger, the original Logger will be | ||||
| // returned. | ||||
| // This is useful for users who have helper functions between the | ||||
| // "real" call site and the actual calls to Logger methods. | ||||
| // Implementations that log information about the call site (such as | ||||
| // 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 | ||||
| // CallDepthLogger support themselves. | ||||
| func WithCallDepth(logger Logger, depth int) Logger { | ||||
| 	if decorator, ok := logger.(CallDepthLogger); ok { | ||||
| 		return decorator.WithCallDepth(depth) | ||||
| 	} | ||||
| 	return logger | ||||
| // This is an optional interface and implementations are not required | ||||
| // to support it. Implementations that choose to support this must not | ||||
| // simply implement it as WithCallDepth(1), because | ||||
| // Logger.WithCallStackHelper will call both methods if they are | ||||
| // present. This should only be implemented for LogSinks that actually | ||||
| // need it, as with testing.T. | ||||
| 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 | ||||
|  | ||||
| go 1.15 | ||||
| go 1.16 | ||||
|  | ||||
| replace go.opentelemetry.io/contrib => ../../../../ | ||||
|  | ||||
| require ( | ||||
| 	github.com/golang/protobuf v1.5.2 | ||||
| 	go.opentelemetry.io/otel v1.0.0 | ||||
| 	go.opentelemetry.io/otel/trace v1.0.0 | ||||
| 	google.golang.org/grpc v1.40.0 | ||||
| 	go.opentelemetry.io/otel v1.3.0 | ||||
| 	go.opentelemetry.io/otel/trace v1.3.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/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= | ||||
| 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/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/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/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/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.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.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/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/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | ||||
| 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/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/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/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/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| go.opentelemetry.io/otel v1.0.0 h1:qTTn6x71GVBvoafHK/yaRUmFzI4LcONZD0/kXxl5PHI= | ||||
| go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg= | ||||
| go.opentelemetry.io/otel/trace v1.0.0 h1:TSBr8GTEtKevYMG/2d21M989r5WJYVimhTHBKVEZuh4= | ||||
| go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs= | ||||
| go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= | ||||
| go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= | ||||
| go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= | ||||
| go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= | ||||
| go.opentelemetry.io/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-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.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= | ||||
| 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.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= | ||||
| google.golang.org/grpc v1.42.0 h1:XT2/MFpuPFsEX2fWh3YQtHkZ+WYZFQRfaUgLZYj/p6A= | ||||
| 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-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | ||||
| 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 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= | ||||
| 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/yaml.v2 v2.2.2/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/baggage" | ||||
| 	"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" | ||||
| ) | ||||
|  | ||||
|   | ||||
| @@ -18,7 +18,7 @@ import ( | ||||
| 	"strings" | ||||
|  | ||||
| 	"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 | ||||
|   | ||||
| @@ -16,7 +16,7 @@ package otelgrpc | ||||
|  | ||||
| import ( | ||||
| 	"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. | ||||
|   | ||||
| @@ -16,7 +16,7 @@ package otelgrpc | ||||
|  | ||||
| // Version is the current release version of the gRPC instrumentation. | ||||
| func Version() string { | ||||
| 	return "0.24.0" | ||||
| 	return "0.27.0" | ||||
| 	// 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] | ||||
|  | ||||
| ## [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 | ||||
|  | ||||
| ### Fixed | ||||
| @@ -1550,7 +1639,10 @@ It contains api and sdk for trace and meter. | ||||
| - CircleCI build CI manifest files. | ||||
| - 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 | ||||
| [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 | ||||
|   | ||||
							
								
								
									
										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 | ||||
|  | ||||
| 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) | ||||
| - [David Ashpole](https://github.com/dashpole), Google | ||||
| - [Gustavo Silva Paiva](https://github.com/paivagustavo), LightStep | ||||
| - [Aaron Clawson](https://github.com/MadVikingGod) | ||||
| - [Robert Pająk](https://github.com/pellared), Splunk | ||||
|  | ||||
| Maintainers: | ||||
|  | ||||
| - [Aaron Clawson](https://github.com/MadVikingGod), LightStep | ||||
| - [Anthony Mirabella](https://github.com/Aneurysm9), AWS | ||||
| - [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 .); \ | ||||
| 	done | ||||
|  | ||||
| generate: $(STRINGER) | ||||
| generate: $(STRINGER) $(PORTO) | ||||
| 	set -e; for dir in $(ALL_GO_MOD_DIRS); do \ | ||||
| 	  echo "$(GO) generate $${dir}/..."; \ | ||||
| 	  (cd "$${dir}" && \ | ||||
| @@ -145,7 +145,7 @@ lint: misspell lint-modules | $(GOLANGCI_LINT) | ||||
|  | ||||
| .PHONY: vanity-import-check | ||||
| vanity-import-check: | $(PORTO) | ||||
| 	$(PORTO) -l . | ||||
| 	$(PORTO) --include-internal -l . | ||||
|  | ||||
| .PHONY: 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 | ||||
|  | ||||
| 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. | ||||
|  | ||||
| | OS      | Go Version | Architecture | | ||||
| | ------- | ---------- | ------------ | | ||||
| | Ubuntu  | 1.17       | amd64        | | ||||
| | Ubuntu  | 1.16       | amd64        | | ||||
| | Ubuntu  | 1.15       | amd64        | | ||||
| | Ubuntu  | 1.17       | 386          | | ||||
| | Ubuntu  | 1.16       | 386          | | ||||
| | Ubuntu  | 1.15       | 386          | | ||||
| | MacOS   | 1.17       | amd64        | | ||||
| | MacOS   | 1.16       | amd64        | | ||||
| | MacOS   | 1.15       | amd64        | | ||||
| | Windows | 1.17       | amd64        | | ||||
| | Windows | 1.16       | amd64        | | ||||
| | Windows | 1.15       | amd64        | | ||||
| | Windows | 1.17       | 386          | | ||||
| | Windows | 1.16       | 386          | | ||||
| | Windows | 1.15       | 386          | | ||||
|  | ||||
| While this project should work for other systems, no compatibility guarantees | ||||
| 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. | ||||
|  | ||||
| package attribute // import "go.opentelemetry.io/otel/attribute" | ||||
| package attribute | ||||
|  | ||||
| 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 | ||||
| // 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 ( | ||||
| 	"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 | ||||
| // 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) | ||||
| 
 | ||||
| // 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 { | ||||
| 	if !c.Enabled { | ||||
| 		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 { | ||||
| 	case <-ctx.Done(): | ||||
| 		return ctx.Err() | ||||
| 		// 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() | ||||
| 		} | ||||
| 	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 | ||||
|  | ||||
| The following environment variables can be used | ||||
| (instead of options objects) to override the default configuration. | ||||
| The following environment variables can be used (instead of options objects) to | ||||
| 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                       | | ||||
| | ------------------------------------------------------------------------ |------------------------------ | ----------------------------------- | | ||||
|   | ||||
							
								
								
									
										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" | ||||
|  | ||||
| 	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform" | ||||
|  | ||||
| 	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 | ||||
|  | ||||
| go 1.15 | ||||
| go 1.16 | ||||
|  | ||||
| require ( | ||||
| 	github.com/cenkalti/backoff/v4 v4.1.1 | ||||
| 	github.com/google/go-cmp v0.5.6 | ||||
| 	github.com/stretchr/testify v1.7.0 | ||||
| 	go.opentelemetry.io/otel v1.0.1 | ||||
| 	go.opentelemetry.io/otel/sdk v1.0.1 | ||||
| 	go.opentelemetry.io/otel/trace v1.0.1 | ||||
| 	go.opentelemetry.io/proto/otlp v0.9.0 | ||||
| 	google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 | ||||
| 	google.golang.org/grpc v1.41.0 | ||||
| 	go.opentelemetry.io/otel v1.3.0 | ||||
| 	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 | ||||
| 	go.opentelemetry.io/otel/sdk v1.3.0 | ||||
| 	go.opentelemetry.io/otel/trace v1.3.0 | ||||
| 	go.opentelemetry.io/proto/otlp v0.11.0 | ||||
| 	google.golang.org/grpc v1.42.0 | ||||
| 	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/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= | ||||
| 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/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.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/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | ||||
| 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-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-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/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.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.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/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/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/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | ||||
| 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/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.9.0 h1:C0g6TWmQYvjKRnljRULLWUVJGy8Uvu0NEL/5frY2/t4= | ||||
| go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= | ||||
| go.opentelemetry.io/proto/otlp v0.11.0 h1:cLDgIBTf4lLOlztkhzAEdQsJ4Lj+i5Wc9k6Nn0K1VyU= | ||||
| 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-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| 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.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= | ||||
| 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.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E= | ||||
| google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= | ||||
| google.golang.org/grpc v1.42.0 h1:XT2/MFpuPFsEX2fWh3YQtHkZ+WYZFQRfaUgLZYj/p6A= | ||||
| 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-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | ||||
| 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 | ||||
| // limitations under the License. | ||||
|  | ||||
| package otlpconfig | ||||
| package otlpconfig // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig" | ||||
|  | ||||
| import ( | ||||
| 	"crypto/tls" | ||||
| @@ -20,7 +20,7 @@ import ( | ||||
| 	"io/ioutil" | ||||
| 	"net/url" | ||||
| 	"os" | ||||
| 	"regexp" | ||||
| 	"path" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| @@ -28,24 +28,17 @@ import ( | ||||
| 	"go.opentelemetry.io/otel" | ||||
| ) | ||||
|  | ||||
| var httpSchemeRegexp = regexp.MustCompile(`(?i)^(http://|https://)`) | ||||
| var DefaultEnvOptionsReader = EnvOptionsReader{ | ||||
| 	GetEnv:   os.Getenv, | ||||
| 	ReadFile: ioutil.ReadFile, | ||||
| } | ||||
|  | ||||
| func ApplyGRPCEnvConfigs(cfg *Config) { | ||||
| 	e := EnvOptionsReader{ | ||||
| 		GetEnv:   os.Getenv, | ||||
| 		ReadFile: ioutil.ReadFile, | ||||
| 	} | ||||
|  | ||||
| 	e.ApplyGRPCEnvConfigs(cfg) | ||||
| 	DefaultEnvOptionsReader.ApplyGRPCEnvConfigs(cfg) | ||||
| } | ||||
|  | ||||
| func ApplyHTTPEnvConfigs(cfg *Config) { | ||||
| 	e := EnvOptionsReader{ | ||||
| 		GetEnv:   os.Getenv, | ||||
| 		ReadFile: ioutil.ReadFile, | ||||
| 	} | ||||
|  | ||||
| 	e.ApplyHTTPEnvConfigs(cfg) | ||||
| 	DefaultEnvOptionsReader.ApplyHTTPEnvConfigs(cfg) | ||||
| } | ||||
|  | ||||
| type EnvOptionsReader struct { | ||||
| @@ -71,23 +64,55 @@ func (e *EnvOptionsReader) GetOptionsFromEnv() []GenericOption { | ||||
| 	var opts []GenericOption | ||||
|  | ||||
| 	// 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 isInsecureEndpoint(v) { | ||||
| 			opts = append(opts, WithInsecure()) | ||||
| 		} else { | ||||
| 			opts = append(opts, WithSecure()) | ||||
| 		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 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) | ||||
| 			})) | ||||
| 		} | ||||
|  | ||||
| 		opts = append(opts, WithEndpoint(trimSchema(v))) | ||||
| 	} | ||||
|  | ||||
| 	// Certificate File | ||||
| @@ -136,12 +161,13 @@ func (e *EnvOptionsReader) GetOptionsFromEnv() []GenericOption { | ||||
| 	return opts | ||||
| } | ||||
|  | ||||
| func isInsecureEndpoint(endpoint string) bool { | ||||
| 	return strings.HasPrefix(strings.ToLower(endpoint), "http://") || strings.HasPrefix(strings.ToLower(endpoint), "unix://") | ||||
| } | ||||
|  | ||||
| func trimSchema(endpoint string) string { | ||||
| 	return httpSchemeRegexp.ReplaceAllString(endpoint, "") | ||||
| func insecureSchema(schema string) bool { | ||||
| 	switch strings.ToLower(schema) { | ||||
| 	case "http", "unix": | ||||
| 		return true | ||||
| 	default: | ||||
| 		return false | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // 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" | ||||
|  | ||||
| 	"google.golang.org/grpc" | ||||
| 	"google.golang.org/grpc/backoff" | ||||
| 	"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 ( | ||||
| @@ -58,6 +60,7 @@ type ( | ||||
| 		ReconnectionPeriod time.Duration | ||||
| 		ServiceConfig      string | ||||
| 		DialOptions        []grpc.DialOption | ||||
| 		GRPCConn           *grpc.ClientConn | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| @@ -75,6 +78,46 @@ func NewDefaultConfig() Config { | ||||
| 	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 ( | ||||
| 	// GenericOption applies an option to the HTTP or gRPC driver. | ||||
| 	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 | ||||
| // limitations under the License. | ||||
|  | ||||
| package otlpconfig | ||||
| package otlpconfig // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig" | ||||
|  | ||||
| import ( | ||||
| 	"crypto/tls" | ||||
|   | ||||
| @@ -12,13 +12,12 @@ | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package tracetransform | ||||
| package tracetransform // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform" | ||||
|  | ||||
| import ( | ||||
| 	"go.opentelemetry.io/otel/attribute" | ||||
| 	commonpb "go.opentelemetry.io/proto/otlp/common/v1" | ||||
|  | ||||
| 	"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. | ||||
|   | ||||
| @@ -12,12 +12,11 @@ | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package tracetransform | ||||
| package tracetransform // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform" | ||||
|  | ||||
| import ( | ||||
| 	commonpb "go.opentelemetry.io/proto/otlp/common/v1" | ||||
|  | ||||
| 	"go.opentelemetry.io/otel/sdk/instrumentation" | ||||
| 	commonpb "go.opentelemetry.io/proto/otlp/common/v1" | ||||
| ) | ||||
|  | ||||
| func InstrumentationLibrary(il instrumentation.Library) *commonpb.InstrumentationLibrary { | ||||
|   | ||||
| @@ -12,12 +12,11 @@ | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package tracetransform | ||||
| package tracetransform // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform" | ||||
|  | ||||
| import ( | ||||
| 	resourcepb "go.opentelemetry.io/proto/otlp/resource/v1" | ||||
|  | ||||
| 	"go.opentelemetry.io/otel/sdk/resource" | ||||
| 	resourcepb "go.opentelemetry.io/proto/otlp/resource/v1" | ||||
| ) | ||||
|  | ||||
| // Resource transforms a Resource into an OTLP Resource. | ||||
|   | ||||
| @@ -12,16 +12,15 @@ | ||||
| // See the License for the specific language governing permissions and | ||||
| // limitations under the License. | ||||
|  | ||||
| package tracetransform | ||||
| package tracetransform // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform" | ||||
|  | ||||
| import ( | ||||
| 	"go.opentelemetry.io/otel/attribute" | ||||
| 	"go.opentelemetry.io/otel/codes" | ||||
| 	tracepb "go.opentelemetry.io/proto/otlp/trace/v1" | ||||
|  | ||||
| 	"go.opentelemetry.io/otel/sdk/instrumentation" | ||||
| 	tracesdk "go.opentelemetry.io/otel/sdk/trace" | ||||
| 	"go.opentelemetry.io/otel/trace" | ||||
| 	tracepb "go.opentelemetry.io/proto/otlp/trace/v1" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
|   | ||||
							
								
								
									
										287
									
								
								vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										287
									
								
								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 ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"sync" | ||||
| 	"time" | ||||
|  | ||||
| 	"go.opentelemetry.io/otel/exporters/otlp/otlptrace" | ||||
| 	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/connection" | ||||
|  | ||||
| 	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig" | ||||
|  | ||||
| 	"google.golang.org/genproto/googleapis/rpc/errdetails" | ||||
| 	"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" | ||||
| 	tracepb "go.opentelemetry.io/proto/otlp/trace/v1" | ||||
| ) | ||||
|  | ||||
| type client struct { | ||||
| 	connection *connection.Connection | ||||
| 	endpoint      string | ||||
| 	dialOpts      []grpc.DialOption | ||||
| 	metadata      metadata.MD | ||||
| 	exportTimeout time.Duration | ||||
| 	requestFunc   retry.RequestFunc | ||||
|  | ||||
| 	lock         sync.Mutex | ||||
| 	tracesClient coltracepb.TraceServiceClient | ||||
| 	// stopCtx is used as a parent context for all exports. Therefore, when it | ||||
| 	// 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 ( | ||||
| 	errNoClient = errors.New("no client") | ||||
| ) | ||||
|  | ||||
| // NewClient creates a new gRPC trace client. | ||||
| func NewClient(opts ...Option) otlptrace.Client { | ||||
| 	cfg := otlpconfig.NewDefaultConfig() | ||||
| 	otlpconfig.ApplyGRPCEnvConfigs(&cfg) | ||||
| 	for _, opt := range opts { | ||||
| 		opt.applyGRPCOption(&cfg) | ||||
| 	return newClient(opts...) | ||||
| } | ||||
|  | ||||
| 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{} | ||||
| 	c.connection = connection.NewConnection(cfg, cfg.Traces, c.handleNewConnection) | ||||
| 	if len(cfg.Traces.Headers) > 0 { | ||||
| 		c.metadata = metadata.New(cfg.Traces.Headers) | ||||
| 	} | ||||
|  | ||||
| 	return c | ||||
| } | ||||
|  | ||||
| func (c *client) handleNewConnection(cc *grpc.ClientConn) { | ||||
| 	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. | ||||
| // Start establishes a gRPC connection to the collector. | ||||
| func (c *client) Start(ctx context.Context) error { | ||||
| 	return c.connection.StartConnection(ctx) | ||||
| } | ||||
|  | ||||
| // Stop shuts down the connection to the collector. | ||||
| func (c *client) Stop(ctx context.Context) error { | ||||
| 	return c.connection.Shutdown(ctx) | ||||
| } | ||||
|  | ||||
| // UploadTraces sends a batch of spans to the collector. | ||||
| func (c *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.ResourceSpans) error { | ||||
| 	if !c.connection.Connected() { | ||||
| 		return fmt.Errorf("traces exporter is disconnected from the server %s: %w", c.connection.SCfg.Endpoint, c.connection.LastConnectError()) | ||||
| 	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 | ||||
| 	} | ||||
|  | ||||
| 	ctx, cancel := c.connection.ContextWithStop(ctx) | ||||
| 	defer cancel() | ||||
| 	ctx, tCancel := context.WithTimeout(ctx, c.connection.SCfg.Timeout) | ||||
| 	defer tCancel() | ||||
| 	// 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() | ||||
|  | ||||
| 	ctx = c.connection.ContextWithMetadata(ctx) | ||||
| 	err := func() error { | ||||
| 		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, | ||||
| 			}) | ||||
| 			return err | ||||
| 		}) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| 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 { | ||||
| 	// Acquire the c.tscMu lock within the ctx lifetime. | ||||
| 	acquired := make(chan struct{}) | ||||
| 	go func() { | ||||
| 		c.tscMu.Lock() | ||||
| 		close(acquired) | ||||
| 	}() | ||||
| 	if err != nil { | ||||
| 		c.connection.SetStateDisconnected(err) | ||||
| 	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 | ||||
| } | ||||
|  | ||||
| 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 { | ||||
| 	// Hold a read lock to ensure a shut down initiated after this starts does | ||||
| 	// 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.exportContext(ctx) | ||||
| 	defer cancel() | ||||
|  | ||||
| 	return c.requestFunc(ctx, func(iCtx context.Context) error { | ||||
| 		_, err := c.tsc.Export(iCtx, &coltracepb.ExportTraceServiceRequest{ | ||||
| 			ResourceSpans: protoSpans, | ||||
| 		}) | ||||
| 		// nil is converted to OK. | ||||
| 		if status.Code(err) == codes.OK { | ||||
| 			// Success. | ||||
| 			return nil | ||||
| 		} | ||||
| 		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 | ||||
|  | ||||
| go 1.15 | ||||
| go 1.16 | ||||
|  | ||||
| require ( | ||||
| 	github.com/stretchr/testify v1.7.0 | ||||
| 	go.opentelemetry.io/otel v1.0.1 | ||||
| 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1 | ||||
| 	go.opentelemetry.io/otel/sdk v1.0.1 | ||||
| 	go.opentelemetry.io/proto/otlp v0.9.0 | ||||
| 	google.golang.org/grpc v1.41.0 | ||||
| 	go.opentelemetry.io/otel v1.3.0 | ||||
| 	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 | ||||
| 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 | ||||
| 	go.opentelemetry.io/otel/sdk v1.3.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 => ../../../.. | ||||
| @@ -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/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= | ||||
| 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/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.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/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | ||||
| 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-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-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/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.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.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/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/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/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | ||||
| 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/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/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/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||
| 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.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= | ||||
| 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.9.0 h1:C0g6TWmQYvjKRnljRULLWUVJGy8Uvu0NEL/5frY2/t4= | ||||
| go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= | ||||
| go.opentelemetry.io/proto/otlp v0.11.0 h1:cLDgIBTf4lLOlztkhzAEdQsJ4Lj+i5Wc9k6Nn0K1VyU= | ||||
| 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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| 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/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-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-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-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-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-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-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-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-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-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-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/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.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-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-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-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= | ||||
| 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.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= | ||||
| 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.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E= | ||||
| google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= | ||||
| google.golang.org/grpc v1.42.0 h1:XT2/MFpuPFsEX2fWh3YQtHkZ+WYZFQRfaUgLZYj/p6A= | ||||
| 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-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | ||||
| 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.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= | ||||
| 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 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.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| 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" | ||||
| 	"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/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. | ||||
| @@ -31,8 +31,19 @@ type Option interface { | ||||
| 	applyGRPCOption(*otlpconfig.Config) | ||||
| } | ||||
|  | ||||
| // RetryConfig defines configuration for retrying batches in case of export | ||||
| // failure using an exponential backoff. | ||||
| func asGRPCOptions(opts []Option) []otlpconfig.GRPCOption { | ||||
| 	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 wrappedOption struct { | ||||
| @@ -43,22 +54,28 @@ func (w wrappedOption) applyGRPCOption(cfg *otlpconfig.Config) { | ||||
| 	w.ApplyGRPCOption(cfg) | ||||
| } | ||||
|  | ||||
| // WithInsecure disables client transport security for the exporter's gRPC connection | ||||
| // just like grpc.WithInsecure() https://pkg.go.dev/google.golang.org/grpc#WithInsecure | ||||
| // does. Note, by default, client security is required unless WithInsecure is used. | ||||
| // WithInsecure disables client transport security for the exporter's gRPC | ||||
| // connection just like grpc.WithInsecure() | ||||
| // (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 { | ||||
| 	return wrappedOption{otlpconfig.WithInsecure()} | ||||
| } | ||||
|  | ||||
| // WithEndpoint allows one to set the endpoint that the exporter will | ||||
| // connect to the collector on. If unset, it will instead try to use | ||||
| // connect to DefaultCollectorHost:DefaultCollectorPort. | ||||
| // WithEndpoint sets the target endpoint the exporter will connect to. If | ||||
| // unset, localhost:4317 will be used as a default. | ||||
| // | ||||
| // This option has no effect if WithGRPCConn is used. | ||||
| func WithEndpoint(endpoint string) Option { | ||||
| 	return wrappedOption{otlpconfig.WithEndpoint(endpoint)} | ||||
| } | ||||
|  | ||||
| // WithReconnectionPeriod allows one to set the delay between next connection attempt | ||||
| // after failing to connect with the collector. | ||||
| // WithReconnectionPeriod set the minimum amount of time between connection | ||||
| // attempts to the target endpoint. | ||||
| // | ||||
| // This option has no effect if WithGRPCConn is used. | ||||
| func WithReconnectionPeriod(rp time.Duration) Option { | ||||
| 	return wrappedOption{otlpconfig.NewGRPCOption(func(cfg *otlpconfig.Config) { | ||||
| 		cfg.ReconnectionPeriod = rp | ||||
| @@ -75,25 +92,30 @@ func compressorToCompression(compressor string) otlpconfig.Compression { | ||||
| 	return otlpconfig.NoCompression | ||||
| } | ||||
|  | ||||
| // WithCompressor will set the compressor for the gRPC client to use when sending requests. | ||||
| // It is the responsibility of the caller to ensure that the compressor set has been registered | ||||
| // with google.golang.org/grpc/encoding. This can be done by encoding.RegisterCompressor. Some | ||||
| // compressors auto-register on import, such as gzip, which can be registered by calling | ||||
| // WithCompressor sets the compressor for the gRPC client to use when sending | ||||
| // requests. It is the responsibility of the caller to ensure that the | ||||
| // compressor set has been registered with google.golang.org/grpc/encoding. | ||||
| // 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"`. | ||||
| // | ||||
| // This option has no effect if WithGRPCConn is used. | ||||
| func WithCompressor(compressor string) Option { | ||||
| 	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 { | ||||
| 	return wrappedOption{otlpconfig.WithHeaders(headers)} | ||||
| } | ||||
|  | ||||
| // WithTLSCredentials allows the connection to use TLS credentials | ||||
| // when talking to the server. It takes in grpc.TransportCredentials instead | ||||
| // of say a Certificate file or a tls.Certificate, because the retrieving of | ||||
| // these credentials can be done in many ways e.g. plain file, in code tls.Config | ||||
| // or by certificate rotation, so it is up to the caller to decide what to use. | ||||
| // WithTLSCredentials allows the connection to use TLS credentials when | ||||
| // talking to the server. It takes in grpc.TransportCredentials instead of say | ||||
| // a Certificate file or a tls.Certificate, because the retrieving of these | ||||
| // credentials can be done in many ways e.g. plain file, in code tls.Config or | ||||
| // 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 { | ||||
| 	return wrappedOption{otlpconfig.NewGRPCOption(func(cfg *otlpconfig.Config) { | ||||
| 		cfg.Traces.GRPCCredentials = creds | ||||
| @@ -101,32 +123,63 @@ func WithTLSCredentials(creds credentials.TransportCredentials) Option { | ||||
| } | ||||
|  | ||||
| // WithServiceConfig defines the default gRPC service config used. | ||||
| // | ||||
| // This option has no effect if WithGRPCConn is used. | ||||
| func WithServiceConfig(serviceConfig string) Option { | ||||
| 	return wrappedOption{otlpconfig.NewGRPCOption(func(cfg *otlpconfig.Config) { | ||||
| 		cfg.ServiceConfig = serviceConfig | ||||
| 	})} | ||||
| } | ||||
|  | ||||
| // WithDialOption opens support to any grpc.DialOption to be used. If it conflicts | ||||
| // with some other configuration the GRPC specified via the collector the ones here will | ||||
| // take preference since they are set last. | ||||
| // WithDialOption sets explicit grpc.DialOptions to use when making a | ||||
| // connection. The options here are appended to the internal grpc.DialOptions | ||||
| // 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 { | ||||
| 	return wrappedOption{otlpconfig.NewGRPCOption(func(cfg *otlpconfig.Config) { | ||||
| 		cfg.DialOptions = opts | ||||
| 	})} | ||||
| } | ||||
|  | ||||
| // WithTimeout tells the driver the max waiting time for the backend to process | ||||
| // each spans batch. If unset, the default will be 10 seconds. | ||||
| // WithGRPCConn sets conn as the gRPC ClientConn used for all communication. | ||||
| // | ||||
| // 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 { | ||||
| 	return wrappedOption{otlpconfig.WithTimeout(duration)} | ||||
| } | ||||
|  | ||||
| // WithRetry configures the retry policy for transient errors that may occurs | ||||
| // when exporting traces. An exponential back-off algorithm is used to ensure | ||||
| // endpoints are not overwhelmed with retries. If unset, the default retry | ||||
| // policy will retry after 5 seconds and increase exponentially after each | ||||
| // error for a total of 1 minute. | ||||
| // WithRetry sets the retry policy for transient retryable errors that may be | ||||
| // returned by the target endpoint when exporting a batch of spans. | ||||
| // | ||||
| // If the target endpoint responds with not only a retryable error, but | ||||
| // 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 { | ||||
| 	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 | ||||
|  | ||||
| go 1.15 | ||||
| go 1.16 | ||||
|  | ||||
| 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/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 => ./ | ||||
| @@ -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/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/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/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | ||||
|   | ||||
							
								
								
									
										67
									
								
								vendor/go.opentelemetry.io/otel/handler.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										67
									
								
								vendor/go.opentelemetry.io/otel/handler.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -18,7 +18,6 @@ import ( | ||||
| 	"log" | ||||
| 	"os" | ||||
| 	"sync" | ||||
| 	"sync/atomic" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| @@ -28,44 +27,45 @@ var ( | ||||
| 	// `Handle` and will be delegated to the registered ErrorHandler. | ||||
| 	globalErrorHandler = defaultErrorHandler() | ||||
|  | ||||
| 	// delegateErrorHandlerOnce ensures that a user provided ErrorHandler is | ||||
| 	// only ever registered once. | ||||
| 	delegateErrorHandlerOnce sync.Once | ||||
|  | ||||
| 	// Compile-time check that delegator implements ErrorHandler. | ||||
| 	_ ErrorHandler = (*delegator)(nil) | ||||
| 	// Compile-time check that errLogger implements ErrorHandler. | ||||
| 	_ ErrorHandler = (*errLogger)(nil) | ||||
| ) | ||||
|  | ||||
| type holder struct { | ||||
| 	eh ErrorHandler | ||||
| } | ||||
|  | ||||
| func defaultErrorHandler() *atomic.Value { | ||||
| 	v := &atomic.Value{} | ||||
| 	v.Store(holder{eh: &delegator{l: log.New(os.Stderr, "", log.LstdFlags)}}) | ||||
| 	return v | ||||
| } | ||||
|  | ||||
| // delegator logs errors if no delegate is set, otherwise they are delegated. | ||||
| type delegator struct { | ||||
| 	delegate atomic.Value | ||||
| 	lock *sync.RWMutex | ||||
| 	eh   ErrorHandler | ||||
| } | ||||
|  | ||||
| 	l *log.Logger | ||||
| func (d *delegator) Handle(err error) { | ||||
| 	d.lock.RLock() | ||||
| 	defer d.lock.RUnlock() | ||||
| 	d.eh.Handle(err) | ||||
| } | ||||
|  | ||||
| // setDelegate sets the ErrorHandler delegate. | ||||
| func (h *delegator) setDelegate(d ErrorHandler) { | ||||
| 	// It is critical this is guarded with delegateErrorHandlerOnce, if it is | ||||
| 	// called again with a different concrete type it will panic. | ||||
| 	h.delegate.Store(d) | ||||
| func (d *delegator) setDelegate(eh ErrorHandler) { | ||||
| 	d.lock.Lock() | ||||
| 	defer d.lock.Unlock() | ||||
| 	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. | ||||
| func (h *delegator) Handle(err error) { | ||||
| 	if d := h.delegate.Load(); d != nil { | ||||
| 		d.(ErrorHandler).Handle(err) | ||||
| 		return | ||||
| 	} | ||||
| func (h *errLogger) Handle(err error) { | ||||
| 	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 | ||||
| // to the new ErrorHandler for prior returned instances. | ||||
| func GetErrorHandler() ErrorHandler { | ||||
| 	return globalErrorHandler.Load().(holder).eh | ||||
| 	return globalErrorHandler | ||||
| } | ||||
|  | ||||
| // SetErrorHandler sets the global ErrorHandler to h. | ||||
| @@ -89,16 +89,7 @@ func GetErrorHandler() ErrorHandler { | ||||
| // ErrorHandler. Subsequent calls will set the global ErrorHandler, but not | ||||
| // delegate errors to h. | ||||
| func SetErrorHandler(h ErrorHandler) { | ||||
| 	delegateErrorHandlerOnce.Do(func() { | ||||
| 		current := GetErrorHandler() | ||||
| 		if current == h { | ||||
| 			return | ||||
| 		} | ||||
| 		if internalHandler, ok := current.(*delegator); ok { | ||||
| 			internalHandler.setDelegate(h) | ||||
| 		} | ||||
| 	}) | ||||
| 	globalErrorHandler.Store(holder{eh: h}) | ||||
| 	globalErrorHandler.setDelegate(h) | ||||
| } | ||||
|  | ||||
| // 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 | ||||
| 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, | ||||
| // 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 | ||||
| // limitations under the License. | ||||
|  | ||||
| package baggage | ||||
| package baggage // import "go.opentelemetry.io/otel/internal/baggage" | ||||
|  | ||||
| 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 | ||||
| // limitations under the License. | ||||
|  | ||||
| package global | ||||
| package global // import "go.opentelemetry.io/otel/internal/global" | ||||
|  | ||||
| import ( | ||||
| 	"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 | ||||
| // limitations under the License. | ||||
|  | ||||
| package global | ||||
| package global // import "go.opentelemetry.io/otel/internal/global" | ||||
|  | ||||
| import ( | ||||
| 	"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 | ||||
| // 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 | ||||
|   | ||||
							
								
								
									
										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 | ||||
| // limitations under the License. | ||||
|  | ||||
| package internal | ||||
| package internal // import "go.opentelemetry.io/otel/internal" | ||||
|  | ||||
| import ( | ||||
| 	"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. | ||||
| // | ||||
| // 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{} | ||||
|  | ||||
| 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 | ||||
| package is the W3C Trace Context encoding | ||||
| (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" | ||||
|   | ||||
							
								
								
									
										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. | ||||
| } | ||||
|  | ||||
| // 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. | ||||
| 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 | ||||
| // limitations under the License. | ||||
|  | ||||
| package internal | ||||
| package internal // import "go.opentelemetry.io/otel/sdk/internal" | ||||
|  | ||||
| import ( | ||||
| 	"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/attribute" | ||||
| 	semconv "go.opentelemetry.io/otel/semconv/v1.4.0" | ||||
| 	semconv "go.opentelemetry.io/otel/semconv/v1.7.0" | ||||
| ) | ||||
|  | ||||
| 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" | ||||
|  | ||||
| 	"go.opentelemetry.io/otel/attribute" | ||||
| 	semconv "go.opentelemetry.io/otel/semconv/v1.4.0" | ||||
| 	semconv "go.opentelemetry.io/otel/semconv/v1.7.0" | ||||
| ) | ||||
|  | ||||
| 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" | ||||
|  | ||||
| 	"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) | ||||
|   | ||||
							
								
								
									
										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 | ||||
| // limitations under the License. | ||||
|  | ||||
| //go: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" | ||||
|   | ||||
							
								
								
									
										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" | ||||
| 	"runtime" | ||||
|  | ||||
| 	semconv "go.opentelemetry.io/otel/semconv/v1.4.0" | ||||
| 	semconv "go.opentelemetry.io/otel/semconv/v1.7.0" | ||||
| ) | ||||
|  | ||||
| type pidProvider func() int | ||||
|   | ||||
							
								
								
									
										39
									
								
								vendor/go.opentelemetry.io/otel/sdk/resource/resource.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								vendor/go.opentelemetry.io/otel/sdk/resource/resource.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -18,6 +18,7 @@ import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"sync" | ||||
|  | ||||
| 	"go.opentelemetry.io/otel" | ||||
| 	"go.opentelemetry.io/otel/attribute" | ||||
| @@ -36,26 +37,12 @@ type Resource struct { | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	emptyResource Resource | ||||
|  | ||||
| 	defaultResource = func(r *Resource, err error) *Resource { | ||||
| 		if err != nil { | ||||
| 			otel.Handle(err) | ||||
| 		} | ||||
| 		return r | ||||
| 	}( | ||||
| 		Detect( | ||||
| 			context.Background(), | ||||
| 			defaultServiceNameDetector{}, | ||||
| 			fromEnv{}, | ||||
| 			telemetrySDK{}, | ||||
| 		), | ||||
| 	) | ||||
| 	emptyResource       Resource | ||||
| 	defaultResource     *Resource | ||||
| 	defaultResourceOnce sync.Once | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	errMergeConflictSchemaURL = errors.New("cannot merge resource due to conflicting Schema URL") | ||||
| ) | ||||
| var errMergeConflictSchemaURL = errors.New("cannot merge resource due to conflicting Schema URL") | ||||
|  | ||||
| // New returns a Resource combined from the user-provided detectors. | ||||
| 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 | ||||
| // "service.name" and OpenTelemetrySDK attributes. | ||||
| 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 | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										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" | ||||
|  | ||||
| 	"go.opentelemetry.io/otel" | ||||
| 	"go.opentelemetry.io/otel/internal/global" | ||||
| 	"go.opentelemetry.io/otel/trace" | ||||
| ) | ||||
|  | ||||
| // Defaults for BatchSpanProcessorOptions. | ||||
| @@ -153,10 +155,29 @@ func (bsp *batchSpanProcessor) Shutdown(ctx context.Context) error { | ||||
| 	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. | ||||
| func (bsp *batchSpanProcessor) ForceFlush(ctx context.Context) error { | ||||
| 	var err error | ||||
| 	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) | ||||
| 		go func() { | ||||
| 			wait <- bsp.exportSpans(ctx) | ||||
| @@ -204,6 +225,7 @@ func WithBlocking() BatchSpanProcessorOption { | ||||
|  | ||||
| // exportSpans is a subroutine of processing and draining the queue. | ||||
| func (bsp *batchSpanProcessor) exportSpans(ctx context.Context) error { | ||||
|  | ||||
| 	bsp.timer.Reset(bsp.o.BatchTimeout) | ||||
|  | ||||
| 	bsp.batchMutex.Lock() | ||||
| @@ -216,6 +238,7 @@ func (bsp *batchSpanProcessor) exportSpans(ctx context.Context) error { | ||||
| 	} | ||||
|  | ||||
| 	if l := len(bsp.batch); l > 0 { | ||||
| 		global.Debug("exporting spans", "count", len(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. | ||||
| @@ -248,6 +271,10 @@ func (bsp *batchSpanProcessor) processQueue() { | ||||
| 				otel.Handle(err) | ||||
| 			} | ||||
| 		case sd := <-bsp.queue: | ||||
| 			if ffs, ok := sd.(forceFlushSpan); ok { | ||||
| 				close(ffs.flushed) | ||||
| 				continue | ||||
| 			} | ||||
| 			bsp.batchMutex.Lock() | ||||
| 			bsp.batch = append(bsp.batch, sd) | ||||
| 			shouldExport := len(bsp.batch) >= bsp.o.MaxExportBatchSize | ||||
| @@ -296,8 +323,12 @@ func (bsp *batchSpanProcessor) drainQueue() { | ||||
| } | ||||
|  | ||||
| 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() { | ||||
| 		return | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	// This ensures the bsp.queue<- below does not panic as the | ||||
| @@ -317,18 +348,24 @@ func (bsp *batchSpanProcessor) enqueue(sd ReadOnlySpan) { | ||||
|  | ||||
| 	select { | ||||
| 	case <-bsp.stopCh: | ||||
| 		return | ||||
| 		return false | ||||
| 	default: | ||||
| 	} | ||||
|  | ||||
| 	if bsp.o.BlockOnQueueFull { | ||||
| 		bsp.queue <- sd | ||||
| 		return | ||||
| 	if block { | ||||
| 		select { | ||||
| 		case bsp.queue <- sd: | ||||
| 			return true | ||||
| 		case <-ctx.Done(): | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	select { | ||||
| 	case bsp.queue <- sd: | ||||
| 		return true | ||||
| 	default: | ||||
| 		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" | ||||
|  | ||||
| 	"go.opentelemetry.io/otel" | ||||
| 	"go.opentelemetry.io/otel/trace" | ||||
|  | ||||
| 	"go.opentelemetry.io/otel/sdk/instrumentation" | ||||
| 	"go.opentelemetry.io/otel/sdk/resource" | ||||
| 	"go.opentelemetry.io/otel/trace" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
|   | ||||
							
								
								
									
										16
									
								
								vendor/go.opentelemetry.io/otel/sdk/trace/simple_span_processor.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/go.opentelemetry.io/otel/sdk/trace/simple_span_processor.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -88,10 +88,24 @@ func (ssp *simpleSpanProcessor) Shutdown(ctx context.Context) error { | ||||
|  | ||||
| 		go shutdown() | ||||
|  | ||||
| 		// Wait for the exporter to shut down or the deadline to expire. | ||||
| 		select { | ||||
| 		case err = <-done: | ||||
| 		case <-ctx.Done(): | ||||
| 			err = ctx.Err() | ||||
| 			// 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() | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	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/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/internal" | ||||
| 	"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 | ||||
| @@ -453,7 +452,7 @@ func (s *recordingSpan) Resource() *resource.Resource { | ||||
| } | ||||
|  | ||||
| func (s *recordingSpan) addLink(link trace.Link) { | ||||
| 	if !s.IsRecording() { | ||||
| 	if !s.IsRecording() || !link.SpanContext.IsValid() { | ||||
| 		return | ||||
| 	} | ||||
| 	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" | ||||
| 	"time" | ||||
|  | ||||
| 	"go.opentelemetry.io/otel/trace" | ||||
|  | ||||
| 	"go.opentelemetry.io/otel/sdk/instrumentation" | ||||
| 	"go.opentelemetry.io/otel/trace" | ||||
| ) | ||||
|  | ||||
| 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/codes" | ||||
| 	"go.opentelemetry.io/otel/trace" | ||||
| ) | ||||
|  | ||||
| // HTTP scheme attributes. | ||||
| @@ -51,64 +52,22 @@ func NetAttributesFromHTTPRequest(network string, request *http.Request) []attri | ||||
| 		attrs = append(attrs, NetTransportOther) | ||||
| 	} | ||||
|  | ||||
| 	peerName, peerIP, peerPort := "", "", 0 | ||||
| 	{ | ||||
| 		hostPart := request.RemoteAddr | ||||
| 		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 = "", "" | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	peerIP, peerName, peerPort := hostIPNamePort(request.RemoteAddr) | ||||
| 	if peerIP != "" { | ||||
| 		attrs = append(attrs, NetPeerIPKey.String(peerIP)) | ||||
| 	} | ||||
| 	if peerName != "" { | ||||
| 		attrs = append(attrs, NetPeerNameKey.String(peerName)) | ||||
| 	} | ||||
| 	if peerIP != "" { | ||||
| 		attrs = append(attrs, NetPeerIPKey.String(peerIP)) | ||||
| 	} | ||||
| 	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} { | ||||
| 		hostPart := "" | ||||
| 		if idx := strings.LastIndex(someHost, ":"); idx >= 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 | ||||
| 			} | ||||
| 		hostIP, hostName, hostPort = hostIPNamePort(someHost) | ||||
| 		if hostIP != "" || hostName != "" || hostPort != 0 { | ||||
| 			break | ||||
| 		} else { | ||||
| 			hostPort = 0 | ||||
| 		} | ||||
| 	} | ||||
| 	if hostIP != "" { | ||||
| @@ -124,6 +83,30 @@ func NetAttributesFromHTTPRequest(network string, request *http.Request) []attri | ||||
| 	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. | ||||
| @@ -225,7 +208,9 @@ func HTTPServerAttributesFromHTTPRequest(serverName, route string, request *http | ||||
| 		attrs = append(attrs, HTTPRouteKey.String(route)) | ||||
| 	} | ||||
| 	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)...) | ||||
| @@ -285,6 +270,21 @@ func SpanStatusFromHTTPStatusCode(code int) (codes.Code, string) { | ||||
| 	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. | ||||
|   | ||||
							
								
								
									
										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 | ||||
| // 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 { | ||||
| 	return spanOptionFunc(func(cfg *SpanConfig) { | ||||
| 		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 | ||||
|  | ||||
| go 1.15 | ||||
| go 1.16 | ||||
|  | ||||
| replace go.opentelemetry.io/otel => ../ | ||||
|  | ||||
| @@ -43,7 +43,7 @@ replace go.opentelemetry.io/otel/trace => ./ | ||||
| require ( | ||||
| 	github.com/google/go-cmp v0.5.6 | ||||
| 	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 | ||||
| @@ -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/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/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/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| 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. | ||||
| 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: | ||||
|   stable-v1: | ||||
|     version: v1.0.1 | ||||
|     version: v1.3.0 | ||||
|     modules: | ||||
|       - go.opentelemetry.io/otel | ||||
|       - 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/otlptracegrpc | ||||
|       - 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/trace | ||||
|       - go.opentelemetry.io/otel/sdk | ||||
|   experimental-metrics: | ||||
|     version: v0.24.0 | ||||
|     version: v0.26.0 | ||||
|     modules: | ||||
|       - go.opentelemetry.io/otel/example/prometheus | ||||
|       - go.opentelemetry.io/otel/exporters/otlp/otlpmetric | ||||
| @@ -45,8 +46,12 @@ module-sets: | ||||
|       - go.opentelemetry.io/otel/metric | ||||
|       - go.opentelemetry.io/otel/sdk/export/metric | ||||
|       - go.opentelemetry.io/otel/sdk/metric | ||||
|   experimental-schema: | ||||
|     version: v0.0.1 | ||||
|     modules: | ||||
|       - go.opentelemetry.io/otel/schema | ||||
|   bridge: | ||||
|     version: v0.24.0 | ||||
|     version: v0.26.0 | ||||
|     modules: | ||||
|       - go.opentelemetry.io/otel/bridge/opencensus | ||||
|       - 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 | ||||
|  | ||||
| 	// 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: | ||||
| 	//	*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. | ||||
| 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 | ||||
| @@ -203,7 +203,7 @@ func (x Status_DeprecatedStatusCode) Number() protoreflect.EnumNumber { | ||||
|  | ||||
| // Deprecated: Use Status_DeprecatedStatusCode.Descriptor instead. | ||||
| 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 | ||||
| @@ -258,7 +258,69 @@ func (x Status_StatusCode) Number() protoreflect.EnumNumber { | ||||
|  | ||||
| // Deprecated: Use Status_StatusCode.Descriptor instead. | ||||
| 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. | ||||
| @@ -281,7 +343,7 @@ type ResourceSpans struct { | ||||
| func (x *ResourceSpans) Reset() { | ||||
| 	*x = ResourceSpans{} | ||||
| 	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.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @@ -294,7 +356,7 @@ func (x *ResourceSpans) String() string { | ||||
| func (*ResourceSpans) ProtoMessage() {} | ||||
|  | ||||
| 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 { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @@ -307,7 +369,7 @@ func (x *ResourceSpans) ProtoReflect() protoreflect.Message { | ||||
|  | ||||
| // Deprecated: Use ResourceSpans.ProtoReflect.Descriptor instead. | ||||
| 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 { | ||||
| @@ -350,7 +412,7 @@ type InstrumentationLibrarySpans struct { | ||||
| func (x *InstrumentationLibrarySpans) Reset() { | ||||
| 	*x = InstrumentationLibrarySpans{} | ||||
| 	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.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @@ -363,7 +425,7 @@ func (x *InstrumentationLibrarySpans) String() string { | ||||
| func (*InstrumentationLibrarySpans) ProtoMessage() {} | ||||
|  | ||||
| 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 { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @@ -376,7 +438,7 @@ func (x *InstrumentationLibrarySpans) ProtoReflect() protoreflect.Message { | ||||
|  | ||||
| // Deprecated: Use InstrumentationLibrarySpans.ProtoReflect.Descriptor instead. | ||||
| 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 { | ||||
| @@ -447,9 +509,7 @@ type Span struct { | ||||
| 	// This makes it easier to correlate spans in different traces. | ||||
| 	// | ||||
| 	// This field is semantically required to be set to non-empty string. | ||||
| 	// When null or empty string received - receiver may use string "name" | ||||
| 	// as a replacement. There might be smarted algorithms implemented by | ||||
| 	// receiver to fix the empty span name. | ||||
| 	// Empty value is equivalent to an unknown span name. | ||||
| 	// | ||||
| 	// This field is required. | ||||
| 	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. | ||||
| 	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, | ||||
| 	// an integer, a double or the Boolean values `true` or `false`. Note, global attributes | ||||
| 	// attributes is a collection of key/value pairs. Note, global 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/server_latency": 300 | ||||
| 	//     "abc.com/myattribute": true | ||||
| 	//     "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"` | ||||
| 	// 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 | ||||
| @@ -503,7 +565,7 @@ type Span struct { | ||||
| func (x *Span) Reset() { | ||||
| 	*x = Span{} | ||||
| 	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.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @@ -516,7 +578,7 @@ func (x *Span) String() string { | ||||
| func (*Span) ProtoMessage() {} | ||||
|  | ||||
| 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 { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @@ -529,7 +591,7 @@ func (x *Span) ProtoReflect() protoreflect.Message { | ||||
|  | ||||
| // Deprecated: Use Span.ProtoReflect.Descriptor instead. | ||||
| 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 { | ||||
| @@ -662,7 +724,7 @@ type Status struct { | ||||
| func (x *Status) Reset() { | ||||
| 	*x = Status{} | ||||
| 	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.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @@ -675,7 +737,7 @@ func (x *Status) String() string { | ||||
| func (*Status) ProtoMessage() {} | ||||
|  | ||||
| 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 { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @@ -688,7 +750,7 @@ func (x *Status) ProtoReflect() protoreflect.Message { | ||||
|  | ||||
| // Deprecated: Use Status.ProtoReflect.Descriptor instead. | ||||
| 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. | ||||
| @@ -735,7 +797,7 @@ type Span_Event struct { | ||||
| func (x *Span_Event) Reset() { | ||||
| 	*x = Span_Event{} | ||||
| 	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.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @@ -748,7 +810,7 @@ func (x *Span_Event) String() string { | ||||
| func (*Span_Event) ProtoMessage() {} | ||||
|  | ||||
| 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 { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @@ -761,7 +823,7 @@ func (x *Span_Event) ProtoReflect() protoreflect.Message { | ||||
|  | ||||
| // Deprecated: Use Span_Event.ProtoReflect.Descriptor instead. | ||||
| 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 { | ||||
| @@ -818,7 +880,7 @@ type Span_Link struct { | ||||
| func (x *Span_Link) Reset() { | ||||
| 	*x = Span_Link{} | ||||
| 	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.StoreMessageInfo(mi) | ||||
| 	} | ||||
| @@ -831,7 +893,7 @@ func (x *Span_Link) String() string { | ||||
| func (*Span_Link) ProtoMessage() {} | ||||
|  | ||||
| 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 { | ||||
| 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||||
| 		if ms.LoadMessageInfo() == nil { | ||||
| @@ -844,7 +906,7 @@ func (x *Span_Link) ProtoReflect() protoreflect.Message { | ||||
|  | ||||
| // Deprecated: Use Span_Link.ProtoReflect.Descriptor instead. | ||||
| 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 { | ||||
| @@ -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, | ||||
| 	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, | ||||
| 	0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf4, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, | ||||
| 	0x65, 0x53, 0x70, 0x61, 0x6e, 0x73, 0x12, 0x45, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, | ||||
| 	0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x74, | ||||
| 	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, | ||||
| 	0x72, 0x6f, 0x74, 0x6f, 0x22, 0x60, 0x0a, 0x0a, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x44, 0x61, | ||||
| 	0x74, 0x61, 0x12, 0x52, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, | ||||
| 	0x70, 0x61, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 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, 0x61, 0x6e, 0x52, 0x05, | ||||
| 	0x73, 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, 0x9c, 0x0a, 0x0a, 0x04, 0x53, 0x70, 0x61, 0x6e, 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, 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, | ||||
| 	0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, | ||||
| 	0x63, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x73, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, | ||||
| 	0x65, 0x53, 0x70, 0x61, 0x6e, 0x73, 0x22, 0xf4, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x6f, 0x75, | ||||
| 	0x72, 0x63, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x73, 0x12, 0x45, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, | ||||
| 	0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 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, 0x61, 0x6e, 0x2e, 0x53, | ||||
| 	0x70, 0x61, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x2f, 0x0a, | ||||
| 	0x14, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, 0x69, 0x78, | ||||
| 	0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x06, 0x52, 0x11, 0x73, 0x74, 0x61, | ||||
| 	0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x2b, | ||||
| 	0x0a, 0x12, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, | ||||
| 	0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x06, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x54, | ||||
| 	0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x47, 0x0a, 0x0a, 0x61, | ||||
| 	0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x09, 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, 0x0a, 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, 0x12, 0x40, | ||||
| 	0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, | ||||
| 	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, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, | ||||
| 	0x61, 0x6e, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, | ||||
| 	0x12, 0x30, 0x0a, 0x14, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, | ||||
| 	0x74, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, | ||||
| 	0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, | ||||
| 	0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x0d, 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, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, | ||||
| 	0x2e, 0x53, 0x70, 0x61, 0x6e, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x6b, | ||||
| 	0x73, 0x12, 0x2e, 0x0a, 0x13, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6e, | ||||
| 	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, | ||||
| 	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, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x6e, | ||||
| 	0x52, 0x05, 0x73, 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, 0x9c, 0x0a, 0x0a, 0x04, 0x53, 0x70, 0x61, 0x6e, 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, | ||||
| 	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, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x6e, | ||||
| 	0x2e, 0x53, 0x70, 0x61, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, | ||||
| 	0x2f, 0x0a, 0x14, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, | ||||
| 	0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x06, 0x52, 0x11, 0x73, | ||||
| 	0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, | ||||
| 	0x12, 0x2b, 0x0a, 0x12, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, 0x69, | ||||
| 	0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x06, 0x52, 0x0f, 0x65, 0x6e, | ||||
| 	0x64, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x6e, 0x69, 0x78, 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x47, 0x0a, | ||||
| 	0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x09, 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, 0x0a, 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, | ||||
| 	0x12, 0x40, 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, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x2e, | ||||
| 	0x53, 0x70, 0x61, 0x6e, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, | ||||
| 	0x74, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x65, 0x76, | ||||
| 	0x65, 0x6e, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, | ||||
| 	0x52, 0x12, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x43, | ||||
| 	0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x0d, 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, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, | ||||
| 	0x76, 0x31, 0x2e, 0x53, 0x70, 0x61, 0x6e, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x05, 0x6c, 0x69, | ||||
| 	0x6e, 0x6b, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6c, | ||||
| 	0x69, 0x6e, 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, 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, | ||||
| 	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, 0x43, 0x4f, | ||||
| 	0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x05, 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, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, | ||||
| 	0x5f, 0x45, 0x58, 0x49, 0x53, 0x54, 0x53, 0x10, 0x06, 0x12, 0x2c, 0x0a, 0x28, 0x44, 0x45, 0x50, | ||||
| 	0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x05, | ||||
| 	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, 0x41, 0x4c, 0x52, 0x45, 0x41, | ||||
| 	0x44, 0x59, 0x5f, 0x45, 0x58, 0x49, 0x53, 0x54, 0x53, 0x10, 0x06, 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, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, | ||||
| 	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, | ||||
| 	0x4f, 0x44, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 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, 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, | ||||
| 	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, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0e, | ||||
| 	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, 0x44, 0x41, 0x54, 0x41, 0x5f, | ||||
| 	0x4c, 0x4f, 0x53, 0x53, 0x10, 0x0f, 0x12, 0x2a, 0x0a, 0x26, 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, 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, | ||||
| 	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, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, | ||||
| 	0x10, 0x0e, 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, 0x44, 0x41, 0x54, | ||||
| 	0x41, 0x5f, 0x4c, 0x4f, 0x53, 0x53, 0x10, 0x0f, 0x12, 0x2a, 0x0a, 0x26, 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, 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 ( | ||||
| @@ -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_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{}{ | ||||
| 	(Span_SpanKind)(0),                  // 0: opentelemetry.proto.trace.v1.Span.SpanKind | ||||
| 	(Status_DeprecatedStatusCode)(0),    // 1: opentelemetry.proto.trace.v1.Status.DeprecatedStatusCode | ||||
| 	(Status_StatusCode)(0),              // 2: opentelemetry.proto.trace.v1.Status.StatusCode | ||||
| 	(*ResourceSpans)(nil),               // 3: opentelemetry.proto.trace.v1.ResourceSpans | ||||
| 	(*InstrumentationLibrarySpans)(nil), // 4: opentelemetry.proto.trace.v1.InstrumentationLibrarySpans | ||||
| 	(*Span)(nil),                        // 5: opentelemetry.proto.trace.v1.Span | ||||
| 	(*Status)(nil),                      // 6: opentelemetry.proto.trace.v1.Status | ||||
| 	(*Span_Event)(nil),                  // 7: opentelemetry.proto.trace.v1.Span.Event | ||||
| 	(*Span_Link)(nil),                   // 8: opentelemetry.proto.trace.v1.Span.Link | ||||
| 	(*v1.Resource)(nil),                 // 9: opentelemetry.proto.resource.v1.Resource | ||||
| 	(*v11.InstrumentationLibrary)(nil),  // 10: opentelemetry.proto.common.v1.InstrumentationLibrary | ||||
| 	(*v11.KeyValue)(nil),                // 11: opentelemetry.proto.common.v1.KeyValue | ||||
| 	(*TracesData)(nil),                  // 3: opentelemetry.proto.trace.v1.TracesData | ||||
| 	(*ResourceSpans)(nil),               // 4: opentelemetry.proto.trace.v1.ResourceSpans | ||||
| 	(*InstrumentationLibrarySpans)(nil), // 5: opentelemetry.proto.trace.v1.InstrumentationLibrarySpans | ||||
| 	(*Span)(nil),                        // 6: opentelemetry.proto.trace.v1.Span | ||||
| 	(*Status)(nil),                      // 7: opentelemetry.proto.trace.v1.Status | ||||
| 	(*Span_Event)(nil),                  // 8: opentelemetry.proto.trace.v1.Span.Event | ||||
| 	(*Span_Link)(nil),                   // 9: opentelemetry.proto.trace.v1.Span.Link | ||||
| 	(*v1.Resource)(nil),                 // 10: opentelemetry.proto.resource.v1.Resource | ||||
| 	(*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{ | ||||
| 	9,  // 0: opentelemetry.proto.trace.v1.ResourceSpans.resource:type_name -> opentelemetry.proto.resource.v1.Resource | ||||
| 	4,  // 1: opentelemetry.proto.trace.v1.ResourceSpans.instrumentation_library_spans:type_name -> opentelemetry.proto.trace.v1.InstrumentationLibrarySpans | ||||
| 	10, // 2: opentelemetry.proto.trace.v1.InstrumentationLibrarySpans.instrumentation_library:type_name -> opentelemetry.proto.common.v1.InstrumentationLibrary | ||||
| 	5,  // 3: opentelemetry.proto.trace.v1.InstrumentationLibrarySpans.spans:type_name -> opentelemetry.proto.trace.v1.Span | ||||
| 	0,  // 4: opentelemetry.proto.trace.v1.Span.kind:type_name -> opentelemetry.proto.trace.v1.Span.SpanKind | ||||
| 	11, // 5: opentelemetry.proto.trace.v1.Span.attributes:type_name -> opentelemetry.proto.common.v1.KeyValue | ||||
| 	7,  // 6: opentelemetry.proto.trace.v1.Span.events:type_name -> opentelemetry.proto.trace.v1.Span.Event | ||||
| 	8,  // 7: opentelemetry.proto.trace.v1.Span.links:type_name -> opentelemetry.proto.trace.v1.Span.Link | ||||
| 	6,  // 8: opentelemetry.proto.trace.v1.Span.status:type_name -> opentelemetry.proto.trace.v1.Status | ||||
| 	1,  // 9: opentelemetry.proto.trace.v1.Status.deprecated_code:type_name -> opentelemetry.proto.trace.v1.Status.DeprecatedStatusCode | ||||
| 	2,  // 10: opentelemetry.proto.trace.v1.Status.code:type_name -> opentelemetry.proto.trace.v1.Status.StatusCode | ||||
| 	11, // 11: opentelemetry.proto.trace.v1.Span.Event.attributes:type_name -> opentelemetry.proto.common.v1.KeyValue | ||||
| 	11, // 12: opentelemetry.proto.trace.v1.Span.Link.attributes:type_name -> opentelemetry.proto.common.v1.KeyValue | ||||
| 	13, // [13:13] is the sub-list for method output_type | ||||
| 	13, // [13:13] is the sub-list for method input_type | ||||
| 	13, // [13:13] is the sub-list for extension type_name | ||||
| 	13, // [13:13] is the sub-list for extension extendee | ||||
| 	0,  // [0:13] is the sub-list for field type_name | ||||
| 	4,  // 0: opentelemetry.proto.trace.v1.TracesData.resource_spans:type_name -> opentelemetry.proto.trace.v1.ResourceSpans | ||||
| 	10, // 1: opentelemetry.proto.trace.v1.ResourceSpans.resource:type_name -> opentelemetry.proto.resource.v1.Resource | ||||
| 	5,  // 2: opentelemetry.proto.trace.v1.ResourceSpans.instrumentation_library_spans:type_name -> opentelemetry.proto.trace.v1.InstrumentationLibrarySpans | ||||
| 	11, // 3: opentelemetry.proto.trace.v1.InstrumentationLibrarySpans.instrumentation_library:type_name -> opentelemetry.proto.common.v1.InstrumentationLibrary | ||||
| 	6,  // 4: opentelemetry.proto.trace.v1.InstrumentationLibrarySpans.spans:type_name -> opentelemetry.proto.trace.v1.Span | ||||
| 	0,  // 5: opentelemetry.proto.trace.v1.Span.kind:type_name -> opentelemetry.proto.trace.v1.Span.SpanKind | ||||
| 	12, // 6: opentelemetry.proto.trace.v1.Span.attributes:type_name -> opentelemetry.proto.common.v1.KeyValue | ||||
| 	8,  // 7: opentelemetry.proto.trace.v1.Span.events:type_name -> opentelemetry.proto.trace.v1.Span.Event | ||||
| 	9,  // 8: opentelemetry.proto.trace.v1.Span.links:type_name -> opentelemetry.proto.trace.v1.Span.Link | ||||
| 	7,  // 9: opentelemetry.proto.trace.v1.Span.status:type_name -> opentelemetry.proto.trace.v1.Status | ||||
| 	1,  // 10: opentelemetry.proto.trace.v1.Status.deprecated_code:type_name -> opentelemetry.proto.trace.v1.Status.DeprecatedStatusCode | ||||
| 	2,  // 11: opentelemetry.proto.trace.v1.Status.code:type_name -> opentelemetry.proto.trace.v1.Status.StatusCode | ||||
| 	12, // 12: opentelemetry.proto.trace.v1.Span.Event.attributes:type_name -> opentelemetry.proto.common.v1.KeyValue | ||||
| 	12, // 13: opentelemetry.proto.trace.v1.Span.Link.attributes:type_name -> opentelemetry.proto.common.v1.KeyValue | ||||
| 	14, // [14:14] is the sub-list for method output_type | ||||
| 	14, // [14:14] is the sub-list for method input_type | ||||
| 	14, // [14:14] is the sub-list for extension 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() } | ||||
| @@ -1136,7 +1206,7 @@ func file_opentelemetry_proto_trace_v1_trace_proto_init() { | ||||
| 	} | ||||
| 	if !protoimpl.UnsafeEnabled { | ||||
| 		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: | ||||
| 				return &v.state | ||||
| 			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{} { | ||||
| 			switch v := v.(*InstrumentationLibrarySpans); i { | ||||
| 			switch v := v.(*ResourceSpans); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			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{} { | ||||
| 			switch v := v.(*Span); i { | ||||
| 			switch v := v.(*InstrumentationLibrarySpans); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			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{} { | ||||
| 			switch v := v.(*Status); i { | ||||
| 			switch v := v.(*Span); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			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{} { | ||||
| 			switch v := v.(*Span_Event); i { | ||||
| 			switch v := v.(*Status); i { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| 			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{} { | ||||
| 			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 { | ||||
| 			case 0: | ||||
| 				return &v.state | ||||
| @@ -1214,7 +1296,7 @@ func file_opentelemetry_proto_trace_v1_trace_proto_init() { | ||||
| 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | ||||
| 			RawDescriptor: file_opentelemetry_proto_trace_v1_trace_proto_rawDesc, | ||||
| 			NumEnums:      3, | ||||
| 			NumMessages:   6, | ||||
| 			NumMessages:   7, | ||||
| 			NumExtensions: 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. | ||||
| 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) | ||||
| 	MarkDead(*ClientConn) | ||||
| } | ||||
| @@ -42,7 +48,7 @@ type clientConnPool struct { | ||||
| 	conns        map[string][]*ClientConn // key is host:port | ||||
| 	dialing      map[string]*dialCall     // currently in-flight dials | ||||
| 	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) { | ||||
| @@ -54,28 +60,8 @@ const ( | ||||
| 	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) { | ||||
| 	// TODO(dneil): Dial a new connection when t.DisableKeepAlives is set? | ||||
| 	if isConnectionCloseRequest(req) && dialOnMiss { | ||||
| 		// It gets its own connection. | ||||
| 		traceGetConn(req, addr) | ||||
| @@ -89,10 +75,14 @@ func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMis | ||||
| 	for { | ||||
| 		p.mu.Lock() | ||||
| 		for _, cc := range p.conns[addr] { | ||||
| 			if st := cc.idleState(); st.canTakeNewRequest { | ||||
| 				if p.shouldTraceGetConn(st) { | ||||
| 			if cc.ReserveNewRequest() { | ||||
| 				// 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) | ||||
| 				} | ||||
| 				cc.getConnCalled = false | ||||
| 				p.mu.Unlock() | ||||
| 				return cc, nil | ||||
| 			} | ||||
| @@ -108,7 +98,13 @@ func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMis | ||||
| 		if shouldRetryDial(call, req) { | ||||
| 			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 { | ||||
| 		c.err = err | ||||
| 	} else { | ||||
| 		cc.getConnCalled = true // already called by the net/http package | ||||
| 		p.addConnLocked(key, cc) | ||||
| 	} | ||||
| 	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)) | ||||
| } | ||||
|  | ||||
| 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 | ||||
| // entire connection. | ||||
| type ConnectionError ErrCode | ||||
| @@ -67,6 +74,11 @@ type StreamError struct { | ||||
| 	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 { | ||||
| 	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 | ||||
| // bytes. The length of payload will always equal fh.Length (which | ||||
| // 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{ | ||||
| 	FrameData:         parseDataFrame, | ||||
| @@ -267,6 +267,11 @@ type Framer struct { | ||||
| 	lastFrame Frame | ||||
| 	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 | ||||
| 	// unfinished HEADERS/CONTINUATION. | ||||
| 	lastHeaderStream uint32 | ||||
| @@ -426,6 +431,7 @@ func NewFramer(w io.Writer, r io.Reader) *Framer { | ||||
| 	fr := &Framer{ | ||||
| 		w:                 w, | ||||
| 		r:                 r, | ||||
| 		countError:        func(string) {}, | ||||
| 		logReads:          logFrameReads, | ||||
| 		logWrites:         logFrameWrites, | ||||
| 		debugReadLoggerf:  log.Printf, | ||||
| @@ -500,7 +506,7 @@ func (fr *Framer) ReadFrame() (Frame, error) { | ||||
| 	if _, err := io.ReadFull(fr.r, payload); err != nil { | ||||
| 		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 ce, ok := err.(connError); ok { | ||||
| 			return nil, fr.connError(ce.Code, ce.Reason) | ||||
| @@ -588,13 +594,14 @@ func (f *DataFrame) Data() []byte { | ||||
| 	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 { | ||||
| 		// DATA frames MUST be associated with a stream. If a | ||||
| 		// DATA frame is received whose stream identifier | ||||
| 		// field is 0x0, the recipient MUST respond with a | ||||
| 		// connection error (Section 5.4.1) of type | ||||
| 		// PROTOCOL_ERROR. | ||||
| 		countError("frame_data_stream_0") | ||||
| 		return nil, connError{ErrCodeProtocol, "DATA frame with stream ID 0"} | ||||
| 	} | ||||
| 	f := fc.getDataFrame() | ||||
| @@ -605,6 +612,7 @@ func parseDataFrame(fc *frameCache, fh FrameHeader, payload []byte) (Frame, erro | ||||
| 		var err error | ||||
| 		payload, padSize, err = readByte(payload) | ||||
| 		if err != nil { | ||||
| 			countError("frame_data_pad_byte_short") | ||||
| 			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 | ||||
| 		// treat this as a connection error. | ||||
| 		// 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"} | ||||
| 	} | ||||
| 	f.data = payload[:len(payload)-int(padSize)] | ||||
| @@ -695,7 +704,7 @@ type SettingsFrame struct { | ||||
| 	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 { | ||||
| 		// When this (ACK 0x1) bit is set, the payload of the | ||||
| 		// 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 | ||||
| 		// connection error (Section 5.4.1) of type | ||||
| 		// FRAME_SIZE_ERROR. | ||||
| 		countError("frame_settings_ack_with_length") | ||||
| 		return nil, ConnectionError(ErrCodeFrameSize) | ||||
| 	} | ||||
| 	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 | ||||
| 		// respond with a connection error (Section 5.4.1) of | ||||
| 		// type PROTOCOL_ERROR. | ||||
| 		countError("frame_settings_has_stream") | ||||
| 		return nil, ConnectionError(ErrCodeProtocol) | ||||
| 	} | ||||
| 	if len(p)%6 != 0 { | ||||
| 		countError("frame_settings_mod_6") | ||||
| 		// Expecting even number of 6 byte settings. | ||||
| 		return nil, ConnectionError(ErrCodeFrameSize) | ||||
| 	} | ||||
| 	f := &SettingsFrame{FrameHeader: fh, p: p} | ||||
| 	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 | ||||
| 		// be treated as a connection error (Section 5.4.1) of type | ||||
| 		// FLOW_CONTROL_ERROR. | ||||
| @@ -832,11 +845,13 @@ type PingFrame struct { | ||||
|  | ||||
| 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 { | ||||
| 		countError("frame_ping_length") | ||||
| 		return nil, ConnectionError(ErrCodeFrameSize) | ||||
| 	} | ||||
| 	if fh.StreamID != 0 { | ||||
| 		countError("frame_ping_has_stream") | ||||
| 		return nil, ConnectionError(ErrCodeProtocol) | ||||
| 	} | ||||
| 	f := &PingFrame{FrameHeader: fh} | ||||
| @@ -872,11 +887,13 @@ func (f *GoAwayFrame) DebugData() []byte { | ||||
| 	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 { | ||||
| 		countError("frame_goaway_has_stream") | ||||
| 		return nil, ConnectionError(ErrCodeProtocol) | ||||
| 	} | ||||
| 	if len(p) < 8 { | ||||
| 		countError("frame_goaway_short") | ||||
| 		return nil, ConnectionError(ErrCodeFrameSize) | ||||
| 	} | ||||
| 	return &GoAwayFrame{ | ||||
| @@ -912,7 +929,7 @@ func (f *UnknownFrame) Payload() []byte { | ||||
| 	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 | ||||
| } | ||||
|  | ||||
| @@ -923,8 +940,9 @@ type WindowUpdateFrame struct { | ||||
| 	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 { | ||||
| 		countError("frame_windowupdate_bad_len") | ||||
| 		return nil, ConnectionError(ErrCodeFrameSize) | ||||
| 	} | ||||
| 	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 | ||||
| 		// error (Section 5.4.1). | ||||
| 		if fh.StreamID == 0 { | ||||
| 			countError("frame_windowupdate_zero_inc_conn") | ||||
| 			return nil, ConnectionError(ErrCodeProtocol) | ||||
| 		} | ||||
| 		countError("frame_windowupdate_zero_inc_stream") | ||||
| 		return nil, streamError(fh.StreamID, ErrCodeProtocol) | ||||
| 	} | ||||
| 	return &WindowUpdateFrame{ | ||||
| @@ -988,7 +1008,7 @@ func (f *HeadersFrame) HasPriority() bool { | ||||
| 	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{ | ||||
| 		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 | ||||
| 		// respond with a connection error (Section 5.4.1) of type | ||||
| 		// PROTOCOL_ERROR. | ||||
| 		countError("frame_headers_zero_stream") | ||||
| 		return nil, connError{ErrCodeProtocol, "HEADERS frame with stream ID 0"} | ||||
| 	} | ||||
| 	var padLength uint8 | ||||
| 	if fh.Flags.Has(FlagHeadersPadded) { | ||||
| 		if p, padLength, err = readByte(p); err != nil { | ||||
| 			countError("frame_headers_pad_short") | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| @@ -1009,16 +1031,19 @@ func parseHeadersFrame(_ *frameCache, fh FrameHeader, p []byte) (_ Frame, err er | ||||
| 		var v uint32 | ||||
| 		p, v, err = readUint32(p) | ||||
| 		if err != nil { | ||||
| 			countError("frame_headers_prio_short") | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		hf.Priority.StreamDep = v & 0x7fffffff | ||||
| 		hf.Priority.Exclusive = (v != hf.Priority.StreamDep) // high bit was set | ||||
| 		p, hf.Priority.Weight, err = readByte(p) | ||||
| 		if err != nil { | ||||
| 			countError("frame_headers_prio_weight_short") | ||||
| 			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) | ||||
| 	} | ||||
| 	hf.headerFragBuf = p[:len(p)-int(padLength)] | ||||
| @@ -1125,11 +1150,13 @@ func (p PriorityParam) IsZero() bool { | ||||
| 	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 { | ||||
| 		countError("frame_priority_zero_stream") | ||||
| 		return nil, connError{ErrCodeProtocol, "PRIORITY frame with stream ID 0"} | ||||
| 	} | ||||
| 	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))} | ||||
| 	} | ||||
| 	v := binary.BigEndian.Uint32(payload[:4]) | ||||
| @@ -1172,11 +1199,13 @@ type RSTStreamFrame struct { | ||||
| 	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 { | ||||
| 		countError("frame_rststream_bad_len") | ||||
| 		return nil, ConnectionError(ErrCodeFrameSize) | ||||
| 	} | ||||
| 	if fh.StreamID == 0 { | ||||
| 		countError("frame_rststream_zero_stream") | ||||
| 		return nil, ConnectionError(ErrCodeProtocol) | ||||
| 	} | ||||
| 	return &RSTStreamFrame{fh, ErrCode(binary.BigEndian.Uint32(p[:4]))}, nil | ||||
| @@ -1202,8 +1231,9 @@ type ContinuationFrame struct { | ||||
| 	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 { | ||||
| 		countError("frame_continuation_zero_stream") | ||||
| 		return nil, connError{ErrCodeProtocol, "CONTINUATION frame with stream ID 0"} | ||||
| 	} | ||||
| 	return &ContinuationFrame{fh, p}, nil | ||||
| @@ -1252,7 +1282,7 @@ func (f *PushPromiseFrame) HeadersEnded() bool { | ||||
| 	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{ | ||||
| 		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 | ||||
| 		// 0x0, a recipient MUST respond with a connection error | ||||
| 		// (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| 		countError("frame_pushpromise_zero_stream") | ||||
| 		return nil, ConnectionError(ErrCodeProtocol) | ||||
| 	} | ||||
| 	// The PUSH_PROMISE frame includes optional padding. | ||||
| @@ -1270,18 +1301,21 @@ func parsePushPromise(_ *frameCache, fh FrameHeader, p []byte) (_ Frame, err err | ||||
| 	var padLength uint8 | ||||
| 	if fh.Flags.Has(FlagPushPromisePadded) { | ||||
| 		if p, padLength, err = readByte(p); err != nil { | ||||
| 			countError("frame_pushpromise_pad_short") | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	p, pp.PromiseID, err = readUint32(p) | ||||
| 	if err != nil { | ||||
| 		countError("frame_pushpromise_promiseid_short") | ||||
| 		return | ||||
| 	} | ||||
| 	pp.PromiseID = pp.PromiseID & (1<<31 - 1) | ||||
|  | ||||
| 	if int(padLength) > len(p) { | ||||
| 		// like the DATA frame, error out if padding is longer than the body. | ||||
| 		countError("frame_pushpromise_pad_too_big") | ||||
| 		return nil, ConnectionError(ErrCodeProtocol) | ||||
| 	} | ||||
| 	pp.headerFragBuf = p[:len(p)-int(padLength)] | ||||
|   | ||||
							
								
								
									
										38
									
								
								vendor/golang.org/x/net/http2/hpack/huffman.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								vendor/golang.org/x/net/http2/hpack/huffman.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -140,25 +140,29 @@ func buildRootHuffmanNode() { | ||||
| 		panic("unexpected size") | ||||
| 	} | ||||
| 	lazyRootHuffmanNode = newInternalNode() | ||||
| 	for i, code := range huffmanCodes { | ||||
| 		addDecoderNode(byte(i), code, huffmanCodeLen[i]) | ||||
| 	} | ||||
| } | ||||
| 	// allocate a leaf node for each of the 256 symbols | ||||
| 	leaves := new([256]node) | ||||
|  | ||||
| func addDecoderNode(sym byte, code uint32, codeLen uint8) { | ||||
| 	cur := lazyRootHuffmanNode | ||||
| 	for codeLen > 8 { | ||||
| 		codeLen -= 8 | ||||
| 		i := uint8(code >> codeLen) | ||||
| 		if cur.children[i] == nil { | ||||
| 			cur.children[i] = newInternalNode() | ||||
| 	for sym, code := range huffmanCodes { | ||||
| 		codeLen := huffmanCodeLen[sym] | ||||
|  | ||||
| 		cur := lazyRootHuffmanNode | ||||
| 		for codeLen > 8 { | ||||
| 			codeLen -= 8 | ||||
| 			i := uint8(code >> codeLen) | ||||
| 			if cur.children[i] == nil { | ||||
| 				cur.children[i] = newInternalNode() | ||||
| 			} | ||||
| 			cur = cur.children[i] | ||||
| 		} | ||||
| 		shift := 8 - codeLen | ||||
| 		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++ { | ||||
| 			cur.children[i] = &leaves[sym] | ||||
| 		} | ||||
| 		cur = cur.children[i] | ||||
| 	} | ||||
| 	shift := 8 - codeLen | ||||
| 	start, end := int(uint8(code<<shift)), int(1<<shift) | ||||
| 	for i := start; i < start+end; i++ { | ||||
| 		cur.children[i] = &node{sym: sym, codeLen: codeLen} | ||||
| 	} | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										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 | ||||
| } | ||||
|  | ||||
| // 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 { | ||||
| 	p.mu.Lock() | ||||
| 	defer p.mu.Unlock() | ||||
|   | ||||
							
								
								
									
										111
									
								
								vendor/golang.org/x/net/http2/server.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										111
									
								
								vendor/golang.org/x/net/http2/server.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -130,6 +130,12 @@ type Server struct { | ||||
| 	// If nil, a default scheduler is chosen. | ||||
| 	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) | ||||
| 	// so that we don't embed a Mutex in this struct, which will make the | ||||
| 	// 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) | ||||
|  | ||||
| 	fr := NewFramer(sc.bw, c) | ||||
| 	if s.CountError != nil { | ||||
| 		fr.countError = s.CountError | ||||
| 	} | ||||
| 	fr.ReadMetaHeaders = hpack.NewDecoder(initialHeaderTableSize, nil) | ||||
| 	fr.MaxHeaderListSize = sc.maxHeaderListSize() | ||||
| 	fr.SetMaxReadFrameSize(s.maxReadFrameSize()) | ||||
| @@ -710,7 +719,15 @@ func (sc *serverConn) canonicalHeader(v string) string { | ||||
| 		sc.canonHeader = make(map[string]string) | ||||
| 	} | ||||
| 	cv = http.CanonicalHeaderKey(v) | ||||
| 	sc.canonHeader[v] = cv | ||||
| 	// 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 | ||||
| 	} | ||||
| 	return cv | ||||
| } | ||||
|  | ||||
| @@ -1399,7 +1416,7 @@ func (sc *serverConn) processFrame(f Frame) error { | ||||
| 	// First frame received must be SETTINGS. | ||||
| 	if !sc.sawFirstSettings { | ||||
| 		if _, ok := f.(*SettingsFrame); !ok { | ||||
| 			return ConnectionError(ErrCodeProtocol) | ||||
| 			return sc.countError("first_settings", ConnectionError(ErrCodeProtocol)) | ||||
| 		} | ||||
| 		sc.sawFirstSettings = true | ||||
| 	} | ||||
| @@ -1424,7 +1441,7 @@ func (sc *serverConn) processFrame(f Frame) error { | ||||
| 	case *PushPromiseFrame: | ||||
| 		// 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. | ||||
| 		return ConnectionError(ErrCodeProtocol) | ||||
| 		return sc.countError("push_promise", ConnectionError(ErrCodeProtocol)) | ||||
| 	default: | ||||
| 		sc.vlogf("http2: server ignoring frame: %v", f.Header()) | ||||
| 		return nil | ||||
| @@ -1444,7 +1461,7 @@ func (sc *serverConn) processPing(f *PingFrame) error { | ||||
| 		// identifier field value other than 0x0, the recipient MUST | ||||
| 		// respond with a connection error (Section 5.4.1) of type | ||||
| 		// PROTOCOL_ERROR." | ||||
| 		return ConnectionError(ErrCodeProtocol) | ||||
| 		return sc.countError("ping_on_stream", ConnectionError(ErrCodeProtocol)) | ||||
| 	} | ||||
| 	if sc.inGoAway && sc.goAwayCode != ErrCodeNo { | ||||
| 		return nil | ||||
| @@ -1463,7 +1480,7 @@ func (sc *serverConn) processWindowUpdate(f *WindowUpdateFrame) error { | ||||
| 			// or PRIORITY on a stream in this state MUST be | ||||
| 			// treated as a connection error (Section 5.4.1) of | ||||
| 			// type PROTOCOL_ERROR." | ||||
| 			return ConnectionError(ErrCodeProtocol) | ||||
| 			return sc.countError("stream_idle", ConnectionError(ErrCodeProtocol)) | ||||
| 		} | ||||
| 		if st == nil { | ||||
| 			// "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 | ||||
| 		} | ||||
| 		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 | ||||
| 		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 | ||||
| 		// recipient MUST treat this as a connection error | ||||
| 		// (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| 		return ConnectionError(ErrCodeProtocol) | ||||
| 		return sc.countError("reset_idle_stream", ConnectionError(ErrCodeProtocol)) | ||||
| 	} | ||||
| 	if st != nil { | ||||
| 		st.cancelCtx() | ||||
| @@ -1547,7 +1564,7 @@ func (sc *serverConn) processSettings(f *SettingsFrame) error { | ||||
| 			// Why is the peer ACKing settings we never sent? | ||||
| 			// The spec doesn't mention this case, but | ||||
| 			// hang up on them anyway. | ||||
| 			return ConnectionError(ErrCodeProtocol) | ||||
| 			return sc.countError("ack_mystery", ConnectionError(ErrCodeProtocol)) | ||||
| 		} | ||||
| 		return nil | ||||
| 	} | ||||
| @@ -1555,7 +1572,7 @@ func (sc *serverConn) processSettings(f *SettingsFrame) error { | ||||
| 		// This isn't actually in the spec, but hang up on | ||||
| 		// suspiciously large settings frames or those with | ||||
| 		// duplicate entries. | ||||
| 		return ConnectionError(ErrCodeProtocol) | ||||
| 		return sc.countError("settings_big_or_dups", ConnectionError(ErrCodeProtocol)) | ||||
| 	} | ||||
| 	if err := f.ForeachSetting(sc.processSetting); err != nil { | ||||
| 		return err | ||||
| @@ -1622,7 +1639,7 @@ func (sc *serverConn) processSettingInitialWindowSize(val uint32) error { | ||||
| 			// control window to exceed the maximum size as a | ||||
| 			// connection error (Section 5.4.1) of type | ||||
| 			// FLOW_CONTROL_ERROR." | ||||
| 			return ConnectionError(ErrCodeFlowControl) | ||||
| 			return sc.countError("setting_win_size", ConnectionError(ErrCodeFlowControl)) | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| @@ -1655,7 +1672,7 @@ func (sc *serverConn) processData(f *DataFrame) error { | ||||
| 		// or PRIORITY on a stream in this state MUST be | ||||
| 		// treated as a connection error (Section 5.4.1) of | ||||
| 		// 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" | ||||
| @@ -1672,7 +1689,7 @@ func (sc *serverConn) processData(f *DataFrame) error { | ||||
| 		// and return any flow control bytes since we're not going | ||||
| 		// to consume them. | ||||
| 		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 | ||||
| 		// 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. | ||||
| 			return nil | ||||
| 		} | ||||
| 		return streamError(id, ErrCodeStreamClosed) | ||||
| 		return sc.countError("closed", streamError(id, ErrCodeStreamClosed)) | ||||
| 	} | ||||
| 	if st.body == nil { | ||||
| 		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 | ||||
| 		// value of a content-length header field does not equal the sum of the | ||||
| 		// 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 { | ||||
| 		// Check whether the client has flow control quota. | ||||
| 		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)) | ||||
|  | ||||
| @@ -1710,7 +1727,7 @@ func (sc *serverConn) processData(f *DataFrame) error { | ||||
| 			wrote, err := st.body.Write(data) | ||||
| 			if err != nil { | ||||
| 				sc.sendWindowUpdate(nil, int(f.Length)-wrote) | ||||
| 				return streamError(id, ErrCodeStreamClosed) | ||||
| 				return sc.countError("body_write_err", streamError(id, ErrCodeStreamClosed)) | ||||
| 			} | ||||
| 			if wrote != len(data) { | ||||
| 				panic("internal error: bad Writer") | ||||
| @@ -1796,7 +1813,7 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { | ||||
| 	// stream identifier MUST respond with a connection error | ||||
| 	// (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| 	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 | ||||
| 	// 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 | ||||
| 		// type STREAM_CLOSED. | ||||
| 		if st.state == stateHalfClosedRemote { | ||||
| 			return streamError(id, ErrCodeStreamClosed) | ||||
| 			return sc.countError("headers_half_closed", streamError(id, ErrCodeStreamClosed)) | ||||
| 		} | ||||
| 		return st.processTrailerHeaders(f) | ||||
| 	} | ||||
| @@ -1824,7 +1841,7 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { | ||||
| 	// receives an unexpected stream identifier MUST respond with | ||||
| 	// a connection error (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
| 	if id <= sc.maxClientStreamID { | ||||
| 		return ConnectionError(ErrCodeProtocol) | ||||
| 		return sc.countError("stream_went_down", ConnectionError(ErrCodeProtocol)) | ||||
| 	} | ||||
| 	sc.maxClientStreamID = id | ||||
|  | ||||
| @@ -1841,14 +1858,14 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { | ||||
| 	if sc.curClientStreams+1 > sc.advMaxStreams { | ||||
| 		if sc.unackedSettings == 0 { | ||||
| 			// 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 | ||||
| 		// received our last SETTINGS update. But actually | ||||
| 		// this can't happen yet, because we don't yet provide | ||||
| 		// a way for users to adjust server parameters at | ||||
| 		// runtime. | ||||
| 		return streamError(id, ErrCodeRefusedStream) | ||||
| 		return sc.countError("over_max_streams_race", streamError(id, ErrCodeRefusedStream)) | ||||
| 	} | ||||
|  | ||||
| 	initialState := stateOpen | ||||
| @@ -1858,7 +1875,7 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { | ||||
| 	st := sc.newStream(id, 0, initialState) | ||||
|  | ||||
| 	if f.HasPriority() { | ||||
| 		if err := checkPriority(f.StreamID, f.Priority); err != nil { | ||||
| 		if err := sc.checkPriority(f.StreamID, f.Priority); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		sc.writeSched.AdjustStream(st.id, f.Priority) | ||||
| @@ -1902,15 +1919,15 @@ func (st *stream) processTrailerHeaders(f *MetaHeadersFrame) error { | ||||
| 	sc := st.sc | ||||
| 	sc.serveG.check() | ||||
| 	if st.gotTrailerHeader { | ||||
| 		return ConnectionError(ErrCodeProtocol) | ||||
| 		return sc.countError("dup_trailers", ConnectionError(ErrCodeProtocol)) | ||||
| 	} | ||||
| 	st.gotTrailerHeader = true | ||||
| 	if !f.StreamEnded() { | ||||
| 		return streamError(st.id, ErrCodeProtocol) | ||||
| 		return sc.countError("trailers_not_ended", streamError(st.id, ErrCodeProtocol)) | ||||
| 	} | ||||
|  | ||||
| 	if len(f.PseudoFields()) > 0 { | ||||
| 		return streamError(st.id, ErrCodeProtocol) | ||||
| 		return sc.countError("trailers_pseudo", streamError(st.id, ErrCodeProtocol)) | ||||
| 	} | ||||
| 	if st.trailer != nil { | ||||
| 		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 | ||||
| 				// no way to send debug data at a stream level. Discuss with | ||||
| 				// 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) | ||||
| 		} | ||||
| @@ -1928,13 +1945,13 @@ func (st *stream) processTrailerHeaders(f *MetaHeadersFrame) error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func checkPriority(streamID uint32, p PriorityParam) error { | ||||
| func (sc *serverConn) checkPriority(streamID uint32, p PriorityParam) error { | ||||
| 	if streamID == p.StreamDep { | ||||
| 		// 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." | ||||
| 		// Section 5.3.3 says that a stream can depend on one of its dependencies, | ||||
| 		// so it's only self-dependencies that are forbidden. | ||||
| 		return streamError(streamID, ErrCodeProtocol) | ||||
| 		return sc.countError("priority", streamError(streamID, ErrCodeProtocol)) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| @@ -1943,7 +1960,7 @@ func (sc *serverConn) processPriority(f *PriorityFrame) error { | ||||
| 	if sc.inGoAway { | ||||
| 		return nil | ||||
| 	} | ||||
| 	if err := checkPriority(f.StreamID, f.PriorityParam); err != nil { | ||||
| 	if err := sc.checkPriority(f.StreamID, f.PriorityParam); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	sc.writeSched.AdjustStream(f.StreamID, f.PriorityParam) | ||||
| @@ -2000,7 +2017,7 @@ func (sc *serverConn) newWriterAndRequest(st *stream, f *MetaHeadersFrame) (*res | ||||
| 	isConnect := rp.method == "CONNECT" | ||||
| 	if isConnect { | ||||
| 		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") { | ||||
| 		// 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 | ||||
| 		// value for the :method, :scheme, and :path | ||||
| 		// 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() | ||||
| 	if rp.method == "HEAD" && bodyOpen { | ||||
| 		// 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) | ||||
| @@ -2102,7 +2119,7 @@ func (sc *serverConn) newWriterAndRequestNoBody(st *stream, rp requestParam) (*r | ||||
| 		var err error | ||||
| 		url_, err = url.ParseRequestURI(rp.path) | ||||
| 		if err != nil { | ||||
| 			return nil, nil, streamError(st.id, ErrCodeProtocol) | ||||
| 			return nil, nil, sc.countError("bad_path", streamError(st.id, ErrCodeProtocol)) | ||||
| 		} | ||||
| 		requestURI = rp.path | ||||
| 	} | ||||
| @@ -2985,3 +3002,31 @@ func h1ServerKeepAlivesDisabled(hs *http.Server) bool { | ||||
| 	} | ||||
| 	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 | ||||
| } | ||||
|   | ||||
							
								
								
									
										1480
									
								
								vendor/golang.org/x/net/http2/transport.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1480
									
								
								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 | ||||
| 	// 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) | ||||
| } | ||||
|  | ||||
| @@ -52,6 +53,7 @@ type FrameWriteRequest struct { | ||||
|  | ||||
| 	// stream is the stream on which this frame will be written. | ||||
| 	// nil for non-stream frames like PING and SETTINGS. | ||||
| 	// nil for RST_STREAM streams, which use the StreamError.StreamID field instead. | ||||
| 	stream *stream | ||||
|  | ||||
| 	// 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) { | ||||
| 	id := wr.StreamID() | ||||
| 	if id == 0 { | ||||
| 	if wr.isControl() { | ||||
| 		ws.zero.push(wr) | ||||
| 		return | ||||
| 	} | ||||
| 	id := wr.StreamID() | ||||
| 	q, ok := ws.sq[id] | ||||
| 	if !ok { | ||||
| 		q = ws.queuePool.get() | ||||
| @@ -59,7 +59,7 @@ func (ws *randomWriteScheduler) Push(wr FrameWriteRequest) { | ||||
| } | ||||
|  | ||||
| func (ws *randomWriteScheduler) Pop() (FrameWriteRequest, bool) { | ||||
| 	// Control frames first. | ||||
| 	// Control and RST_STREAM frames first. | ||||
| 	if !ws.zero.empty() { | ||||
| 		return ws.zero.shift(), true | ||||
| 	} | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	 Kazuyoshi Kato
					Kazuyoshi Kato