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