使用Python推送指標數據到Pushgateway
需求描述
實踐環境
Python 3.6.5
Django 3.0.6
prometheus-client 0.11.0
代碼實現
!/usr/bin/env python
-*- coding:utf-8 -*-
from prometheus_client import CollectorRegistry, Gauge, push_to_gateway
if __name__ == '__main__':
registry = CollectorRegistry()
labels = ['req_status', 'req_method', 'req_url']
g_one = Gauge('requests_total', 'url請求次數', labels, registry=registry)
g_two = Gauge('avg_response_time_seconds', '1分鍾內的URL平均響應時間', labels, registry=registry)
g_one.labels('200','GET', '/test/url').set(1) #set設定值
g_two.labels('200','GET', '/test/api/url/').set(10) #set設定值
push_to_gateway('http://162.13.0.83:9091', job='SampleURLMetrics', registry=registry)
注意:采用這種方式是無法為指標數據提供數據生成時間戳的,具體下文說明
查看運行結果
瀏覽器訪問推送網關地址http://162.13.0.83:9091
,如下
關於時間戳(timestamp)
如果你在 t1 時刻推送Metric
,你可能認為普羅米修斯會“刮取(scrap
)”這些指標,並使用相同時間戳 t1 作為對應時序數據的時間戳,然而,普羅米修斯不會這樣做,它會把從推送網關(Pushgateway
)“刮取”數據時的時間戳當作指標數據對應的時間戳。為什么會這樣?
在普羅米修斯的世界觀中,一個Metric
可以在任何時候被刮取,一個無法被”刮取”的Metric
基本上是不存在了。對此,普羅米修斯多少還是有點“容忍”的,但是如果它不能在 5 分鍾內獲得一個Metric
的任何樣本,那么它就會表現得好像該Metric
不再存在一樣。為了防止這種情況發生,實際上是使用Pushgateway
的原因之一。Pushgateway
將使你的臨時job在任何時候都可以被刮取,也就是說任何時刻都可以采集到你推送的數據。將推送時間附加為時間戳將無法達到這一目的,因為在最后一次推送5分鍾之后,普羅米修斯會認為你的Metric
已經過時,就好像它再也不能被“刮取”一樣。(普羅米修斯只能識別每個樣本的一個時間戳,無法區分“推送時間”和“刮取時間”。)
由於沒有任何讓附加不同的時間戳有意義的場景,並且許多用戶試圖錯誤地這樣做(盡管沒有客戶端庫支持),Pushgateway
拒絕任何帶有時間戳的推送。
為了更容易對失敗的推送器或最近未運行的Pusher
發出警報,Pushgateway將在push_time_seconds
和push_failure_time_seconds
Metric
中給每個組添加最后一次成功和失敗的POST
、PUT
的Unix時間戳。這將覆蓋使用該名稱推送的任何Metric
。兩個Metric
的值均為零表示該組從未見過成功或失敗的POST
、PUT
。