Prometheus Python客户端提示 – 创建多个指标的方法
概述
在Prometheus中,有各种不同的导出器,如果想要创建API并生成自定义的度量数据,我们需要使用客户端库。
- https://prometheus.io/docs/instrumenting/clientlibs/
所以在Python中也有相应的库,这就是它。
基本上,只需使用Gauge即可创建,所以代码大致如下。
#!/usr/bin/env python3
# import os
import sys
import re
from logging import getLogger
from prometheus_client import generate_latest
from prometheus_client import Gauge
from prometheus_client import REGISTRY
logger = getLogger(__name__)
class MetricsGenetator(object):
    def __init__(self):
        self.g = Gauge('my_inprogress_requests', 'Description of gauge')
    def run(self):
        self.g.inc()      # Increment by 1
        self.g.dec(10)    # Decrement by given value
        self.g.set(4.2)   # Set to a given value
        metrics = generate_latest(self.registry)
        return metrics
def main():
    app = MetricsGenerator()
    metrics = app.run()
    print(metrics)
if __name__ == '__main__':
    main()
如果每次都执行这个操作的话就没问题了,但是如果举个例子,传递给self.g.set的值为4.2时,如果它被使用在以下这种情况下会出现问题。
- 
- snmpget cpu_usage from のように対象が分かれるだけでコード自体は使い回されている場合
 
- 
- 上記のようなコードがモジュール化されており常時プロセスとしては起動し続けている
 
- 値が取得できたときは返すが、取得できない時にダミー値を入れない
具体来说,发生什么事情呢?
- 
- 从A服务器获取CPU使用情况为50。
 
- 
- 从B服务器获取CPU使用情况时失败(None)。
 
如果返回None,则跳过self.g.set()。
这样,B服务器的CPU使用情况将返回为50。
换句话说,由于先前的值被直接使用,所以在上述的结构情况下,只需明确添加CPU usage = None等内容即可。
但是,如果A服务器和B服务器的CPU数量是动态变化的,以类似于for cpu in cpu_num:的形式动态生成标签的情况下,无法使用虚拟值。
“怎么办呢?”
通过使用在2019年9月新提交的CollectorRegistry的target_info,现在可以实现将Registry分隔开来。
就像这样。
#!/usr/bin/env python3
# import os
import sys
import re
import click
from logging import getLogger
from prometheus_client import generate_latest
from prometheus_client import Gauge
# from prometheus_client import REGISTRY
from prometheus_client.core import CollectorRegistry
logger = getLogger(__name__)
class MetricsGenetator(object):
    def __init__(self, target):
        registry = CollectorRegistry(target_info={"target": server_name})
        self.g = Gauge(
                     'my_inprogress_requests',
                     'Description of gauge',
                     registry=registry)
    def run(self):
        self.g.inc()      # Increment by 1
        self.g.dec(10)    # Decrement by given value
        self.g.set(4.2)   # Set to a given value
        metrics = generate_latest(self.registry)
        return metrics
@click.command()
@click.option('-h', '--hostname', required=True, type=str,
              default="localhost", help="get metrics from hostname. (default: localhost)")
def cli():
    app = MetricsGenerator(target)
    metrics = app.run()
    print(metrics)
def main():
    cli()
if __name__ == '__main__':
    main()
 
    