Образовательный проект «SnakeProject» Михаила Козлова

Навигация

⇒ FreeBSD and Nix ⇐

CISCO

Voice(Asterisk\Cisco)

Microsoft

Powershell

Python

SQL\T-SQL

Общая

WEB Разработка

ORACLE SQL \ JAVA

Мото

Стрельба, пневматика, оружие

Саморазвитие и психология


Prometheus + Python


Prometheus + Python


Что может отслеживать Prometheus?

Prometheus поддерживает следующие 4 типа показателей:

Counter: это средство подсчета чисел. Это помогает вам следить за тем, чтобы показатели не увеличивались или просто не сбрасывались на 0 в целом.
Gauge: Это числовой показатель, обычно используемый для отслеживания значений, таких как показатели производительности.
Info: Он используется для получения статической информации, такой как версия приложения и / или ‘перечисление’, чтобы показать состояние приложения.
Histogram: Использование гистограмм играет важную роль в отслеживании и анализе продолжительности, объема и частоты таких вещей, как запросы.


Библиотека инструментария Prometheus для приложений Python

Библиотека:
https://github.com/prometheus/client_python

Установка:
pip install prometheus-client

Документация:
https://prometheus.github.io/client_python/

prometheus.yml:
global:
 scrape_interval: 5s
scrape_configs:
 - job_name: test_client_python
 static_configs:
 - targets:
 - localhost:8000

выбирает из http://localhost:8000/metrics


Список доступных инструментов библиотеки 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.


Пример с Summary

С оф.док.

Дока:
https://prometheus.github.io/client_python/instrumenting/summary/

app.py:
#!/usr/bin/env python3

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())

Перейдите по ссылке http://localhost:8000/

Из одного простого в использовании декоратора вы получите:
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()

if __name__ == '__main__':
    start_http_server(8000)
    request_counter = Counter('http_requests', 'HTTP request', ["status_code", "instance"])
    webServer = HTTPServer(("localhost", 8080), HTTPRequestHandler).serve_forever()
    print("Server started")

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

https://docs.python.org/3/library/random.html

HTTP-сервер на порту 8000 для prometheus.
HTTP-сервер на порту 8080 для запросов.

app.py:
#!/usr/bin/env python3

import random http.server time
from prometheus_client import Counter Gauge start_http_server

REQUESTS = Counter('your_messages_total','Write your description here.')
EXCEPTIONS = Counter('your_messages_exceptions_total','Write your description here.')
PROGRESS = Gauge('your_messages_inprogress','Write your description here.')
LASTENDED = Gauge('your_messages_last_time_seconds','Write your description here.')

class My(http.server.BaseHTTPRequestHandler):
 PROGRESS.inc()
 def do_GET(self):
   REQUESTS.inc()
   with EXCEPTIONS.count_exceptions():
      if random.random() < 0.1:
         raise Exception
   self.send_response(200)
   self.end_headers()
   self.wfile.write(b"your_message")
   LASTENDED.set(time.time())
   PROGRESS.dec()

if __name__ == "__main__":
 start_http_server(8000)
 server = http.server.HTTPServer(('localhost', 8080), My)
 server.serve_forever()

Запрос к http://localhost:8080/ отдаст ответ your_message.

Примеры метрик с 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 - сколько секунд прошло с момента последнего запроса.

 


Комментарии пользователей

Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!

Контакты Группа ВК Сборник материалов по Cisco, Asterisk, Windows Server, Python и Django, SQL и T-SQL, FreeBSD и LinuxКод обмена баннерами Видео к IT статьям на YoutubeВидео на другие темы Смотреть
Мои друзья: Советы, помощь, инструменты для сис.админа, статическая и динамическая маршрутизация, FreeBSD

© Snakeproject.ru создан в 2013 году.
При копировании материала с сайта - оставьте ссылку.
Весь материал на сайте носит ознакомительный характер,
за его использование другими людьми, автор ответственности не несет.

Рейтинг@Mail.ru
Рейтинг@Mail.ru Яндекс.Метрика





Поддержать автора и проект