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

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日
  • 展开全部

悬赏问题

  • ¥15 List<Class>有参构造
  • ¥20 搭建三相栅极电路后高侧浮动地VS存在电容特性
  • ¥20 云卓h12pro 数传问题
  • ¥20 请问有人知道怎么用工艺库里面的sdb文件通过virtuoso导出来library里面每个cell的symbol吗?
  • ¥20 海思 nnie 编译 报错
  • ¥50 决策面并仿真,要求有仿真结果图
  • ¥15 springboot接入微信支付SDK
  • ¥50 大区域的遥感影像匹配 怎么做啊
  • ¥15 求解答:pytorch跑yolov8神经网络受挫
  • ¥20 Js代码报错问题不知道怎么解决