You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by yc...@apache.org on 2021/07/16 17:24:38 UTC
[cassandra-dtest] branch trunk updated: Update timer metrics
assertion for Cassandra-16760 (#149)
This is an automated email from the ASF dual-hosted git repository.
ycai pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra-dtest.git
The following commit(s) were added to refs/heads/trunk by this push:
new 7bf5be8 Update timer metrics assertion for Cassandra-16760 (#149)
7bf5be8 is described below
commit 7bf5be87e1d37e9f9302f15b1b79a48b0082b521
Author: Yifan Cai <52...@users.noreply.github.com>
AuthorDate: Fri Jul 16 10:24:30 2021 -0700
Update timer metrics assertion for Cassandra-16760 (#149)
---
client_request_metrics_test.py | 100 ++++++++++++++++++++++-------------------
1 file changed, 54 insertions(+), 46 deletions(-)
diff --git a/client_request_metrics_test.py b/client_request_metrics_test.py
index 6c5ef4d..c241742 100644
--- a/client_request_metrics_test.py
+++ b/client_request_metrics_test.py
@@ -140,19 +140,20 @@ class TestClientRequestMetrics(Tester):
global_baseline = metric_class(global_scope)
cl_baseline = metric_class(cl_scope)
other_baselines = [metric_class(scope_for_cl(global_scope, c)) for c in other_cls]
+ cassandra_version = self.dtest_config.cassandra_version_from_build
- global_baseline.validate()
- cl_baseline.validate()
+ global_baseline.validate(cassandra_version)
+ cl_baseline.validate(cassandra_version)
for b in other_baselines:
- b.validate()
+ b.validate(cassandra_version)
for _ in range(query_count):
self.session.execute(statement)
global_updated = metric_class(global_scope)
cl_updated = metric_class(cl_scope)
- global_updated.validate()
- cl_updated.validate()
+ global_updated.validate(cassandra_version)
+ cl_updated.validate(cassandra_version)
global_diff = global_updated.diff(global_baseline)
cl_diff = cl_updated.diff(cl_baseline)
@@ -322,7 +323,8 @@ class TestClientRequestMetrics(Tester):
def run_collect_view_write_metrics(self, statement, query_count):
scope = 'ViewWrite'
baseline = ViewWriteMetrics(scope)
- baseline.validate()
+ cassandra_version = self.dtest_config.cassandra_version_from_build
+ baseline.validate(cassandra_version)
for _ in range(query_count):
self.session.execute(statement)
@@ -336,7 +338,7 @@ class TestClientRequestMetrics(Tester):
sample = ViewWriteMetrics(scope)
diff = sample.diff(last)
- sample.validate()
+ sample.validate(cassandra_version)
return sample.diff(baseline)
@@ -355,17 +357,18 @@ class TestClientRequestMetrics(Tester):
def cas_contention(self, metric_factory, statement):
query_count = 20
+ cassandra_version = self.dtest_config.cassandra_version_from_build
def sample():
baseline = metric_factory()
- baseline.validate()
+ baseline.validate(cassandra_version)
execute_concurrent_with_args(self.session,
statement,
repeat([], query_count), raise_on_first_error=False)
updated = metric_factory()
- updated.validate()
+ updated.validate(cassandra_version)
return updated.diff(baseline)
@@ -477,7 +480,7 @@ class TestClientRequestMetrics(Tester):
cl_scope = scope_for_cl(global_scope, query_cl)
cl_baseline = metric_class(cl_scope)
- cl_baseline.validate()
+ cl_baseline.validate(self.dtest_config.cassandra_version_from_build)
core_diff = self.validate_metric(global_scope, metric_class, statement, query_count, secondary_meter, expected_exception)
@@ -525,7 +528,7 @@ class AbstractPropertyValues(ABC):
pass
@abstractmethod
- def validate(self):
+ def validate(self, cassandra_version):
pass
def load(self, attr):
@@ -547,7 +550,7 @@ class Counter(AbstractPropertyValues):
def init(self):
self.load("Count")
- def validate(self):
+ def validate(self, cassandra_version):
v = self.values['Count']
assert isinstance(v, int), self.mbean
assert v >= 0, self.mbean
@@ -563,7 +566,7 @@ class Meter(AbstractPropertyValues):
"RateUnit"]:
self.load(a)
- def validate(self):
+ def validate(self, cassandra_version):
assert self.values['RateUnit'] == 'events/second'
for k, v in self.values.items():
if k == 'RateUnit':
@@ -585,17 +588,22 @@ stat_words = [
'RecentValues']
-def validate_stat_values(prefix, values):
+def validate_stat_values(prefix, values, cassandra_version):
sample_count = values['Count']
if sample_count:
- validate_sane_latency(prefix, values)
+ validate_sane_histogram_values(prefix, values, cassandra_version)
else:
- validate_zero_latency(prefix, values)
+ validate_zero_histogram_values(prefix, values)
-def validate_sane_latency(prefix, values):
+def validate_sane_histogram_values(prefix, values, cassandra_version):
validators = defaultdict(lambda: is_positive)
- validators['RecentValues'] = is_histo_list
+ if 'DurationUnit' in values and cassandra_version >= '4.1':
+ # Timer values (since 4.1) are in micros resolution. The default number of buckets should be 91.
+ # See CASSANDRA-16760
+ validators['RecentValues'] = partial(is_histo_list, expected_len=91)
+ else:
+ validators['RecentValues'] = partial(is_histo_list, expected_len=165)
validators['StdDev'] = is_non_negative
validators['Min'] = is_non_negative
@@ -612,7 +620,7 @@ def validate_sane_latency(prefix, values):
last_pct = this_pct
-def validate_zero_latency(prefix, values):
+def validate_zero_histogram_values(prefix, values):
validators = defaultdict(lambda: is_zero)
validators['RecentValues'] = is_zero_list
validators['Mean'] = is_none
@@ -627,8 +635,8 @@ class Histogram(AbstractPropertyValues):
self.load(a)
self.load('Count')
- def validate(self):
- validate_stat_values(self.mbean, self.values)
+ def validate(self, cassandra_version):
+ validate_stat_values(self.mbean, self.values, cassandra_version)
is_non_negative(self.mbean, self.values['Count'])
@@ -640,8 +648,8 @@ class LatencyMetricsTimer(Counter):
self.load(a)
self.load('DurationUnit')
- def validate(self):
- validate_stat_values(self.mbean, self.values)
+ def validate(self, cassandra_version):
+ validate_stat_values(self.mbean, self.values, cassandra_version)
is_microseconds(self.mbean, self.values['DurationUnit'])
@@ -657,9 +665,9 @@ class LatencyMetrics(object):
d.update(other.values[k].diff(v))
return d
- def validate(self):
+ def validate(self, cassandra_version):
for v in self.values.values():
- v.validate()
+ v.validate(cassandra_version)
class ClientRequestMetrics(LatencyMetrics):
@@ -684,11 +692,11 @@ class ViewWriteMetrics(ClientRequestMetrics):
self.values['ViewReplicasSuccess'] = Counter(scope, 'ViewReplicasSuccess')
self.values['ViewWriteLatency'] = LatencyMetricsTimer(scope, 'ViewWriteLatency')
- def validate(self):
- super(ViewWriteMetrics, self).validate()
- self.values['ViewReplicasAttempted'].validate()
- self.values['ViewReplicasSuccess'].validate()
- self.values['ViewWriteLatency'].validate()
+ def validate(self, cassandra_version):
+ super(ViewWriteMetrics, self).validate(cassandra_version)
+ self.values['ViewReplicasAttempted'].validate(cassandra_version)
+ self.values['ViewReplicasSuccess'].validate(cassandra_version)
+ self.values['ViewWriteLatency'].validate(cassandra_version)
class CASClientRequestMetrics(ClientRequestMetrics):
@@ -698,11 +706,11 @@ class CASClientRequestMetrics(ClientRequestMetrics):
self.values['UnfinishedCommit'] = Counter(scope, 'UnfinishedCommit')
self.values['UnknownResult'] = Meter(scope, 'UnknownResult')
- def validate(self):
- super(CASClientRequestMetrics, self).validate()
- self.values['ContentionHistogram'].validate()
- self.values['UnfinishedCommit'].validate()
- self.values['UnknownResult'].validate()
+ def validate(self, cassandra_version):
+ super(CASClientRequestMetrics, self).validate(cassandra_version)
+ self.values['ContentionHistogram'].validate(cassandra_version)
+ self.values['UnfinishedCommit'].validate(cassandra_version)
+ self.values['UnknownResult'].validate(cassandra_version)
class CASClientWriteRequestMetrics(CASClientRequestMetrics):
@@ -711,10 +719,10 @@ class CASClientWriteRequestMetrics(CASClientRequestMetrics):
self.values['MutationSizeHistogram'] = Histogram(scope, 'MutationSizeHistogram')
self.values['ConditionNotMet'] = Counter(scope, 'ConditionNotMet')
- def validate(self):
- super(CASClientWriteRequestMetrics, self).validate()
- self.values['MutationSizeHistogram'].validate()
- self.values['ConditionNotMet'].validate()
+ def validate(self, cassandra_version):
+ super(CASClientWriteRequestMetrics, self).validate(cassandra_version)
+ self.values['MutationSizeHistogram'].validate(cassandra_version)
+ self.values['ConditionNotMet'].validate(cassandra_version)
def diff_num(v1, v2):
@@ -763,19 +771,19 @@ def is_microseconds(k, v):
assert v == 'microseconds', k
-def is_zero_list(k, l):
- assert not any(l), k
+def is_zero_list(k, values):
+ assert not any(values), k
-def is_nonzero_list(k, l):
- assert any(l), k
+def is_nonzero_list(k, values):
+ assert any(values), k
-def is_histo_list(k, l):
+def is_histo_list(k, values, expected_len):
# since these values change on sampling, we can only generally verify it takes the proper form
# There are in-tree unit tests around ClearableHistogram and DecayingEstimatedHistogramReservoir
- assert len(l) == 165, k
- assert all(isinstance(i, int) for i in l), k
+ assert len(values) == expected_len, k
+ assert all(isinstance(i, int) for i in values), k
last_key = 0
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org