Prometheus 數據監控 for Python Client (一)
Prometheus 是一個開源的時序數據庫,網上主要的應用方向都是用於服務器和容器等生產信息監控。
Prometheus對於Python有官方的庫支持,地址https://github.com/prometheus/client_python#instrumenting
以下根據一些網上資料整理一些筆記:
- 首先數據模型:
<metric name>{<label name>=<label value>, ...} value
metric可以類比為sql中的表,label可以類比為sql中的鍵,最后的value為表中的值、
Prometheus中的metric,label,value要符合規范,詳見Metric and Label Naming
- Prometheus在Python-client下使用Gauge這個數據類型示例:
from prometheus_client import Gauge g = Gauge('my_inprogress_requests', 'Description of gauge') g.set(value) #value自己定義,但是一定要為 整數或者浮點數
如果需要定義一些label,則
from prometheus_client import Gauge g = Gauge('my_inprogress_requests', 'Description of gauge',['mylabelname'])
'''第一個參數是Metric Name,第二個參數是對該值的描述,第三個參數是list()形式的labelname'''
g.labels(mylabelname='str').set(value) #value自己定義,但是一定要為 整數或者浮點數
#'str'是labelname 的 lebel value
#此時一定要注意,定義Gague標簽的時候是一個列表,列表可以存多個lablename,類型是字符串
#在給lable定義value的時候也要注意,mylablename 這里是一個方法,或者說是一個變量了,一定要注意.
啟動一個http
from prometheus_client import Gauge,start_http_server from prometheus_client import Gauge a = Gauge('a', 'Description of gauge') a.set(345) #value自己定義,但是一定要為 整數或者浮點數 g = Gauge('g', 'Description of gauge',['mylabelname']) g.labels(mylabelname='jastme').set(123) #value自己定義,但是一定要為 整數或者浮點數 #此時一定要注意,定義Gague標簽的時候是一個列表,列表可以存多個lablename,類型是字符串 #在給lable定義value的時候也要注意,mylablename 這里是一個方法,或者說是一個變量了,一定要注意. start_http_server(8000)
這樣就可以通過http訪問到數據,這是個靜態頁面。如果需要做一個動態頁面,則
from prometheus_client import Gauge,start_http_server import random from prometheus_client import Gauge a = Gauge('a', 'Description of gauge') a.set(random.random()) #value自己定義,但是一定要為 整數或者浮點數 g = Gauge('g', 'Description of gauge',['mylabelname']) #此時一定要注意,定義Gague標簽的時候是一個列表,列表可以存多個lablename,類型是字符串 #在給lable定義value的時候也要注意,mylablename 這里是一個方法,或者說是一個變量了,一定要注意. start_http_server(8000) while True: g.labels(mylabelname='jastme').set(random.random())
這樣g的值就是隨機的,而a的值一直是固定的。
-
關於內存
使用作監控的時候,內存是吃得很快的。但是在api數量很少的時候,如果老是出現內存嚴重不足的狀態, 那很可能是用法有問題。
它們的數據格式,(從調用者的角度看)都是類似(省去了時間戳):
job name(label1=value1, label2=value2, label3=value3) = value
在influxdb里job name應該是指db name, label是tag。注意了, label的不同值不要太多!比如label1對應的value1的不同的值,不能太多,否則查詢非常非常吃內存。如
api_count(method=POST, userID=1) = 100
