def test_bad_growth_factors(self): with self.assertRaises(AssertionError): distribution.GeometricBucketer(growth_factor=-1) with self.assertRaises(AssertionError): distribution.GeometricBucketer(growth_factor=0) with self.assertRaises(AssertionError): distribution.GeometricBucketer(growth_factor=1)
def test_small_scale(self): with self.assertRaises(ValueError): distribution.GeometricBucketer(growth_factor=-1) with self.assertRaises(ValueError): distribution.GeometricBucketer(growth_factor=0) with self.assertRaises(ValueError): distribution.GeometricBucketer(growth_factor=1)
def test_generate_geometric_distribution_with_scale(self): bucketer = distribution.GeometricBucketer(growth_factor=10.0, num_finite_buckets=10, scale=0.1) dists = [(metrics.NonCumulativeDistributionMetric('test0', 'test', None, bucketer=bucketer), metrics_pb2.GAUGE), (metrics.CumulativeDistributionMetric('test1', 'test', None, bucketer=bucketer), metrics_pb2.CUMULATIVE)] for dist, stream_kind in dists: data_set, data = self._test_distribution_proto(dist) self.assertListEqual([1, 0, 4, 1, 0, 0, 1, 0, 0, 0, 0, 0], list(data.distribution_value.bucket_count)) self.assertEqual( 10, data.distribution_value.exponential_buckets.num_finite_buckets) self.assertEqual( 10.0, data.distribution_value.exponential_buckets.growth_factor) self.assertEqual(0.1, data.distribution_value.exponential_buckets.scale) self.assertEqual(stream_kind, data_set.stream_kind) self.assertEqual(7, data.distribution_value.count)
def modify_fn(dist, delta): # This is the same as the modify_fn in _DistributionMetricBase's add(). if dist == 0: dist = distribution.Distribution( distribution.GeometricBucketer()) dist.add(delta) return dist
def __init__(self, name, description, field_spec, is_cumulative=True, bucketer=None, start_time=None, units=None, target_type=None): self._start_time = start_time if bucketer is None: bucketer = distribution.GeometricBucketer() self._is_cumulative = is_cumulative self.bucketer = bucketer super(_DistributionMetricBase, self).__init__( name, description, field_spec, units=units, target_type=target_type)
def test_scale(self): b = distribution.GeometricBucketer(growth_factor=4, num_finite_buckets=4, scale=.1) # bucket lower bounds will be approximately [float('-Inf'), .1, .4, 1.6, # 6.4, 25.6], but to avoid floating point errors affecting test assert on # bucket_for_value instead of using assertLowerBounds. self.assertEquals(0, b.bucket_for_value(float('-Inf'))) self.assertEquals(0, b.bucket_for_value(.05)) self.assertEquals(1, b.bucket_for_value(.2)) self.assertEquals(5, b.bucket_for_value(float('Inf')))
def __init__(self, name, is_cumulative=True, bucketer=None, fields=None, start_time=None, description=None): super(DistributionMetric, self).__init__( name, fields=fields, description=description) self._start_time = start_time if bucketer is None: bucketer = distribution.GeometricBucketer() self._is_cumulative = is_cumulative self.bucketer = bucketer
def test_bucket_for_value(self): b = distribution.GeometricBucketer(growth_factor=2, num_finite_buckets=5) self.assertEquals(0, b.bucket_for_value(float('-Inf'))) self.assertEquals(0, b.bucket_for_value(-100)) self.assertEquals(0, b.bucket_for_value(-1)) self.assertEquals(0, b.bucket_for_value(0)) self.assertEquals(1, b.bucket_for_value(1)) self.assertEquals(5, b.bucket_for_value(31)) self.assertEquals(6, b.bucket_for_value(32)) self.assertEquals(6, b.bucket_for_value(100000)) self.assertEquals(6, b.bucket_for_value(float('Inf')))
def test_populate_canonical(self): pb = metrics_pb2.MetricsData() m = metrics.DistributionMetric('test') m._populate_value( pb, distribution.Distribution(distribution.GeometricBucketer()), 1234) self.assertEquals( pb.distribution.spec_type, metrics_pb2.PrecomputedDistribution.CANONICAL_POWERS_OF_10_P_0_2) m._populate_value( pb, distribution.Distribution(distribution.GeometricBucketer(2)), 1234) self.assertEquals( pb.distribution.spec_type, metrics_pb2.PrecomputedDistribution.CANONICAL_POWERS_OF_2) m._populate_value( pb, distribution.Distribution(distribution.GeometricBucketer(10)), 1234) self.assertEquals( pb.distribution.spec_type, metrics_pb2.PrecomputedDistribution.CANONICAL_POWERS_OF_10)
def test_add(self): d = distribution.Distribution(distribution.GeometricBucketer()) self.assertEqual(0, d.sum) self.assertEqual(0, d.count) self.assertEqual({}, d.buckets) d.add(1) d.add(10) d.add(100) self.assertEqual(111, d.sum) self.assertEqual(3, d.count) self.assertEqual({1: 1, 5: 1, 10: 1}, d.buckets) d.add(50) self.assertEqual(161, d.sum) self.assertEqual(4, d.count) self.assertEqual({1: 1, 5: 1, 9: 1, 10: 1}, d.buckets)
def test_populate_custom(self): pb = metrics_pb2.MetricsData() m = metrics.DistributionMetric('test') m._populate_value( pb, distribution.Distribution(distribution.GeometricBucketer(4)), 1234) self.assertEquals( pb.distribution.spec_type, metrics_pb2.PrecomputedDistribution.CUSTOM_PARAMETERIZED) self.assertEquals(0, pb.distribution.width) self.assertEquals(4, pb.distribution.growth_factor) self.assertEquals(100, pb.distribution.num_buckets) m._populate_value( pb, distribution.Distribution(distribution.FixedWidthBucketer(10)), 1234) self.assertEquals( pb.distribution.spec_type, metrics_pb2.PrecomputedDistribution.CUSTOM_PARAMETERIZED) self.assertEquals(10, pb.distribution.width) self.assertEquals(0, pb.distribution.growth_factor) self.assertEquals(100, pb.distribution.num_buckets)
# Copyright 2015 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. from infra_libs.ts_mon.common import distribution from infra_libs.ts_mon.common import metrics # Extending HTTP status codes to client-side errors and timeouts. STATUS_OK = 200 STATUS_ERROR = 901 STATUS_TIMEOUT = 902 STATUS_EXCEPTION = 909 # 90% of durations are in the range 11-1873ms. Growth factor 10^0.06 puts that # range into 37 buckets. Max finite bucket value is 12 minutes. _duration_bucketer = distribution.GeometricBucketer(10**0.06) # 90% of sizes are in the range 0.17-217014 bytes. Growth factor 10^0.1 puts # that range into 54 buckets. Max finite bucket value is 6.3GB. _size_bucketer = distribution.GeometricBucketer(10**0.1) request_bytes = metrics.CumulativeDistributionMetric( 'http/request_bytes', 'Bytes sent per http request (body only).', [ metrics.StringField('name'), metrics.StringField('client'), ], bucketer=_size_bucketer) response_bytes = metrics.CumulativeDistributionMetric( 'http/response_bytes', 'Bytes received per http request (content only).', [
def test_large_size(self): b = distribution.GeometricBucketer(growth_factor=4, num_finite_buckets=4) self.assertLowerBounds(b, [float('-Inf'), 1, 4, 16, 64, 256])
def test_zero_size(self): b = distribution.GeometricBucketer(num_finite_buckets=0) self.assertLowerBounds(b, [float('-Inf'), 1])
def test_zero_size(self): b = distribution.GeometricBucketer(num_finite_buckets=0) self.assertBucketCounts(b, 2) self.assertBoundaries(b, [])
def test_negative_size(self): with self.assertRaises(ValueError): distribution.GeometricBucketer(num_finite_buckets=-1)
def test_equality(self): b = distribution.GeometricBucketer(growth_factor=4, num_finite_buckets=4, scale=.1) self.assertEquals(b, b)
def test_large_size(self): b = distribution.GeometricBucketer(growth_factor=4, num_finite_buckets=4) self.assertBucketCounts(b, 6) self.assertBoundaries(b, [1, 4, 16, 64])