adambernier opened a new pull request, #167:
URL: https://github.com/apache/otava/pull/167
| File | Action | Details |
| :--- | :--- | :--- |
| `otava/analysis.py` | **MODIFY** | Delete the `fill_missing()` function
implementation. |
| `otava/series.py` | **MODIFY** | Remove `from otava.analysis import
fill_missing` and all call sites of `fill_missing()`. Pass raw data series
directly. |
| `tests/analysis_test.py` | **MODIFY** | Remove unit tests covering
`fill_missing()`. |
| `tests/series_test.py` | **MODIFY** | Update tests to ensure unpadded
series data processes without errors. |
```python
$ uv run tox
test: commands_pre[0]> uv sync --active --locked --all-extras -v
DEBUG Found workspace root: `/home/acbernier/otava`
DEBUG Adding root workspace member: `/home/acbernier/otava`
DEBUG Skipping `pyproject.toml` in `/home/acbernier/otava` (no `[tool.uv]`
section)
DEBUG Searching for user configuration in:
`/home/acbernier/.config/uv/uv.toml`
DEBUG uv 0.12.2 (x86_64-unknown-linux-gnu)
DEBUG Found project root: `/home/acbernier/otava`
DEBUG Using active virtual environment `build/.tox/test` instead of project
environment `.venv`
DEBUG No Python version file found in workspace: /home/acbernier/otava
DEBUG Using Python request `>=3.10, <3.15` from `requires-python` metadata
DEBUG Using active virtual environment `build/.tox/test` instead of project
environment `.venv`
DEBUG Checking for Python environment at: `build/.tox/test`
DEBUG The project environment's Python version satisfies the request:
`Python >=3.10, <3.15`
DEBUG Using request connect timeout of 10s and read timeout of 30s
DEBUG Found static `requires-dist` for: /home/acbernier/otava/
DEBUG Existing `uv.lock` satisfies workspace requirements
Resolved 72 packages in 0.88ms
DEBUG Computed cache info: Timestamp(SystemTime { tv_sec: 1786113363,
tv_nsec: 458263624 }), None, None, {}, {"src": None}. Most recently modified:
pyproject.toml
DEBUG Requirement already installed: apache-otava==0.8.0 (from
file:///home/acbernier/otava)
DEBUG Requirement already installed: configargparse==1.7.1
DEBUG Requirement already installed: dateparser==1.2.0
DEBUG Requirement already installed: google-cloud-bigquery==3.38.0
DEBUG Requirement already installed: numpy==2.2.6
DEBUG Requirement already installed: pg8000==1.31.5
DEBUG Requirement already installed: pystache==0.6.8
DEBUG Requirement already installed: python-dateutil==2.9.0.post0
DEBUG Requirement already installed: requests==2.33.0
DEBUG Requirement already installed: ruamel-yaml==0.18.16
DEBUG Requirement already installed: scipy==1.16.3
DEBUG Requirement already installed: slack-sdk==3.39.0
DEBUG Requirement already installed: tabulate==0.9.0
DEBUG Requirement already installed: validators==0.35.0
DEBUG Requirement already installed: autoflake==2.3.1
DEBUG Requirement already installed: flake8==7.3.0
DEBUG Requirement already installed: isort==7.0.0
DEBUG Requirement already installed: pre-commit==4.5.0
DEBUG Requirement already installed: pytest==9.0.3
DEBUG Requirement already installed: pytest-benchmark==5.2.3
DEBUG Requirement already installed: pytz==2025.2
DEBUG Requirement already installed: ruff==0.14.8
DEBUG Requirement already installed: tox==4.32.0
DEBUG Requirement already installed: regex==2025.11.3
DEBUG Requirement already installed: tzlocal==5.3.1
DEBUG Requirement already installed: google-api-core==2.28.1
DEBUG Requirement already installed: google-auth==2.43.0
DEBUG Requirement already installed: google-cloud-core==2.5.0
DEBUG Requirement already installed: google-resumable-media==2.7.2
DEBUG Requirement already installed: packaging==25.0
DEBUG Requirement already installed: scramp==1.4.6
DEBUG Requirement already installed: six==1.17.0
DEBUG Requirement already installed: certifi==2025.10.5
DEBUG Requirement already installed: charset-normalizer==3.4.4
DEBUG Requirement already installed: idna==3.15
DEBUG Requirement already installed: urllib3==2.7.0
DEBUG Requirement already installed: ruamel-yaml-clib==0.2.14
DEBUG Requirement already installed: pyflakes==3.4.0
DEBUG Requirement already installed: mccabe==0.7.0
DEBUG Requirement already installed: pycodestyle==2.14.0
DEBUG Requirement already installed: cfgv==3.4.0
DEBUG Requirement already installed: identify==2.6.15
DEBUG Requirement already installed: nodeenv==1.9.1
DEBUG Requirement already installed: pyyaml==6.0.3
DEBUG Requirement already installed: virtualenv==20.36.1
DEBUG Requirement already installed: iniconfig==2.3.0
DEBUG Requirement already installed: pluggy==1.6.0
DEBUG Requirement already installed: pygments==2.20.0
DEBUG Requirement already installed: py-cpuinfo==9.0.0
DEBUG Requirement already installed: cachetools==6.2.1
DEBUG Requirement already installed: chardet==5.2.0
DEBUG Requirement already installed: colorama==0.4.6
DEBUG Requirement already installed: filelock==3.24.3
DEBUG Requirement already installed: platformdirs==4.5.0
DEBUG Requirement already installed: pyproject-api==1.10.0
DEBUG Requirement already installed: googleapis-common-protos==1.72.0
DEBUG Requirement already installed: proto-plus==1.26.1
DEBUG Requirement already installed: protobuf==6.33.5
DEBUG Requirement already installed: grpcio==1.76.0
DEBUG Requirement already installed: grpcio-status==1.76.0
DEBUG Requirement already installed: pyasn1-modules==0.4.2
DEBUG Requirement already installed: rsa==4.9.1
DEBUG Requirement already installed: google-crc32c==1.7.1
DEBUG Requirement already installed: asn1crypto==1.5.1
DEBUG Requirement already installed: distlib==0.4.0
DEBUG Requirement already installed: typing-extensions==4.15.0
DEBUG Requirement already installed: pyasn1==0.6.4
DEBUG Preserving seed package: pip==26.2
Checked 67 packages in 0.88ms
test: commands[0]> ruff check --diff .
test: commands[1]> autoflake --exclude build,.venv --recursive
--remove-all-unused-imports --check .
./tests/graphite_test.py: No issues detected!
./hatch_build.py: No issues detected!
./tests/analysis_test.py: No issues detected!
./tests/report_test.py: No issues detected!
./tests/slack_notification_test.py: No issues detected!
./tests/cli_help_test.py: No issues detected!
./tests/util_test.py: No issues detected!
./tests/e2e_test_utils.py: No issues detected!
./tests/postgres_e2e_test.py: No issues detected!
./tests/graphite_e2e_test.py: No issues detected!
./otava/attributes.py: No issues detected!
./tests/tigerbeetle_test.py: No issues detected!
./otava/bigquery.py: No issues detected!
./tests/config_test.py: No issues detected!
./tests/csv_e2e_test.py: No issues detected!
./perf/perf_test.py: No issues detected!
./otava/util.py: No issues detected!
./tests/change_point_divisive_test.py: No issues detected!
./otava/graphite.py: No issues detected!
./otava/grafana.py: No issues detected!
./otava/change_point_divisive/__init__.py: No issues detected!
./otava/csv_options.py: No issues detected!
./otava/data_selector.py: No issues detected!
./tests/series_test.py: No issues detected!
./otava/change_point_divisive/significance_test.py: No issues detected!
./otava/change_point_divisive/detector.py: No issues detected!
./otava/postgres.py: No issues detected!
./otava/report.py: No issues detected!
./otava/config.py: No issues detected!
./otava/slack.py: No issues detected!
./otava/change_point_divisive/base.py: No issues detected!
./tests/importer_test.py: No issues detected!
./otava/change_point_divisive/calculator.py: No issues detected!
./otava/test_config.py: No issues detected!
./otava/analysis.py: No issues detected!
./otava/main.py: No issues detected!
./otava/series.py: No issues detected!
./otava/importer.py: No issues detected!
test: commands[2]> isort --check --diff .
Skipped 3 files
test: commands[3]> flake8 --count --show-source --statistics
0
test: commands[4]> pre-commit run --all-files --hook-stage pre-push
insert-license
[INFO] Initializing environment for
https://github.com/Lucas-C/pre-commit-hooks.
[INFO] Installing environment for
https://github.com/Lucas-C/pre-commit-hooks.
[INFO] Once installed this environment will be reused.
[INFO] This may take a few minutes...
Add license for all Python
files.........................................Passed
Add license for all YAML
files...........................................Passed
Add license for all Markdown
files.......................................Passed
Add license for all Shell
files..........................................Passed
Add license for all toml
files...........................................Passed
Add license for all SQL
files............................................Passed
Add license for all other
files..........................................Passed
test: commands[5]> mkdir -p /home/acbernier/otava/build/test
test: commands[6]> pytest --verbose tests perf
======================== test session starts =========================
platform linux -- Python 3.12.3, pytest-9.0.3, pluggy-1.6.0 --
/home/acbernier/otava/build/.tox/test/bin/python3
cachedir: build/.tox/test/.pytest_cache
benchmark: 5.2.3 (defaults: timer=time.perf_counter disable_gc=False
min_rounds=5 min_time=0.000005 max_time=1.0 calibration_precision=10
warmup=False warmup_iterations=100000)
rootdir: /home/acbernier/otava
configfile: pyproject.toml (WARNING: ignoring pytest config in tox.ini!)
plugins: benchmark-5.2.3
collected 114 items
tests/analysis_test.py::test_single_series PASSED [ 0%]
tests/analysis_test.py::test_single_series_original PASSED [ 1%]
tests/analysis_test.py::test_significance_tester PASSED [ 2%]
tests/change_point_divisive_test.py::test_calculator_candidate PASSED [ 3%]
tests/change_point_divisive_test.py::test_permutation_calculation PASSED [
4%]
tests/change_point_divisive_test.py::test_permutation_test PASSED [ 5%]
tests/change_point_divisive_test.py::test_ttest PASSED [ 6%]
tests/change_point_divisive_test.py::test_get_intervals_requires_sorted_change_points
PASSED [ 7%]
tests/cli_help_test.py::test_otava_help_output PASSED [ 7%]
tests/cli_help_test.py::test_otava_analyze_help_output PASSED [ 8%]
tests/cli_help_test.py::test_otava_list_tests_help_output PASSED [ 9%]
tests/cli_help_test.py::test_otava_list_metrics_help_output PASSED [ 10%]
tests/cli_help_test.py::test_otava_list_groups_help_output PASSED [ 11%]
tests/cli_help_test.py::test_otava_remove_annotations_help_output PASSED [
12%]
tests/cli_help_test.py::test_otava_validate_help_output PASSED [ 13%]
tests/config_test.py::test_load_graphite_tests PASSED [ 14%]
tests/config_test.py::test_load_csv_tests PASSED [ 14%]
tests/config_test.py::test_load_test_groups PASSED [ 15%]
tests/config_test.py::test_load_histostat_config PASSED [ 16%]
tests/config_test.py::test_configuration_substitutions[slack_token] PASSED [
17%]
tests/config_test.py::test_configuration_substitutions[bigquery_project_id]
PASSED [ 18%]
tests/config_test.py::test_configuration_substitutions[bigquery_dataset]
PASSED [ 19%]
tests/config_test.py::test_configuration_substitutions[bigquery_credentials]
PASSED [ 20%]
tests/config_test.py::test_configuration_substitutions[grafana_url] PASSED [
21%]
tests/config_test.py::test_configuration_substitutions[grafana_user] PASSED
[ 21%]
tests/config_test.py::test_configuration_substitutions[grafana_password]
PASSED [ 22%]
tests/config_test.py::test_configuration_substitutions[graphite_url] PASSED
[ 23%]
tests/config_test.py::test_configuration_substitutions[postgres_hostname]
PASSED [ 24%]
tests/config_test.py::test_configuration_substitutions[postgres_port] PASSED
[ 25%]
tests/config_test.py::test_configuration_substitutions[postgres_username]
PASSED [ 26%]
tests/config_test.py::test_configuration_substitutions[postgres_password]
PASSED [ 27%]
tests/config_test.py::test_configuration_substitutions[postgres_database]
PASSED [ 28%]
tests/config_test.py::test_config_section_yaml_parser_flattens_only_config_sections
PASSED [ 28%]
tests/config_test.py::test_cli_precedence_over_env_vars PASSED [ 29%]
tests/config_test.py::test_unknown_argument_raises_error PASSED [ 30%]
tests/csv_e2e_test.py::test_analyze_csv PASSED [ 31%]
tests/csv_e2e_test.py::test_analyze_csv_multiple_branches_without_branch_flag_fails
PASSED [ 32%]
tests/csv_e2e_test.py::test_analyze_csv_branch_flag_without_branch_column_fails
PASSED [ 33%]
tests/csv_e2e_test.py::test_analyze_csv_with_branch_filter PASSED [ 34%]
tests/graphite_e2e_test.py::test_analyze_graphite PASSED [ 35%]
tests/graphite_e2e_test.py::test_analyze_graphite_with_branch PASSED [ 35%]
tests/graphite_test.py::test_compress_target_paths PASSED [ 36%]
tests/importer_test.py::test_import_csv PASSED [ 37%]
tests/importer_test.py::test_import_csv_with_metrics_filter PASSED [ 38%]
tests/importer_test.py::test_import_csv_with_time_filter PASSED [ 39%]
tests/importer_test.py::test_import_csv_with_unix_timestamps PASSED [ 40%]
tests/importer_test.py::test_import_csv_semicolon_sep PASSED [ 41%]
tests/importer_test.py::test_import_csv_last_n_points PASSED [ 42%]
tests/importer_test.py::test_import_histostat PASSED [ 42%]
tests/importer_test.py::test_import_histostat_last_n_points PASSED [ 43%]
tests/importer_test.py::test_import_postgres PASSED [ 44%]
tests/importer_test.py::test_import_postgres_with_time_filter PASSED [ 45%]
tests/importer_test.py::test_import_postgres_last_n_points PASSED [ 46%]
tests/importer_test.py::test_import_bigquery PASSED [ 47%]
tests/importer_test.py::test_import_bigquery_with_time_filter PASSED [ 48%]
tests/importer_test.py::test_import_bigquery_last_n_points PASSED [ 49%]
tests/importer_test.py::test_graphite_substitutes_branch PASSED [ 50%]
tests/importer_test.py::test_graphite_branch_placeholder_without_branch_raises_error
PASSED [ 50%]
tests/importer_test.py::test_postgres_branch_placeholder_without_branch_raises_error
PASSED [ 51%]
tests/importer_test.py::test_bigquery_branch_placeholder_without_branch_raises_error
PASSED [ 52%]
tests/importer_test.py::test_csv_no_branch_no_branch_column PASSED [ 53%]
tests/importer_test.py::test_csv_no_branch_single_branch_in_column PASSED [
54%]
tests/importer_test.py::test_csv_no_branch_multiple_branches_raises_error
PASSED [ 55%]
tests/importer_test.py::test_csv_branch_specified_no_branch_column_raises_error
PASSED [ 56%]
tests/importer_test.py::test_csv_branch_specified_filters_rows PASSED [ 57%]
tests/postgres_e2e_test.py::test_analyze PASSED [ 57%]
tests/postgres_e2e_test.py::test_analyze_and_update_postgres PASSED [ 58%]
tests/report_test.py::test_report PASSED [ 59%]
tests/report_test.py::test_json_report PASSED [ 60%]
tests/series_test.py::test_change_point_detection PASSED [ 61%]
tests/series_test.py::test_change_point_min_magnitude PASSED [ 62%]
tests/series_test.py::test_div_by_zero PASSED [ 63%]
tests/series_test.py::test_change_point_detection_performance PASSED [ 64%]
tests/series_test.py::test_get_stable_range PASSED [ 64%]
tests/series_test.py::test_incremental_otava PASSED [ 65%]
tests/series_test.py::test_validate PASSED [ 66%]
tests/series_test.py::test_can_append PASSED [ 67%]
tests/series_test.py::test_orig_edivisive PASSED [ 68%]
tests/series_test.py::test_series_sparse_commits PASSED [ 69%]
tests/series_test.py::test_series_irregular_timestamps PASSED [ 70%]
tests/series_test.py::test_series_raw_initialization PASSED [ 71%]
tests/slack_notification_test.py::test_blocks_dispatch PASSED [ 71%]
tests/tigerbeetle_test.py::test_tb_old_defaults PASSED [ 72%]
tests/tigerbeetle_test.py::test_tb_old_defaults_p05 PASSED [ 73%]
tests/tigerbeetle_test.py::test_tb_old_defaults_p1 PASSED [ 74%]
tests/tigerbeetle_test.py::test_tb_old_defaults_p2 PASSED [ 75%]
tests/tigerbeetle_test.py::test_tb_magnitude0_p2 PASSED [ 76%]
tests/tigerbeetle_test.py::test_tb_magnitude0_p1 PASSED [ 77%]
tests/tigerbeetle_test.py::test_tb_magnitude0_p01 PASSED [ 78%]
tests/tigerbeetle_test.py::test_tb_magnitude0_p001 PASSED [ 78%]
tests/tigerbeetle_test.py::test_tb_magnitude0_p0001 PASSED [ 79%]
tests/tigerbeetle_test.py::test_tb_magnitude0_p00001 PASSED [ 80%]
tests/util_test.py::test_merge_sorted PASSED [ 81%]
tests/util_test.py::test_remove_common_prefix PASSED [ 82%]
tests/util_test.py::test_insert_multiple PASSED [ 83%]
tests/util_test.py::test_sliding_window PASSED [ 84%]
tests/util_test.py::test_merge_dicts PASSED [ 85%]
tests/util_test.py::test_dict_list PASSED [ 85%]
tests/util_test.py::test_interpolate PASSED [ 86%]
perf/perf_test.py::test_tb_baseline0001 PASSED [ 87%]
perf/perf_test.py::test_tb_baseline001 PASSED [ 88%]
perf/perf_test.py::test_tb_baseline01 PASSED [ 89%]
perf/perf_test.py::test_tb_baseline1 PASSED [ 90%]
perf/perf_test.py::test_tb_baseline2 PASSED [ 91%]
perf/perf_test.py::test_tb_twice0001 PASSED [ 92%]
perf/perf_test.py::test_tb_twice001 PASSED [ 92%]
perf/perf_test.py::test_tb_twice01 PASSED [ 93%]
perf/perf_test.py::test_tb_twice1 PASSED [ 94%]
perf/perf_test.py::test_tb_twice2 PASSED [ 95%]
perf/perf_test.py::test_tb_incremental0001 PASSED [ 96%]
perf/perf_test.py::test_tb_incremental001 PASSED [ 97%]
perf/perf_test.py::test_tb_incremental01 PASSED [ 98%]
perf/perf_test.py::test_tb_incremental1 PASSED [ 99%]
perf/perf_test.py::test_tb_incremental2 PASSED [100%]
-----------------------------------------------------------------------------------
benchmark: 15 tests
------------------------------------------------------------------------------------
Name (time in ms) Min Max Mean
StdDev Median IQR Outliers
OPS Rounds Iterations
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_tb_baseline0001 7.9230 (1.0) 9.2694 (1.0) 8.0740
(1.0) 0.1653 (1.0) 8.0401 (1.0) 0.0866 (1.18) 4;6
123.8546 (1.0) 114 1
test_tb_baseline001 8.5798 (1.08) 10.2639 (1.11) 8.7624
(1.09) 0.2499 (1.51) 8.7035 (1.08) 0.0731 (1.0) 7;10
114.1244 (0.92) 113 1
test_tb_incremental0001 11.1100 (1.40) 19.7569 (2.13) 12.3123
(1.52) 2.3668 (14.32) 11.3464 (1.41) 0.4484 (6.13) 10;17
81.2195 (0.66) 87 1
test_tb_baseline01 11.8020 (1.49) 13.5598 (1.46) 12.0242
(1.49) 0.2678 (1.62) 11.9714 (1.49) 0.1765 (2.41) 3;3
83.1657 (0.67) 83 1
test_tb_incremental001 11.8569 (1.50) 13.2494 (1.43) 12.1130
(1.50) 0.2127 (1.29) 12.0793 (1.50) 0.2214 (3.03) 9;2
82.5557 (0.67) 81 1
test_tb_twice0001 15.8170 (2.00) 19.2875 (2.08) 16.2970
(2.02) 0.5428 (3.28) 16.1524 (2.01) 0.4168 (5.70) 8;6
61.3611 (0.50) 60 1
test_tb_incremental01 16.4057 (2.07) 22.5458 (2.43) 16.7604
(2.08) 0.8075 (4.89) 16.6192 (2.07) 0.1726 (2.36) 2;3
59.6645 (0.48) 56 1
test_tb_twice001 17.2626 (2.18) 18.8334 (2.03) 17.5009
(2.17) 0.2744 (1.66) 17.4471 (2.17) 0.1566 (2.14) 4;4
57.1398 (0.46) 57 1
test_tb_twice01 23.8332 (3.01) 30.8713 (3.33) 24.7840
(3.07) 1.2522 (7.58) 24.4253 (3.04) 0.7926 (10.84) 4;4
40.3487 (0.33) 42 1
test_tb_baseline1 26.2696 (3.32) 29.4324 (3.18) 26.7632
(3.31) 0.7780 (4.71) 26.4512 (3.29) 0.3034 (4.15) 5;7
37.3648 (0.30) 38 1
test_tb_incremental1 35.6927 (4.50) 37.0809 (4.00) 36.1989
(4.48) 0.2729 (1.65) 36.2146 (4.50) 0.2590 (3.54) 5;3
27.6252 (0.22) 28 1
test_tb_baseline2 48.3863 (6.11) 51.1180 (5.51) 49.2043
(6.09) 0.8523 (5.16) 48.8588 (6.08) 1.4696 (20.09) 5;0
20.3234 (0.16) 21 1
test_tb_twice1 54.8857 (6.93) 60.1800 (6.49) 56.8059
(7.04) 1.8394 (11.13) 55.9817 (6.96) 3.5191 (48.12) 7;0
17.6038 (0.14) 17 1
test_tb_incremental2 60.6456 (7.65) 63.0708 (6.80) 61.4671
(7.61) 0.6465 (3.91) 61.2567 (7.62) 0.6884 (9.41) 4;1
16.2689 (0.13) 17 1
test_tb_twice2 95.7630 (12.09) 98.4475 (10.62) 97.1678
(12.03) 0.7144 (4.32) 97.3437 (12.11) 0.8321 (11.38) 2;0
10.2915 (0.08) 11 1
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Legend:
Outliers: 1 Standard Deviation from Mean; 1.5 IQR (InterQuartile Range)
from 1st Quartile and 3rd Quartile.
OPS: Operations Per Second, computed as 1 / Mean
======================== 114 passed in 56.40s ========================
test: OK (61.68=setup[0.03]+cmd[0.02,0.01,0.12,0.12,0.21,4.14,0.00,57.02]
seconds)
congratulations :) (61.70 seconds)
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]