diff --git a/kafka/metrics/compound_stat.py b/kafka/metrics/compound_stat.py index f8b149c54..f5b482da2 100644 --- a/kafka/metrics/compound_stat.py +++ b/kafka/metrics/compound_stat.py @@ -21,6 +21,8 @@ def stats(self): class NamedMeasurable(object): + __slots__ = ('_name', '_stat') + def __init__(self, metric_name, measurable_stat): self._name = metric_name self._stat = measurable_stat diff --git a/kafka/metrics/kafka_metric.py b/kafka/metrics/kafka_metric.py index 9fb8d89f1..fef684850 100644 --- a/kafka/metrics/kafka_metric.py +++ b/kafka/metrics/kafka_metric.py @@ -4,6 +4,8 @@ class KafkaMetric(object): + __slots__ = ('_metric_name', '_measurable', '_config') + # NOTE java constructor takes a lock instance def __init__(self, metric_name, measurable, config): if not metric_name: @@ -33,4 +35,4 @@ def config(self, config): def value(self, time_ms=None): if time_ms is None: time_ms = time.time() * 1000 - return self.measurable.measure(self.config, time_ms) + return self._measurable.measure(self._config, time_ms) diff --git a/kafka/metrics/metric_config.py b/kafka/metrics/metric_config.py index 2e55abfcb..7e5ead1fe 100644 --- a/kafka/metrics/metric_config.py +++ b/kafka/metrics/metric_config.py @@ -5,6 +5,8 @@ class MetricConfig(object): """Configuration values for metrics""" + __slots__ = ('quota', '_samples', 'event_window', 'time_window_ms', 'tags') + def __init__(self, quota=None, samples=2, event_window=sys.maxsize, time_window_ms=30 * 1000, tags=None): """ diff --git a/kafka/metrics/metric_name.py b/kafka/metrics/metric_name.py index 32a7e3a4b..b8ab2a3ad 100644 --- a/kafka/metrics/metric_name.py +++ b/kafka/metrics/metric_name.py @@ -38,6 +38,7 @@ class MetricName(object): # as messages are sent we record the sizes sensor.record(message_size) """ + __slots__ = ('_name', '_group', '_description', '_tags', '_hash') def __init__(self, name, group, description=None, tags=None): """ diff --git a/kafka/metrics/quota.py b/kafka/metrics/quota.py index 237edf841..36a30c44e 100644 --- a/kafka/metrics/quota.py +++ b/kafka/metrics/quota.py @@ -3,6 +3,8 @@ class Quota(object): """An upper or lower bound for metrics""" + __slots__ = ('_bound', '_upper') + def __init__(self, bound, is_upper): self._bound = bound self._upper = is_upper diff --git a/kafka/metrics/stats/avg.py b/kafka/metrics/stats/avg.py index cfbaec309..906d95573 100644 --- a/kafka/metrics/stats/avg.py +++ b/kafka/metrics/stats/avg.py @@ -7,6 +7,8 @@ class Avg(AbstractSampledStat): """ An AbstractSampledStat that maintains a simple average over its samples. """ + __slots__ = ('_initial_value', '_samples', '_current') + def __init__(self): super(Avg, self).__init__(0.0) diff --git a/kafka/metrics/stats/count.py b/kafka/metrics/stats/count.py index 6e0a2d545..6cd6d2abe 100644 --- a/kafka/metrics/stats/count.py +++ b/kafka/metrics/stats/count.py @@ -7,6 +7,8 @@ class Count(AbstractSampledStat): """ An AbstractSampledStat that maintains a simple count of what it has seen. """ + __slots__ = ('_initial_value', '_samples', '_current') + def __init__(self): super(Count, self).__init__(0.0) diff --git a/kafka/metrics/stats/histogram.py b/kafka/metrics/stats/histogram.py index ecc6c9db4..2c8afbfb3 100644 --- a/kafka/metrics/stats/histogram.py +++ b/kafka/metrics/stats/histogram.py @@ -4,6 +4,8 @@ class Histogram(object): + __slots__ = ('_hist', '_count', '_bin_scheme') + def __init__(self, bin_scheme): self._hist = [0.0] * bin_scheme.bins self._count = 0.0 @@ -40,6 +42,8 @@ def __str__(self): return '{%s}' % ','.join(values) class ConstantBinScheme(object): + __slots__ = ('_min', '_max', '_bins', '_bucket_width') + def __init__(self, bins, min_val, max_val): if bins < 2: raise ValueError('Must have at least 2 bins.') @@ -69,6 +73,8 @@ def to_bin(self, x): return int(((x - self._min) / self._bucket_width) + 1) class LinearBinScheme(object): + __slots__ = ('_bins', '_max', '_scale') + def __init__(self, num_bins, max_val): self._bins = num_bins self._max = max_val diff --git a/kafka/metrics/stats/max_stat.py b/kafka/metrics/stats/max_stat.py index 08aebddfd..9c5eeb6fd 100644 --- a/kafka/metrics/stats/max_stat.py +++ b/kafka/metrics/stats/max_stat.py @@ -5,6 +5,8 @@ class Max(AbstractSampledStat): """An AbstractSampledStat that gives the max over its samples.""" + __slots__ = ('_initial_value', '_samples', '_current') + def __init__(self): super(Max, self).__init__(float('-inf')) diff --git a/kafka/metrics/stats/min_stat.py b/kafka/metrics/stats/min_stat.py index 072106d8a..6bebe57e0 100644 --- a/kafka/metrics/stats/min_stat.py +++ b/kafka/metrics/stats/min_stat.py @@ -7,6 +7,8 @@ class Min(AbstractSampledStat): """An AbstractSampledStat that gives the min over its samples.""" + __slots__ = ('_initial_value', '_samples', '_current') + def __init__(self): super(Min, self).__init__(float(sys.maxsize)) diff --git a/kafka/metrics/stats/percentile.py b/kafka/metrics/stats/percentile.py index 3a86a84a9..75e64ce5e 100644 --- a/kafka/metrics/stats/percentile.py +++ b/kafka/metrics/stats/percentile.py @@ -2,6 +2,8 @@ class Percentile(object): + __slots__ = ('_metric_name', '_percentile') + def __init__(self, metric_name, percentile): self._metric_name = metric_name self._percentile = float(percentile) diff --git a/kafka/metrics/stats/percentiles.py b/kafka/metrics/stats/percentiles.py index 6d702e80f..c36543ffa 100644 --- a/kafka/metrics/stats/percentiles.py +++ b/kafka/metrics/stats/percentiles.py @@ -13,6 +13,9 @@ class BucketSizing(object): class Percentiles(AbstractSampledStat, AbstractCompoundStat): """A compound stat that reports one or more percentiles""" + __slots__ = ('_initial_value', '_samples', '_current', + '_percentiles', '_buckets', '_bin_scheme') + def __init__(self, size_in_bytes, bucketing, max_val, min_val=0.0, percentiles=None): super(Percentiles, self).__init__(0.0) diff --git a/kafka/metrics/stats/rate.py b/kafka/metrics/stats/rate.py index 68393fbf7..4d0ba0f27 100644 --- a/kafka/metrics/stats/rate.py +++ b/kafka/metrics/stats/rate.py @@ -37,6 +37,8 @@ class Rate(AbstractMeasurableStat): occurrences (e.g. the count of values measured over the time interval) or other such values. """ + __slots__ = ('_stat', '_unit') + def __init__(self, time_unit=TimeUnit.SECONDS, sampled_stat=None): self._stat = sampled_stat or SampledTotal() self._unit = time_unit @@ -105,6 +107,7 @@ def convert(self, time_ms): class SampledTotal(AbstractSampledStat): + __slots__ = ('_initial_value', '_samples', '_current') def __init__(self, initial_value=None): if initial_value is not None: raise ValueError('initial_value cannot be set on SampledTotal') diff --git a/kafka/metrics/stats/sampled_stat.py b/kafka/metrics/stats/sampled_stat.py index 146687916..fe8970dbf 100644 --- a/kafka/metrics/stats/sampled_stat.py +++ b/kafka/metrics/stats/sampled_stat.py @@ -22,6 +22,8 @@ class AbstractSampledStat(AbstractMeasurableStat): Subclasses of this class define different statistics measured using this basic pattern. """ + __slots__ = ('_initial_value', '_samples', '_current') + def __init__(self, initial_value): self._initial_value = initial_value self._samples = [] diff --git a/kafka/metrics/stats/sensor.py b/kafka/metrics/stats/sensor.py index 571723f97..9f7ac45f5 100644 --- a/kafka/metrics/stats/sensor.py +++ b/kafka/metrics/stats/sensor.py @@ -15,6 +15,10 @@ class Sensor(object): the `record(double)` api and would maintain a set of metrics about request sizes such as the average or max. """ + __slots__ = ('_lock', '_registry', '_name', '_parents', '_metrics', + '_stats', '_config', '_inactive_sensor_expiration_time_ms', + '_last_record_time') + def __init__(self, registry, name, parents, config, inactive_sensor_expiration_time_seconds): if not name: diff --git a/kafka/metrics/stats/total.py b/kafka/metrics/stats/total.py index 5b3bb87fd..a78e99733 100644 --- a/kafka/metrics/stats/total.py +++ b/kafka/metrics/stats/total.py @@ -5,6 +5,8 @@ class Total(AbstractMeasurableStat): """An un-windowed cumulative total maintained over all time.""" + __slots__ = ('_total') + def __init__(self, value=0.0): self._total = value