Files
scylladb/test/nodetool/test_tablehistograms.py
Botond Dénes a77796f484 test/nodetool: make test pass with cassandra nodetool
After the recent fixes 4 tests started failing with the java nodetool
implementation. We are about to ditch the java implementation, but until
we actually do, it is valuable to keep the tests passing with both the
native and java implementation.
So in this patch, these tests are fixed to pass with the java
implementation too.
There is one test, test_help.py, which fails only if run together with
all the tests. I couldn't confirm this 100%, but it seems like this is
due to JMX sending a rouge request on some timer, which happens to hit
this test. I don't think this is worth trying to fix.
2024-05-13 07:09:20 -04:00

111 lines
8.1 KiB
Python

#
# Copyright 2024-present ScyllaDB
#
# SPDX-License-Identifier: AGPL-3.0-or-later
#
from rest_api_mock import expected_request
from typing import NamedTuple
import pytest
class table_name_param(NamedTuple):
args: list[str]
keyspace_name: str
table_name: str
row_size_histogram = {"bucket_offsets": [1, 2, 3, 4, 5, 6, 7], "buckets": [4, 4, 4, 4, 1, 1, 2, 0]}
column_count_histogram = {"bucket_offsets": [1, 2, 3, 4, 5, 6, 7], "buckets": [2, 4, 4, 2, 0, 0, 0, 0]}
sstables_per_read_histogram = {"bucket_offsets": [1, 2, 3, 4, 5, 6, 7], "buckets": [4, 4, 2, 2, 1, 1, 2, 0]}
read_latency_histogram = {"meter": {"rates": [1723.9181185133377, 368.14352124736297, 124.08049846282876], "mean_rate": 117.64529914529915, "count": 165174}, "hist": {"count": 165174, "sum": 5339437, "min": 5, "max": 242, "variance": 13736889.182246631, "mean": 32.32613486384056, "sample": [14, 26, 18, 12, 31, 32, 35, 20, 32, 26, 20, 12, 29, 10, 13, 38, 16, 13, 33, 26, 11, 33, 20, 32, 55, 17, 21, 22, 17, 40, 31, 22, 12, 38, 17, 11, 87, 45, 38, 21, 21, 14, 69, 61, 15, 33, 20, 38, 20, 21, 15, 38, 56, 37, 20, 18, 15, 39, 27, 12, 17, 28, 18, 36, 14, 44, 19, 15, 23, 32, 31, 15, 29, 21, 14, 32, 11, 32, 30, 34, 21, 28, 13, 14, 32, 11, 27, 21, 33, 13, 32, 27, 13, 13, 28, 33, 16, 39, 16, 14, 38, 24, 59, 15, 13, 39, 22, 31, 15, 28, 26, 33, 32, 11, 12, 19, 30, 12, 41, 41, 22, 29, 19, 56, 12, 29, 20, 12, 39, 12, 26, 10, 35, 16, 22, 36, 33, 65, 17, 32, 34, 23, 31, 32, 49, 15, 33, 21, 32, 32, 31, 55, 27, 38, 39, 39, 38, 16, 56, 39, 39, 39, 35, 16, 31, 55, 40, 15, 39, 40, 23, 39, 57, 23, 40, 14, 39, 38, 39, 57, 14, 43, 23, 42, 33, 32, 48, 20, 33, 31, 11, 32, 32, 50, 34, 32, 17, 10, 33, 32, 58, 20, 11, 40, 39, 39, 40, 56, 41, 40, 41, 40, 52, 17, 55, 51, 39, 33, 32, 15, 32, 60, 40, 18, 40, 41, 40, 40, 54, 39, 41, 39, 15, 50, 39, 55, 44, 37, 33, 13, 32, 32, 49, 33, 32, 32, 12, 32, 95, 48, 32, 32, 32, 11, 32, 31]}}
write_latency_histogram = {"meter": {"rates": [18.318261456969374, 4806.675944036122, 12175.520380360176], "mean_rate": 2092.050209205021, "count": 1000000}, "hist": {"count": 1000000, "sum": 5757334, "min": 1, "max": 86, "variance": 6698277.036767641, "mean": 5.757334, "sample": [4, 4, 4, 4, 3, 11, 4, 4, 4, 4, 4, 11, 4, 4, 4, 4, 4, 11, 4, 4, 4, 4, 4, 11, 4, 5, 4, 4, 4, 10, 4, 4, 4, 4, 4, 11, 4, 4, 4, 4, 4, 10, 4, 4, 4, 4, 3, 11, 4, 3, 4, 4, 4, 10, 4, 4, 4, 4, 4, 11, 4, 4, 4, 3, 4, 10, 4, 4, 4, 4, 4, 10, 4, 4, 4, 4, 3, 11, 4, 4, 4, 4, 4, 11, 4, 4, 4, 4, 4, 11, 4, 4, 4, 4, 4, 11, 4, 4, 4, 4, 4, 11, 4, 4, 4, 4, 4, 11, 4, 4, 4, 4, 17, 11, 5, 4, 4, 4, 4, 11, 4, 3, 4, 4, 4, 11, 4, 4, 4, 4, 4, 10, 5, 4, 4, 4, 4, 10, 4, 3, 4, 4, 4, 10, 4, 4, 4, 3, 10, 4, 4, 3, 4, 10, 4, 4, 4, 4, 10, 4, 4, 4, 4, 11, 4, 4, 4, 4, 11, 4, 4, 4, 4, 11, 4, 4, 4, 4, 11, 4, 4, 4, 11, 4, 4, 4, 10, 4, 4, 4, 10, 4, 4, 4, 10, 5, 4, 4, 10, 4, 4, 4, 10, 4, 5, 4, 10, 4, 4, 4, 11, 4, 4, 4, 11, 4, 4, 4, 11, 4, 4, 4, 10, 5, 4, 11, 5, 4, 11, 4, 4, 11, 4, 4, 11, 4, 4, 11, 4, 10, 4, 10, 4, 10, 4, 10, 4, 11, 4, 10, 5, 10, 4, 11, 11, 11]}}
@pytest.mark.parametrize("param", (
table_name_param(["tablehistograms", "ks", "tbl"], "ks", "tbl"),
table_name_param(["tablehistograms", "ks.tbl"], "ks", "tbl"),
table_name_param(["tablehistograms", "ks.1", "tbl"], "ks.1", "tbl"),
table_name_param(["tablehistograms", "ks/tbl"], "ks", "tbl"),
table_name_param(["tablehistograms", "ks.1/tbl"], "ks.1", "tbl"),
))
def test_tablehistograms(nodetool, param):
table_param = f"{param.keyspace_name}:{param.table_name}"
expected_requests = [
expected_request("GET", "/column_family/",
response=[{"ks": param.keyspace_name, "cf": param.table_name, "type": "ColumnFamilies"}],
multiple=expected_request.ANY),
expected_request("GET", f"/column_family/metrics/estimated_row_size_histogram/{table_param}",
response=row_size_histogram),
expected_request("GET", f"/column_family/metrics/estimated_column_count_histogram/{table_param}",
response=column_count_histogram),
expected_request("GET", f"/column_family/metrics/read_latency/moving_average_histogram/{table_param}",
response=read_latency_histogram),
expected_request("GET", f"/column_family/metrics/write_latency/moving_average_histogram/{table_param}",
response=write_latency_histogram),
expected_request("GET", f"/column_family/metrics/sstables_per_read_histogram/{table_param}",
response=sstables_per_read_histogram),
]
res = nodetool(*param.args, expected_requests=expected_requests)
assert res.stdout == f"""{param.keyspace_name}/{param.table_name} histograms
Percentile SSTables Write Latency Read Latency Partition Size Cell Count
(micros) (micros) (bytes)
50% 2.00 4.00 32.00 3 2
75% 4.00 5.00 39.00 4 3
95% 7.00 11.00 56.00 7 4
98% 7.00 11.00 60.86 7 4
99% 7.00 11.00 76.74 7 4
Min 0.00 3.00 10.00 0 0
Max 7.00 17.00 95.00 7 4
"""
# The java implementation explodes with null pointer exception.
# It is not worth trying to fix, so just disable this test for the java nodetool.
def test_tablehistograms_empty_histogram(scylla_only, nodetool):
keyspace_name = "ks"
table_name = "tbl"
table_param = f"{keyspace_name}:{table_name}"
empty_estimated_histogram = {"buckets": [0]}
empty_histogram = {"meter": {"rates": [0,0,0], "mean_rate": 0, "count": 0}, "hist": {"count": 0, "sum": 0, "min": 0, "max": 0, "variance": 0, "mean": 0}}
expected_requests = [
expected_request("GET", "/column_family/",
response=[{"ks": keyspace_name, "cf": table_name, "type": "ColumnFamilies"}],
multiple=expected_request.ANY),
expected_request("GET", f"/column_family/metrics/estimated_row_size_histogram/{table_param}",
response=empty_estimated_histogram),
expected_request("GET", f"/column_family/metrics/estimated_column_count_histogram/{table_param}",
response=empty_estimated_histogram),
expected_request("GET", f"/column_family/metrics/read_latency/moving_average_histogram/{table_param}",
response=empty_histogram),
expected_request("GET", f"/column_family/metrics/write_latency/moving_average_histogram/{table_param}",
response=empty_histogram),
expected_request("GET", f"/column_family/metrics/sstables_per_read_histogram/{table_param}",
response=empty_estimated_histogram),
]
res = nodetool("tablehistograms", keyspace_name, table_name, expected_requests=expected_requests)
assert res.stdout == f"""{keyspace_name}/{table_name} histograms
Percentile SSTables Write Latency Read Latency Partition Size Cell Count
(micros) (micros) (bytes)
50% 0.00 0.00 0.00 0 0
75% 0.00 0.00 0.00 0 0
95% 0.00 0.00 0.00 0 0
98% 0.00 0.00 0.00 0 0
99% 0.00 0.00 0.00 0 0
Min 0.00 0.00 0.00 0 0
Max 0.00 0.00 0.00 0 0
"""