blob: b6d7afdfd37757429a7f2ef18d115ea6fc7d3ad1 [file] [view]
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
# Basics
## Listing Available Tests
```
otava list-groups
```
Lists all available test groups - high-level categories of tests.
```
otava list-tests [group name]
```
Lists all tests or the tests within a given group, if the group name is provided.
## Listing Available Metrics for Tests
To list all available metrics defined for the test:
```
otava list-metrics <test>
```
### Example
> [!TIP]
> See [otava.yaml](../examples/csv/config/otava.yaml) for the full example configuration.
```
$ otava list-metrics local.sample
metric1
metric2
```
## Finding Change Points
```
otava analyze <test>...
otava analyze <group>...
```
This command prints interesting results of all
runs of the test and a list of change-points.
A change-point is a moment when a metric value starts to differ significantly
from the values of the earlier runs and when the difference
is persistent and statistically significant that it is unlikely to happen by chance.
Otava calculates the probability (P-value) that the change point was caused
by chance - the closer to zero, the more "sure" it is about the regression or
performance improvement. The smaller is the actual magnitude of the change,
the more data points are needed to confirm the change, therefore Otava may
not notice the regression immediately after the first run that regressed.
However, it will eventually identify the specific commit that caused the regression,
as it analyzes the history of changes rather than just the HEAD of a branch.
The `analyze` command accepts multiple tests or test groups.
The results are simply concatenated.
### Example
> [!TIP]
> See [otava.yaml](../examples/csv/config/otava.yaml) for the full
> example configuration and [local_samples.csv](../examples/csv/data/local_samples.csv)
> for the data.
```
$ otava analyze local.sample --since=2024-01-01
INFO: Computing change points for test sample.csv...
sample:
time metric1 metric2
------------------------- --------- ---------
2021-01-01 02:00:00 +0000 154023 10.43
2021-01-02 02:00:00 +0000 138455 10.23
2021-01-03 02:00:00 +0000 143112 10.29
2021-01-04 02:00:00 +0000 149190 10.91
2021-01-05 02:00:00 +0000 132098 10.34
2021-01-06 02:00:00 +0000 151344 10.69
·········
-12.9%
·········
2021-01-07 02:00:00 +0000 155145 9.23
2021-01-08 02:00:00 +0000 148889 9.11
2021-01-09 02:00:00 +0000 149466 9.13
2021-01-10 02:00:00 +0000 148209 9.03
```
## Avoiding test definition duplication
You may find that your test definitions are very similar to each other, e.g. they all have the same metrics. Instead
of copy-pasting the definitions you can use templating capability built-in otava to define the common bits of configs
separately.
First, extract the common pieces to the `templates` section:
```yaml
templates:
common-metrics:
throughput:
suffix: client.throughput
response-time:
suffix: client.p50
direction: -1 # lower is better
cpu-load:
suffix: server.cpu
direction: -1 # lower is better
```
Next you can recall a template in the `inherit` property of the test:
```yaml
my-product.test-1:
type: graphite
tags: [perf-test, daily, my-product, test-1]
prefix: performance-tests.daily.my-product.test-1
inherit: common-metrics
my-product.test-2:
type: graphite
tags: [perf-test, daily, my-product, test-2]
prefix: performance-tests.daily.my-product.test-2
inherit: common-metrics
```
You can inherit more than one template.
## Validating Performance of a Feature Branch
When developing a feature, you may want to analyze performance test results from a specific branch
to detect any regressions introduced by your changes. The `--branch` option allows you to run
change-point analysis on branch-specific data.
### Configuration
To support branch-based analysis, use the `%{BRANCH}` placeholder in your test configuration.
This placeholder will be replaced with the branch name specified via `--branch`:
```yaml
tests:
my-product.test:
type: graphite
prefix: performance-tests.%{BRANCH}.my-product
tags: [perf-test, my-product]
metrics:
throughput:
suffix: client.throughput
direction: 1
response_time:
suffix: client.p50
direction: -1
```
For PostgreSQL or BigQuery tests, use `%{BRANCH}` in your SQL query:
```yaml
tests:
my-product.db-test:
type: postgres
time_column: commit_ts
attributes: [experiment_id, commit]
query: |
SELECT commit, commit_ts, throughput, response_time
FROM results
WHERE branch = %{BRANCH}
ORDER BY commit_ts ASC
metrics:
throughput:
direction: 1
response_time:
direction: -1
```
For CSV data sources, the branching is done by looking at the `branch` column in the CSV file and filtering rows based on the specified branch value.
### Usage
Run the analysis with the `--branch` option:
```
otava analyze my-product.test --branch feature-xyz
```
This will:
1. Fetch data from the branch-specific location.
2. Run change-point detection on the branch's performance data
### Example
```
$ otava analyze my-product.test --branch feature-new-cache --since=-30d
INFO: Computing change points for test my-product.test...
my-product.test:
time throughput response_time
------------------------- ------------ ---------------
2024-01-15 10:00:00 +0000 125000 45.2
2024-01-16 10:00:00 +0000 124500 44.8
2024-01-17 10:00:00 +0000 126200 45.1
········
+15.2%
········
2024-01-18 10:00:00 +0000 145000 38.5
2024-01-19 10:00:00 +0000 144200 39.1
2024-01-20 10:00:00 +0000 146100 38.2
```
The `--branch` option can also be set via the `BRANCH` environment variable:
```
BRANCH=feature-xyz otava analyze my-product.test
```