-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmetric.py
117 lines (104 loc) · 3.96 KB
/
metric.py
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
class Metric:
TYPE_COUNTER = "counter"
TYPE_GAUGE = "gauge"
def __init__(self, name, type_name, labels=()):
if type(labels) != tuple:
labels = (labels,)
self.name = name
self.type_name = type_name
self.help_text = None
self.labels = labels
self.measurements = {}
def set_type(self, type_name):
self.type_name = type_name
def set_help(self, help_text):
self.help_text = help_text
def headers(self):
headers = ""
if self.help_text is not None:
headers += "# HELP " + self.name + " " + self.help_text + "\n"
if self.type_name is not None:
headers += "# TYPE " + self.name + " " + self.type_name + "\n"
return headers
def set_value(self, value, labels=(), ts=None):
if type(value) != float:
value = float(value)
if type(labels) != tuple:
labels = (labels,)
if len(labels) != len(self.labels):
raise Exception("Label count mismatch. Should be %d, not %d",
(len(self.labels), len(labels)))
self.measurements[labels] = {
"value": value,
"ts" : ts
}
def value(self, labels=()):
if type(labels) != tuple:
labels = (labels,)
if len(labels) != len(self.labels):
raise Exception("Label count mismatch. Should be %d, not %d",
(len(self.labels), len(labels)))
if labels in self.measurements:
measurement = self.measurements[labels]
return measurement["value"]
return None
def timestamp(self, labels=()):
if type(labels) != tuple:
labels = (labels,)
if len(labels) != len(self.labels):
raise Exception("Label count mismatch. Should be %d, not %d",
(len(self.labels), len(labels)))
if labels in self.measurements:
measurement = self.measurements[labels]
if measurement["ts"] is not None:
return int(measurement["ts"])
return None
def value_row(self, labels=()):
if type(labels) != tuple:
labels = (labels,)
if len(labels) != len(self.labels):
raise Exception("Label count mismatch. Should be %d, not %d",
(len(self.labels), len(labels)))
row = self.name
measurement = self.measurements[labels]
if len(labels) > 0:
row += "{"
for i in range(0, len(labels)):
if i > 0:
row += ","
row += self.labels[i] + "=\"" + labels[i] + "\""
row += "}"
row += " %f" % measurement["value"]
if measurement["ts"] is not None:
row += " %d" % int(measurement["ts"])
row += "\n"
return row
def value_rows(self):
rows = ''
for labels in self.measurements:
rows += self.value_row(labels)
return rows
def lineprotocol_row(self, labels=()):
if type(labels) != tuple:
labels = (labels,)
if len(labels) != len(self.labels):
raise Exception("Label count mismatch. Should be %d, not %d",
(len(self.labels), len(labels)))
row = self.name
measurement = self.measurements[labels]
if len(labels) > 0:
row += ","
for i in range(0, len(labels)):
if i > 0:
row += ","
row += self.labels[i] + "=\"" + labels[i] + "\""
row += " _value=%f" % measurement["value"]
if measurement["ts"] is not None:
row += " %d000000" % int(measurement["ts"])
row += "\n"
return row
def lineprotocol_rows(self):
rows = ''
for labels in self.measurements:
rows += self.lineprotocol_row(labels)
return rows