Fix _exposition.py to stop stripping samples

Our hacked-up `_exposition.py` was stripping out some samples it shouldn't
have been. Put them back in, to more closely match the upstream
`exposition.py`.
This commit is contained in:
Richard van der Hoff 2020-09-30 16:44:10 +01:00
parent ceafb5a1c6
commit 1c8ca2c543
1 changed files with 29 additions and 11 deletions

View File

@ -26,6 +26,7 @@ import math
import threading import threading
from http.server import BaseHTTPRequestHandler, HTTPServer from http.server import BaseHTTPRequestHandler, HTTPServer
from socketserver import ThreadingMixIn from socketserver import ThreadingMixIn
from typing import Dict, List
from urllib.parse import parse_qs, urlparse from urllib.parse import parse_qs, urlparse
from prometheus_client import REGISTRY from prometheus_client import REGISTRY
@ -124,16 +125,33 @@ def generate_latest(registry, emit_help=False):
) )
) )
output.append("# TYPE {0} {1}\n".format(mname, mtype)) output.append("# TYPE {0} {1}\n".format(mname, mtype))
for sample in metric.samples:
# Get rid of the OpenMetrics specific samples om_samples = {} # type: Dict[str, List[str]]
for s in metric.samples:
for suffix in ["_created", "_gsum", "_gcount"]: for suffix in ["_created", "_gsum", "_gcount"]:
if sample.name.endswith(suffix): if s.name == metric.name + suffix:
# OpenMetrics specific sample, put in a gauge at the end.
# (these come from gaugehistograms which don't get renamed,
# so no need to faff with mnewname)
om_samples.setdefault(suffix, []).append(sample_line(s, s.name))
break break
else: else:
newname = sample.name.replace(mnewname, mname) newname = s.name.replace(mnewname, mname)
if ":" in newname and newname.endswith("_total"): if ":" in newname and newname.endswith("_total"):
newname = newname[: -len("_total")] newname = newname[: -len("_total")]
output.append(sample_line(sample, newname)) output.append(sample_line(s, newname))
for suffix, lines in sorted(om_samples.items()):
if emit_help:
output.append(
"# HELP {0}{1} {2}\n".format(
metric.name,
suffix,
metric.documentation.replace("\\", r"\\").replace("\n", r"\n"),
)
)
output.append("# TYPE {0}{1} gauge\n".format(metric.name, suffix))
output.extend(lines)
# Get rid of the weird colon things while we're at it # Get rid of the weird colon things while we're at it
if mtype == "counter": if mtype == "counter":
@ -152,16 +170,16 @@ def generate_latest(registry, emit_help=False):
) )
) )
output.append("# TYPE {0} {1}\n".format(mnewname, mtype)) output.append("# TYPE {0} {1}\n".format(mnewname, mtype))
for sample in metric.samples:
# Get rid of the OpenMetrics specific samples for s in metric.samples:
# Get rid of the OpenMetrics specific samples (we should already have
# dealt with them above anyway.)
for suffix in ["_created", "_gsum", "_gcount"]: for suffix in ["_created", "_gsum", "_gcount"]:
if sample.name.endswith(suffix): if s.name == metric.name + suffix:
break break
else: else:
output.append( output.append(
sample_line( sample_line(s, s.name.replace(":total", "").replace(":", "_"))
sample, sample.name.replace(":total", "").replace(":", "_")
)
) )
return "".join(output).encode("utf-8") return "".join(output).encode("utf-8")