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 のように対象が分かれるだけでコード自体は使い回されている場合

 

    • 上記のようなコードがモジュール化されており常時プロセスとしては起動し続けている

 

    値が取得できたときは返すが、取得できない時にダミー値を入れない

具体来说,发生什么事情呢?

    1. 从A服务器获取CPU使用情况为50。

 

    1. 从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()
广告
将在 10 秒后关闭
bannerAds