Documentation ¶
Index ¶
- Constants
- Variables
- func LoadConfig(p string, c *Config) error
- type BinaryDataFunc
- type Bucket
- type CallData
- type Config
- type Counter
- type DataProviderFunc
- type Duration
- type LatencyDistribution
- type Logger
- type MetadataProviderFunc
- 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 WithCountErrors(v bool) Option
- func WithData(data interface{}) Option
- func WithDataFromFile(path string) Option
- func WithDataFromJSON(data string) Option
- func WithDataFromReader(r io.Reader) Option
- func WithDataProvider(fn DataProviderFunc) Option
- func WithDefaultCallOptions(opts []grpc.CallOption) Option
- func WithDialTimeout(dt time.Duration) Option
- func WithDisableTemplateData(v bool) Option
- func WithDisableTemplateFuncs(v bool) 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 WithMetadataProvider(fn MetadataProviderFunc) 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 WithProtosetBinary(b []byte) 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 WithStreamCallCount(c uint) Option
- func WithStreamCallDuration(d time.Duration) Option
- func WithStreamDynamicMessages(v bool) Option
- func WithStreamInterceptorProviderFunc(interceptor StreamInterceptorProviderFunc) Option
- func WithStreamInterval(d time.Duration) Option
- func WithStreamMessageProvider(fn StreamMessageProviderFunc) Option
- func WithStreamRecvMsgIntercept(fn StreamRecvMsgInterceptFunc) 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 StreamInterceptor
- type StreamInterceptorProviderFunc
- type StreamMessageProviderFunc
- type StreamRecvMsgInterceptFunc
- 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 ¶
var ErrEndStream = errors.New("ending stream")
ErrEndStream is a signal from message providers that worker should close the stream It should not be used for erronous states
var ErrLastMessage = errors.New("last message")
ErrLastMessage is a signal from message providers that the returned payload is the last one of the stream This is optional but encouraged for optimized performance Message payload returned along with this error must be valid and may not be nil
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
func (*CallData) ExecuteData ¶ added in v0.80.0
ExecuteData applies the call data's parsed template and data string and returns the resulting buffer
func (*CallData) Regenerate ¶ added in v0.80.0
Regenerate generates a new instance of call data from this parent instance The dynamic data like timestamps and UUIDs are re-filled
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"` CountErrors bool `json:"count-errors" toml:"count-errors" yaml:"count-errors"` 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"` StreamCallDuration Duration `json:"stream-call-duration" toml:"stream-call-duration" yaml:"stream-call-duration"` StreamCallCount uint `json:"stream-call-count" toml:"stream-call-count" yaml:"stream-call-count"` StreamDynamicMessages bool `json:"stream-dynamic-messages" toml:"stream-dynamic-messages" yaml:"stream-dynamic-messages"` 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"` LBStrategy string `json:"lb-strategy" toml:"lb-strategy" yaml:"lb-strategy"` MaxCallRecvMsgSize string `json:"max-recv-message-size" toml:"max-recv-message-size" yaml:"max-recv-message-size"` MaxCallSendMsgSize string `json:"max-send-message-size" toml:"max-send-message-size" yaml:"max-send-message-size"` DisableTemplateFuncs bool `json:"disable-template-functions" toml:"disable-template-functions" yaml:"disable-template-functions"` DisableTemplateData bool `json:"disable-template-data" toml:"disable-template-data" yaml:"disable-template-data"` }
Config for the run. TODO fix casing and consistency.
type Counter ¶ added in v0.70.0
type Counter struct {
// contains filtered or unexported fields
}
Counter is an implementation of the request counter
type DataProviderFunc ¶ added in v0.80.0
DataProviderFunc is the interface for providing data for calls For unary and server streaming calls it should return an array with a single element For client and bidi streaming calls it should return an array of messages to be used
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 MetadataProviderFunc ¶ added in v0.80.0
MetadataProviderFunc is the interface for providing metadadata for calls
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 WithCountErrors ¶ added in v0.80.0
WithCountErrors is the count errors option
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 WithDataProvider ¶ added in v0.80.0
func WithDataProvider(fn DataProviderFunc) Option
WithDataProvider provides custom data provider
WithDataProvider(func(*CallData) ([]*dynamic.Message, error) { protoMsg := &helloworld.HelloRequest{Name: "Bob"} dynamicMsg, err := dynamic.AsDynamicMessage(protoMsg) if err != nil { return nil, err } return []*dynamic.Message{dynamicMsg}, nil }),
func WithDefaultCallOptions ¶ added in v0.100.0
func WithDefaultCallOptions(opts []grpc.CallOption) Option
WithDefaultCallOptions sets the default CallOptions for calls over the connection.
func WithDialTimeout ¶
WithDialTimeout specifies the initial connection dial timeout
WithDialTimeout(time.Duration(20*time.Second))
func WithDisableTemplateData ¶ added in v0.111.0
WithDisableTemplateData disables template data execution in call data
func WithDisableTemplateFuncs ¶ added in v0.111.0
WithDisableTemplateFuncs disables template functions in call data
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 WithMetadataProvider ¶ added in v0.80.0
func WithMetadataProvider(fn MetadataProviderFunc) Option
WithMetadataProvider provides custom metadata provider
WithMetadataProvider(ctd *CallData) (*metadata.MD, error) { return &metadata.MD{"token": []string{"secret"}}, nil }),
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 WithProtosetBinary ¶ added in v0.100.0
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 WithStreamCallCount ¶ added in v0.80.0
WithStreamCallCount sets the stream close count
func WithStreamCallDuration ¶ added in v0.80.0
WithStreamCallDuration sets the maximum stream call duration at which point the client will close the stream
func WithStreamDynamicMessages ¶ added in v0.80.0
WithStreamDynamicMessages sets the stream dynamic message generation
func WithStreamInterceptorProviderFunc ¶ added in v0.118.0
func WithStreamInterceptorProviderFunc(interceptor StreamInterceptorProviderFunc) Option
WithStreamInterceptor specifies the stream interceptor provider function
func WithStreamInterval ¶ added in v0.28.0
WithStreamInterval sets the stream interval
func WithStreamMessageProvider ¶ added in v0.90.0
func WithStreamMessageProvider(fn StreamMessageProviderFunc) Option
WithStreamMessageProvider sets custom stream message provider
WithStreamMessageProvider(func(cd *CallData) (*dynamic.Message, error) { protoMsg := &helloworld.HelloRequest{Name: cd.WorkerID + ": " + strconv.FormatInt(cd.RequestNumber, 10)} dynamicMsg, err := dynamic.AsDynamicMessage(protoMsg) if err != nil { return nil, err } callCounter++ if callCounter == 5 { err = ErrLastMessage } return dynamicMsg, err }),
func WithStreamRecvMsgIntercept ¶ added in v0.80.0
func WithStreamRecvMsgIntercept(fn StreamRecvMsgInterceptFunc) Option
WithStreamRecvMsgIntercept specified the stream receive intercept function
WithStreamRecvMsgIntercept(func(msg *dynamic.Message, err error) error { if err == nil && msg != nil { reply := &helloworld.HelloReply{} convertErr := msg.ConvertTo(reply) if convertErr == nil { if reply.GetMessage() == "Hello bar" { return ErrEndStream } } } return nil })
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 int `json:"rps,omitempty"` LoadSchedule string `json:"load-schedule"` LoadStart int `json:"load-start"` LoadEnd int `json:"load-end"` LoadStep int `json:"load-step"` LoadStepDuration time.Duration `json:"load-step-duration"` LoadMaxDuration time.Duration `json:"load-max-duration"` Concurrency int `json:"concurrency,omitempty"` CSchedule string `json:"concurrency-schedule"` CStart int `json:"concurrency-start"` CEnd int `json:"concurrency-end"` CStep int `json:"concurrency-step"` CStepDuration time.Duration `json:"concurrency-step-duration"` CMaxDuration time.Duration `json:"concurrency-max-duration"` Total int `json:"total,omitempty"` Async bool `json:"async,omitempty"` Connections int `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 int `json:"skipFirst,omitempty"` CountErrors bool `json:"count-errors,omitempty"` }
Options represents the request options TODO fix casing and consistency
type Report ¶
type Report struct { Name string `json:"name,omitempty"` EndReason StopReason `json:"endReason,omitempty"` Date time.Time `json:"date"` Options Options `json:"options,omitempty"` 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
type StreamInterceptor ¶ added in v0.118.0
type StreamInterceptor interface { Recv(*dynamic.Message, error) error Send(*CallData) (*dynamic.Message, error) }
StreamInterceptor is an interface for sending and receiving stream messages. The interceptor can keep shared state for the send and receive calls.
type StreamInterceptorProviderFunc ¶ added in v0.118.0
type StreamInterceptorProviderFunc func(*CallData) StreamInterceptor
StreamInterceptorProviderFunc is an interface for a function invoked to generate a stream interceptor
type StreamMessageProviderFunc ¶ added in v0.80.0
StreamMessageProviderFunc is the interface for providing a message for every message send in the course of a streaming call
type StreamRecvMsgInterceptFunc ¶ added in v0.80.0
StreamRecvMsgInterceptFunc is an interface for function invoked when we receive a stream message Clients can return ErrEndStream to end the call early