github:https://github.com/prometheus/client_python
использовать pip Инструменты могут быть очень удобными. prometheus_client:
pip install prometheus-client
prometheus_client предоставляет богатый API, который можно использовать для определения и регистрации метрик, а также при необходимости предоставлять интерфейсы для этих метрик.
from prometheus_client import Counter, Gauge, Summary, Histogram, start_http_server
# Определение и регистрация metric
c = Counter('test_counter', «тестовый счетчик»)
g = Gauge('test_gauge', «Тестовая панель»)
s = Summary('test_summary', «Сводка испытаний»)
h = Histogram('test_histogram', «Тестовая гистограмма», buckets=(1, 2, 3))
# Приращения счетчика
c.inc()
# Настройки панели управления
g.set(42)
# Значения настроек сводки и гистограммы
s.observe(1.2)
h.observe(4.2)
# запускать HTTP сервер, открытый metrics интерфейс
start_http_server(8080)
В приведенном выше коде мы сначала определяем четыре различных типа метрика (счетчик, панель мониторинга, сводка и гистограмма), а затем работали с ними соответственно. Например, счетчик выполнил операцию автоматического приращения, панель мониторинга установила значение, а сводка и гистограмма установили значение наблюдения. Наконец, мы вызываем start_http_server()
функция, будет metrics Интерфейс открыт для доступа к нему внешних программ.
Следующий пример кода можно использовать для сбора CPU изиспользовать Индикатор скорости:
from prometheus_client import Counter, Gauge, Summary, Histogram, start_http_server
import psutil
import time
# Определение и регистрацияиндекс
cpu_percent = Gauge('cpu_percent','CPU использоватьпроцент ставки')
cpu_freq_current = Gauge('cpu_freq_current', 'CPU текущая частота')
cpu_freq_min = Gauge('cpu_freq_min', 'CPU минимальная частота')
cpu_freq_max = Gauge('cpu_freq_max', 'CPU максимальная частота')
# получать CPU информация о частоте
cpu_freq = psutil.cpu_freq()
# Установить начальное значение
cpu_freq_current.set(cpu_freq.current)
cpu_freq_min.set(cpu_freq.min)
cpu_freq_max.set(cpu_freq.max)
# запускать HTTP сервер, открытый metrics интерфейс
start_http_server(8080)
while True:
# Сбор показателей использования ЦП
cpu_percent.set(psutil.cpu_percent())
# собирать CPU индекс частоты
cpu_freq = psutil.cpu_freq()
cpu_freq_current.set(cpu_freq.current)
# ждать 1 секунд, сделай это еще раз, собери
time.sleep(1)
В приведенном выше коде мы используем psutil приобретение библиотеки CPU использовать информацию о скорости и частоте и использовать их в качестве индикаторов для сбора данных. При каждом выполнении цикла мы будем устанавливать текущее значение индикатора на соответствующее metric и подождите одну секунду перед повторным сбором.
prometheus_client может не только собирать индикаторы системного уровня, но также легко собирать пользовательские индикаторы.
В следующем примере кода показано, как получить индикатор случайного числа:
from prometheus_client import Gauge, start_http_server
import random
# Определение и регистрацияиндекс
random_value = Gauge('random_value', «Индикатор случайных чисел»)
# запускать HTTP сервер, открытый metrics интерфейс
start_http_server(8080)
while True:
# генерировать 0 приезжать 100 случайное число,и установитьприезжатьиндекссередина
random_value.set(random.randint(0, 100))
# ждать 5 секунд, сделай это еще раз, собери
time.sleep(5)
В приведенном выше коде мы определяем индикатор случайных чисел, каждый 5 Секунды генерируется случайное число и устанавливается на индикатор. Затем мы передаем этот индикатор через start_http_server()
Интерфейс открыт, чтобы другие программы могли легко получить к нему доступ.
Из двух приведенных выше примеров мы видим, что гибкий API prometheus_client может легко реализовать сбор и предоставление индикаторов различных типов и размеров.
# encoding: utf-8
from prometheus_client import Counter, Gauge, Summary
from prometheus_client.core import CollectorRegistry
from prometheus_client.exposition import choose_encoder
class Monitor:
def __init__(self):
# зарегистрироватьсясобиратьустройство&Максимальные затраты времениmap
self.collector_registry = CollectorRegistry(auto_describe=False)
self.request_time_max_map = {}
# интерфейсвызовsummaryстатистика
self.http_request_summary = Summary(name="http_server_requests_seconds",
documentation="Num of request time summary",
labelnames=("method", "code", "uri"),
registry=self.collector_registry)
# интерфейс Максимальное время статистики
self.http_request_max_cost = Gauge(name="http_server_requests_seconds_max",
documentation="Number of request max cost",
labelnames=("method", "code", "uri"),
registry=self.collector_registry)
# Статистика количества неудачных запросов
self.http_request_fail_count = Counter(name="http_server_requests_error",
documentation="Times of request fail in total",
labelnames=("method", "code", "uri"),
registry=self.collector_registry)
# Прогнозирование модели требует времени статистика
self.http_request_predict_cost = Counter(name="http_server_requests_seconds_predict",
documentation="Seconds of prediction cost in total",
labelnames=("method", "code", "uri"),
registry=self.collector_registry)
# Загрузка изображения занимает время статистика
self.http_request_download_cost = Counter(name="http_server_requests_seconds_download",
documentation="Seconds of download cost in total",
labelnames=("method", "code", "uri"),
registry=self.collector_registry)
# получать/metricsрезультат
def get_prometheus_metrics_info(self, handler):
encoder, content_type = choose_encoder(handler.request.headers.get('accept'))
handler.set_header("Content-Type", content_type)
handler.write(encoder(self.collector_registry))
self.reset_request_time_max_map()
# summaryстатистика
def set_prometheus_request_summary(self, handler):
self.http_request_summary.labels(handler.request.method, handler.get_status(), handler.request.path).observe(handler.request.request_time())
self.set_prometheus_request_max_cost(handler)
# Пользовательская сводная статистика
def set_prometheus_request_summary_customize(self, method, status, path, cost_time):
self.http_request_summary.labels(method, status, path).observe(cost_time)
self.set_prometheus_request_max_cost_customize(method, status, path, cost_time)
# статистика отказов
def set_prometheus_request_fail_count(self, handler, amount=1.0):
self.http_request_fail_count.labels(handler.request.method, handler.get_status(), handler.request.path).inc(amount)
# Настроить отказов
def set_prometheus_request_fail_count_customize(self, method, status, path, amount=1.0):
self.http_request_fail_count.labels(method, status, path).inc(amount)
# Статистика максимальной трудоемкости
def set_prometheus_request_max_cost(self, handler):
requset_cost = handler.request.request_time()
if self.check_request_time_max_map(handler.request.path, requset_cost):
self.http_request_max_cost.labels(handler.request.method, handler.get_status(), handler.request.path).set(requset_cost)
self.request_time_max_map[handler.request.path] = requset_cost
# Настроить статистику максимальной трудоемкости
def set_prometheus_request_max_cost_customize(self, method, status, path, cost_time):
if self.check_request_time_max_map(path, cost_time):
self.http_request_max_cost.labels(method, status, path).set(cost_time)
self.request_time_max_map[path] = cost_time
# Прогнозирование статистики затрат времени
def set_prometheus_request_predict_cost(self, handler, amount=1.0):
self.http_request_predict_cost.labels(handler.request.method, handler.get_status(), handler.request.path).inc(amount)
# Настроить Прогнозирование статистики затрат времени
def set_prometheus_request_predict_cost_customize(self, method, status, path, cost_time):
self.http_request_predict_cost.labels(method, status, path).inc(cost_time)
# Статистика времени загрузки
def set_prometheus_request_download_cost(self, handler, amount=1.0):
self.http_request_download_cost.labels(handler.request.method, handler.get_status(), handler.request.path).inc(amount)
# Настроить статистику времени загрузки
def set_prometheus_request_download_cost_customize(self, method, status, path, cost_time):
self.http_request_download_cost.labels(method, status, path).inc(cost_time)
# Проверка, назначать ли максимально трудоемкую карту
def check_request_time_max_map(self, uri, cost):
if uri not in self.request_time_max_map:
return True
if self.request_time_max_map[uri] < cost:
return True
return False
# Сброс максимально трудоемкой карты
def reset_request_time_max_map(self):
for key in self.request_time_max_map:
self.request_time_max_map[key] = 0.0
import tornado
import tornado.ioloop
import tornado.web
import tornado.gen
from datetime import datetime
from tools.monitor import Monitor
global g_monitor
class ClassifierHandler(tornado.web.RequestHandler):
def post(self):
# TODO Something you need
# work....
# Сводная статистика, включая количество запросов и затраченное время каждый раз
g_monitor.set_prometheus_request_summary(self)
self.write("OK")
class PingHandler(tornado.web.RequestHandler):
def head(self):
print('INFO', datetime.now(), "/ping Head.")
g_monitor.set_prometheus_request_summary(self)
self.write("OK")
def get(self):
print('INFO', datetime.now(), "/ping Get.")
g_monitor.set_prometheus_request_summary(self)
self.write("OK")
class MetricsHandler(tornado.web.RequestHandler):
def get(self):
print('INFO', datetime.now(), "/metrics Get.")
g_monitor.set_prometheus_request_summary(self)
# Возврат результатов статистики по Metricsинтерфейс
g_monitor.get_prometheus_metrics_info(self)
def make_app():
return tornado.web.Application([
(r"/ping?", PingHandler),
(r"/metrics?", MetricsHandler),
(r"/work?", ClassifierHandler)
])
if __name__ == "__main__":
g_monitor = Monitor()
app = make_app()
app.listen(port)
tornado.ioloop.IOLoop.current().start()
Метрики возвращают экземпляр результата
Ссылка: https://pythonjishu.com/ldkilffcsapzipi/ https://www.cnblogs.com/alioth01/p/14363574.html