client_python icon indicating copy to clipboard operation
client_python copied to clipboard

Non-stringy label values in MetricFamily metrics cause export-time errors

Open DrewBloechl opened this issue 7 years ago • 4 comments

This is very similar to #18 only I'm using the GaugeMetricFamily/CounterMetricFamily interface, otherwise the symptoms are the same. I'm using the default pypi version (which I think is 0.2.0).

I was inadvertently passing in ints for a couple of the label values in .add_metric(), which results in a 500 error on export and the following traceback. Wrapping a str() around the values makes this go away. Coercing these values as was done in the fix for #18 seems like the right thing to do here as well.

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/socketserver.py", line 639, in process_request_thread
    self.finish_request(request, client_address)
  File "/usr/local/lib/python3.6/socketserver.py", line 361, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/local/lib/python3.6/socketserver.py", line 696, in __init__
    self.handle()
  File "/usr/local/lib/python3.6/http/server.py", line 418, in handle
    self.handle_one_request()
  File "/usr/local/lib/python3.6/http/server.py", line 406, in handle_one_request
    method()
  File "/usr/local/lib/python3.6/site-packages/prometheus_client/exposition.py", line 95, in do_GET
    output = generate_latest(registry)
  File "/usr/local/lib/python3.6/site-packages/prometheus_client/exposition.py", line 78, in generate_latest
    for k, v in sorted(labels.items())]))
  File "/usr/local/lib/python3.6/site-packages/prometheus_client/exposition.py", line 78, in <listcomp>
    for k, v in sorted(labels.items())]))
AttributeError: 'int' object has no attribute 'replace'

DrewBloechl avatar Apr 24 '18 22:04 DrewBloechl

Would you like to send a PR?

brian-brazil avatar Apr 25 '18 06:04 brian-brazil

At a glance it looks simple enough to fix (famous last words). I'll give it a shot within the next couple of days.

DrewBloechl avatar Apr 26 '18 04:04 DrewBloechl

Did you have a chance to work on this?

brian-brazil avatar Aug 08 '19 11:08 brian-brazil

This hit me yesterday and the workaround isn't pretty.

I was looking at how to fix it, and the easiest solution (and potentially slowest , but given suboptimal string operations around, not that bad), is to use str(v).replace(... . The only other way I see is do this during adding the labels, but this isn't restricted in any way and would require quite a bit of changes and potentially is error-prone.

Might take a deeper look at it once I'm done with my exporter.

Prof-Bloodstone avatar Aug 16 '19 05:08 Prof-Bloodstone