diff --git a/cli/api/client.go b/cli/api/client.go index b2051eb..f1ed972 100644 --- a/cli/api/client.go +++ b/cli/api/client.go @@ -1,16 +1,14 @@ package api import ( + "encoding/json" "errors" "fmt" "os" "strings" - - "encoding/json" - "time" - "github.com/theckman/godspeed" + "github.com/DataDog/datadog-go/v5/statsd" "github.com/vsco/dcdr/cli/api/ioutil2" "github.com/vsco/dcdr/cli/api/stores" "github.com/vsco/dcdr/cli/printer" @@ -46,11 +44,11 @@ type ClientIFace interface { type Client struct { Store stores.IFace Repo repo.IFace - Stats *godspeed.Godspeed + Stats statsd.ClientInterface config *config.Config } -func New(st stores.IFace, rp repo.IFace, cfg *config.Config, stats *godspeed.Godspeed) (c *Client) { +func New(st stores.IFace, rp repo.IFace, cfg *config.Config, stats statsd.ClientInterface) (c *Client) { c = &Client{ Store: st, Repo: rp, @@ -143,15 +141,7 @@ func (c *Client) Set(ft *models.Feature) error { return err } - err = c.Store.Set(ft.ScopedKey(), bts) - - if err != nil { - return err - } - - err = c.SendStatEvent(ft, false) - - return nil + return c.Store.Set(ft.ScopedKey(), bts) } func (c *Client) Get(key string, v interface{}) error { @@ -196,15 +186,7 @@ func (c *Client) Delete(key string, scope string) error { return KeyNotFoundError(key) } - err = c.Store.Delete(key) - - if err != nil { - return err - } - - err = c.SendStatEvent(existing, true) - - return err + return c.Store.Delete(key) } func (c *Client) Commit(ft *models.Feature, deleted bool) error { @@ -348,28 +330,6 @@ func (c *Client) WriteOutputFile(kvb stores.KVBytes) { printer.Logf("wrote changes to: %s", c.config.Watcher.OutputPath) } -func (c *Client) SendStatEvent(f *models.Feature, delete bool) error { - if c.Stats == nil { - return nil - } - - var text string - title := "Decider Change" - - if delete { - text = fmt.Sprintf("deleted %s", f.ScopedKey()) - } else { - text = fmt.Sprintf("set %s: %v", f.ScopedKey(), f.Value) - } - - optionals := make(map[string]string) - optionals["alert_type"] = "info" - optionals["source_type_name"] = "dcdr" - tags := []string{"source_type:dcdr"} - - return c.Stats.Event(title, text, optionals, tags) -} - // KVsToFeatures helper for unmarshalling `KVBytes` to a `FeatureMap` func (c *Client) KVsToFeatureMap(kvb stores.KVBytes) (*models.FeatureMap, error) { fm := models.EmptyFeatureMap() diff --git a/client/stats/godspeed/godspeed_statter.go b/client/stats/godspeed/godspeed_statter.go deleted file mode 100644 index 6ad20ef..0000000 --- a/client/stats/godspeed/godspeed_statter.go +++ /dev/null @@ -1,28 +0,0 @@ -package stats - -import "github.com/theckman/godspeed" - -// Godspeed stats adapter for Godspeed. -type Godspeed struct { - gs *godspeed.Godspeed - tags []string -} - -// New creates a new Godspeed stats adapter. -func New(gs *godspeed.Godspeed, tags []string) (g *Godspeed) { - g = &Godspeed{ - gs: gs, - } - - return -} - -// Incr increments a key. -func (g *Godspeed) Incr(key string, sampleRate float64) { - g.gs.Send(key, "c", 1, sampleRate, g.tags) -} - -// Tags accessor for `tags`. -func (g *Godspeed) Tags() []string { - return g.tags -} diff --git a/client/stats/stats.go b/client/stats/stats.go deleted file mode 100644 index 34818ab..0000000 --- a/client/stats/stats.go +++ /dev/null @@ -1,12 +0,0 @@ -package stats - -type IFace interface { - Incr(feature string, sampleRate float64) - Tags() []string -} - -const ( - Enabled = "enabled" - Disabled = "disabled" - JoinWith = "." -) diff --git a/client/stats_client.go b/client/stats_client.go index 740c73a..b2a4fe1 100644 --- a/client/stats_client.go +++ b/client/stats_client.go @@ -3,7 +3,7 @@ package client import ( "strings" - "github.com/vsco/dcdr/client/stats" + "github.com/DataDog/datadog-go/v5/statsd" "github.com/vsco/dcdr/config" "github.com/vsco/dcdr/models" ) @@ -11,11 +11,11 @@ import ( // StatsClient delegates `Client` methods with metrics. type StatsClient struct { Client - stats stats.IFace + stats statsd.ClientInterface } // NewStatsClient creates a new client. -func NewStatsClient(cfg *config.Config, stats stats.IFace) (sc *StatsClient, err error) { +func NewStatsClient(cfg *config.Config, stats statsd.ClientInterface) (sc *StatsClient, err error) { sc = &StatsClient{ stats: stats, } @@ -29,7 +29,7 @@ func NewStatsClient(cfg *config.Config, stats stats.IFace) (sc *StatsClient, err } // NewStatsClient creates a new client. -func NewStatsDefault(stats stats.IFace) (sc *StatsClient, err error) { +func NewStatsDefault(stats statsd.ClientInterface) (sc *StatsClient, err error) { sc = &StatsClient{ stats: stats, } @@ -90,21 +90,21 @@ func (sc *StatsClient) Scopes() []string { // Incr increments the formatted `statKey`. func (sc *StatsClient) Incr(feature string, enabled bool, sampleRate float64) { key := sc.statKey(feature, enabled) - sc.stats.Incr(key, sampleRate) + sc.stats.Incr(key, []string{}, sampleRate) } func (sc *StatsClient) statKey(feature string, enabled bool) string { - status := stats.Enabled + status := "enabled" if enabled == false { - status = stats.Disabled + status = "disabled" } scopes := models.DefaultScope if len(sc.Client.Scopes()) > 0 { - scopes = strings.Replace(strings.Join(sc.Client.Scopes(), stats.JoinWith), "/", stats.JoinWith, -1) + scopes = strings.Replace(strings.Join(sc.Client.Scopes(), "."), "/", ".", -1) } - return strings.Join([]string{sc.config.Namespace, scopes, feature, status}, stats.JoinWith) + return strings.Join([]string{sc.config.Namespace, scopes, feature, status}, ".") } diff --git a/dcdr.go b/dcdr.go index cc487b0..927d9e7 100644 --- a/dcdr.go +++ b/dcdr.go @@ -1,9 +1,10 @@ package main import ( + "fmt" "os" - "github.com/theckman/godspeed" + "github.com/DataDog/datadog-go/v5/statsd" "github.com/vsco/dcdr/cli" "github.com/vsco/dcdr/cli/api" "github.com/vsco/dcdr/cli/api/resolver" @@ -19,18 +20,21 @@ func main() { rp := repo.New(cfg) - var gs *godspeed.Godspeed - var err error + var stats statsd.ClientInterface + if cfg.StatsEnabled() { - gs, err = godspeed.New(cfg.Stats.Host, cfg.Stats.Port, false) + var err error + stats, err = statsd.New(fmt.Sprintf("%s:%s", cfg.Stats.Host, cfg.Stats.Port)) if err != nil { printer.SayErr("%v", err) os.Exit(1) } + } else { + stats = &statsd.NoOpClient{} } - kv := api.New(store, rp, cfg, gs) + kv := api.New(store, rp, cfg, stats) ctrl := controller.New(cfg, kv) dcdr := cli.New(ctrl) diff --git a/go.mod b/go.mod index a44e1fc..be98683 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/vsco/dcdr go 1.18 require ( + github.com/DataDog/datadog-go/v5 v5.5.0 github.com/coreos/etcd v3.0.0-beta.0.0.20160528191156-a86ae1d96912+incompatible github.com/fatih/color v1.14.1 github.com/fsnotify/fsnotify v1.3.0 @@ -13,14 +14,13 @@ require ( github.com/hashicorp/hcl v0.0.0-20160119202737-578dd9746824 github.com/rodaine/table v0.0.0-20151010055857-c35ded4ccfec github.com/stretchr/testify v1.8.3 - github.com/theckman/godspeed v0.0.0-20160207214103-ef757b820a7d github.com/tucnak/climax v0.0.0-20160110101300-4c021a579dda github.com/vsco/http-test v0.0.0-20160424235822-3e41d6201903 golang.org/x/net v0.17.0 ) require ( - github.com/PagerDuty/godspeed v0.0.0-20180224001232-122876cde329 // indirect + github.com/Microsoft/go-winio v0.5.0 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/gorilla/context v0.0.0-20160525203319-aed02d124ae4 // indirect diff --git a/go.sum b/go.sum index bb4d7e1..a296618 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,8 @@ github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/PagerDuty/godspeed v0.0.0-20180224001232-122876cde329 h1:3q+9OIju0tFi+TUZZuG80mRbXI3MT/L/1vlTb8CcofA= -github.com/PagerDuty/godspeed v0.0.0-20180224001232-122876cde329/go.mod h1:u6OV0JEB9gtT/nTmTNEt6SXkQJW+SBnGWlJoSr+0F+U= +github.com/DataDog/datadog-go/v5 v5.5.0 h1:G5KHeB8pWBNXT4Jtw0zAkhdxEAWSpWH00geHI6LDrKU= +github.com/DataDog/datadog-go/v5 v5.5.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/Microsoft/go-winio v0.5.0 h1:Elr9Wn+sGKPlkaBvwu4mTrxtmOp3F3yV9qhaHbXGjwU= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -39,6 +41,7 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -142,6 +145,7 @@ github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144T github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -165,17 +169,21 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUt github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/theckman/godspeed v0.0.0-20160207214103-ef757b820a7d h1:X7USZy33fzzrJSYDLfXvFVayK86pfZuSMfbxdzVV4XI= -github.com/theckman/godspeed v0.0.0-20160207214103-ef757b820a7d/go.mod h1:HbvX1ULDanALaHLD1Q1jwxL3THjMTn6KgpTSZ1MTvMQ= github.com/tucnak/climax v0.0.0-20160110101300-4c021a579dda h1:VvJLFK4TAPRLbr64RWDGbqfztQdh32BivMWqZfyz4jU= github.com/tucnak/climax v0.0.0-20160110101300-4c021a579dda/go.mod h1:aN8AHR3MaHF61SaAxoSwsOS/AjZrRJeYAlrs4mg3ugk= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= @@ -183,11 +191,14 @@ github.com/ugorji/go v0.0.0-20160328060740-a396ed22fc04 h1:eE+Se4ffRJ16+igSBQWAY github.com/ugorji/go v0.0.0-20160328060740-a396ed22fc04/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= github.com/vsco/http-test v0.0.0-20160424235822-3e41d6201903 h1:5VfvX56oHNTt6Pdss+lf110TyDLJBCuEtQFXPSDZF+k= github.com/vsco/http-test v0.0.0-20160424235822-3e41d6201903/go.mod h1:ATk8q2GaMFU2bNaCYaYuIVIJIcR3B+w2m5zbRQtY0vY= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -195,6 +206,7 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= @@ -208,6 +220,7 @@ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -216,8 +229,10 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -233,8 +248,12 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190424220101-1e8e1cfdf96b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/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.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= @@ -243,5 +262,6 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=