forked from DataDog/datadogpy
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmax_sample_metric.py
More file actions
69 lines (57 loc) · 2.64 KB
/
Copy pathmax_sample_metric.py
File metadata and controls
69 lines (57 loc) · 2.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import random
from datadog.dogstatsd.metric_types import MetricType
from datadog.dogstatsd.metrics import MetricAggregator
from threading import Lock
class MaxSampleMetric(object):
def __init__(self, name, tags, metric_type, specified_rate=1.0, max_metric_samples=0, cardinality=None):
self.name = name
self.tags = tags
self.lock = Lock()
self.metric_type = metric_type
self.max_metric_samples = max_metric_samples
self.cardinality = cardinality
self.specified_rate = specified_rate
self.data = [None] * max_metric_samples if max_metric_samples > 0 else []
self.stored_metric_samples = 0
self.total_metric_samples = 0
def sample(self, value):
if self.max_metric_samples == 0:
self.data.append(value)
else:
self.data[self.stored_metric_samples] = value
self.stored_metric_samples += 1
self.total_metric_samples += 1
def maybe_keep_sample_work_unsafe(self, value):
if self.max_metric_samples > 0:
self.total_metric_samples += 1
if self.stored_metric_samples < self.max_metric_samples:
self.data[self.stored_metric_samples] = value
self.stored_metric_samples += 1
else:
i = random.randint(0, self.total_metric_samples - 1)
if i < self.max_metric_samples:
self.data[i] = value
else:
self.sample(value)
def skip_sample(self):
self.total_metric_samples += 1
def flush(self):
rate = self.stored_metric_samples / self.total_metric_samples
with self.lock:
return [
MetricAggregator(
self.name, self.tags, rate, self.metric_type, self.data[i], cardinality=self.cardinality
)
for i in range(self.stored_metric_samples)
]
class HistogramMetric(MaxSampleMetric):
def __init__(self, name, tags, rate=1.0, max_metric_samples=0, cardinality=None):
super(HistogramMetric, self).__init__(name, tags, MetricType.HISTOGRAM, rate, max_metric_samples, cardinality)
class DistributionMetric(MaxSampleMetric):
def __init__(self, name, tags, rate=1.0, max_metric_samples=0, cardinality=None):
super(DistributionMetric, self).__init__(
name, tags, MetricType.DISTRIBUTION, rate, max_metric_samples, cardinality
)
class TimingMetric(MaxSampleMetric):
def __init__(self, name, tags, rate=1.0, max_metric_samples=0, cardinality=None):
super(TimingMetric, self).__init__(name, tags, MetricType.TIMING, rate, max_metric_samples, cardinality)