Как использовать переменную в круглых скобках - PullRequest
0 голосов
/ 01 ноября 2018

У меня странная проблема, и я надеялся найти решение здесь. Я использую модуль push_to_gateway, чтобы позволить Прометею собрать некоторые данные. Процесс состоит из 2 шагов:

1) объявить переменную следующим образом:

g = Gauge(ctr, '', ['host', 'ip'], registry=registry)

host и ip - метки, используемые в БД Prometheus. Реестр не имеет отношения к моей проблеме.

2) Заполните данные:

g.labels(hostname, ipaddr).set(val)

hostname и ipaddr - переменные, содержащие значения

Когда вы посмотрите на данные в Prometheus, вы увидите что-то вроде:

ctr{hostname="node1",ip="1.1.1.1"} -1 

Поскольку у меня есть тысячи счетчиков для импорта в Prometheus, и все они имеют разные наборы меток, я хочу создать заказной текст, содержащий метки и их значения, при анализе данных и использовании его для генерации 1) и 2) , Заполнить часть 1) легко. Я просто набираю:

g = Gauge(ctr, '', list(labels.keys()), registry=registry)

Строка ожидает список и получает список.

Но как мне заполнить часть 2), поскольку g.labels ожидает имя хоста и ipaddr, разделенные символом ',' (то есть не списком). Если я делаю list (tags.values ​​()), то он отображается в виде списка в скобках, и это не работает. Мне нужно, чтобы список (label.values ​​()) расширился до «node1», «1.1.1.1» внутри скобок, чтобы это работало, и я понятия не имею, как это сделать (если это вообще возможно), чтобы 2 ) выглядит так:

g.labels('node1', '1.1.1.1').set(val)

Thx

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

другое решение - просто распаковать на лету:

hostname, ipaddr = labels.values()
g.labels(hostname, ipaddr).set(val)
0 голосов
/ 01 ноября 2018

Именно здесь * пригодится. Распаковывает значения списка.

Попробуйте:

list_of_labels = list(labels.values())
g.labels(*list_of_labels).set(val)

Вот пример того, как * работает в python

def f(a, b):
    print a, b

tup = ("Hello", "there")

f(*tup)
# prints "Hello there"
...