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()