Documentation ¶
Index ¶
- Constants
- func LoadConfig(p string, c *Config) error
- type BinaryDataFunc
- type Bucket
- type CallData
- type Config
- type Counter
- type Duration
- type LatencyDistribution
- type Logger
- type Option
- func WithAsync(async bool) Option
- func WithAuthority(authority string) Option
- func WithBinaryData(data []byte) Option
- func WithBinaryDataFromFile(path string) Option
- func WithBinaryDataFunc(data func(mtd *desc.MethodDescriptor, callData *CallData) []byte) Option
- func WithCPUs(c uint) Option
- func WithCertificate(cert, key string) Option
- func WithClientLoadBalancing(strategy string) Option
- func WithConcurrency(c uint) Option
- func WithConcurrencyDuration(duration time.Duration) Option
- func WithConcurrencyEnd(v uint) Option
- func WithConcurrencySchedule(schedule string) Option
- func WithConcurrencyStart(v uint) Option
- func WithConcurrencyStep(step int) Option
- func WithConcurrencyStepDuration(duration time.Duration) Option
- func WithConfig(cfg *Config) Option
- func WithConfigFromFile(file string) Option
- func WithConfigFromReader(reader io.Reader) Option
- func WithConnections(c uint) Option
- func WithData(data interface{}) Option
- func WithDataFromFile(path string) Option
- func WithDataFromJSON(data string) Option
- func WithDataFromReader(r io.Reader) Option
- func WithDialTimeout(dt time.Duration) Option
- func WithDurationStopAction(action string) Option
- func WithEnableCompression(enableCompression bool) Option
- func WithInsecure(insec bool) Option
- func WithKeepalive(k time.Duration) Option
- func WithLoadDuration(duration time.Duration) Option
- func WithLoadEnd(end uint) Option
- func WithLoadSchedule(schedule string) Option
- func WithLoadStart(start uint) Option
- func WithLoadStep(step int) Option
- func WithLoadStepDuration(duration time.Duration) Option
- func WithLogger(log Logger) Option
- func WithMetadata(md map[string]string) Option
- func WithMetadataFromFile(path string) Option
- func WithMetadataFromJSON(md string) Option
- func WithName(name string) Option
- func WithPacer(p load.Pacer) Option
- func WithProtoFile(proto string, importPaths []string) Option
- func WithProtoset(protoset string) Option
- func WithRPS(v uint) Option
- func WithReflectionMetadata(md map[string]string) Option
- func WithRootCertificate(cert string) Option
- func WithRunDuration(z time.Duration) Option
- func WithServerNameOverride(cname string) Option
- func WithSkipFirst(c uint) Option
- func WithSkipTLSVerify(skip bool) Option
- func WithStreamInterval(d time.Duration) Option
- func WithTags(tags map[string]string) Option
- func WithTemplateFuncs(funcMap template.FuncMap) Option
- func WithTimeout(timeout time.Duration) Option
- func WithTotalRequests(n uint) Option
- func WithWorkerTicker(ticker load.WorkerTicker) Option
- type Options
- type Report
- type Reporter
- type RequestCounter
- type Requester
- type ResultDetail
- type RunConfig
- type StopReason
- type TickValue
- type Worker
Examples ¶
Constants ¶
const ( // ReasonNormalEnd indicates a normal end to the run ReasonNormalEnd = StopReason("normal") // ReasonCancel indicates end due to cancellation ReasonCancel = StopReason("cancel") // ReasonTimeout indicates run ended due to Z parameter timeout ReasonTimeout = StopReason("timeout") )
const ScheduleConst = "const"
ScheduleConst is a constant load schedule
const ScheduleLine = "line"
ScheduleLine is the line load schedule
const ScheduleStep = "step"
ScheduleStep is the step load schedule
Variables ¶
This section is empty.
Functions ¶
func LoadConfig ¶ added in v0.55.0
LoadConfig loads the config from a file
Types ¶
type BinaryDataFunc ¶ added in v0.62.0
type BinaryDataFunc func(mtd *desc.MethodDescriptor, callData *CallData) []byte
BinaryDataFunc is a function that can be used for provide binary data for request programatically. MethodDescriptor of the call is passed to the data function. CallData for the request is passed and can be used to access worker id, request number, etc...
type Bucket ¶
type Bucket struct { // The Mark for histogram bucket in seconds Mark float64 `json:"mark"` // The count in the bucket Count int `json:"count"` // The frequency of results in the bucket as a decimal percentage Frequency float64 `json:"frequency"` }
Bucket holds histogram data
type CallData ¶ added in v0.62.0
type CallData struct { WorkerID string // unique worker ID RequestNumber int64 // unique incremented request number for each request FullyQualifiedName string // fully-qualified name of the method call MethodName string // shorter call method name ServiceName string // the service name InputName string // name of the input message type OutputName string // name of the output message type IsClientStreaming bool // whether this call is client streaming IsServerStreaming bool // whether this call is server streaming Timestamp string // timestamp of the call in RFC3339 format TimestampUnix int64 // timestamp of the call as unix time in seconds TimestampUnixMilli int64 // timestamp of the call as unix time in milliseconds TimestampUnixNano int64 // timestamp of the call as unix time in nanoseconds UUID string // generated UUIDv4 for each call // contains filtered or unexported fields }
CallData represents contextualized data available for templating
type Config ¶ added in v0.52.0
type Config struct { Proto string `json:"proto" toml:"proto" yaml:"proto"` Protoset string `json:"protoset" toml:"protoset" yaml:"protoset"` Call string `json:"call" toml:"call" yaml:"call"` RootCert string `json:"cacert" toml:"cacert" yaml:"cacert"` Cert string `json:"cert" toml:"cert" yaml:"cert"` Key string `json:"key" toml:"key" yaml:"key"` SkipTLSVerify bool `json:"skipTLS" toml:"skipTLS" yaml:"skipTLS"` SkipFirst uint `json:"skipFirst" toml:"skipFirst" yaml:"skipFirst"` CName string `json:"cname" toml:"cname" yaml:"cname"` Authority string `json:"authority" toml:"authority" yaml:"authority"` Insecure bool `json:"insecure,omitempty" toml:"insecure,omitempty" yaml:"insecure,omitempty"` N uint `json:"total" toml:"total" yaml:"total" default:"200"` Async bool `json:"async,omitempty" toml:"async,omitempty" yaml:"async,omitempty"` C uint `json:"concurrency" toml:"concurrency" yaml:"concurrency" default:"50"` CSchedule string `json:"concurrency-schedule" toml:"concurrency-schedule" yaml:"concurrency-schedule" default:"const"` CStart uint `json:"concurrency-start" toml:"concurrency-start" yaml:"concurrency-start" default:"1"` CEnd uint `json:"concurrency-end" toml:"concurrency-end" yaml:"concurrency-end" default:"0"` CStep int `json:"concurrency-step" toml:"concurrency-step" yaml:"concurrency-step" default:"0"` CStepDuration Duration `json:"concurrency-step-duration" toml:"concurrency-step-duration" yaml:"concurrency-step-duration" default:"0"` CMaxDuration Duration `json:"concurrency-max-duration" toml:"concurrency-max-duration" yaml:"concurrency-max-duration" default:"0"` Connections uint `json:"connections" toml:"connections" yaml:"connections" default:"1"` RPS uint `json:"rps" toml:"rps" yaml:"rps"` Z Duration `json:"duration" toml:"duration" yaml:"duration"` ZStop string `json:"duration-stop" toml:"duration-stop" yaml:"duration-stop" default:"close"` X Duration `json:"max-duration" toml:"max-duration" yaml:"max-duration"` Timeout Duration `json:"timeout" toml:"timeout" yaml:"timeout" default:"20s"` Data interface{} `json:"data,omitempty" toml:"data,omitempty" yaml:"data,omitempty"` DataPath string `json:"data-file" toml:"data-file" yaml:"data-file"` BinData []byte `json:"-" toml:"-" yaml:"-"` BinDataPath string `json:"binary-file" toml:"binary-file" yaml:"binary-file"` Metadata map[string]string `json:"metadata,omitempty" toml:"metadata,omitempty" yaml:"metadata,omitempty"` MetadataPath string `json:"metadata-file" toml:"metadata-file" yaml:"metadata-file"` SI Duration `json:"stream-interval" toml:"stream-interval" yaml:"stream-interval"` Output string `json:"output" toml:"output" yaml:"output"` Format string `json:"format" toml:"format" yaml:"format" default:"summary"` DialTimeout Duration `json:"connect-timeout" toml:"connect-timeout" yaml:"connect-timeout" default:"10s"` KeepaliveTime Duration `json:"keepalive" toml:"keepalive" yaml:"keepalive"` CPUs uint `json:"cpus" toml:"cpus" yaml:"cpus"` ImportPaths []string `json:"import-paths,omitempty" toml:"import-paths,omitempty" yaml:"import-paths,omitempty"` Name string `json:"name,omitempty" toml:"name,omitempty" yaml:"name,omitempty"` Tags map[string]string `json:"tags,omitempty" toml:"tags,omitempty" yaml:"tags,omitempty"` ReflectMetadata map[string]string `json:"reflect-metadata,omitempty" toml:"reflect-metadata,omitempty" yaml:"reflect-metadata,omitempty"` Debug string `json:"debug,omitempty" toml:"debug,omitempty" yaml:"debug,omitempty"` Host string `json:"host" toml:"host" yaml:"host"` EnableCompression bool `json:"enable-compression,omitempty" toml:"enable-compression,omitempty" yaml:"enable-compression,omitempty"` LoadSchedule string `json:"load-schedule" toml:"load-schedule" yaml:"load-schedule" default:"const"` LoadStart uint `json:"load-start" toml:"load-start" yaml:"load-start"` LoadEnd uint `json:"load-end" toml:"load-end" yaml:"load-end"` LoadStep int `json:"load-step" toml:"load-step" yaml:"load-step"` LoadStepDuration Duration `json:"load-step-duration" toml:"load-step-duration" yaml:"load-step-duration"` LoadMaxDuration Duration `json:"load-max-duration" toml:"load-max-duration" yaml:"load-max-duration"` }
Config for the run.
type Counter ¶ added in v0.70.0
type Counter struct {
// contains filtered or unexported fields
}
Counter is an implementation of the request counter
type Duration ¶ added in v0.52.0
Duration is our duration with TOML support
func (Duration) MarshalJSON ¶ added in v0.55.0
MarshalJSON implements encoding JSONMarshaler
func (Duration) MarshalText ¶ added in v0.52.0
MarshalText implements encoding.TextMarshaler
func (*Duration) UnmarshalJSON ¶ added in v0.55.0
UnmarshalJSON is our custom unmarshaller with JSON support
func (*Duration) UnmarshalText ¶ added in v0.52.0
UnmarshalText is our custom unmarshaller with TOML support
type LatencyDistribution ¶
type LatencyDistribution struct { Percentage int `json:"percentage"` Latency time.Duration `json:"latency"` }
LatencyDistribution holds latency distribution data
type Logger ¶ added in v0.47.0
type Logger interface { Debug(args ...interface{}) Debugf(template string, args ...interface{}) Debugw(msg string, keysAndValues ...interface{}) Error(args ...interface{}) Errorf(template string, args ...interface{}) Errorw(msg string, keysAndValues ...interface{}) }
Logger interface is the common logger interface for all of web
type Option ¶
Option controls some aspect of run
func WithAuthority ¶ added in v0.25.0
WithAuthority specifies the value to be used as the :authority pseudo-header. This only works with WithInsecure option.
func WithBinaryData ¶
WithBinaryData specifies the binary data
msg := &helloworld.HelloRequest{} msg.Name = "bob" binData, _ := proto.Marshal(msg) WithBinaryData(binData)
func WithBinaryDataFromFile ¶
WithBinaryDataFromFile specifies the binary data
WithBinaryDataFromFile("request_data.bin")
func WithBinaryDataFunc ¶ added in v0.62.0
func WithBinaryDataFunc(data func(mtd *desc.MethodDescriptor, callData *CallData) []byte) Option
WithBinaryDataFunc specifies the binary data func which will be called on each request
WithBinaryDataFunc(changeFunc)
func WithCertificate ¶
WithCertificate specifies the certificate options for the run
WithCertificate("client.crt", "client.key")
func WithClientLoadBalancing ¶ added in v0.64.0
WithClientLoadBalancing specifies the LB strategy to use The strategies has to be self written and pre defined
func WithConcurrency ¶
WithConcurrency specifies the C (number of concurrent requests) option
WithConcurrency(20)
func WithConcurrencyDuration ¶ added in v0.70.0
WithConcurrencyDuration specifies the total concurrency adjustment duration
func WithConcurrencyEnd ¶ added in v0.70.0
WithConcurrencyEnd specifies the concurrency end value for line or step schedule
WithConcurrencyEnd(25)
func WithConcurrencySchedule ¶ added in v0.70.0
WithConcurrencySchedule specifies the concurrency adjustment schedule
WithConcurrencySchedule("const")
func WithConcurrencyStart ¶ added in v0.70.0
WithConcurrencyStart specifies the concurrency start for line or step schedule
WithConcurrencyStart(5)
func WithConcurrencyStep ¶ added in v0.70.0
WithConcurrencyStep specifies the concurrency step value or slope
WithConcurrencyStep(5)
func WithConcurrencyStepDuration ¶ added in v0.70.0
WithConcurrencyStepDuration specifies the concurrency step duration for step schedule
func WithConfig ¶ added in v0.52.0
WithConfig uses the configuration to populate the RunConfig See also: WithConfigFromFile, WithConfigFromReader
func WithConfigFromFile ¶ added in v0.52.0
WithConfigFromFile uses a configuration JSON file to populate the RunConfig
WithConfigFromFile("config.json")
func WithConfigFromReader ¶ added in v0.52.0
WithConfigFromReader uses a reader containing JSON data to populate the RunConfig See also: WithConfigFromFile
func WithConnections ¶ added in v0.35.0
WithConnections specifies the number of gRPC connections to use
WithConnections(5)
func WithData ¶
func WithData(data interface{}) Option
WithData specifies data as generic data that can be serailized to JSON
func WithDataFromJSON ¶
WithDataFromJSON loads JSON data from string
WithDataFromJSON(`{"name":"bob"}`)
func WithDataFromReader ¶
WithDataFromReader loads JSON data from reader
file, _ := os.Open("data.json") WithDataFromReader(file)
func WithDialTimeout ¶
WithDialTimeout specifies the initial connection dial timeout
WithDialTimeout(time.Duration(20*time.Second))
func WithDurationStopAction ¶ added in v0.42.0
WithDurationStopAction specifies how run duration (Z) timeout is handled Possible options are "close", "ignore", and "wait"
WithDurationStopAction("ignore")
func WithEnableCompression ¶ added in v0.50.0
WithEnableCompression specifies that requests should be done using gzip Compressor
WithEnableCompression(true)
func WithInsecure ¶
WithInsecure specifies that this run should be done using insecure mode
WithInsecure(true)
func WithKeepalive ¶
WithKeepalive specifies the keepalive timeout
WithKeepalive(time.Duration(1*time.Minute))
func WithLoadDuration ¶ added in v0.70.0
WithLoadDuration specifies the load duration
func WithLoadSchedule ¶ added in v0.70.0
WithLoadSchedule specifies the load schedule
WithLoadSchedule("const")
func WithLoadStepDuration ¶ added in v0.70.0
WithLoadStepDuration specifies the load step duration for step schedule
func WithLogger ¶ added in v0.47.0
WithLogger specifies the logging option
func WithMetadata ¶
WithMetadata specifies the metadata to be used as a map
md := make(map[string]string) md["token"] = "foobar" md["request-id"] = "123" WithMetadata(&md)
func WithMetadataFromFile ¶
WithMetadataFromFile loads JSON metadata from file
WithMetadataFromJSON("metadata.json")
func WithMetadataFromJSON ¶
WithMetadataFromJSON specifies the metadata to be read from JSON string
WithMetadataFromJSON(`{"request-id":"123"}`)
func WithProtoFile ¶
WithProtoFile specified proto file path and optionally import paths We will automatically add the proto file path's directory and the current directory
WithProtoFile("greeter.proto", []string{"/home/protos"})
func WithRPS ¶ added in v0.70.0
WithRPS specifies the RPS (requests per second) limit option
WithRPS(10)
func WithReflectionMetadata ¶ added in v0.30.0
WithReflectionMetadata specifies the metadata to be used as a map
md := make(map[string]string) md["token"] = "foobar" md["request-id"] = "123" WithReflectionMetadata(&md)
func WithRootCertificate ¶ added in v0.25.0
WithRootCertificate specifies the root certificate options for the run
WithRootCertificate("ca.crt")
func WithRunDuration ¶
WithRunDuration specifies the Z (total test duration) option
WithRunDuration(time.Duration(2*time.Minute))
func WithServerNameOverride ¶ added in v0.25.0
WithServerNameOverride specifies the certificate options for the run
func WithSkipFirst ¶ added in v0.56.0
WithSkipFirst is the skipFirst option
func WithSkipTLSVerify ¶ added in v0.25.0
WithSkipTLSVerify skip client side TLS verification of server certificate
func WithStreamInterval ¶ added in v0.28.0
WithStreamInterval sets the stream interval
func WithTags ¶ added in v0.22.0
WithTags specifies the user defined tags as a map
tags := make(map[string]string) tags["env"] = "staging" tags["created by"] = "joe developer" WithTags(&tags)
func WithTemplateFuncs ¶ added in v0.58.0
WithTemplateFuncs adds additional template functions
func WithTimeout ¶
WithTimeout specifies the timeout for each request
WithTimeout(time.Duration(20*time.Second))
func WithTotalRequests ¶
WithTotalRequests specifies the N (number of total requests) setting
WithTotalRequests(1000)
func WithWorkerTicker ¶ added in v0.70.0
func WithWorkerTicker(ticker load.WorkerTicker) Option
WithWorkerTicker specified the custom worker ticker to use
type Options ¶
type Options struct { Call string `json:"call,omitempty"` Host string `json:"host,omitempty"` Proto string `json:"proto,omitempty"` Protoset string `json:"protoset,omitempty"` ImportPaths []string `json:"import-paths,omitempty"` EnableCompression bool `json:"enable-compression,omitempty"` CACert string `json:"cacert,omitempty"` Cert string `json:"cert,omitempty"` Key string `json:"key,omitempty"` CName string `json:"cname,omitempty"` SkipTLS bool `json:"skipTLS,omitempty"` Insecure bool `json:"insecure"` Authority string `json:"authority,omitempty"` RPS uint `json:"rps,omitempty"` LoadSchedule string `json:"load-schedule"` LoadStart uint `json:"load-start"` LoadEnd uint `json:"load-end"` LoadStep int `json:"load-step"` LoadStepDuration time.Duration `json:"load-step-duration"` LoadMaxDuration time.Duration `json:"load-max-duration"` Concurrency uint `json:"concurrency,omitempty"` CSchedule string `json:"concurrency-schedule"` CStart uint `json:"concurrency-start"` CEnd uint `json:"concurrency-end"` CStep int `json:"concurrency-step"` CStepDuration time.Duration `json:"concurrency-step-duration"` CMaxDuration time.Duration `json:"concurrency-max-duration"` Total uint `json:"total,omitempty"` Async bool `json:"async,omitempty"` Connections uint `json:"connections,omitempty"` Duration time.Duration `json:"duration,omitempty"` Timeout time.Duration `json:"timeout,omitempty"` DialTimeout time.Duration `json:"dial-timeout,omitempty"` KeepaliveTime time.Duration `json:"keepalive,omitempty"` Data interface{} `json:"data,omitempty"` Binary bool `json:"binary"` Metadata *map[string]string `json:"metadata,omitempty"` CPUs int `json:"CPUs"` Name string `json:"name,omitempty"` SkipFirst uint `json:"skipFirst,omitempty"` }
Options represents the request options
type Report ¶
type Report struct { Name string `json:"name,omitempty"` EndReason StopReason `json:"endReason,omitempty"` Options Options `json:"options,omitempty"` Date time.Time `json:"date"` Count uint64 `json:"count"` Total time.Duration `json:"total"` Average time.Duration `json:"average"` Fastest time.Duration `json:"fastest"` Slowest time.Duration `json:"slowest"` Rps float64 `json:"rps"` ErrorDist map[string]int `json:"errorDistribution"` StatusCodeDist map[string]int `json:"statusCodeDistribution"` LatencyDistribution []LatencyDistribution `json:"latencyDistribution"` Histogram []Bucket `json:"histogram"` Details []ResultDetail `json:"details"` Tags map[string]string `json:"tags,omitempty"` }
Report holds the data for the full test
func Run ¶
Run executes the test
report, err := runner.Run( "helloworld.Greeter.SayHello", "localhost:50051", WithProtoFile("greeter.proto", []string{}), WithDataFromFile("data.json"), WithInsecure(true), )
Example ¶
ExampleRun demonstrates how to use runner package to perform a gRPC load test programmatically. We use the printer package to print the report in pretty JSON format.
package main import ( "fmt" "os" "github.com/bojand/ghz/printer" "github.com/bojand/ghz/runner" ) func main() { report, err := runner.Run( "helloworld.Greeter.SayHello", "localhost:50051", runner.WithProtoFile("greeter.proto", []string{}), runner.WithDataFromFile("data.json"), runner.WithInsecure(true), ) if err != nil { fmt.Println(err.Error()) os.Exit(1) } printer := printer.ReportPrinter{ Out: os.Stdout, Report: report, } printer.Print("pretty") }
Output:
func (Report) MarshalJSON ¶
MarshalJSON is custom marshal for report to properly format the date
type Reporter ¶
type Reporter struct {
// contains filtered or unexported fields
}
Reporter gathers all the results
type RequestCounter ¶ added in v0.70.0
type RequestCounter interface {
Get() uint64
}
RequestCounter gets the request count
type Requester ¶
type Requester struct {
// contains filtered or unexported fields
}
Requester is used for doing the requests
func NewRequester ¶ added in v0.60.0
NewRequester creates a new requestor from the passed RunConfig
type ResultDetail ¶
type ResultDetail struct { Timestamp time.Time `json:"timestamp"` Latency time.Duration `json:"latency"` Error string `json:"error"` Status string `json:"status"` }
ResultDetail data for each result
type RunConfig ¶
type RunConfig struct {
// contains filtered or unexported fields
}
RunConfig represents the request Configs
type StopReason ¶
type StopReason string
StopReason is a reason why the run ended
func ReasonFromString ¶
func ReasonFromString(str string) StopReason
ReasonFromString creates a Status from a string
func (StopReason) MarshalJSON ¶
func (s StopReason) MarshalJSON() ([]byte, error)
MarshalJSON formats a Threshold value into a JSON string
func (StopReason) String ¶
func (s StopReason) String() string
String() is the string representation of threshold
func (*StopReason) UnmarshalJSON ¶
func (s *StopReason) UnmarshalJSON(b []byte) error
UnmarshalJSON prases a Threshold value from JSON string