weixin_52331560 2022-11-17 20:51 采纳率: 83.3%
浏览 32
已结题

python开发exporter,for循环创建创建Gauge报错

python开发exporter,for循环创建创建Gauge报错


#!/usr/bin/python3
import os
import time
import sys
sys.path.append("/usr/local/lib/python3.6/site-packages/")
from prometheus_client import start_http_server,Gauge

def get_dir_num():
        for it in 1,2,3,4:
                ite = str(it)
                ll = f"ll{ite}"
                print(ll)
                dir_num = Gauge(ll,'Calculate the number of directories',['instance', 'port'])
                dir_num.labels(instance='3333333',port='222').set(it)

if __name__ == "__main__":

        start_http_server(8000)
        while True:
                get_dir_num()
                time.sleep(10)
[root@localhost exporter]# python3 test.sh 
ll1
ll2
ll3
ll4
ll1
Traceback (most recent call last):
  File "test.sh", line 26, in <module>
    get_dir_num()
  File "test.sh", line 17, in get_dir_num
    dir_num = Gauge(ll,'Calculate the number of directories',['instance', 'port'])
  File "/usr/local/lib/python3.6/site-packages/prometheus_client/metrics.py", line 373, in __init__
    _labelvalues=_labelvalues,
  File "/usr/local/lib/python3.6/site-packages/prometheus_client/metrics.py", line 143, in __init__
    registry.register(self)
  File "/usr/local/lib/python3.6/site-packages/prometheus_client/registry.py", line 45, in register
    duplicates))
ValueError: Duplicated timeseries in CollectorRegistry: {'ll1'}

第一次走完for循环是没问题的,第二次走for循环变量带入Gauge模块直接报错。

访问url可以看到第一次for循环的结果

img

  • 写回答

1条回答 默认 最新

  • 程序媛一枚~ Python领域新星创作者 2022-11-19 23:32
    关注

    Gauge 的监控项,只能初始化一次,不然会报 “ValueError:Duplicated timeseries in CollectorRegistry”

    一定要先在 Gauge 中初始化标签(比如,['标签1', '标签2']),才能在 labels 中使用(比如,labels(IP='10.0.0.1', HOSTNAME='foobar'))

    把这行移到for循环外
    dir_num = Gauge('ll1', 'Calculate the number of directories', ['instance', 'port'])
    去掉while True死循环就可以了

    img

    
    import sys
    # !/usr/bin/python3
    import time
    
    sys.path.append("/usr/local/lib/python3.6/site-packages/")
    from prometheus_client import start_http_server, Gauge
    
    
    def get_dir_num():
        # Gauge 用法:Gauge('监控项', '监控项说明', ['标签1', '标签2'])
        # Gauge 的监控项,只能初始化一次,不然会报 “ValueError:Duplicated timeseries in CollectorRegistry”
        # 一定要先在 Gauge 中初始化标签(比如,['标签1', '标签2']),才能在 labels 中使用(比如,labels(IP='10.0.0.1', HOSTNAME='foobar'))
        dir_num = Gauge('ll1', 'Calculate the number of directories', ['instance', 'port'])
        for it in 1, 2, 3, 4:
            ite = str(it)
            ll = f"ll{ite}"
            print(ll)
            dir_num.labels(instance='3333333', port='222').set(it)
    
    
    if __name__ == "__main__":
        start_http_server(8000)
        get_dir_num()
        time.sleep(10)
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月29日
  • 已采纳回答 11月21日
  • 赞助了问题酬金15元 11月18日
  • 修改了问题 11月18日
  • 展开全部

悬赏问题

  • ¥20 powerbuilder datawindow控件导出Excel数据,可不可以不自动覆盖原数据,而是在后面新插入入数据。
  • ¥100 无轴承永磁同步电机控制
  • ¥15 eps里添加本地倾斜模型
  • ¥15 telegram 问题
  • ¥15 nrf52810-c三个a 程序
  • ¥15 lego-loam跑出来的roll误差很大
  • ¥50 求一个半透明没有锯齿的圆角窗体的实现例子
  • ¥15 STM32cubeMX里的FreeRTOS无法释放内存
  • ¥15 CATIA有些零件打开直接单机确定终止
  • ¥15 请问有会的吗,用MATLAB做