Prometheus поддерживает следующие 4 типа показателей:
Counter: это средство подсчета чисел. Это помогает вам следить за тем, чтобы показатели не увеличивались или просто не сбрасывались на 0 в целом. Gauge: Это числовой показатель, обычно используемый для отслеживания значений, таких как показатели производительности. Info: Он используется для получения статической информации, такой как версия приложения и / или ‘перечисление’, чтобы показать состояние приложения. Histogram: Использование гистограмм играет важную роль в отслеживании и анализе продолжительности, объема и частоты таких вещей, как запросы.
Библиотека инструментария Prometheus для приложений Python
Список доступных инструментов библиотеки client_python
Counter - повышаются и сбрасываются при перезапуске процесса. Gauge - мо;tn подниматься и опускаться. Summary - отслеживает размер и количество событий. Histogram - отслеживает размер и количество событий в сегментах, позволяет агрегировать квантили. Info - отслеживает информацию о ключе-значении, обычно о целевом объекте в целом. Enum - отслеживает, в каком из набора состояний что-либо находится в данный момент. Labels - все показатели могут иметь метки, позволяющие группировать связанные временные ряды. Exemplars - могут быть добавлены к метрикам счетчика и гистограммы, путем передачи dict пар значений меток.
У каждого типа есть свои методы, поэтому стоит заглянуть в документацию.
Смотрите в клиенте Prometheus Python или в документации к самой библиотеке (пример ниже Counter):
>>> import prometheus_client
>>> help(prometheus_client.Counter)
Как создается счетчик - пример:
REQUEST_TIME = Summary('request_processing_seconds', 'Write your description here')
где:
- request_processing_seconds - название метрики из prometheus
- Write your description here - введите свое описание для метрики
- Summary - инструмент из списка
Пример с Gauge
app.py:
#!/usr/bin/env python3
import prometheus_client as prom
from random import randrange
import time
#здесь мы определяем калибровку, у нее есть только одна метрика, которая нужна только для генерации числа
RANDOM_NUMBER_GAUGE = prom.Gauge('rendom_number_gauge', 'Random number between 1 - 100')
#это функция для генерации случайных чисел на основе нашего Gauge и отображения всего этого на странице
def generate_random_numbers():
while True:
random_number = randrange(10)
RANDOM_NUMBER_GAUGE.set(random_number)
time.sleep(5) #эта функция сна определяет, через сколько времени наш датчик обновит метрики
if __name__ == '__main__':
prom.start_http_server(8000)
generate_random_numbers()
Перейдите по ссылке http://127.0.0.1:8000/
На странице будут показатели, которые могут отслеживаться и использоваться в Prometheus.
Все показатели помечены комментарием.
В списке вы увидите и созданный нами показатель rendom_number_gauge.
from prometheus_client import Summary start_http_server
import random
import time
# Создайте показатель для отслеживания затраченного времени и зделанных запросов.
REQUEST_TIME = Summary('request_processing_seconds', 'Write your description here')
# Декоратор функции метрикой
@REQUEST_TIME.time()
def process_request(t):
# Фиктивная функция, которая занимает некоторое время.
time.sleep(t)
if __name__ == '__main__':
# Запустите сервер, чтобы предоставить метрики.
start_http_server(8000)
# Сгенерируйтеь несколько запросов.
while True:
process_request(random.random())
Из одного простого в использовании декоратора вы получите:
request_processing_seconds_count: количество раз, когда вызывалась эта функция
request_processing_seconds_sum: общее количество времени, затраченного на выполнение этой функции
Функция позволяет вычислять как количество запросов в секунду, так и задержку по времени
Пример с Counter
HTTP-сервер на порту 8000 для prometheus.
HTTP-сервер на порту 8080 для запросов.
На порту 8080 — экспортер, который будет:
собирать статистику по запросам с кодами ответов
создавать метрику http_requests с двумя метками:
- в 1 будем хранить код ответа.
- в 2 будем хранить имя хоста, с которого была получена метрика.
app.py:
#!/usr/bin/env python3
import os re platform
from time import sleep
from http.server import BaseHTTPRequestHandler, HTTPServer
from prometheus_client import start_http_server, Counter, REGISTRY
class HTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == '/':
self.send_response(200)
self.send_header('Content-type','text/html')
self.end_headers()
self.wfile.write(bytes("<b>your_message</b>", "utf-8"))
request_counter.labels(status_code='200', instance=platform.node()).inc()
else:
self.send_error(404)
request_counter.labels(status_code='404', instance=platform.node()).inc()
HTTP-запрос к localhost:8080 перейдет к методу do_GET(), в котором будет проверен URI запроса.
Если мы перейдем к /, то получим код 200, если любой другой - то 404.
Так делается обновление значения метрики http_requests - добавляем код ответа и имя хоста.
Вызываем метод Counter.inc(), который увеличит значение метрики на единицу.
Каждый запрос, что обработается веб-сервером webServer, будет добавлять +1 к нашей метрике.
В зависимости от кода ответа мы получим эту метку с двумя разными метками - 200 и 404.
Проверьте, как это работает, и запустите сам скрипт:
$ ./py_http_exporter.py
$ curl -I -X GET localhost:8080/
HTTP/1.0 200 OK
$ curl -I -X GET localhost:8080/
HTTP/1.0 200 OK
$ curl -I -X GET localhost:8080/test1
HTTP/1.0 404 Not Found
$ curl -I -X GET localhost:8080/test2
HTTP/1.0 404 Not Found
Теперь давайте проверим, что у нас есть на конечной точке экспортера:
$ curl -X GET localhost:8000
…
HELP http_requests_total HTTP request
TYPE http_requests_total counter
http_requests_total{instance=”***”,status_code=”200"} 2.0
http_requests_total{instance=”***”,status_code=”404"} 2.0
Пример с Counter и Gauge
Ниже мы искуственно симулируем проблемы обработки random
Примеры метрик с Counter:
rate(your_messages_total[5m]) - всего.
rate(your_messages_exceptions_total[5m]) - исключения при обработке.
rate(your_messages_exceptions_total[5m] / rate(your_messages_total[5m]) - процент.
Примеры метрик с Gauge:
your_messages_inprogress - количество выполняемых приложений.
your_messages_last_time_seconds - когда приложение обработало последний запрос.
time() - your_messages_last_time_seconds - сколько секунд прошло с момента последнего запроса.
Комментарии пользователей
Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!