【问题标题】:Prometheus counter not yielding in custom collectorPrometheus 计数器未在自定义收集器中产生
【发布时间】:2021-06-11 20:03:35
【问题描述】:

我正在写这个客户收集器,我想在其中添加一个计数器。

#!/usr/bin/env python3
import sys
import time

from prometheus_client import start_http_server
from prometheus_client.core import CollectorRegistry, Counter

class MyCollector():
    def __init__(self):
        self.mymetrics_counter = Counter('observability_total', 'Status of My Services', ['app', 'test'])
        
    def describe(self):
        print("Started: Metrics Collector!")
        return list()
    
    def collect(self):
        self.mymetrics_counter.labels('observability', 'test').inc()
        yield self.mymetrics_counter

if __name__ == '__main__':
    try:
        myregistry = CollectorRegistry()
        myregistry.register(MyCollector())
        start_http_server(port=9100, registry=myregistry)
        while True:
            time.sleep(10)
    except KeyboardInterrupt:
        print("Ended: Metrics Collector!")
        sys.exit(0)

但我在 yield 时遇到错误

(venv) test_collector % python mycollector.py
Started: Metrics Collector!
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/wsgiref/handlers.py", line 137, in run
    self.result = application(self.environ, self.start_response)
  File "/Users/myid/Documents/myproj/workspace/test_collector/venv/lib/python3.9/site-packages/prometheus_client/exposition.py", line 123, in prometheus_app
    status, header, output = _bake_output(registry, accept_header, params)
  File "/Users/myid/Documents/myproj/workspace/test_collector/venv/lib/python3.9/site-packages/prometheus_client/exposition.py", line 105, in _bake_output
    output = encoder(registry)
  File "/Users/myid/Documents/myproj/workspace/test_collector/venv/lib/python3.9/site-packages/prometheus_client/exposition.py", line 179, in generate_latest
    mname = metric.name
AttributeError: ("'Counter' object has no attribute 'name'", prometheus_client.metrics.Counter(observability))

【问题讨论】:

    标签: python prometheus custom-collection


    【解决方案1】:

    collect 返回指标系列,而不是指标。如果您产生mymetrics_counter.collect() 的每个结果,它会起作用。

    此外,当您创建 Counter 时,它会注册到默认注册表,您不希望在此软用法中使用它,因为它最终会返回两次,这是无效的。

    【讨论】:

    • 感谢@brian-brazil,我尝试了yield self.mymetrics_counter.collect() 并将注册表更改为默认值,但随后出现以下错误-> AttributeError: ("'list' object has no attribute 'name'", [Metric(observability, Status of My Services, counter, , [Sample(name='observability_total', labels={'app': 'observability', 'test': 'test'}, value=1.0, timestamp=None, exemplar=None), Sample(name='observability_created', labels={'app': 'observability', 'test': 'test'}, value=1623696998.4481, timestamp=None, exemplar=None)
    猜你喜欢
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多