Documentation ¶
Overview ¶
Package cloudapi contains several things related to the k6 cloud - various data and config structures, a REST API client, log streaming logic, etc. They are all used in cloud tests (i.e. `k6 cloud`), and in local tests emitting their results to the k6 cloud output (i.e. `k6 run --out cloud`).
Index ¶
- Constants
- Variables
- func MergeFromExternal(external map[string]json.RawMessage, conf *Config) error
- func URLForResults(refID string, config Config) string
- type Client
- func (c *Client) CreateTestRun(testRun *TestRun) (*CreateTestRunResponse, error)
- func (c *Client) Do(req *http.Request, v interface{}) error
- func (c *Client) GetTestProgress(referenceID string) (*TestProgressResponse, error)
- func (c *Client) Login(email string, password string) (*LoginResponse, error)
- func (c *Client) NewRequest(method, url string, data interface{}) (*http.Request, error)
- func (c *Client) StartCloudTestRun(name string, projectID int64, arc *lib.Archive) (string, error)
- func (c *Client) StopCloudTestRun(referenceID string) error
- func (c *Client) TestFinished(referenceID string, thresholds ThresholdResult, tained bool, ...) error
- func (c *Client) ValidateOptions(options lib.Options) error
- type Config
- type CreateTestRunResponse
- type ErrorResponse
- type LoginResponse
- type ResultStatus
- type TestProgressResponse
- type TestRun
- type ThresholdResult
Constants ¶
const ( // RetryInterval is the default cloud request retry interval RetryInterval = 500 * time.Millisecond // MaxRetries specifies max retry attempts MaxRetries = 3 )
Variables ¶
Functions ¶
func MergeFromExternal ¶
func MergeFromExternal(external map[string]json.RawMessage, conf *Config) error
MergeFromExternal merges three fields from the JSON in a loadimpact key of the provided external map. Used for options.ext.loadimpact settings.
func URLForResults ¶
URLForResults returns the cloud URL with the test run results.
Types ¶
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client handles communication with Load Impact cloud API.
func NewClient ¶
func NewClient(logger logrus.FieldLogger, token, host, version string, timeout time.Duration) *Client
NewClient return a new client for the cloud API
func (*Client) CreateTestRun ¶
func (c *Client) CreateTestRun(testRun *TestRun) (*CreateTestRunResponse, error)
func (*Client) GetTestProgress ¶
func (c *Client) GetTestProgress(referenceID string) (*TestProgressResponse, error)
func (*Client) Login ¶
func (c *Client) Login(email string, password string) (*LoginResponse, error)
func (*Client) NewRequest ¶
NewRequest creates new HTTP request.
This is the same as http.NewRequest, except that data if not nil will be serialized in json format.
func (*Client) StartCloudTestRun ¶
func (*Client) StopCloudTestRun ¶
func (*Client) TestFinished ¶
type Config ¶
type Config struct { // TODO: refactor common stuff between cloud execution and output Token null.String `json:"token" envconfig:"K6_CLOUD_TOKEN"` ProjectID null.Int `json:"projectID" envconfig:"K6_CLOUD_PROJECT_ID"` Name null.String `json:"name" envconfig:"K6_CLOUD_NAME"` Host null.String `json:"host" envconfig:"K6_CLOUD_HOST"` Timeout types.NullDuration `json:"timeout" envconfig:"K6_CLOUD_TIMEOUT"` LogsTailURL null.String `json:"-" envconfig:"K6_CLOUD_LOGS_TAIL_URL"` PushRefID null.String `json:"pushRefID" envconfig:"K6_CLOUD_PUSH_REF_ID"` WebAppURL null.String `json:"webAppURL" envconfig:"K6_CLOUD_WEB_APP_URL"` NoCompress null.Bool `json:"noCompress" envconfig:"K6_CLOUD_NO_COMPRESS"` StopOnError null.Bool `json:"stopOnError" envconfig:"K6_CLOUD_STOP_ON_ERROR"` MaxMetricSamplesPerPackage null.Int `json:"maxMetricSamplesPerPackage" envconfig:"K6_CLOUD_MAX_METRIC_SAMPLES_PER_PACKAGE"` // The time interval between periodic API calls for sending samples to the cloud ingest service. MetricPushInterval types.NullDuration `json:"metricPushInterval" envconfig:"K6_CLOUD_METRIC_PUSH_INTERVAL"` // This is how many concurrent pushes will be done at the same time to the cloud MetricPushConcurrency null.Int `json:"metricPushConcurrency" envconfig:"K6_CLOUD_METRIC_PUSH_CONCURRENCY"` // If specified and is greater than 0, sample aggregation with that period is enabled AggregationPeriod types.NullDuration `json:"aggregationPeriod" envconfig:"K6_CLOUD_AGGREGATION_PERIOD"` // If aggregation is enabled, this is how often new HTTP trails will be sorted into buckets and sub-buckets and aggregated. AggregationCalcInterval types.NullDuration `json:"aggregationCalcInterval" envconfig:"K6_CLOUD_AGGREGATION_CALC_INTERVAL"` // If aggregation is enabled, this specifies how long we'll wait for period samples to accumulate before trying to aggregate them. AggregationWaitPeriod types.NullDuration `json:"aggregationWaitPeriod" envconfig:"K6_CLOUD_AGGREGATION_WAIT_PERIOD"` // If aggregation is enabled, but the collected samples for a certain AggregationPeriod after AggregationPushDelay has passed are less than this number, they won't be aggregated. AggregationMinSamples null.Int `json:"aggregationMinSamples" envconfig:"K6_CLOUD_AGGREGATION_MIN_SAMPLES"` // If this is enabled and a sub-bucket has more than AggregationMinSamples HTTP trails in it, they would all be // aggregated without attempting to find and separate any outlier metrics first. // IMPORTANT: This is intended for testing purposes only or, in extreme cases, when the result precision // isn't very important and the improved aggregation percentage would be worth the potentially huge loss // of metric granularity and possible masking of any outlier samples. AggregationSkipOutlierDetection null.Bool `json:"aggregationSkipOutlierDetection" envconfig:"K6_CLOUD_AGGREGATION_SKIP_OUTLIER_DETECTION"` // If aggregation and outlier detection are enabled, this option specifies the // number of HTTP trails in a sub-bucket that determine which quartile-calculating // algorithm would be used: // - for fewer samples (between MinSamples and OutlierAlgoThreshold), a more precise // (i.e. supporting interpolation), but also more computationally-heavy sorting // algorithm will be used to find the quartiles. // - if there are more samples than OutlierAlgoThreshold in the sub-bucket, a // QuickSelect-based (https://en.wikipedia.org/wiki/Quickselect) algorithm will // be used. It doesn't support interpolation, so there's a small loss of precision // in the outlier detection, but it's not as resource-heavy as the sorting algorithm. AggregationOutlierAlgoThreshold null.Int `json:"aggregationOutlierAlgoThreshold" envconfig:"K6_CLOUD_AGGREGATION_OUTLIER_ALGO_THRESHOLD"` // The radius (as a fraction) from the median at which to sample Q1 and Q3. // By default it's one quarter (0.25) and if set to something different, the Q in IQR // won't make much sense... But this would allow us to select tighter sample groups for // aggregation if we want. AggregationOutlierIqrRadius null.Float `json:"aggregationOutlierIqrRadius" envconfig:"K6_CLOUD_AGGREGATION_OUTLIER_IQR_RADIUS"` // Connection or request times with how many IQRs below Q1 to consier as non-aggregatable outliers. AggregationOutlierIqrCoefLower null.Float `json:"aggregationOutlierIqrCoefLower" envconfig:"K6_CLOUD_AGGREGATION_OUTLIER_IQR_COEF_LOWER"` // Connection or request times with how many IQRs above Q3 to consier as non-aggregatable outliers. AggregationOutlierIqrCoefUpper null.Float `json:"aggregationOutlierIqrCoefUpper" envconfig:"K6_CLOUD_AGGREGATION_OUTLIER_IQR_COEF_UPPER"` }
Config holds all the necessary data and options for sending metrics to the Load Impact cloud.
func GetConsolidatedConfig ¶
func GetConsolidatedConfig( jsonRawConf json.RawMessage, env map[string]string, configArg string, external map[string]json.RawMessage, ) (Config, error)
GetConsolidatedConfig combines the default config values with the JSON config values and environment variables and returns the final result.
func NewConfig ¶
func NewConfig() Config
NewConfig creates a new Config instance with default values for some fields.
type CreateTestRunResponse ¶
type ErrorResponse ¶
type ErrorResponse struct { Response *http.Response `json:"-"` Code int `json:"code"` Message string `json:"message"` Details map[string][]string `json:"details"` FieldErrors map[string][]string `json:"field_errors"` Errors []string `json:"errors"` }
ErrorResponse represents an error cause by talking to the API
func (ErrorResponse) Error ¶
func (e ErrorResponse) Error() string
type LoginResponse ¶
type LoginResponse struct {
Token string `json:"token"`
}
type ResultStatus ¶
type ResultStatus int
const ( ResultStatusPassed ResultStatus = 0 ResultStatusFailed ResultStatus = 1 )
type TestProgressResponse ¶
type TestProgressResponse struct { RunStatusText string `json:"run_status_text"` RunStatus lib.RunStatus `json:"run_status"` ResultStatus ResultStatus `json:"result_status"` Progress float64 `json:"progress"` }