10000 Factor out value/timestamp/label parsing · sxlstevengit/client_python@0f668b6 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0f668b6

Browse files
committed
Factor out value/timestamp/label parsing
Signed-off-by: Brian Brazil <brian.brazil@robustperception.io>
1 parent 9a39e5c commit 0f668b6

File tree

1 file changed

+56
-36
lines changed

1 file changed

+56
-36
lines changed

prometheus_client/openmetrics/parser.py

Lines changed: 56 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -47,25 +47,40 @@ def _unescape_help(text):
4747
return ''.join(result)
4848

4949

50-
def _parse_sample(text):
51-
name = []
50+
def _parse_value(value):
51+
value = ''.join(value)
52+
try:
53+
return int(value)
54+
except ValueError:
55+
return float(value)
56+
57+
58+
def _parse_timestamp(timestamp):
59+
timestamp = ''.join(timestamp)
60+
if not timestamp:
61+
return None
62+
try:
63+
# Simple int.
64+
return core.Timestamp(int(timestamp), 0)
65+
except ValueError:
66+
try:
67+
# aaaa.bbbb. Nanosecond resolution supported.
68+
parts = timestamp.split('.', 1)
69+
return core.Timestamp(int(parts[0]), int(parts[1][:9].ljust(9, "0")))
70+
except ValueError:
71+
# Float.
72+
return float(timestamp)
73+
74+
75+
def _parse_labels(it, text):
76+
# The { has already been parsed.
77+
state = 'startoflabelname'
5278
labelname = []
5379
labelvalue = []
54-
value = []
55-
timestamp = []
5680
labels = {}
5781

58-
state = 'name'
59-
60-
for char in text:
61-
if state == 'name':
62-
if char == '{':
63-
state = 'startoflabelname'
64-
elif char == ' ':
65-
state = 'value'
66-
else:
67-
name.append(char)
68-
elif state == 'startoflabelname':
82+
for char in it:
83+
if state == 'startoflabelname':
6984
if char == '}':
7085
state = 'endoflabels'
7186
else:
@@ -112,9 +127,32 @@ def _parse_sample(text):
112127
labelvalue.append('\\' + char)
113128
elif state == 'endoflabels':
114129
if char == ' ':
115-
state = 'value'
130+
break
116131
else:
117132
raise ValueError("Invalid line: " + text)
133+
return labels
134+
135+
136+
def _parse_sample(text):
137+
name = []
138+
value = []
139+
timestamp = []
140+
labels = {}
141+
142+
state = 'name'
143+
144+
it = iter(text)
145+
146+
for char in it:
147+
if state == 'name':
148+
if char == '{':
149+
labels = _parse_labels(it, text)
150+
# Space has already been parsed.
151+
state = 'value'
152+
elif char == ' ':
153+
state = 'value'
154+
else:
155+
name.append(char)
118156
elif state == 'value':
119157
if char == ' ':
120158
state = 'timestamp'
@@ -134,26 +172,8 @@ def _parse_sample(text):
134172
if not value:
135173
raise ValueError("Invalid line: " + text)
136174
value = ''.join(value)
137-
val = None
138-
try:
139-
val = int(value)
140-
except ValueError:
141-
val = float(value)
142-
143-
ts = None
144-
timestamp = ''.join(timestamp)
145-
if timestamp:
146-
try:
147-
# Simple int.
148-
ts = core.Timestamp(int(timestamp), 0)
149-
except ValueError:
150-
try:
151-
# aaaa.bbbb. Nanosecond resolution supported.
152-
parts = timestamp.split('.', 1)
153-
ts = core.Timestamp(int(parts[0]), int(parts[1][:9].ljust(9, "0")))
154-
except ValueError:
155-
# Float.
156-
ts = float(timestamp)
175+
val = _parse_value(value)
176+
ts = _parse_timestamp(timestamp)
157177

158178
return core.Sample(''.join(name), labels, val, ts)
159179

0 commit comments

Comments
 (0)
0