// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// This file was auto-generated via go generate.
// DO NOT UPDATE MANUALLY

/*
Command stress is a tool to stress/load test RPC by issuing randomly generated
requests.

Usage:
   stress <command>

The stress commands are:
   stress      Run stress test
   stats       Print out stress stats of servers
   load        Run load test
   stop        Stop servers
   help        Display help for commands or topics

The global flags are:
 -alsologtostderr=true
   log to standard error as well as files
 -log_backtrace_at=:0
   when logging hits line file:N, emit a stack trace
 -log_dir=
   if non-empty, write log files to this directory
 -logtostderr=false
   log to standard error instead of files
 -max_stack_buf_size=4292608
   max size in bytes of the buffer to use for logging stack traces
 -stderrthreshold=2
   logs at or above this threshold go to stderr
 -v=0
   log level for V logs
 -v23.credentials=
   directory to use for storing security credentials
 -v23.i18n-catalogue=
   18n catalogue files to load, comma separated
 -v23.metadata=<just specify -v23.metadata to activate>
   Displays metadata for the program and exits.
 -v23.namespace.root=[/(dev.v.io/role/vprod/service/mounttabled)@ns.dev.v.io:8101]
   local namespace root; can be repeated to provided multiple roots
 -v23.permissions.file=map[]
   specify a perms file as <name>:<permsfile>
 -v23.permissions.literal=
   explicitly specify the runtime perms as a JSON-encoded access.Permissions.
   Overrides all --v23.permissions.file flags.
 -v23.proxy=
   object name of proxy service to use to export services across network
   boundaries
 -v23.tcp.address=
   address to listen on
 -v23.tcp.protocol=wsh
   protocol to listen with
 -v23.vtrace.cache-size=1024
   The number of vtrace traces to store in memory.
 -v23.vtrace.collect-regexp=
   Spans and annotations that match this regular expression will trigger trace
   collection.
 -v23.vtrace.dump-on-shutdown=true
   If true, dump all stored traces on runtime shutdown.
 -v23.vtrace.sample-rate=0
   Rate (from 0.0 to 1.0) to sample vtrace traces.
 -vmodule=
   comma-separated list of pattern=N settings for filename-filtered logging
 -vpath=
   comma-separated list of pattern=N settings for file pathname-filtered logging

Stress stress - Run stress test

Run stress test

Usage:
   stress stress [flags] <server> ...

<server> ... A list of servers to connect to.

The stress stress flags are:
 -duration=1m0s
   duration of the test to run
 -format=text
   Stats output format; either text or json
 -max-chunk-count=1000
   maximum number of chunks to send per streaming RPC
 -max-payload-size=10000
   maximum size of payload in bytes
 -workers=1
   number of test workers to run

Stress stats - Print out stress stats of servers

Print out stress stats of servers

Usage:
   stress stats [flags] <server> ...

<server> ... A list of servers to connect to.

The stress stats flags are:
 -format=text
   Stats output format; either text or json

Stress load - Run load test

Run load test

Usage:
   stress load [flags] <server> ...

<server> ... A list of servers to connect to.

The stress load flags are:
 -cpu=0
   number of cpu cores to use; if zero, use the number of servers to test
 -duration=1m0s
   duration of the test to run
 -format=text
   Stats output format; either text or json
 -payload-size=1000
   size of payload in bytes

Stress stop - Stop servers

Stop servers

Usage:
   stress stop <server> ...

<server> ... A list of servers to stop.

Stress help - Display help for commands or topics

Help with no args displays the usage of the parent command.

Help with args displays the usage of the specified sub-command or help topic.

"help ..." recursively displays help for all commands and topics.

Usage:
   stress help [flags] [command/topic ...]

[command/topic ...] optionally identifies a specific sub-command or help topic.

The stress help flags are:
 -style=compact
   The formatting style for help output:
      compact - Good for compact cmdline output.
      full    - Good for cmdline output, shows all global flags.
      godoc   - Good for godoc processing.
   Override the default by setting the CMDLINE_STYLE environment variable.
 -width=<terminal width>
   Format output to this target width in runes, or unlimited if width < 0.
   Defaults to the terminal width if available.  Override the default by setting
   the CMDLINE_WIDTH environment variable.
*/
package main
