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) (*CreateTestRunResponse, 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 LogEntry
- type LoginResponse
- type ResultStatus
- type RunStatus
- 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)
CreateTestRun is used when a test run is being executed locally, while the results are streamed to the cloud, i.e. `k6 run --out cloud script.js`.
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 (c *Client) StartCloudTestRun(name string, projectID int64, arc *lib.Archive) (*CreateTestRunResponse, error)
StartCloudTestRun starts a cloud test run, i.e. `k6 cloud script.js`.
func (*Client) StopCloudTestRun ¶
func (*Client) TestFinished ¶
func (c *Client) TestFinished(referenceID string, thresholds ThresholdResult, tained bool, runStatus RunStatus) error
TestFinished sends the result and run status values to the cloud, along with information for the test thresholds, and marks the test run as finished.
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"` TestRunDetails null.String `json:"testRunDetails" envconfig:"K6_CLOUD_TEST_RUN_DETAILS"` 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 LogEntry ¶
LogEntry can be used by the cloud to tell k6 to log something to the console, so the user can see it.
type LoginResponse ¶
type LoginResponse struct {
Token string `json:"token"`
}
type ResultStatus ¶
type ResultStatus int
const ( ResultStatusPassed ResultStatus = 0 ResultStatusFailed ResultStatus = 1 )
type RunStatus ¶
type RunStatus int
RunStatus values are used to tell the cloud output how a local test run ended, and to get that information from the cloud for cloud tests.
const ( RunStatusCreated RunStatus = -2 RunStatusValidated RunStatus = -1 RunStatusQueued RunStatus = 0 RunStatusInitializing RunStatus = 1 RunStatusRunning RunStatus = 2 RunStatusFinished RunStatus = 3 RunStatusTimedOut RunStatus = 4 RunStatusAbortedUser RunStatus = 5 RunStatusAbortedSystem RunStatus = 6 RunStatusAbortedScriptError RunStatus = 7 RunStatusAbortedThreshold RunStatus = 8 RunStatusAbortedLimit RunStatus = 9 )
Possible run status values; iota isn't used intentionally
type TestProgressResponse ¶
type TestProgressResponse struct { RunStatusText string `json:"run_status_text"` RunStatus RunStatus `json:"run_status"` ResultStatus ResultStatus `json:"result_status"` Progress float64 `json:"progress"` }