diff --git a/compile.sh b/compile.sh index bb699916c52a5fdde5a3adf3ad0ccdbd1958b31c..398d7da9d12a66d25e1dd49f1f9a94f6f793f874 100755 --- a/compile.sh +++ b/compile.sh @@ -3,23 +3,21 @@ set -euo pipefail IFS=$'\n\t' -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "${SCRIPT_DIR}" for build_tags in \ "" \ - "tracer_static tracer_static_jaeger" \ - "tracer_static tracer_static_lightstep" \ - "tracer_static tracer_static_datadog" \ - "tracer_static tracer_static_jaeger tracer_static_lightstep tracer_static_datadog" \ - "continuous_profiler_stackdriver" \ - ; do + "tracer_static_jaeger" \ + "tracer_static_otlp" \ + "tracer_static_jaeger tracer_static_otlp" \ + "continuous_profiler_stackdriver"; do ( - set -x; + set -x go build \ - -tags "${build_tags}" \ - ./... + -tags "${build_tags}" \ + ./... ) done diff --git a/go.mod b/go.mod index 1acef5bc31443ebd060bf3cea41a5088e2459702..fdd92330999584e6e81f61a17dc21e68f03946c6 100644 --- a/go.mod +++ b/go.mod @@ -1,43 +1,31 @@ module gitlab.com/gitlab-org/labkit require ( - cloud.google.com/go v0.50.0 + cloud.google.com/go v0.65.0 github.com/certifi/gocertifi v0.0.0-20180905225744-ee1a9a0726d2 // indirect github.com/client9/reopen v1.0.0 - github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd // indirect github.com/getsentry/raven-go v0.1.0 github.com/getsentry/sentry-go v0.5.1 - github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 // indirect - github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 - github.com/jstemmer/go-junit-report v0.9.1 // indirect github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect - github.com/lightstep/lightstep-tracer-go v0.15.6 github.com/oklog/ulid v1.3.1 github.com/oklog/ulid/v2 v2.0.2 - github.com/opentracing/opentracing-go v1.0.2 - github.com/philhofer/fwd v1.0.0 // indirect github.com/prometheus/client_golang v1.0.0 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 github.com/sebest/xff v0.0.0-20160910043805-6c115e0ffa35 github.com/sirupsen/logrus v1.3.0 - github.com/stretchr/testify v1.4.0 - github.com/tinylib/msgp v1.0.2 // indirect - github.com/uber-go/atomic v1.3.2 // indirect - github.com/uber/jaeger-client-go v2.15.0+incompatible - github.com/uber/jaeger-lib v1.5.0 // indirect - go.opencensus.io v0.22.2 // indirect - go.uber.org/atomic v1.3.2 // indirect - golang.org/x/exp v0.0.0-20191227195350-da58074b4299 // indirect - golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa // indirect - golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect - golang.org/x/sys v0.0.0-20200113162924-86b910548bc1 // indirect - golang.org/x/tools v0.0.0-20200117161641-43d50277825c // indirect - google.golang.org/api v0.15.0 - google.golang.org/appengine v1.6.5 // indirect - google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba // indirect - google.golang.org/grpc v1.24.0 - gopkg.in/DataDog/dd-trace-go.v1 v1.7.0 + github.com/stretchr/testify v1.6.1 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.13.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.13.0 + go.opentelemetry.io/otel v0.13.0 + go.opentelemetry.io/otel/exporters/otlp v0.13.0 + go.opentelemetry.io/otel/exporters/stdout v0.13.0 + go.opentelemetry.io/otel/exporters/trace/jaeger v0.13.0 + go.opentelemetry.io/otel/sdk v0.13.0 + golang.org/x/text v0.3.4 // indirect + golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3 // indirect + google.golang.org/api v0.32.0 + google.golang.org/grpc v1.32.0 ) go 1.13 diff --git a/go.sum b/go.sum index 0e96f17a0049031ec92118018cdcbb70f2d95bf0..73643df0c427a9a0b7329fc112dfedadb09eda77 100644 --- a/go.sum +++ b/go.sum @@ -7,14 +7,36 @@ cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTj cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0 h1:0E3eE8MX426vUOs7aHfI7aN1BrIzzzf4ccKCSfSjGmc= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go/bigquery v1.0.1 h1:hL+ycaJpVE9M7nLoiXb/Pn10ENE2u+oddxbD8uu0ZVU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0 h1:Kt+gOPPp2LEPWp8CSfxhsM8ik9CcyE/gYu+0r+RnZvM= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1 h1:W9tAK3E57P75u0XLLR82LZyw8VpAnhmyTOxW9qzmyj8= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0 h1:VV2nUM3wwLLGh9lSABFgZMjInyUbJeaRSE64WuAIQ+4= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0 h1:STgFzyU5/8miMl0//zKh2aQeTyeaUH3WN9bSUiJ09bA= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= @@ -22,17 +44,24 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= +github.com/DataDog/sketches-go v0.0.1 h1:RtG+76WKgZuz6FIaGsjoPePmadDBkuD/KC6+ZWu78b8= +github.com/DataDog/sketches-go v0.0.1/go.mod h1:Q5DbzQ+3AkgGwymQO7aZFNP7ns2lZKGtvRBzRXfdi60= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/benbjohnson/clock v1.0.3 h1:vkLuvpK4fmtSCuo60+yC63p7y0BmQ8gm5ZXGuBCJyXg= +github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20180905225744-ee1a9a0726d2 h1:MmeatFT1pTPSVb4nkPmBFN/LRZ97vPjsFKsZrU3KKTs= github.com/certifi/gocertifi v0.0.0-20180905225744-ee1a9a0726d2/go.mod h1:GJKEexRPVJrBSOjoqN5VNOIKJ5Q3RViH6eu3puDRwx4= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -41,8 +70,7 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/client9/reopen v1.0.0 h1:8tpLVR74DLpLObrn2KvsyxJY++2iORGR17WLUdSzUws= github.com/client9/reopen v1.0.0/go.mod h1:caXVCEr+lUtoN1FlsRiOWdfQtdRHIYfcb0ai8qKWtkQ= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= @@ -56,9 +84,15 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -72,7 +106,9 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= @@ -82,35 +118,70 @@ github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6Wezm github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gogo/protobuf v1.1.1 h1:72R+M5VuhED/KujmZVcIquuo8mBgX4oVda//DQb3PXo= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0 h1:pMen7vLs8nvgEYhywH3KDWJIJTeEr2ULsVWHWYHQyBs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc h1:DLpL8pWq0v4JYoRpEhDfsJhhJyGKCcQM2WPW2TJs31c= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99 h1:Ak8CrdlwwXwAZxzS66vgPt4U8yUZX7JwLvVR58FN5jM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= @@ -146,6 +217,7 @@ github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4 github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= @@ -162,8 +234,6 @@ 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/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/lightstep/lightstep-tracer-go v0.15.6 h1:D0GGa7afJ7GcQvu5as6ssLEEKYXvRgKI5d5cevtz8r4= -github.com/lightstep/lightstep-tracer-go v0.15.6/go.mod h1:6AMpwZpsyCFwSovxzM78e+AsYxE8sGwiM6C3TytaWeI= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -193,12 +263,8 @@ github.com/onsi/ginkgo v1.10.3 h1:OoxbjfXVZyod1fmWYhI7SEyaD8B00ynP3T+D5GiyHOY= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.7.1 h1:K0jcRCwNQM3vFGh1ppMtDh/+7ApJrjldlX8fA0jDTLQ= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= @@ -239,6 +305,7 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -246,14 +313,8 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/tinylib/msgp v1.0.2 h1:DfdQrzQa7Yh2es9SuLkixqxuXS2SxsdYn0KbdrOGWD8= -github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= -github.com/uber-go/atomic v1.3.2 h1:Azu9lPBWRNKzYXSIwRfgRuDuS0YKsK4NFhiQv98gkxo= -github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= -github.com/uber/jaeger-client-go v2.15.0+incompatible h1:NP3qsSqNxh8VYr956ur1N/1C1PjvOJnJykCzcD5QHbk= -github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-lib v1.5.0 h1:OHbgr8l656Ub3Fw5k9SWnBfIEwvoHQ+W2y+Aa9D1Uyo= -github.com/uber/jaeger-lib v1.5.0/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -271,12 +332,33 @@ github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmv github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opentelemetry.io/contrib v0.13.0 h1:q34CFu5REx9Dt2ksESHC/doIjFJkEg1oV3aSwlL5JR0= +go.opentelemetry.io/contrib v0.13.0/go.mod h1:HzCu6ebm0ywgNxGaEfs3izyJOMP4rZnzxycyTgpI5Sg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.13.0 h1:Ys1lnE8Y6rv3aKc9Ha13n7UM4pMHC0kvLSFtNx+gUfY= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.13.0/go.mod h1:ffigAFAlfY9AfFwJocEw88qbbvjAKfvqZg5tLyZv0l0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.13.0 h1:dnZy1afzxEDrHybTYoJE1bQ3fphNwZF2ipSsynlITP4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.13.0/go.mod h1:SeQm4RTCcZ2/hlMSTuHb7nwIROe5odBtgfKx+7MMqEs= +go.opentelemetry.io/otel v0.13.0 h1:2isEnyzjjJZq6r2EKMsFj4TxiQiexsM04AVhwbR/oBA= +go.opentelemetry.io/otel v0.13.0/go.mod h1:dlSNewoRYikTkotEnxdmuBHgzT+k/idJSfDv/FxEnOY= +go.opentelemetry.io/otel/exporters/otlp v0.13.0 h1:iithmYmMAfLFgCW5TcRXHpXR5NTWO7nGtX3WcBiusVE= +go.opentelemetry.io/otel/exporters/otlp v0.13.0/go.mod h1:YHH58UrGcqCKtBkY7sl3zPKpxBzfC1HUUYMRQONJJ9E= +go.opentelemetry.io/otel/exporters/stdout v0.13.0 h1:A+XiGIPQbGoJoBOJfKAKnZyiUSjSWvL3XWETUvtom5k= +go.opentelemetry.io/otel/exporters/stdout v0.13.0/go.mod h1:JJt8RpNY6K+ft9ir3iKpceCvT/rhzJXEExGrWFCbv1o= +go.opentelemetry.io/otel/exporters/trace/jaeger v0.13.0 h1:TjXcUVYbsjl3lYifrWptraZAL0OBmpMxRLm/eJ1GyZU= +go.opentelemetry.io/otel/exporters/trace/jaeger v0.13.0/go.mod h1:RSg6E40NYGqN/aCrStCUue2e+jABeFk2bKdNucw63ao= +go.opentelemetry.io/otel/sdk v0.13.0 h1:4VCfpKamZ8GtnepXxMRurSpHpMKkcxhtO33z1S4rGDQ= +go.opentelemetry.io/otel/sdk v0.13.0/go.mod h1:dKvLH8Uu8LcEPlSAUsfW7kMGaJBhk/1NYvpPZ6wIMbU= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -286,13 +368,19 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299 h1:zQpM52jfKHG6II1ISZY1ZcpygvuSFZpLwfluuF89XOg= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -301,13 +389,21 @@ golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTk golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= +golang.org/x/mod v0.3.0/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 h1:g9qWBGx4puODJTMVyoPrpoxPFgVGd+z1DZwjfRu4d0I= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -326,15 +422,36 @@ golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 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= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 h1:ld7aEMNHoBnnDAX15v1T6z31v8HwR2A9FYOuAhWqkwc= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= 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= @@ -343,6 +460,11 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522 h1:Ve1ORMCxvRmSXBwJK+t3Oy+V2vRW2OetUQBq4rJIkZE= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -361,17 +483,42 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1 h1:gZpLHxUX5BdYLA08Lj4YCJNN/jk7KtquiArPoeX0WvA= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f h1:Fqb3ao1hUmOR3GkUOg/Y+BadLwykBIzs5q8Ez2SbHyc= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +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/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 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= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/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= @@ -389,27 +536,68 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c h1:2EA2K0k9bcvvEDlqD8xdlOhCOqq+O/p9Voqi4x9W1YU= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3 h1:g7N8JAk6JanVPobmEOIX9ZMC2qGD1oA/nxCURqi2a+0= +golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 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 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= 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= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0 h1:yzlyyDW/J0w8yNFJIhiAJy4kq74S+1DOLdawELNxFMA= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.32.0 h1:Le77IccnTqEa8ryp9wIpX5W3zYm7Gf9LhOp9PHcwFts= +google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -419,21 +607,65 @@ google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba h1:pRj9OXZbwNtbtZtOB4dLwfK4u+EVRMvP+e9zKkg2grM= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d h1:92D1fum1bJLKSdr11OJ+54YeCMCGYIygTA7R/YZxH5M= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -gopkg.in/DataDog/dd-trace-go.v1 v1.7.0 h1:7wbMayb6JXcbAS95RN7MI42W3o1BCxCcdIzZfVWBAiE= -gopkg.in/DataDog/dd-trace-go.v1 v1.7.0/go.mod h1:DVp8HmDh8PuTu2Z0fVVlBsyWaC++fzwVCaGWylTe3tg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1 h1:SfXqXS5hkufcdZ/mHtYCh53P2b+92WQq/DZcKLgsFRs= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0 h1:zWTV+LMdc3kaiJMSTOFz2UgSBgx8RNQoTGiZu3fR9S0= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +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= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 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/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -448,10 +680,16 @@ gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/test.sh b/test.sh index 819c539cb4814c5dd8b31b73a01818db972edbd8..74c0592387808613526f092014366e9736732ca7 100755 --- a/test.sh +++ b/test.sh @@ -3,19 +3,20 @@ set -euo pipefail IFS=$'\n\t' -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "${SCRIPT_DIR}" for build_tags in \ "" \ - "tracer_static tracer_static_jaeger tracer_static_lightstep tracer_static_datadog" \ - "continuous_profiler_stackdriver" \ - ; do + "tracer_static_jaeger" \ + "tracer_static_otlp" \ + "tracer_static_jaeger tracer_static_otlp" \ + "continuous_profiler_stackdriver"; do ( - set -x; + set -x go test \ - -tags "${build_tags}" \ - ./... + -tags "${build_tags}" \ + ./... ) done diff --git a/tracing/connstr/connection_string_parser.go b/tracing/connstr/connection_string_parser.go index 97128de63ffbab4ee780da52610202436e65044a..f7da42c819380a1c22cb252bcd6581902a384178 100644 --- a/tracing/connstr/connection_string_parser.go +++ b/tracing/connstr/connection_string_parser.go @@ -24,7 +24,8 @@ func Parse(connectionString string) (driverName string, options map[string]strin return "", nil, errInvalidConnection } - if URL.Scheme != "opentracing" { + // Allow transition from opentracing to otel... + if URL.Scheme != "opentracing" && URL.Scheme != "otel" { return "", nil, errInvalidConnection } diff --git a/tracing/correlation/baggage_handler.go b/tracing/correlation/baggage_handler.go index 4ed0646c2cffc588cade25ecdb9e487ea8ad2f44..f67fb17d035bcc3e73ca39c733390bd2e267385e 100644 --- a/tracing/correlation/baggage_handler.go +++ b/tracing/correlation/baggage_handler.go @@ -3,8 +3,9 @@ package tracingcorrelation import ( "net/http" - opentracing "github.com/opentracing/opentracing-go" "gitlab.com/gitlab-org/labkit/correlation" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/label" ) // BaggageHandler will set opentracing baggage items with the current correlation_id. @@ -12,18 +13,19 @@ func BaggageHandler(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() - if span := opentracing.SpanFromContext(ctx); span != nil { - correlationID := correlation.ExtractFromContext(ctx) + correlationID := correlation.ExtractFromContext(ctx) + if correlationID != "" { + // Context -> Baggage + ctx = otel.ContextWithBaggageValues(ctx, label.String(correlation.FieldName, correlationID)) + r = r.WithContext(ctx) + } else { + // If the span contains the correlation_id, but the context doesn't + // inject it from the span + // Baggage -> Context + correlationID = otel.BaggageValue(ctx, correlation.FieldName).AsString() if correlationID != "" { - span.SetBaggageItem(correlation.FieldName, correlationID) - } else { - // If the span contains the correlation_id, but the context doesn't - // inject it from the span - correlationID = span.BaggageItem(correlation.FieldName) - if correlationID != "" { - ctx = correlation.ContextWithCorrelation(ctx, correlationID) - r = r.WithContext(ctx) - } + ctx = correlation.ContextWithCorrelation(ctx, correlationID) + r = r.WithContext(ctx) } } diff --git a/tracing/env_extractor.go b/tracing/env_extractor.go index 6ba8ca0875b3129a655dfef6fff4f67faca65d90..1c70b70b8712e502cacbee2e56b1788fdbbdc1e9 100644 --- a/tracing/env_extractor.go +++ b/tracing/env_extractor.go @@ -5,9 +5,11 @@ import ( "os" "strings" - opentracing "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/ext" "gitlab.com/gitlab-org/labkit/correlation" + "go.opentelemetry.io/otel/api/global" + "go.opentelemetry.io/otel/api/trace" + "go.opentelemetry.io/otel/label" + "go.opentelemetry.io/otel/semconv" ) // ExtractFromEnv will extract a span from the environment after it has been passed in @@ -15,49 +17,33 @@ import ( // should be called on process termination. func ExtractFromEnv(ctx context.Context, opts ...ExtractFromEnvOption) (context.Context, func()) { /* config not yet used */ applyExtractFromEnvOptions(opts) - tracer := opentracing.GlobalTracer() + + textMapPropagator := global.TextMapPropagator() // TODO: do better than this? + tr := global.Tracer("gitlab.com/gitlab-org/labkit/tracing") + carrier := &envTextMapCarrier{} // Extract the Correlation-ID - envMap := environAsMap(os.Environ()) - correlationID := envMap[envCorrelationIDKey] - if correlationID != "" { + correlationID, hasCorrelationID := os.LookupEnv(envCorrelationIDKey) + if hasCorrelationID && correlationID != "" { ctx = correlation.ContextWithCorrelation(ctx, correlationID) } - // Attempt to deserialize tracing identifiers - wireContext, err := tracer.Extract( - opentracing.TextMap, - opentracing.TextMapCarrier(envMap)) - - if err != nil { - /* Clients could send bad data, in which case we simply ignore it */ - return ctx, func() {} - } - - // Create the span referring to the RPC client if available. - // If wireContext == nil, a root span will be created. - additionalStartSpanOpts := []opentracing.StartSpanOption{ - ext.RPCServerOption(wireContext), + attributes := []label.KeyValue{ + semconv.ProcessPIDKey.Int(os.Getpid()), + semconv.ProcessExecutableNameKey.String(os.Args[0]), + semconv.ProcessCommandLineKey.String(strings.Join(os.Args, " ")), } if correlationID != "" { - additionalStartSpanOpts = append(additionalStartSpanOpts, opentracing.Tag{Key: "correlation_id", Value: correlationID}) + attributes = append(attributes, label.String("correlation_id", correlationID)) } - serverSpan := opentracing.StartSpan( + ctx = textMapPropagator.Extract(ctx, carrier) + ctx, span := tr.Start( + ctx, "execute", - additionalStartSpanOpts..., + trace.WithAttributes(attributes...), ) - ctx = opentracing.ContextWithSpan(ctx, serverSpan) - - return ctx, func() { serverSpan.Finish() } -} -func environAsMap(env []string) map[string]string { - envMap := make(map[string]string, len(env)) - for _, v := range env { - s := strings.SplitN(v, "=", 2) - envMap[s[0]] = s[1] - } - return envMap + return ctx, func() { span.End() } } diff --git a/tracing/env_extractor_test.go b/tracing/env_extractor_test.go index d8aea405965754fe7996388962bf57310503eb8f..c70d003922275118fb9addc52f19eaa04a6b50ad 100644 --- a/tracing/env_extractor_test.go +++ b/tracing/env_extractor_test.go @@ -3,7 +3,6 @@ package tracing import ( "context" "os" - "reflect" "testing" "github.com/stretchr/testify/require" @@ -48,26 +47,26 @@ func TestExtractFromEnv(t *testing.T) { } } -func Test_environAsMap(t *testing.T) { - tests := []struct { - name string - env []string - want map[string]string - }{ - { - name: "trivial", - env: nil, - want: map[string]string{}, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := environAsMap(tt.env); !reflect.DeepEqual(got, tt.want) { - t.Errorf("environAsMap() = %v, want %v", got, tt.want) - } - }) - } -} +// func Test_environAsMap(t *testing.T) { +// tests := []struct { +// name string +// env []string +// want map[string]string +// }{ +// { +// name: "trivial", +// env: nil, +// want: map[string]string{}, +// }, +// } +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// if got := environAsMap(tt.env); !reflect.DeepEqual(got, tt.want) { +// t.Errorf("environAsMap() = %v, want %v", got, tt.want) +// } +// }) +// } +// } // addAdditionalEnv will configure additional environment values // and return a deferrable function to reset the environment to diff --git a/tracing/env_injector.go b/tracing/env_injector.go index 0147981125970e594fb25dda685f9c89e6c74283..092e9024afb54feff25a3f718be73e10644a58a4 100644 --- a/tracing/env_injector.go +++ b/tracing/env_injector.go @@ -2,13 +2,10 @@ package tracing import ( "context" - "fmt" "os" - "sort" - opentracing "github.com/opentracing/opentracing-go" "gitlab.com/gitlab-org/labkit/correlation" - logkit "gitlab.com/gitlab-org/labkit/log" + "go.opentelemetry.io/otel/api/global" ) // envCorrelationIDKey is used to pass the current correlation-id over to the child process. @@ -25,46 +22,26 @@ func NewEnvInjector(opts ...EnvInjectorOption) EnvInjector { /* config not yet used */ applyEnvInjectorOptions(opts) return func(ctx context.Context, env []string) []string { - envMap := map[string]string{} + carrier := &envTextMapCarrier{injectedValues: make(map[string]string)} // Pass the Correlation-ID through the environment if set correlationID := correlation.ExtractFromContext(ctx) if correlationID != "" { - envMap[envCorrelationIDKey] = correlationID + carrier.Set(envCorrelationIDKey, correlationID) } // Also include the GITLAB_TRACING configuration so that // the child process knows how to configure itself v, ok := os.LookupEnv(tracingEnvKey) if ok { - envMap[tracingEnvKey] = v + carrier.Set(tracingEnvKey, v) } - span := opentracing.SpanFromContext(ctx) - if span == nil { - // If no active span, short circuit - return appendMapToEnv(env, envMap) - } - - carrier := opentracing.TextMapCarrier(envMap) - err := span.Tracer().Inject(span.Context(), opentracing.TextMap, carrier) - - if err != nil { - logkit.ContextLogger(ctx).WithError(err).Error("tracing span injection failed") - } + textMapPropagator := global.TextMapPropagator() // TODO: do better than this? + textMapPropagator.Inject(ctx, carrier) + // Append the injected items into the environment - return appendMapToEnv(env, envMap) + additionalItems := carrier.getCarrierValues() + return append(env, additionalItems...) } } - -// appendMapToEnv takes a map of key,value pairs and appends it to an -// array of environment variable pairs in `K=V` string pairs. -func appendMapToEnv(env []string, envMap map[string]string) []string { - additionalItems := []string{} - for k, v := range envMap { - additionalItems = append(additionalItems, fmt.Sprintf("%s=%s", k, v)) - } - - sort.Strings(additionalItems) - return append(env, additionalItems...) -} diff --git a/tracing/env_injector_test.go b/tracing/env_injector_test.go index 56cd7facd762284c9afd130b21cf58c47bfc2530..a9b5d8a897f7a23f4cb09d72cae7a2c350ce7cc4 100644 --- a/tracing/env_injector_test.go +++ b/tracing/env_injector_test.go @@ -3,7 +3,6 @@ package tracing import ( "context" "os" - "reflect" "testing" "github.com/stretchr/testify/require" @@ -115,49 +114,49 @@ func clearEnvironment(key string) func() { } } -func Test_appendMapToEnv(t *testing.T) { - tests := []struct { - name string - env []string - envMap map[string]string - want []string - }{ - { - name: "empty_case", - env: nil, - envMap: nil, - want: nil, - }, - { - name: "no_new_values", - env: []string{"A=1"}, - envMap: nil, - want: []string{"A=1"}, - }, - { - name: "no_original_values", - env: nil, - envMap: map[string]string{"A": "1"}, - want: []string{"A=1"}, - }, - { - name: "merge_values", - env: []string{"A=1"}, - envMap: map[string]string{"B": "2"}, - want: []string{"A=1", "B=2"}, - }, - { - name: "merge_conflicts", - env: []string{"A=1", "C=3"}, - envMap: map[string]string{"B": "2", "C": "4"}, - want: []string{"A=1", "C=3", "B=2", "C=4"}, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := appendMapToEnv(tt.env, tt.envMap); !reflect.DeepEqual(got, tt.want) { - t.Errorf("appendMapToEnv() = %v, want %v", got, tt.want) - } - }) - } -} +// func Test_appendMapToEnv(t *testing.T) { +// tests := []struct { +// name string +// env []string +// envMap map[string]string +// want []string +// }{ +// { +// name: "empty_case", +// env: nil, +// envMap: nil, +// want: nil, +// }, +// { +// name: "no_new_values", +// env: []string{"A=1"}, +// envMap: nil, +// want: []string{"A=1"}, +// }, +// { +// name: "no_original_values", +// env: nil, +// envMap: map[string]string{"A": "1"}, +// want: []string{"A=1"}, +// }, +// { +// name: "merge_values", +// env: []string{"A=1"}, +// envMap: map[string]string{"B": "2"}, +// want: []string{"A=1", "B=2"}, +// }, +// { +// name: "merge_conflicts", +// env: []string{"A=1", "C=3"}, +// envMap: map[string]string{"B": "2", "C": "4"}, +// want: []string{"A=1", "C=3", "B=2", "C=4"}, +// }, +// } +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// if got := appendMapToEnv(tt.env, tt.envMap); !reflect.DeepEqual(got, tt.want) { +// t.Errorf("appendMapToEnv() = %v, want %v", got, tt.want) +// } +// }) +// } +// } diff --git a/tracing/env_text_map_carrier.go b/tracing/env_text_map_carrier.go new file mode 100644 index 0000000000000000000000000000000000000000..1ec4de912fb3b73098a018cba18e408931859f64 --- /dev/null +++ b/tracing/env_text_map_carrier.go @@ -0,0 +1,40 @@ +package tracing + +import ( + "fmt" + "os" + "sort" + + "go.opentelemetry.io/otel" +) + +type envTextMapCarrier struct { + injectedValues map[string]string +} + +var _ otel.TextMapCarrier = &envTextMapCarrier{} + +func (c *envTextMapCarrier) Get(key string) string { + // Check if this value has already been set + v, ok := c.injectedValues[key] + if ok { + return v + } + + // Fallback to environment + v, _ = os.LookupEnv(key) + return v +} + +func (c *envTextMapCarrier) Set(key string, value string) { + c.injectedValues[key] = value +} + +func (c *envTextMapCarrier) getCarrierValues() []string { + additionalItems := []string{} + for k, v := range c.injectedValues { + additionalItems = append(additionalItems, fmt.Sprintf("%s=%s", k, v)) + } + sort.Strings(additionalItems) + return additionalItems +} diff --git a/tracing/grpc/client_interceptors.go b/tracing/grpc/client_interceptors.go index 3244bf3a6ff37aa34e7daa8cb9450a426334f5eb..a129be328b9861ed5751455d57cee96155309cd5 100644 --- a/tracing/grpc/client_interceptors.go +++ b/tracing/grpc/client_interceptors.go @@ -1,16 +1,16 @@ package grpccorrelation import ( - grpc_opentracing "github.com/grpc-ecosystem/go-grpc-middleware/tracing/opentracing" + "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" "google.golang.org/grpc" ) // UnaryClientTracingInterceptor will create a unary client tracing interceptor. func UnaryClientTracingInterceptor() grpc.UnaryClientInterceptor { - return grpc_opentracing.UnaryClientInterceptor() + return otelgrpc.UnaryClientInterceptor() } // StreamClientTracingInterceptor will create a streaming client tracing interceptor. func StreamClientTracingInterceptor() grpc.StreamClientInterceptor { - return grpc_opentracing.StreamClientInterceptor() + return otelgrpc.StreamClientInterceptor() } diff --git a/tracing/grpc/server_interceptors.go b/tracing/grpc/server_interceptors.go index 23065742d9edfc3308febd8eb330cb3247cbdb94..fe00b5374b9ce4bbd2d29be0c3e4f742741ff238 100644 --- a/tracing/grpc/server_interceptors.go +++ b/tracing/grpc/server_interceptors.go @@ -1,16 +1,16 @@ package grpccorrelation import ( - grpc_opentracing "github.com/grpc-ecosystem/go-grpc-middleware/tracing/opentracing" + "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" "google.golang.org/grpc" ) // UnaryServerTracingInterceptor will create a unary server tracing interceptor. func UnaryServerTracingInterceptor() grpc.UnaryServerInterceptor { - return grpc_opentracing.UnaryServerInterceptor() + return otelgrpc.UnaryServerInterceptor() } // StreamServerTracingInterceptor will create a streaming server tracing interceptor. func StreamServerTracingInterceptor() grpc.StreamServerInterceptor { - return grpc_opentracing.StreamServerInterceptor() + return otelgrpc.StreamServerInterceptor() } diff --git a/tracing/impl/closer_func.go b/tracing/impl/closer_func.go new file mode 100644 index 0000000000000000000000000000000000000000..95919532b07d849ae02801512988ac659842c5dc --- /dev/null +++ b/tracing/impl/closer_func.go @@ -0,0 +1,12 @@ +package impl + +import "io" + +type closerFunc func() + +func (c closerFunc) Close() error { + c() + return nil +} + +var _ io.Closer = closerFunc(func() {}) diff --git a/tracing/impl/closer_noop.go b/tracing/impl/closer_noop.go new file mode 100644 index 0000000000000000000000000000000000000000..76d4764f400f984e4b0deefa355407e7d80af539 --- /dev/null +++ b/tracing/impl/closer_noop.go @@ -0,0 +1,7 @@ +package impl + +type noopCloser struct{} + +func (c *noopCloser) Close() error { + return nil +} diff --git a/tracing/impl/datadog_tracer.go b/tracing/impl/datadog_tracer.go deleted file mode 100644 index 8a0995a74b7855c6f0c26b0b1571b25c368d52a4..0000000000000000000000000000000000000000 --- a/tracing/impl/datadog_tracer.go +++ /dev/null @@ -1,24 +0,0 @@ -// +build tracer_static,tracer_static_datadog - -package impl - -import ( - "io" - - opentracing "github.com/opentracing/opentracing-go" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/opentracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" -) - -func tracerFactory(config map[string]string) (opentracing.Tracer, io.Closer, error) { - opts := []tracer.StartOption{} - if config["service_name"] != "" { - opts = append(opts, tracer.WithServiceName(config["service_name"])) - } - - return opentracer.New(opts...), nil, nil -} - -func init() { - registerTracer("datadog", tracerFactory) -} diff --git a/tracing/impl/jaeger_tracer.go b/tracing/impl/jaeger_tracer.go index d0656e74dfcf95d7811e329b6dec876e61e2494b..f1161675cb89d274f44d424aae108b1869084504 100644 --- a/tracing/impl/jaeger_tracer.go +++ b/tracing/impl/jaeger_tracer.go @@ -1,94 +1,61 @@ -// +build tracer_static,tracer_static_jaeger +// +build tracer_static_jaeger package impl import ( - "fmt" "io" - "strconv" - opentracing "github.com/opentracing/opentracing-go" - log "github.com/sirupsen/logrus" - jaegercfg "github.com/uber/jaeger-client-go/config" - jaegerlog "github.com/uber/jaeger-client-go/log" + apitrace "go.opentelemetry.io/otel/api/trace" + "go.opentelemetry.io/otel/exporters/trace/jaeger" + sdktrace "go.opentelemetry.io/otel/sdk/trace" ) -type traceConfigMapper func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) +func jaegerTracerFactory(config map[string]string) (apitrace.TracerProvider, io.Closer, error) { + err := validateOptions( + config, + "service_name", + "debug", // Ignored for backwards compat + "sampler", + "sampler_param", + "http_endpoint", + "udp_endpoint", + ) -var configMapper = map[string]traceConfigMapper{ - "service_name": func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) { - traceCfg.ServiceName = value - return nil, nil - }, - "debug": func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) { - return []jaegercfg.Option{jaegercfg.Logger(jaegerlog.StdLogger)}, nil - }, - "sampler": func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) { - if traceCfg.Sampler == nil { - traceCfg.Sampler = &jaegercfg.SamplerConfig{} - } - - traceCfg.Sampler.Type = value - return nil, nil - }, - "sampler_param": func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) { - if traceCfg.Sampler == nil { - traceCfg.Sampler = &jaegercfg.SamplerConfig{} - } - valuef, err := strconv.ParseFloat(value, 64) - if err != nil { - return nil, fmt.Errorf("sampler_param must be a float: %w", ErrConfiguration) - } - - traceCfg.Sampler.Param = valuef - return nil, nil - }, - "http_endpoint": func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) { - if traceCfg.Reporter == nil { - traceCfg.Reporter = &jaegercfg.ReporterConfig{} - } - traceCfg.Reporter.CollectorEndpoint = value - return nil, nil - }, - "udp_endpoint": func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) { - if traceCfg.Reporter == nil { - traceCfg.Reporter = &jaegercfg.ReporterConfig{} - } - traceCfg.Reporter.LocalAgentHostPort = value - return nil, nil - }, -} - -func jaegerTracerFactory(config map[string]string) (opentracing.Tracer, io.Closer, error) { - traceCfg, err := jaegercfg.FromEnv() if err != nil { - return nil, nil, err + return apitrace.NoopTracerProvider(), &noopCloser{}, err } - options := []jaegercfg.Option{} + + process := jaeger.Process{} + endpointOption := jaeger.WithAgentEndpoint("localhost:9999") // TODO: Fix this // Convert the configuration map into a jaeger configuration for k, v := range config { - mapper := configMapper[k] - if k == keyStrictConnectionParsing { - continue + switch k { + case "service_name": + process.ServiceName = v + case "http_endpoint": + endpointOption = jaeger.WithCollectorEndpoint(v) + case "udp_endpoint": + endpointOption = jaeger.WithAgentEndpoint(v) } + } - if mapper != nil { - o, err := mapper(traceCfg, v) - if err != nil { - return nil, nil, err - } - options = append(options, o...) - } else { - if config[keyStrictConnectionParsing] != "" { - return nil, nil, fmt.Errorf("jaeger tracer: invalid option: %s: %w", k, ErrConfiguration) - } + sampler, err := samplerFactory(config) + if err != nil { + return apitrace.NoopTracerProvider(), &noopCloser{}, err + } - log.Printf("jaeger tracer: warning: ignoring unknown configuration option: %s", k) - } + exportOptions := []jaeger.Option{ + jaeger.WithProcess(process), + jaeger.WithSDK(&sdktrace.Config{DefaultSampler: sampler}), } - return traceCfg.NewTracer(options...) + traceProvider, flush, err := jaeger.NewExportPipeline( + endpointOption, + exportOptions..., + ) + + return traceProvider, closerFunc(flush), err } func init() { diff --git a/tracing/impl/jaeger_tracer_test.go b/tracing/impl/jaeger_tracer_test.go index 8008248a469b70f5327d76710c62bf1d5abc81ec..3853923bbdd21d136e7d7e77d21d5c0b2969fc95 100644 --- a/tracing/impl/jaeger_tracer_test.go +++ b/tracing/impl/jaeger_tracer_test.go @@ -1,4 +1,4 @@ -// +build tracer_static,tracer_static_jaeger +// +build tracer_static_jaeger package impl diff --git a/tracing/impl/lightstep_tracer.go b/tracing/impl/lightstep_tracer.go deleted file mode 100644 index 23edf3a191dc7e53a1e861f3ce2e6596651c94d4..0000000000000000000000000000000000000000 --- a/tracing/impl/lightstep_tracer.go +++ /dev/null @@ -1,71 +0,0 @@ -// +build tracer_static,tracer_static_lightstep - -package impl - -import ( - "context" - "fmt" - "io" - - lightstep "github.com/lightstep/lightstep-tracer-go" - opentracing "github.com/opentracing/opentracing-go" - log "github.com/sirupsen/logrus" -) - -type lightstepCloser struct { - tracer lightstep.Tracer -} - -func (c *lightstepCloser) Close() error { - lightstep.Close(context.Background(), c.tracer) - return nil -} - -var lightstepConfigMapper = map[string]func(traceCfg *lightstep.Options, value string) error{ - "service_name": func(options *lightstep.Options, value string) error { - options.Tags[lightstep.ComponentNameKey] = value - return nil - }, - "access_token": func(options *lightstep.Options, value string) error { - options.AccessToken = value - return nil - }, -} - -func lightstepTracerFactory(config map[string]string) (opentracing.Tracer, io.Closer, error) { - options := lightstep.Options{ - Tags: map[string]interface{}{}, - } - - // Convert the configuration map into a jaeger configuration - for k, v := range config { - mapper := lightstepConfigMapper[k] - if k == keyStrictConnectionParsing { - continue - } - - if mapper != nil { - err := mapper(&options, v) - if err != nil { - return nil, nil, err - } - } else { - if config[keyStrictConnectionParsing] != "" { - return nil, nil, fmt.Errorf("lightstep tracer: invalid option: %s: %w", k, ErrConfiguration) - } - - log.Printf("lightstep tracer: warning: ignoring unknown configuration option: %s", k) - } - } - - tracer := lightstep.NewTracer(options) - if tracer == nil { - return nil, nil, fmt.Errorf("lightstep tracer: unable to create tracer, review log messages: %w", ErrConfiguration) - } - - return tracer, &lightstepCloser{tracer}, nil -} - -func init() { - registerTracer("lightstep", lightstepTracerFactory) -} diff --git a/tracing/impl/lightstep_tracer_test.go b/tracing/impl/lightstep_tracer_test.go deleted file mode 100644 index c4750d5e7091142bb600b0e8a3e70f0735a3dcc5..0000000000000000000000000000000000000000 --- a/tracing/impl/lightstep_tracer_test.go +++ /dev/null @@ -1,67 +0,0 @@ -// +build tracer_static,tracer_static_lightstep - -package impl - -import ( - "testing" - - "gitlab.com/gitlab-org/labkit/tracing/connstr" -) - -func Test_lightstepTracerFactory(t *testing.T) { - tests := []struct { - connectionString string - wantErr bool - strict bool - }{ - { - connectionString: "opentracing://lightstep", - wantErr: true, - strict: true, - }, - { - connectionString: "opentracing://lightstep?access_token=12345", - wantErr: false, - strict: true, - }, - { - connectionString: "opentracing://lightstep?access_token=12345&relaxed", - wantErr: false, - strict: false, - }, - { - connectionString: "opentracing://lightstep?access_token=12345&strict", - wantErr: true, - strict: true, - }, - } - for _, tt := range tests { - t.Run(tt.connectionString, func(t *testing.T) { - _, options, err := connstr.Parse(tt.connectionString) - if err != nil { - t.Errorf("TracerFactory() error = unable to parse connection string: %v", err) - } - if tt.strict { - options[keyStrictConnectionParsing] = "1" - } - - options["service_name"] = "test" - - gotTracer, gotCloser, err := lightstepTracerFactory(options) - - if (err != nil) != tt.wantErr { - t.Errorf("TracerFactory() error = %v, wantErr %v", err, tt.wantErr) - return - } - - if !tt.wantErr { - if gotTracer == nil { - t.Errorf("TracerFactory() expected a tracer, got nil") - } - if gotCloser == nil { - t.Errorf("TracerFactory() expected a closed, got nil") - } - } - }) - } -} diff --git a/tracing/impl/null_tracer.go b/tracing/impl/null_tracer.go deleted file mode 100644 index ddfe40602ad99455f2f5ec8eb018d58c3ce24e41..0000000000000000000000000000000000000000 --- a/tracing/impl/null_tracer.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build !tracer_static - -package impl - -import ( - "fmt" - "io" - - opentracing "github.com/opentracing/opentracing-go" -) - -// New will instantiate a new instance of the tracer, given the driver and configuration -func New(driverName string, config map[string]string) (opentracing.Tracer, io.Closer, error) { - return nil, nil, fmt.Errorf("tracer: binary compiled without tracer support: cannot load driver %s", driverName) -} diff --git a/tracing/impl/options_validator.go b/tracing/impl/options_validator.go new file mode 100644 index 0000000000000000000000000000000000000000..db703a4f0945d66393e50323ae897b822a3e1e5d --- /dev/null +++ b/tracing/impl/options_validator.go @@ -0,0 +1,35 @@ +package impl + +import ( + "fmt" + + log "github.com/sirupsen/logrus" +) + +func validateOptions(config map[string]string, validKeys ...string) error { + strictParse := config[keyStrictConnectionParsing] != "" + + validKeySet := make(map[string]struct{}) + for _, v := range validKeys { + validKeySet[v] = struct{}{} + } + + // Convert the configuration map into a jaeger configuration + for k := range config { + if k == keyStrictConnectionParsing { + continue + } + + _, keyValid := validKeySet[k] + + if !keyValid { + if strictParse { + return fmt.Errorf("tracer options: invalid option: %s: %w", k, ErrConfiguration) + } + + log.Printf("tracer options: warning: ignoring unknown configuration option: %s", k) + } + } + + return nil +} diff --git a/tracing/impl/otlp_tracer.go b/tracing/impl/otlp_tracer.go new file mode 100644 index 0000000000000000000000000000000000000000..8c8537239aff82d3d8002f09b0c14b4a9ef55386 --- /dev/null +++ b/tracing/impl/otlp_tracer.go @@ -0,0 +1,112 @@ +// +build tracer_static_otlp + +package impl + +import ( + "context" + "io" + "strconv" + "time" + + log "github.com/sirupsen/logrus" + apitrace "go.opentelemetry.io/otel/api/trace" + "go.opentelemetry.io/otel/exporters/otlp" + "go.opentelemetry.io/otel/sdk/metric/controller/push" + "go.opentelemetry.io/otel/sdk/metric/processor/basic" + "go.opentelemetry.io/otel/sdk/metric/selector/simple" + "go.opentelemetry.io/otel/sdk/resource" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + "go.opentelemetry.io/otel/semconv" +) + +func otlpTracerFactory(config map[string]string) (apitrace.TracerProvider, io.Closer, error) { + err := validateOptions( + config, + "service_name", + "insecure", + "sampler", + "sampler_param", + "address", + ) + + if err != nil { + return apitrace.NoopTracerProvider(), &noopCloser{}, err + } + + serviceName := "" + insecure := false + address := "" + + for k, v := range config { + if k == "service_name" { + serviceName = v + } else if k == "insecure" { + b, err := strconv.ParseBool(v) + if err == nil { + insecure = b + } else { + // TODO Log a warning + insecure = false + } + } else if k == "address" { + address = v + } + } + + exporterOptions := []otlp.ExporterOption{} + if address != "" { + exporterOptions = append(exporterOptions, otlp.WithAddress(address)) + } + if insecure { + exporterOptions = append(exporterOptions, otlp.WithInsecure()) + } + + exp, err := otlp.NewExporter(exporterOptions...) + + if err != nil { + return apitrace.NoopTracerProvider(), &noopCloser{}, err + } + + bsp := sdktrace.NewBatchSpanProcessor(exp) + + defaultSampler, err := samplerFactory(config) + if err != nil { + return apitrace.NoopTracerProvider(), &noopCloser{}, err + } + + tracerProvider := sdktrace.NewTracerProvider( + sdktrace.WithConfig(sdktrace.Config{DefaultSampler: defaultSampler}), + sdktrace.WithResource(resource.New(semconv.ServiceNameKey.String(serviceName))), + sdktrace.WithSpanProcessor(bsp), + ) + + pusher := push.New( + basic.New( + simple.NewWithExactDistribution(), + exp, + ), + exp, + push.WithPeriod(2*time.Second), + ) + + // set global propagator to tracecontext (the default is no-op). + // global.SetTextMapPropagator(propagators.TraceContext{}) + // global.SetTracerProvider(tracerProvider) + // global.SetMeterProvider(pusher.MeterProvider()) + pusher.Start() + + closer := closerFunc(func() { + ctx := context.Background() + err := exp.Shutdown(ctx) + if err != nil { + log.Printf("otlp tracer: warning: shutdown failed: %w", err) + } + pusher.Stop() // pushes any last exports to the receiver + }) + + return tracerProvider, closer, nil +} + +func init() { + registerTracer("otlp", otlpTracerFactory) +} diff --git a/tracing/impl/sampler_factory.go b/tracing/impl/sampler_factory.go new file mode 100644 index 0000000000000000000000000000000000000000..c741a4a16a705ec86bffb4eb4e64be0939b23401 --- /dev/null +++ b/tracing/impl/sampler_factory.go @@ -0,0 +1,37 @@ +package impl + +import ( + "strconv" + + "go.opentelemetry.io/otel/sdk/trace" +) + +func samplerFactory(config map[string]string) (trace.Sampler, error) { + sampler := "probabilistic" + if v, ok := config["sampler"]; ok { + sampler = v + } + + samplerParam := 0.001 + if v, ok := config["sampler"]; ok { + f, err := strconv.ParseFloat(v, 64) + if err == nil { + samplerParam = f + } else { + samplerParam = 0.001 + } + } + + switch sampler { + case "const": + if samplerParam == 0 { + return trace.NeverSample(), nil + } + return trace.AlwaysSample(), nil + case "probabilistic": + // TODO: figure out if this (roughly) matches the old probabilistic sampler + return trace.ParentBased(trace.TraceIDRatioBased(samplerParam)), nil + } + + return trace.ParentBased(trace.TraceIDRatioBased(samplerParam)), nil +} diff --git a/tracing/impl/static_tracer.go b/tracing/impl/static_tracer.go index 0baa0624bc03c5095c80df9ba77ed85c1e206591..2fd0185ca9a06a29882f6dbffc02ad8090a9a96f 100644 --- a/tracing/impl/static_tracer.go +++ b/tracing/impl/static_tracer.go @@ -1,16 +1,14 @@ -// +build tracer_static - package impl import ( "fmt" "io" - opentracing "github.com/opentracing/opentracing-go" + apitrace "go.opentelemetry.io/otel/api/trace" ) // New will instantiate a new instance of the tracer, given the driver and configuration. -func New(driverName string, config map[string]string) (opentracing.Tracer, io.Closer, error) { +func New(driverName string, config map[string]string) (apitrace.TracerProvider, io.Closer, error) { factory := registry[driverName] if factory == nil { return nil, nil, fmt.Errorf("tracer: unable to load driver %s: %w", driverName, ErrConfiguration) diff --git a/tracing/impl/stdout_tracer.go b/tracing/impl/stdout_tracer.go new file mode 100644 index 0000000000000000000000000000000000000000..ec57cd866115d978e0cd95fb48fdc69f63c36f3f --- /dev/null +++ b/tracing/impl/stdout_tracer.go @@ -0,0 +1,74 @@ +package impl + +import ( + "context" + "io" + "time" + + log "github.com/sirupsen/logrus" + apitrace "go.opentelemetry.io/otel/api/trace" + "go.opentelemetry.io/otel/exporters/stdout" + "go.opentelemetry.io/otel/sdk/metric/controller/push" + "go.opentelemetry.io/otel/sdk/metric/processor/basic" + "go.opentelemetry.io/otel/sdk/metric/selector/simple" + sdktrace "go.opentelemetry.io/otel/sdk/trace" +) + +func stdoutTracerFactory(config map[string]string) (apitrace.TracerProvider, io.Closer, error) { + err := validateOptions( + config, + "service_name", + "sampler", + "sampler_param", + ) + + if err != nil { + return apitrace.NoopTracerProvider(), &noopCloser{}, err + } + + exporter, err := stdout.NewExporter( + stdout.WithQuantiles([]float64{0.5, 0.9, 0.95}), + stdout.WithPrettyPrint(), + ) + if err != nil { + return apitrace.NoopTracerProvider(), &noopCloser{}, err + } + + bsp := sdktrace.NewBatchSpanProcessor(exporter) + + defaultSampler, err := samplerFactory(config) + if err != nil { + return apitrace.NoopTracerProvider(), &noopCloser{}, err + } + + tracerProvider := sdktrace.NewTracerProvider( + sdktrace.WithConfig(sdktrace.Config{DefaultSampler: defaultSampler}), + sdktrace.WithSpanProcessor(bsp), + ) + + pusher := push.New( + basic.New( + simple.NewWithExactDistribution(), + exporter, + ), + exporter, + push.WithPeriod(2*time.Second), + ) + + pusher.Start() + + closer := closerFunc(func() { + ctx := context.Background() + err := exporter.Shutdown(ctx) + if err != nil { + log.Printf("otlp tracer: warning: shutdown failed: %v", err) + } + pusher.Stop() // pushes any last exports to the receiver + }) + + return tracerProvider, closer, nil +} + +func init() { + registerTracer("stdout", stdoutTracerFactory) +} diff --git a/tracing/impl/tracer_registry.go b/tracing/impl/tracer_registry.go index 2506469c82557ca18a0942f87789baecf38c1dd2..2405092551b33dc0d421df5e0ea9e7310c8c8470 100644 --- a/tracing/impl/tracer_registry.go +++ b/tracing/impl/tracer_registry.go @@ -3,10 +3,10 @@ package impl import ( "io" - opentracing "github.com/opentracing/opentracing-go" + apitrace "go.opentelemetry.io/otel/api/trace" ) -type tracerFactoryFunc func(config map[string]string) (opentracing.Tracer, io.Closer, error) +type tracerFactoryFunc func(config map[string]string) (apitrace.TracerProvider, io.Closer, error) var registry = map[string]tracerFactoryFunc{} diff --git a/tracing/inbound_http.go b/tracing/inbound_http.go index 90df6fb4adf50e657717597f778914e1fb51cd06..5afdea315c7c1026759939e49447f5793c46ee33 100644 --- a/tracing/inbound_http.go +++ b/tracing/inbound_http.go @@ -3,45 +3,18 @@ package tracing import ( "net/http" - opentracing "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/ext" - "gitlab.com/gitlab-org/labkit/correlation" + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" ) // Handler will extract tracing from inbound request. func Handler(h http.Handler, opts ...HandlerOption) http.Handler { config := applyHandlerOptions(opts) - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - tracer := opentracing.GlobalTracer() - if tracer == nil { - h.ServeHTTP(w, r) - return - } + spanNameFormatter := func(_ string, r *http.Request) string { + return config.getOperationName(r) + } - wireContext, _ := tracer.Extract( - opentracing.HTTPHeaders, - opentracing.HTTPHeadersCarrier(r.Header)) - - // Create the span referring to the RPC client if available. - // If wireContext == nil, a root span will be created. - additionalStartSpanOpts := []opentracing.StartSpanOption{ - ext.RPCServerOption(wireContext), - } - - correlationID := correlation.ExtractFromContext(r.Context()) - if correlationID != "" { - additionalStartSpanOpts = append(additionalStartSpanOpts, opentracing.Tag{Key: "correlation_id", Value: correlationID}) - } - - serverSpan := opentracing.StartSpan( - config.getOperationName(r), - additionalStartSpanOpts..., - ) - defer serverSpan.Finish() - - ctx := opentracing.ContextWithSpan(r.Context(), serverSpan) - - h.ServeHTTP(w, r.WithContext(ctx)) - }) + return otelhttp.NewHandler(h, "", + otelhttp.WithSpanNameFormatter(spanNameFormatter), + ) } diff --git a/tracing/initialization.go b/tracing/initialization.go index c527a33f120adbdd278e25ddcb45f19c26a89c08..2cf32a24dfe8832d7cd1637af0f9797d46297b5f 100644 --- a/tracing/initialization.go +++ b/tracing/initialization.go @@ -3,10 +3,10 @@ package tracing import ( "io" - opentracing "github.com/opentracing/opentracing-go" log "github.com/sirupsen/logrus" "gitlab.com/gitlab-org/labkit/tracing/connstr" "gitlab.com/gitlab-org/labkit/tracing/impl" + "go.opentelemetry.io/otel/api/global" ) type nopCloser struct { @@ -34,17 +34,17 @@ func Initialize(opts ...InitializationOption) io.Closer { options["service_name"] = config.serviceName } - tracer, closer, err := impl.New(driverName, options) + tracerProvider, closer, err := impl.New(driverName, options) if err != nil { log.WithError(err).Warn("skipping tracing configuration step") return &nopCloser{} } - if tracer == nil { + if tracerProvider == nil { log.Warn("no tracer provided, tracing will be disabled") } else { log.Info("Tracing enabled") - opentracing.SetGlobalTracer(tracer) + global.SetTracerProvider(tracerProvider) } if closer == nil { diff --git a/tracing/outbound_http.go b/tracing/outbound_http.go index 5bd49e80fab6419d48c82d67bdf9560fff62183f..a1f10c8d6d88cf5e4726063676d4659a142db02f 100644 --- a/tracing/outbound_http.go +++ b/tracing/outbound_http.go @@ -1,143 +1,20 @@ package tracing import ( - "crypto/tls" "net/http" - "net/http/httptrace" - opentracing "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/ext" - otlog "github.com/opentracing/opentracing-go/log" - logkit "gitlab.com/gitlab-org/labkit/log" + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" ) -type tracingRoundTripper struct { - delegate http.RoundTripper - config roundTripperConfig -} - -func (c tracingRoundTripper) RoundTrip(req *http.Request) (res *http.Response, e error) { - tracer := opentracing.GlobalTracer() - if tracer == nil { - return c.delegate.RoundTrip(req) - } - - ctx := req.Context() - - var parentCtx opentracing.SpanContext - parentSpan := opentracing.SpanFromContext(ctx) - if parentSpan != nil { - parentCtx = parentSpan.Context() - } - - // start a new Span to wrap HTTP request - span := opentracing.StartSpan( - c.config.getOperationName(req), - opentracing.ChildOf(parentCtx), - ) - defer span.Finish() - - ctx = opentracing.ContextWithSpan(ctx, span) - - // attach ClientTrace to the Context, and Context to request - trace := newClientTrace(span) - ctx = httptrace.WithClientTrace(ctx, trace) - req = req.WithContext(ctx) - - ext.SpanKindRPCClient.Set(span) - ext.HTTPUrl.Set(span, req.URL.String()) - ext.HTTPMethod.Set(span, req.Method) - - carrier := opentracing.HTTPHeadersCarrier(req.Header) - err := span.Tracer().Inject(span.Context(), opentracing.HTTPHeaders, carrier) - - if err != nil { - logkit.ContextLogger(ctx).WithError(err).Error("tracing span injection failed") - } - - response, err := c.delegate.RoundTrip(req) - - if err != nil { - span.LogFields( - otlog.String("event", "roundtrip error"), - otlog.Object("error", err), - ) - } else { - span.LogFields( - otlog.String("event", "roundtrip complete"), - otlog.Int("status", response.StatusCode), - ) - } - - return response, err -} - -func newClientTrace(span opentracing.Span) *httptrace.ClientTrace { - trace := &clientTrace{span: span} - return &httptrace.ClientTrace{ - GotFirstResponseByte: trace.gotFirstResponseByte, - ConnectStart: trace.connectStart, - ConnectDone: trace.connectDone, - TLSHandshakeStart: trace.tlsHandshakeStart, - TLSHandshakeDone: trace.tlsHandshakeDone, - WroteHeaders: trace.wroteHeaders, - WroteRequest: trace.wroteRequest, - } -} - -// clientTrace holds a reference to the Span and -// provides methods used as ClientTrace callbacks. -type clientTrace struct { - span opentracing.Span -} - -func (h *clientTrace) gotFirstResponseByte() { - h.span.LogFields(otlog.String("event", "got first response byte")) -} - -func (h *clientTrace) connectStart(network, addr string) { - h.span.LogFields( - otlog.String("event", "connect started"), - otlog.String("network", network), - otlog.String("addr", addr), - ) -} - -func (h *clientTrace) connectDone(network, addr string, err error) { - h.span.LogFields( - otlog.String("event", "connect done"), - otlog.String("network", network), - otlog.String("addr", addr), - otlog.Object("error", err), - ) -} - -func (h *clientTrace) tlsHandshakeStart() { - h.span.LogFields(otlog.String("event", "tls handshake started")) -} - -func (h *clientTrace) tlsHandshakeDone(state tls.ConnectionState, err error) { - h.span.LogFields( - otlog.String("event", "tls handshake done"), - otlog.Object("error", err), - ) -} - -func (h *clientTrace) wroteHeaders() { - h.span.LogFields(otlog.String("event", "headers written")) -} - -func (h *clientTrace) wroteRequest(info httptrace.WroteRequestInfo) { - h.span.LogFields( - otlog.String("event", "request written"), - otlog.Object("error", info.Err), - ) -} - // NewRoundTripper acts as a "client-middleware" for outbound http requests // adding instrumentation to the outbound request and then delegating to the underlying // transport. func NewRoundTripper(delegate http.RoundTripper, opts ...RoundTripperOption) http.RoundTripper { config := applyRoundTripperOptions(opts) - return &tracingRoundTripper{delegate: delegate, config: config} + + spanNameFormatter := func(_ string, r *http.Request) string { + return config.getOperationName(r) + } + + return otelhttp.NewTransport(delegate, otelhttp.WithSpanNameFormatter(spanNameFormatter)) }