Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Integrating the web dashboard feature #3505

Merged
merged 30 commits into from
Jan 16, 2024
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
31569f1
feat: Integrating the web dashboard feature
szkiba Dec 15, 2023
099fdae
fix: linter issue
szkiba Dec 15, 2023
ad5599b
upgrading xk6-dashboard to v0.7.0-alpha.1 pre-release
szkiba Dec 18, 2023
43f2990
Merge remote-tracking branch 'origin/master' into feat/3504-dashboard…
szkiba Dec 18, 2023
7ac6f77
the web dashboard is now inactive by default
szkiba Dec 18, 2023
8eaa500
make more consistent with other outputs
szkiba Dec 18, 2023
66c7e57
simplify web-dashboard ui output
szkiba Dec 18, 2023
5ec840a
upgrade xk6-dashboard to v0.7.0-apha.2
szkiba Dec 18, 2023
4764e9e
increased indent by 1 (due to "web-dashboard" length)
szkiba Dec 18, 2023
bf371b1
test: added web dashboard CLI and env test
szkiba Dec 18, 2023
7c7c3b8
Merge remote-tracking branch 'origin/master' into feat/3504-dashboard…
szkiba Dec 18, 2023
82d9942
log failed web dashboard test (locally runs without fail)
szkiba Dec 18, 2023
d5f0b54
test: log web dashboard test run to stdout
szkiba Dec 18, 2023
aec3854
Merge remote-tracking branch 'origin/master' into feat/3504-dashboard…
szkiba Dec 18, 2023
303ce2c
fix: Excluded xk6-dashboard config.json from .gitignore
szkiba Dec 19, 2023
d0b0ed3
web-dashboard output name renamed to internal-web-dashboard
szkiba Dec 19, 2023
4548414
move dashboard config.json line close to the rule it is overwriting
szkiba Dec 19, 2023
cf63408
upgrade xk6-dashboard to v0.7.0-alpha.4
szkiba Dec 19, 2023
c2b20c3
use xk6-dashboard output name from xk6-dashboard source code
szkiba Dec 19, 2023
79d55f6
document excluding ule
szkiba Dec 19, 2023
a9f97d0
upgrade xk6-dashboard dependency to v0.7.0-alpha.5
szkiba Jan 11, 2024
dfa5a67
hide web-dashboard flag
szkiba Jan 11, 2024
06b47cb
Update .gitignore
oleiade Jan 15, 2024
fe38865
Merge remote-tracking branch 'origin/master' into feat/3504-dashboard…
szkiba Jan 15, 2024
99e5ac1
fix linter issue
szkiba Jan 15, 2024
233c05a
upgrade xk6-dashboard to v0.7.0-alpha.6
szkiba Jan 15, 2024
ee587cb
upgraded xk6-dashboard to v0.7.0 release
szkiba Jan 15, 2024
ef727f6
remove web-dashboard flag
szkiba Jan 15, 2024
eb67aef
test: fix web-dashboard flag test
szkiba Jan 15, 2024
7f43e50
upgrade xk6-dashboard to v0.7.1 to fix abort issue
szkiba Jan 16, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ script.js
/vendor/**/.editorconfig
/vendor/**/*.jpg
/vendor/**/*.json
# Excluding as it is required (embedded) configuration file for web-dashboard
!/vendor/github.com/grafana/xk6-dashboard/dashboard/assets/packages/config/dist/config.json
/vendor/**/.*.json
/vendor/**/Makefile
/vendor/**/*.png
Expand All @@ -29,5 +31,6 @@ script.js
/vendor/**/.*.y*ml
/vendor/github.com/dlclark/regexp2/testoutput1


oleiade marked this conversation as resolved.
Show resolved Hide resolved
/packaging/.env
/packaging/*.gpg
6 changes: 6 additions & 0 deletions cmd/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ func configFlagSet() *pflag.FlagSet {
flags.StringArrayP("out", "o", []string{}, "`uri` for an external metrics database")
flags.BoolP("linger", "l", false, "keep the API server alive past test end")
flags.Bool("no-usage-report", false, "don't send anonymous stats to the developers")
flags.Bool("web-dashboard", false, "enable web dashboard")
return flags
}

Expand All @@ -41,6 +42,7 @@ type Config struct {
Out []string `json:"out" envconfig:"K6_OUT"`
Linger null.Bool `json:"linger" envconfig:"K6_LINGER"`
NoUsageReport null.Bool `json:"noUsageReport" envconfig:"K6_NO_USAGE_REPORT"`
WebDashboard null.Bool `json:"webDashboard" envconfig:"K6_WEB_DASHBOARD"`

// TODO: deprecate
Collectors map[string]json.RawMessage `json:"collectors"`
Expand All @@ -67,6 +69,9 @@ func (c Config) Apply(cfg Config) Config {
if cfg.NoUsageReport.Valid {
c.NoUsageReport = cfg.NoUsageReport
}
if cfg.WebDashboard.Valid {
c.WebDashboard = cfg.WebDashboard
}
if len(cfg.Collectors) > 0 {
c.Collectors = cfg.Collectors
}
Expand Down Expand Up @@ -98,6 +103,7 @@ func getConfig(flags *pflag.FlagSet) (Config, error) {
Out: out,
Linger: getNullBool(flags, "linger"),
NoUsageReport: getNullBool(flags, "no-usage-report"),
WebDashboard: getNullBool(flags, "web-dashboard"),
}, nil
}

Expand Down
5 changes: 5 additions & 0 deletions cmd/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,11 @@ func TestConfigEnv(t *testing.T) {
"true": func(c Config) { assert.Equal(t, null.BoolFrom(true), c.NoUsageReport) },
"false": func(c Config) { assert.Equal(t, null.BoolFrom(false), c.NoUsageReport) },
},
{"WebDashboard", "K6_WEB_DASHBOARD"}: {
"": func(c Config) { assert.Equal(t, null.Bool{}, c.WebDashboard) },
"true": func(c Config) { assert.Equal(t, null.BoolFrom(true), c.WebDashboard) },
"false": func(c Config) { assert.Equal(t, null.BoolFrom(false), c.WebDashboard) },
},
{"Out", "K6_OUT"}: {
"": func(c Config) { assert.Equal(t, []string{}, c.Out) },
"influxdb": func(c Config) { assert.Equal(t, []string{"influxdb"}, c.Out) },
Expand Down
12 changes: 10 additions & 2 deletions cmd/outputs.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"go.k6.io/k6/output/json"
"go.k6.io/k6/output/statsd"

"github.com/grafana/xk6-dashboard/dashboard"
"github.com/grafana/xk6-output-prometheus-remote/pkg/remotewrite"
)

Expand Down Expand Up @@ -45,6 +46,7 @@ func getAllOutputConstructors() (map[string]output.Constructor, error) {
"experimental-prometheus-rw": func(params output.Params) (output.Output, error) {
return remotewrite.New(params)
},
"web-dashboard": dashboard.New,
}

exts := ext.Get(ext.OutputExtension)
Expand Down Expand Up @@ -92,9 +94,15 @@ func createOutputs(
RuntimeOptions: test.preInitState.RuntimeOptions,
ExecutionPlan: executionPlan,
}
result := make([]output.Output, 0, len(test.derivedConfig.Out))

for _, outputFullArg := range test.derivedConfig.Out {
outputs := test.derivedConfig.Out
if test.derivedConfig.WebDashboard.Bool {
outputs = append(outputs, dashboard.OutputName)
}

result := make([]output.Output, 0, len(outputs))

for _, outputFullArg := range outputs {
Comment on lines +114 to +121
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking at this and the changes to the way we format stuff ... I wonder ... why?

Like why do you want ot have an additional --web-dashboard cli flag when -o dashboard ... works.

Why do you want to move it on separate line when outputs already have a way to show a url for users to use as in
image
^ arguably the above can be improved, but I see no reason to move it in a different one.

And this will practically limit the integration to the above "registration" of the output.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Like why do you want ot have an additional --web-dashboard cli flag when -o dashboard ... works.

Because this is what is written in the design document, if you want to re-discuss it open the question to the working group. It's perfectly fine for me if it has to be activated with the -o flag.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As @szkiba mentioned, this was a UX/product decision made by the workgroup that is reflected in the design document.

Part of the reasoning behind that decision was a desire to have the dashboard become a first-class citizen of the k6 UX down the road, the fact that it acts as an output under the hood being judged an implementation detail.

If there is a strong technical argument to be made to keep exposing/displaying it as an output as part of our command-line UI, we'd be happy to discuss it at the beginning of next year when everyone is back 🤝

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

first-class citizen of the k6 UX

Outputs are first class citizen.

down the road

Kind of implies to me this shouldn't be in the initial release.

The technical and none technical argument is the same - users already have the concept of output. Adding a thing that is clearly and output and then treating it differently isn't cohesive.

At best people will be confused why there are two ways to the same thing at worse they will think they are two different things. And anyone who works on it will need to wonder the same thing.

On connected note - yes the current summary fits this same bill, except that it predates most of that, and if possible I will certainly try to push it towards being an output through and through.

But adding more special cases IMO doesn't help anyone.

Copy link
Member

@oleiade oleiade Dec 21, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see your point 👍🏻 I personally don't have a strong opinion on this.

Will add it to the agenda of our internal discussions when everyone is back from 🎄 holidays, and I'll invite you to it so we can discuss and decide on a way forward that makes sense for everyone 🙇🏻

Copy link
Member

@oleiade oleiade Jan 15, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We've discussed this internally, and our preference goes with proceeding with the current UX provided by the PR:

  • The feature needs to be activated through an environment variable
  • when activated, it has a dedicated line in the output to point users to the URL
  • the --output argument is supported for consistency and to align with a larger idea to mark outputs (including the end-of-test summary), more explicitly as such in the future.
K6_WEB_DASHBOARD=true ./k6 run ../extensions/xk6-dashboard/script.js

          /\      |‾‾| /‾‾/   /‾‾/
     /\  /  \     |  |/  /   /  /
    /  \/    \    |     (   /   ‾‾\
   /          \   |  |\  \ |  (‾)  |
  / __________ \  |__| \__\ \_____/ .io

     execution: local
        script: ../extensions/xk6-dashboard/script.js
 web dashboard: http://127.0.0.1:5665
        output: -

     scenarios: (100.00%) 2 scenarios, 9 max VUs, 12m30s max duration (incl. graceful stop):
              * camel: Up to 5 looping VUs for 12m0s over 6 stages (gracefulRampDown: 0s, gracefulStop: 30s)
              * snake: Up to 4 looping VUs for 12m0s over 12 stages (gracefulRampDown: 0s, gracefulStop: 30s)

outputType, outputArg := parseOutputArgument(outputFullArg)
outputConstructor, ok := outputConstructors[outputType]
if !ok {
Expand Down
44 changes: 44 additions & 0 deletions cmd/tests/cmd_run_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1865,6 +1865,50 @@ func TestUIRenderOutput(t *testing.T) {
}
}

func TestUIRenderWebDashboard(t *testing.T) {
t.Parallel()

tests := []struct {
flag string
codebien marked this conversation as resolved.
Show resolved Hide resolved
env string
active bool
expRender string
}{
{expRender: "web dashboard:"},
{flag: "--web-dashboard", active: true, expRender: "web dashboard: http://127.0.0.1:"},
{env: "false", expRender: "web dashboard:"},
{env: "true", active: true, expRender: "web dashboard: http://127.0.0.1:"},
{env: "false", flag: "--web-dashboard", active: true, expRender: "web dashboard: http://127.0.0.1:"},
}

for _, tc := range tests {
tc := tc

t.Run(tc.expRender, func(t *testing.T) {
t.Parallel()

ts := NewGlobalTestState(t)
if tc.env != "" {
ts.Env["K6_WEB_DASHBOARD"] = tc.env
}
ts.Env["K6_WEB_DASHBOARD_PORT"] = "0"
ts.CmdArgs = []string{"k6", "run", "--log-output=stdout"}
if tc.flag != "" {
ts.CmdArgs = append(ts.CmdArgs, tc.flag)
}
ts.CmdArgs = append(ts.CmdArgs, "-")
ts.Stdin = bytes.NewBufferString(`export default function() {};`)
cmd.ExecuteWithGlobalState(ts.GlobalState)

if tc.active {
assert.Contains(t, ts.Stdout.String(), tc.expRender)
} else {
assert.NotContains(t, ts.Stdout.String(), tc.expRender)
}
})
}
}

// TestRunStaticArchives tests that the static archives are working as expected.
// each archive contains the following files/catalogs:
// ├── a.js
Expand Down
26 changes: 16 additions & 10 deletions cmd/ui.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"unicode/utf8"

"github.com/fatih/color"
"github.com/grafana/xk6-dashboard/dashboard"
"github.com/sirupsen/logrus"
"golang.org/x/term"

Expand Down Expand Up @@ -103,8 +104,8 @@ func printExecutionDescription(
valueColor := getColor(noColor, color.FgCyan)

buf := &strings.Builder{}
fmt.Fprintf(buf, " execution: %s\n", valueColor.Sprint(execution))
fmt.Fprintf(buf, " script: %s\n", valueColor.Sprint(filename))
fmt.Fprintf(buf, " execution: %s\n", valueColor.Sprint(execution))
fmt.Fprintf(buf, " script: %s\n", valueColor.Sprint(filename))

var outputDescriptions []string
switch {
Expand All @@ -114,18 +115,23 @@ func printExecutionDescription(
for _, out := range outputs {
desc := out.Description()
if desc == engine.IngesterDescription {
if len(outputs) != 1 {
continue
}
desc = "-"
continue
}
if strings.HasPrefix(desc, dashboard.OutputName) {
fmt.Fprintf(buf, " web dashboard:%s\n", valueColor.Sprint(strings.TrimPrefix(desc, dashboard.OutputName)))

continue
}
outputDescriptions = append(outputDescriptions, desc)
}
if len(outputDescriptions) == 0 {
outputDescriptions = append(outputDescriptions, "-")
}
}

fmt.Fprintf(buf, " output: %s\n", valueColor.Sprint(strings.Join(outputDescriptions, ", ")))
fmt.Fprintf(buf, " output: %s\n", valueColor.Sprint(strings.Join(outputDescriptions, ", ")))
if gs.Flags.ProfilingEnabled && gs.Flags.Address != "" {
fmt.Fprintf(buf, " profiling: %s\n", valueColor.Sprintf("http://%s/debug/pprof/", gs.Flags.Address))
fmt.Fprintf(buf, " profiling: %s\n", valueColor.Sprintf("http://%s/debug/pprof/", gs.Flags.Address))
}

fmt.Fprintf(buf, "\n")
Expand All @@ -138,13 +144,13 @@ func printExecutionDescription(
scenarioDesc = fmt.Sprintf("%d scenarios", len(executorConfigs))
}

fmt.Fprintf(buf, " scenarios: %s\n", valueColor.Sprintf(
fmt.Fprintf(buf, " scenarios: %s\n", valueColor.Sprintf(
"(%.2f%%) %s, %d max VUs, %s max duration (incl. graceful stop):",
conf.ExecutionSegment.FloatLength()*100, scenarioDesc,
lib.GetMaxPossibleVUs(execPlan), maxDuration.Round(100*time.Millisecond)),
)
for _, ec := range executorConfigs {
fmt.Fprintf(buf, " * %s: %s\n",
fmt.Fprintf(buf, " * %s: %s\n",
ec.GetName(), ec.GetDescription(et))
}
fmt.Fprintf(buf, "\n")
Expand Down
4 changes: 4 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ require (
github.com/golang/protobuf v1.5.3
github.com/gorilla/websocket v1.5.1
github.com/grafana/xk6-browser v1.2.2
github.com/grafana/xk6-dashboard v0.7.0-alpha.4
github.com/grafana/xk6-output-prometheus-remote v0.3.1
github.com/grafana/xk6-redis v0.2.0
github.com/grafana/xk6-timers v0.2.2
Expand Down Expand Up @@ -78,11 +79,13 @@ require (
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_golang v1.16.0 // indirect
github.com/prometheus/client_model v0.4.0 // indirect
github.com/prometheus/common v0.42.0 // indirect
github.com/prometheus/procfs v0.10.1 // indirect
github.com/r3labs/sse/v2 v2.10.0 // indirect
codebien marked this conversation as resolved.
Show resolved Hide resolved
github.com/redis/go-redis/v9 v9.0.5 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.1 // indirect
Expand All @@ -93,5 +96,6 @@ require (
golang.org/x/text v0.14.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97 // indirect
gopkg.in/cenkalti/backoff.v1 v1.1.0 // indirect
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
)
10 changes: 10 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/
github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
github.com/grafana/xk6-browser v1.2.2 h1:0SCVYzJ4j417ivN4mbY8/SjY55a6+O694NiYvR4WFGw=
github.com/grafana/xk6-browser v1.2.2/go.mod h1:D3k9/MQHnNKfyzU3fh32pHlrh3GY2LAlkY4wYt/Vn4Y=
github.com/grafana/xk6-dashboard v0.7.0-alpha.4 h1:eyJCtdg4MgxJGz03IYiK6Q2HJkjjPntf5LzrywyBKcs=
github.com/grafana/xk6-dashboard v0.7.0-alpha.4/go.mod h1:A1SIEX7kaC8RdER5J7l+bnkh54NV7chxA1VQncYBwqE=
github.com/grafana/xk6-output-prometheus-remote v0.3.1 h1:X23rQzlJD8dXWB31DkxR4uPnuRFo8L0Y0H22fSG9xl0=
github.com/grafana/xk6-output-prometheus-remote v0.3.1/go.mod h1:0JLAm4ONsNUlNoxJXAwOCfA6GtDwTPs557OplAvE+3o=
github.com/grafana/xk6-redis v0.2.0 h1:iXmAKVlAxafZ/h8ptuXTFhGu63IFsyDI8QjUgWm66BU=
Expand Down Expand Up @@ -154,6 +156,8 @@ github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/gomega v1.20.2 h1:8uQq0zMgLEfa0vRrrBgaJF2gyW9Da9BmfGV+OyUzfkY=
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU=
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
Expand All @@ -166,6 +170,8 @@ github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI
github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg=
github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM=
github.com/r3labs/sse/v2 v2.10.0 h1:hFEkLLFY4LDifoHdiCN/LlGBAdVJYsANaLqNYa1l/v0=
github.com/r3labs/sse/v2 v2.10.0/go.mod h1:Igau6Whc+F17QUgML1fYe1VPZzTV6EMCnYktEmkNJ7I=
github.com/redis/go-redis/v9 v9.0.5 h1:CuQcn5HIEeK7BgElubPP8CGtE0KakrnbBSTLjathl5o=
github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
Expand Down Expand Up @@ -244,6 +250,7 @@ golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73r
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191116160921-f9c825593386/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-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
Expand All @@ -270,6 +277,7 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
Expand Down Expand Up @@ -332,6 +340,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.31.1-0.20231027082548-f4a6c1f6e5c1 h1:fk72uXZyuZiTtW5tgd63jyVK6582lF61nRC/kGv6vCA=
google.golang.org/protobuf v1.31.1-0.20231027082548-f4a6c1f6e5c1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/cenkalti/backoff.v1 v1.1.0 h1:Arh75ttbsvlpVA7WtVpH4u9h6Zl46xuptxqLxPiSo4Y=
gopkg.in/cenkalti/backoff.v1 v1.1.0/go.mod h1:J6Vskwqd+OMVJl8C33mmtxTBs2gyzfv7UDAkHu8BrjI=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
Expand Down
Loading