From 5bd910da2bc13cee2b579bb01baaac7b4bff0c4e Mon Sep 17 00:00:00 2001 From: Jamie Danielson Date: Fri, 12 May 2023 18:11:38 -0400 Subject: [PATCH 1/2] Fix missing spans in gorillamux instrumentation (#86) * adjust output for e2e test to remove empty span * only use one http function in http server instr * Revert "only use one http function in http server instr" This reverts commit c1bc4d0d8be3666227389bdeeb7ed79b092c3bd9. * only use one http function - keep refactor * keep both func names but only register 1 probe * mirror changes to gorillamux from server #34 * no more empty spans for gorillamux * revert http funcname to 1, keep range for register * make generate * fix error logger, merge some main changes * update changelog * Update CHANGELOG.md Co-authored-by: Tyler Yahn * Update CHANGELOG.md Co-authored-by: Tyler Yahn * Update pkg/instrumentors/bpf/github.com/gorilla/mux/bpf/probe.bpf.c Co-authored-by: Mike Goldsmith * set Method size to 7 in gorillamux probe * set Method size to 7 in gin-gonic probe * set Method size to 7 in nethttp probe * updated traces.json after span name pr merged * also set method len to 7 in gorillamux probe c * also set method len to 7 in gin-gonic probe c * also set method len to 7 in nethttp probe c * make docker-generate --------- Co-authored-by: Mike Goldsmith Co-authored-by: Tyler Yahn --- CHANGELOG.md | 1 + .../github.com/gin-gonic/gin/bpf/probe.bpf.c | 2 +- .../gin-gonic/gin/bpf_bpfel_arm64.go | 4 +- .../github.com/gin-gonic/gin/bpf_bpfel_x86.go | 4 +- .../bpf/github.com/gin-gonic/gin/probe.go | 2 +- .../github.com/gorilla/mux/bpf/probe.bpf.c | 7 ++- .../github.com/gorilla/mux/bpf_bpfel_arm64.go | 4 +- .../github.com/gorilla/mux/bpf_bpfel_x86.go | 4 +- .../bpf/github.com/gorilla/mux/probe.go | 50 +++++++++++-------- .../bpf/net/http/server/bpf/probe.bpf.c | 2 +- .../bpf/net/http/server/bpf_bpfel_arm64.go | 4 +- .../bpf/net/http/server/bpf_bpfel_x86.go | 4 +- .../bpf/net/http/server/probe.go | 2 +- test/e2e/gorillamux/traces.json | 29 +++++++++++ 14 files changed, 81 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d543869e..b6a7b3718 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ OpenTelemetry Go Automatic Instrumentation adheres to [Semantic Versioning](http ### Fixed - Fix gRPC instrumentation memory access issue on newer kernels. ([#150](https://github.com/open-telemetry/opentelemetry-go-instrumentation/pull/150)) +- Fix missing spans in gorillamux instrumentation. ([#86](https://github.com/open-telemetry/opentelemetry-go-instrumentation/pull/86)) ### Changed diff --git a/pkg/instrumentors/bpf/github.com/gin-gonic/gin/bpf/probe.bpf.c b/pkg/instrumentors/bpf/github.com/gin-gonic/gin/bpf/probe.bpf.c index 0c595e789..a068fe450 100644 --- a/pkg/instrumentors/bpf/github.com/gin-gonic/gin/bpf/probe.bpf.c +++ b/pkg/instrumentors/bpf/github.com/gin-gonic/gin/bpf/probe.bpf.c @@ -19,7 +19,7 @@ char __license[] SEC("license") = "Dual MIT/GPL"; #define PATH_MAX_LEN 100 -#define METHOD_MAX_LEN 6 // Longer method: DELETE +#define METHOD_MAX_LEN 7 #define MAX_CONCURRENT 50 struct http_request_t { diff --git a/pkg/instrumentors/bpf/github.com/gin-gonic/gin/bpf_bpfel_arm64.go b/pkg/instrumentors/bpf/github.com/gin-gonic/gin/bpf_bpfel_arm64.go index be4cd2a39..3532cd519 100644 --- a/pkg/instrumentors/bpf/github.com/gin-gonic/gin/bpf_bpfel_arm64.go +++ b/pkg/instrumentors/bpf/github.com/gin-gonic/gin/bpf_bpfel_arm64.go @@ -16,10 +16,10 @@ import ( type bpfHttpRequestT struct { StartTime uint64 EndTime uint64 - Method [6]int8 + Method [7]int8 Path [100]int8 Sc bpfSpanContext - _ [6]byte + _ [5]byte } type bpfSpanContext struct { diff --git a/pkg/instrumentors/bpf/github.com/gin-gonic/gin/bpf_bpfel_x86.go b/pkg/instrumentors/bpf/github.com/gin-gonic/gin/bpf_bpfel_x86.go index d57a435b0..787c38522 100644 --- a/pkg/instrumentors/bpf/github.com/gin-gonic/gin/bpf_bpfel_x86.go +++ b/pkg/instrumentors/bpf/github.com/gin-gonic/gin/bpf_bpfel_x86.go @@ -16,10 +16,10 @@ import ( type bpfHttpRequestT struct { StartTime uint64 EndTime uint64 - Method [6]int8 + Method [7]int8 Path [100]int8 Sc bpfSpanContext - _ [6]byte + _ [5]byte } type bpfSpanContext struct { diff --git a/pkg/instrumentors/bpf/github.com/gin-gonic/gin/probe.go b/pkg/instrumentors/bpf/github.com/gin-gonic/gin/probe.go index 6ca555950..9be30b8f7 100644 --- a/pkg/instrumentors/bpf/github.com/gin-gonic/gin/probe.go +++ b/pkg/instrumentors/bpf/github.com/gin-gonic/gin/probe.go @@ -46,7 +46,7 @@ import ( type Event struct { StartTime uint64 EndTime uint64 - Method [6]byte + Method [7]byte Path [100]byte SpanContext context.EBPFSpanContext } diff --git a/pkg/instrumentors/bpf/github.com/gorilla/mux/bpf/probe.bpf.c b/pkg/instrumentors/bpf/github.com/gorilla/mux/bpf/probe.bpf.c index f4a1d4c16..e20865fe9 100644 --- a/pkg/instrumentors/bpf/github.com/gorilla/mux/bpf/probe.bpf.c +++ b/pkg/instrumentors/bpf/github.com/gorilla/mux/bpf/probe.bpf.c @@ -19,7 +19,7 @@ char __license[] SEC("license") = "Dual MIT/GPL"; #define PATH_MAX_LEN 100 -#define METHOD_MAX_LEN 6 // Longer method: DELETE +#define METHOD_MAX_LEN 7 #define MAX_CONCURRENT 50 struct http_request_t { @@ -91,8 +91,11 @@ int uprobe_GorillaMux_ServeHTTP(struct pt_regs *ctx) { SEC("uprobe/GorillaMux_ServeHTTP") int uprobe_GorillaMux_ServeHTTP_Returns(struct pt_regs *ctx) { + u64 request_pos = 4; void *goroutine = get_goroutine_address(ctx, ctx_ptr_pos); - void *httpReq_ptr = bpf_map_lookup_elem(&context_to_http_events, &goroutine); + void* req_ptr = get_argument(ctx, request_pos); + + void* httpReq_ptr = bpf_map_lookup_elem(&context_to_http_events, &goroutine); struct http_request_t httpReq = {}; bpf_probe_read(&httpReq, sizeof(httpReq), httpReq_ptr); httpReq.end_time = bpf_ktime_get_ns(); diff --git a/pkg/instrumentors/bpf/github.com/gorilla/mux/bpf_bpfel_arm64.go b/pkg/instrumentors/bpf/github.com/gorilla/mux/bpf_bpfel_arm64.go index 3d8c80d1d..e64f9a790 100644 --- a/pkg/instrumentors/bpf/github.com/gorilla/mux/bpf_bpfel_arm64.go +++ b/pkg/instrumentors/bpf/github.com/gorilla/mux/bpf_bpfel_arm64.go @@ -16,10 +16,10 @@ import ( type bpfHttpRequestT struct { StartTime uint64 EndTime uint64 - Method [6]int8 + Method [7]int8 Path [100]int8 Sc bpfSpanContext - _ [6]byte + _ [5]byte } type bpfSpanContext struct { diff --git a/pkg/instrumentors/bpf/github.com/gorilla/mux/bpf_bpfel_x86.go b/pkg/instrumentors/bpf/github.com/gorilla/mux/bpf_bpfel_x86.go index 50f832a31..2af10aa70 100644 --- a/pkg/instrumentors/bpf/github.com/gorilla/mux/bpf_bpfel_x86.go +++ b/pkg/instrumentors/bpf/github.com/gorilla/mux/bpf_bpfel_x86.go @@ -16,10 +16,10 @@ import ( type bpfHttpRequestT struct { StartTime uint64 EndTime uint64 - Method [6]int8 + Method [7]int8 Path [100]int8 Sc bpfSpanContext - _ [6]byte + _ [5]byte } type bpfSpanContext struct { diff --git a/pkg/instrumentors/bpf/github.com/gorilla/mux/probe.go b/pkg/instrumentors/bpf/github.com/gorilla/mux/probe.go index 8f09cf16e..e9f3f953d 100644 --- a/pkg/instrumentors/bpf/github.com/gorilla/mux/probe.go +++ b/pkg/instrumentors/bpf/github.com/gorilla/mux/probe.go @@ -45,7 +45,7 @@ import ( type Event struct { StartTime uint64 EndTime uint64 - Method [100]byte + Method [7]byte Path [100]byte SpanContext context.EBPFSpanContext } @@ -53,7 +53,7 @@ type Event struct { // Instrumentor is the gorilla/mux instrumentor. type Instrumentor struct { bpfObjects *bpfObjects - uprobe link.Link + uprobes []link.Link returnProbs []link.Link eventsReader *perf.Reader } @@ -113,41 +113,51 @@ func (g *Instrumentor) Load(ctx *context.InstrumentorContext) error { return err } - offset, err := ctx.TargetDetails.GetFunctionOffset(g.FuncNames()[0]) + for _, funcName := range g.FuncNames() { + g.registerProbes(ctx, funcName) + } + rd, err := perf.NewReader(g.bpfObjects.Events, os.Getpagesize()) if err != nil { return err } + g.eventsReader = rd + + return nil +} + +func (g *Instrumentor) registerProbes(ctx *context.InstrumentorContext, funcName string) { + logger := log.Logger.WithName("gorilla/mux-instrumentor").WithValues("function", funcName) + offset, err := ctx.TargetDetails.GetFunctionOffset(funcName) + if err != nil { + logger.Error(err, "could not find function start offset. Skipping") + return + } + retOffsets, err := ctx.TargetDetails.GetFunctionReturns(funcName) + if err != nil { + logger.Error(err, "could not find function end offset. Skipping") + return + } up, err := ctx.Executable.Uprobe("", g.bpfObjects.UprobeGorillaMuxServeHTTP, &link.UprobeOptions{ Address: offset, }) if err != nil { - return err + logger.Error(err, "could not insert start uprobe. Skipping") + return } - g.uprobe = up - retOffsets, err := ctx.TargetDetails.GetFunctionReturns(g.FuncNames()[0]) - if err != nil { - return err - } + g.uprobes = append(g.uprobes, up) for _, ret := range retOffsets { retProbe, err := ctx.Executable.Uprobe("", g.bpfObjects.UprobeGorillaMuxServeHTTP_Returns, &link.UprobeOptions{ Address: ret, }) if err != nil { - return err + logger.Error(err, "could not insert return uprobe. Skipping") + return } g.returnProbs = append(g.returnProbs, retProbe) } - - rd, err := perf.NewReader(g.bpfObjects.Events, os.Getpagesize()) - if err != nil { - return err - } - g.eventsReader = rd - - return nil } // Run runs the events processing loop. @@ -210,8 +220,8 @@ func (g *Instrumentor) Close() { g.eventsReader.Close() } - if g.uprobe != nil { - g.uprobe.Close() + for _, r := range g.uprobes { + r.Close() } for _, r := range g.returnProbs { diff --git a/pkg/instrumentors/bpf/net/http/server/bpf/probe.bpf.c b/pkg/instrumentors/bpf/net/http/server/bpf/probe.bpf.c index bb724666b..bde32a61b 100644 --- a/pkg/instrumentors/bpf/net/http/server/bpf/probe.bpf.c +++ b/pkg/instrumentors/bpf/net/http/server/bpf/probe.bpf.c @@ -19,7 +19,7 @@ char __license[] SEC("license") = "Dual MIT/GPL"; #define PATH_MAX_LEN 100 -#define METHOD_MAX_LEN 6 // Longer method: DELETE +#define METHOD_MAX_LEN 7 #define MAX_CONCURRENT 50 struct http_request_t diff --git a/pkg/instrumentors/bpf/net/http/server/bpf_bpfel_arm64.go b/pkg/instrumentors/bpf/net/http/server/bpf_bpfel_arm64.go index 8b017c446..8d06beb63 100644 --- a/pkg/instrumentors/bpf/net/http/server/bpf_bpfel_arm64.go +++ b/pkg/instrumentors/bpf/net/http/server/bpf_bpfel_arm64.go @@ -16,10 +16,10 @@ import ( type bpfHttpRequestT struct { StartTime uint64 EndTime uint64 - Method [6]int8 + Method [7]int8 Path [100]int8 Sc bpfSpanContext - _ [6]byte + _ [5]byte } type bpfSpanContext struct { diff --git a/pkg/instrumentors/bpf/net/http/server/bpf_bpfel_x86.go b/pkg/instrumentors/bpf/net/http/server/bpf_bpfel_x86.go index 8d70f5d5e..d6cb3da28 100644 --- a/pkg/instrumentors/bpf/net/http/server/bpf_bpfel_x86.go +++ b/pkg/instrumentors/bpf/net/http/server/bpf_bpfel_x86.go @@ -16,10 +16,10 @@ import ( type bpfHttpRequestT struct { StartTime uint64 EndTime uint64 - Method [6]int8 + Method [7]int8 Path [100]int8 Sc bpfSpanContext - _ [6]byte + _ [5]byte } type bpfSpanContext struct { diff --git a/pkg/instrumentors/bpf/net/http/server/probe.go b/pkg/instrumentors/bpf/net/http/server/probe.go index 6daafc4f2..78cbce87b 100644 --- a/pkg/instrumentors/bpf/net/http/server/probe.go +++ b/pkg/instrumentors/bpf/net/http/server/probe.go @@ -45,7 +45,7 @@ import ( type Event struct { StartTime uint64 EndTime uint64 - Method [6]byte + Method [7]byte Path [100]byte SpanContext context.EBPFSpanContext } diff --git a/test/e2e/gorillamux/traces.json b/test/e2e/gorillamux/traces.json index d7d5b45a7..26027ede2 100644 --- a/test/e2e/gorillamux/traces.json +++ b/test/e2e/gorillamux/traces.json @@ -24,6 +24,35 @@ ] }, "scopeSpans": [ + { + "scope": { + "name": "github.com/gorilla/mux" + }, + "spans": [ + { + "attributes": [ + { + "key": "http.method", + "value": { + "stringValue": "GET" + } + }, + { + "key": "http.target", + "value": { + "stringValue": "/users/foo" + } + } + ], + "kind": 2, + "name": "GET /users/foo", + "parentSpanId": "", + "spanId": "xxxxx", + "status": {}, + "traceId": "xxxxx" + } + ] + }, { "scope": { "name": "net/http" From a12d31ccb6ed15e7ce073a6b2d9622d6832dd225 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 14 May 2023 07:36:19 -0700 Subject: [PATCH 2/2] Bump github.com/go-logr/zapr from 1.2.3 to 1.2.4 (#157) Bumps [github.com/go-logr/zapr](https://github.com/go-logr/zapr) from 1.2.3 to 1.2.4. - [Release notes](https://github.com/go-logr/zapr/releases) - [Commits](https://github.com/go-logr/zapr/compare/v1.2.3...v1.2.4) --- updated-dependencies: - dependency-name: github.com/go-logr/zapr dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index b10f9c024..73bb7710d 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.18 require ( github.com/cilium/ebpf v0.10.0 github.com/go-logr/logr v1.2.4 - github.com/go-logr/zapr v1.2.3 + github.com/go-logr/zapr v1.2.4 github.com/hashicorp/go-version v1.6.0 github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.8.2 diff --git a/go.sum b/go.sum index 55324621b..66137e77c 100644 --- a/go.sum +++ b/go.sum @@ -75,8 +75,8 @@ github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= +github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= +github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= @@ -173,6 +173,7 @@ github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o 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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= 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/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -195,11 +196,10 @@ go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJP go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= @@ -239,6 +239,7 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB 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/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -282,6 +283,7 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ 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/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -339,7 +341,6 @@ 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-20191108193012-7d206e10da11/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= @@ -365,6 +366,7 @@ golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roY 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.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -463,9 +465,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=