簡體   English   中英

Python prometheus_client,CollectorRegistry 中的重復時間序列

[英]Python prometheus_client, Duplicated timeseries in CollectorRegistry

使用 Python Prometheus 客戶端,我正在嘗試將具有不同標簽的指標添加到同一個收集器注冊表。

我的目標基本上是在一個 CollectorRegistry() object 中收集多個指標,並同時將它們全部推送到推送網關。 前任:

my_metric_name{name="foo",tag="1"} 1.0
my_metric_name{name="foo",tag="2"} 5.0
my_metric_name{name="foo",tag="3"} 7.0

從上述設置中,我想從一個注冊表一次全部推送它們,而不是為每個注冊表創建一個新注冊表。 我可以這樣做嗎?

背景:

考慮這個工作片段:

#!/usr/bin/env python3

from prometheus_client import CollectorRegistry, Gauge

registry = CollectorRegistry()

g = Gauge("test", "some gauge",
            labelnames=["name", "tag"], 
            registry=registry).labels("foo", 1)
g.set(1)

這會創建一個像這樣的 Gauge 度量:

test{name="foo",tag="1"} 1.0

但是,這不起作用

#!/usr/bin/env python3

from prometheus_client import CollectorRegistry, Gauge

title = "foo"
dataset = [1, 2, 3]

registry = CollectorRegistry()

for item in dataset:
    g = Gauge("test", "some gauge",
             labelnames=["name", "tag"], 
             registry=registry).labels(title, item)
    g.set(1)

我期待它創造出這樣的東西,標簽制作獨特的物品(不重復):

test{name="foo",tag="1"} 1.0
test{name="foo",tag="2"} 1.0
test{name="foo",tag="3"} 1.0

相反,它在第二個循環中失敗並出現以下錯誤:

ValueError: Duplicated timeseries in CollectorRegistry

不同的 label 名稱不會使它們不重復嗎?

我可以通過更頻繁地推送指標來推送網關(在每次循環迭代中)並創建一個新注冊表來解決這個問題。 但這確實有助於 package 收集一堆指標並一次發送它們,而不是通過網絡進行多次調用。

我意識到您只需要聲明 Gauge object 一次,然后每次調用 set() 時,都會在注冊表中添加一個新指標:

#!/usr/bin/env python3

from prometheus_client import CollectorRegistry, Gauge

title = "foo"
dataset = [1, 2, 3]

registry = CollectorRegistry()

g = Gauge("test", "some gauge",
         labelnames=["name", "tag"], 
         registry=registry)

for item in dataset:
    g.labels(title, item).set(1)

結果是:

test{name="foo",tag="1"} 1.0
test{name="foo",tag="2"} 1.0
test{name="foo",tag="3"} 1.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM