Можно ли в Prometheus передавать готовые тайм-серии а не единичные значения метрик?
Пытаюсь разобраться с "Prometheus". Как переодически собирать метрики, кажись, понял. Возник вопрос: можно ли передать "Prometheus-у" не одно значение метрики, которое есть на момент опроса, а сразу серию значений, в сочетании с таймстапами, когда эти значения получены. Например, собираю загрузку ЦПУ. Раз в 15, или 20, или 50 секунд получаю от экспортера одно число - все хорошо. А можно ли раз в 60 секунд (не важно, строго говоря, 60 или 70 или еще сколько-то) вычитывать из БД на контролируемом хосте строки, записанные каким-то процессом с интервалом в 1, или 3, или 5 секунд и такую "самодельную" тайм-серию отдать от экспортера и записать ее в "Prometheus". Или другой вариант: в цикле получать от экспортера пары значений из времени и значения метрики и записывать из в базу "Prometheus"?
Это скрипт, который пишет данные в Postgresql БД:
#!/usr/bin/python3 import time import psycopg2 from _datetime import datetime import psutil
while True:
conn = psycopg2.connect(dbname="edudb", user="masterdb", password="passwdb", host="192.168.30.101", port="5432")
with conn:
with conn.cursor() as cursor:
print("Подключение установлено", cursor)
data_to_insert = (datetime.now(), psutil.cpu_percent(), psutil.disk_usage("/")[1]/1024**3, psutil.virtual_memory()[3]/1024**3)
print(data_to_insert)
cursor.execute("INSERT INTO edutbl (curr_time, cpu_load, disk_use, memory_use) VALUES (%s,%s,%s,%s)", data_to_insert)
conn.commit()
time.sleep(20)
conn.close()`
Это код экспортера для Prometheus:
#!/usr/bin/python3
import prometheus_client
import time
import psutil
import psycopg2
def get_metrics():
conn = psycopg2.connect(dbname="edudb", user="masterdb", password="passwdb", host="192.168.30.101", port="5432")
if conn:
print("Подключение к базе установлено", conn)
else:
print("Подключение к базе не установлено")
return 1
with conn.cursor() as cursor:
if cursor:
print("Курсор создан", cursor)
else:
print("Курсор не создан")
return 1
cursor.execute('SELECT cpu_load, disk_use, memory_use FROM edutbl ORDER BY id DESC LIMIT 1;')
conn.commit()
one_str = cursor.fetchone()
print(one_str)
conn.close()
return one_str
UPDATE_PERIOD = 30
SYSTEM_USAGE = prometheus_client.Gauge('System_usage',
'Hold current system resource usage',
['resource_type'])
if __name__ == '__main__':
prometheus_client.start_http_server(8999)
while True:
gm = get_metrics()
SYSTEM_USAGE.labels('cpu_load').set(gm[0])
SYSTEM_USAGE.labels('disk_use').set(gm[1])
SYSTEM_USAGE.labels('memory_use').set(gm[2])
time.sleep(UPDATE_PERIOD)