我有一個腳本,我試圖在其中迭代字串串列,然后獲取當前變數的值,將其轉換為大寫,然后使用結果作為變數名。最終結果將是設定普羅米修斯指標的值,這是一個全域變數。
from prometheus_client import start_http_server, Gauge
# List of strings (global variables will be equal but upper-case)
MEASUREMENTS = ['x', 'y', 'z']
# Prometheus Metrics set as global variables
X = Gauge('some_value', 'some_description', ['label1', 'label2']
Y = Gauge('some_value', 'some_description', ['label1', 'label2']
Z = Gauge('some_value', 'some_description', ['label1', 'label2']
...
# Iterate through list of strings
for measurement in MEASUREMENTS:
metric = getattr(some_status, measurement) # Will be an integer
upper_measurement = measurement.upper() # Will equal the global variable name
[?UPPER_MEASUREMENT?].labels(label1=value_P1, label_2=value).set(metric) # This is where I need to reference the global variable name
實際上是這樣的:
[?UPPER_MEASUREMENT?].labels(label1=value_P1, label_2=value).set(metric)
需要是:
X.labels(label1=value_P1, label_2=value).set(metric)
我試過了:
upper_measurement.labels(label1=value_P1, label_2=value).set(metric)
但這當然會導致錯誤,因為它是一個字串:
Error: 'str' object has no attribute 'labels'
不太確定從這里去哪里。我可以寫一個丑陋的大塊來設定每個指標,但如果可能的話,我寧愿避免這樣做。
uj5u.com熱心網友回復:
在字典中定義您的指標:
METRICS = {
key: Gauge('some_value', 'some_description', ['label1', 'label2'])
for key in ['x', 'y', 'z']
}
然后您可以通過遍歷字典輕松更新所有指標:
for key, metric in METRICS.items():
metric.labels(label1=value_P1, label_2=value).set(getattr(some_status, key))
uj5u.com熱心網友回復:
盡管我認為這樣做的正確方法應該是使用字典,正如其他答案所指出的那樣,但如果你仍然想知道,你可以用eval(). 所以,只要改變
[?UPPER_MEASUREMENT?].labels(label1=value_P1, label_2=value).set(metric)
和
eval(upper_measurement).labels(label1=value_P1, label_2=value).set(metric)
它應該作業。請注意,如果您MEASUREMENTS從某些輸入中獲取串列的元素,在使用之前無法對其進行清理eval(),因為它可能會運行危險的代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/450111.html
