Оператор Premetheus для разработчиков (4 частью части)
В предыдущем посте мы ввели принципы серии Metrics Metrics, этикетки и увидели, какие метрики были полезны для наблюдения за применениями.
В этом посте мы реализуем некоторые метрики в приложении с колбы с 2 конечными точками:
/view/
: Отображение информации о продукте. Эта страница просто отображает название продукта./buy/
: Купите продукт. На самом деле эта конечная точка просто отображает сообщение.
Мы начнем с следующей реализации для нашего приложения Flask в A app.py
файл:
from flask import Flask app = Flask(__name__) @app.route('/view/') def view_product(id): return "View %s" % id @app.route('/buy/ ') def buy_product(id): return "Buy %s" % id
Первый Установить колбу с пипс Установить колбу
или PIP3 Установите колбу
а затем запустить приложение с колбу пробега
.
Цель состоит в том, чтобы генерировать следующие метрики для мониторинга просмотров продуктов и покупок:
# HELP view_total Product view # TYPE view_total counter view_total{product="product1"} 8 view_total{product="product2"} 2 # HELP buy_total Product buy # TYPE buy_total counter buy_total{product="product1"} 3
Чтобы генерировать метрики, нам нужны конечные точки HTTP, которые выходные текстовые метрики. Путь по умолчанию – /Метрики
, но это может быть изменено. Это может быть реализовано со стандартным «маршрутом»:
1 @app.route('/metrics') 2 def metrics(): 3 metrics = "" 4 for id in view_metric: 5 metrics += \n' 6 % (id, view_metric[id]) 7 for id in buy_metric: 8 metrics += \n' 9 % (id, buy_metric[id]) 10 return metrics
В этом примере View_Metric
и buy_metric
Переменные содержат отображение между названием продукта и подсчетом просмотров или покупок.
- строка 1: Мы создаем новую конечную точку HTTP с пути
/Метрики
; Эта конечная точка будет использоваться PROMETHEUS. - Строка 3: Мы инициализируем результат как пустую строку
Строки от 4 до 6: Для каждого продукта мы генерируем строку с:
- Метрическое имя:
Посмотреть
- Этикетка:
Продукт = <Название продукта>
- Значение: подсчет видов; Это значение извлечено из
view_metric.
- Метрическое имя:
- Строки от 7 до 9: То же самое для покупок продукта
Поддерживать переменную метрики актуальным
В этом подходе View_Metric
и buy_metric
Необходимо обновить в другом месте в коде, когда продукт просматривается или куплен. Таким образом, первое, что для реализации – это переменная или объект, который удерживает метрические значения в приложении:
1 view_metric = {} 2 3 @app.route('/view/') 4 def view_product(id): 5 # Update metric 6 if product not in view_metric: 7 view_metric[id] = 1 8 else: 9 view_metric[id] += 1 10 return "View %s" % id
- Линия 1: Глобальная переменная, которая содержит общее количество просмотров для каждого продукта
- Строки 7 и 9: Глобальная переменная обновляется
Код для Метрики ()
Функция действительно проста, она ничего не вычисляет, но просто извлекает значения из существующей переменной, которая поддерживается актуальна. Так что сложность в View_Product ()
функция. Каждый раз, когда продукт «просмотрен», кусок кода, чтобы поддерживать View_Metric
счетчик современности.
Метрики по требованию
Иногда стоимость поддержания этих видов переменных выше, чем вычислить значения на лету, когда Метрики ()
Функция называется. С конфигурацией по умолчанию PROMETHEUS запросит /Метрики
Конечная точка раз каждые 30 секунд. Поэтому, если переменная должна быть обновлена несколько раз во время этого интервала, это может быть хорошая идея вычислить метрики по требованию:
1 @app.route('/metrics') 2 def metrics(): 3 metrics = "" 4 res = query('SELECT product, count(*) FROM product_view'\ 5 'GROUP BY product') 6 for line in res: 7 metrics += \n' 8 % (line[0], line[1]) 9 return metrics
С помощью этого подхода нам не нужно изменять другие части кода. Вместо этого мы запрашиваем базу данных, чтобы получить эту информацию. Обратите внимание, что в этом примере метрики, касающиеся покупок, удаляются для повышения читаемости.
Использование клиентской библиотеки PROMETHEUS
Вероятно, есть Библиотека для вашего языка Это позаботится о производстве текстового формата PROMETHEUS.
Это обеспечит Прилавок
и Датчик
Объекты для реализации ваших метрик:
1 from prometheus_client import Counter 2 3 view_metric = Counter('view', 'Product view') 4 5 @app.route('/view/') 6 def view_product(id): 7 # Update metric 8 view_metric.inc() 9 return "View %s" % id
- Линия 1: Загрузка клиентской библиотеки PROMETHEUS
- Строка 3: Создание
Счетчик
Метрики с именем и описанием - Строка 8: Здесь код гораздо проще, как нам нужно только позвонить
inc ()
методСчетчик
объект
Обратите внимание, что _total
Суффикс будет добавлен в метрическое имя, потому что это Счетчик
и другая метрика с _created
Суффикс будет содержать метку времени создания счетчика.
Добавление этикеток
Пока что мы не обрабатывали этикетки. Давайте посмотрим, как мы можем добавить их сейчас:
1 from prometheus_client import Counter 2 3 view_metric = Counter('view', 'Product view', ['product']) 4 5 @app.route('/view/') 6 def view_product(id): 7 # Update metric 8 view_metric.labels(product=id).inc() 9 return "View %s" % id
- Строка 3: Дополнительный параметр определяет допустимые метки для
Вид
метрика - Строка 8: звонок в
Ярлыки ()
Позволяет устанавливать значения метки и, таким образом, выберите Временные серии это будет увеличено
Наконец, в Метрики ()
Функция, нам просто нужно получить все метрики в текстовом формате PROMETHEUS, используя generate_latest ()
Функция:
1 from prometheus_client import generate_latest 2 3 @app.route('/metrics') 4 def metrics(): 5 return generate_latest()
Вот полный пример:
from flask import Flask from prometheus_client import Counter, generate_latest app = Flask(__name__) view_metric = Counter('view', 'Product view', ['product']) buy_metric = Counter('buy', 'Product buy', ['product']) @app.route('/view/') def view_product(id): view_metric.labels(product=id).inc() return "View %s" % id @app.route('/buy/ ') def buy_product(id): buy_metric.labels(product=id).inc() return "Buy %s" % id @app.route('/metrics') def metrics(): return generate_latest()
Использование Python Decorator
Библиотека Python Также есть несколько хороших декораторов.
Например, вы можете отслеживать время, проведенное в функции, используя @ <Метрика> .time ()
Декоратор:
import time import random from prometheus_client import Summary duration = Summary('duration_compute_seconds', 'Time spent in the compute() function') @duration.time() def compute(): time.sleep(random.uniform(0, 10))
С Счетчик
Вы можете отслеживать выброшенные исключения в частности функции:
import time import random from prometheus_client import Counter exception = Counter('compute_exception', 'Exception thrown in compute() function') @exception.count_exceptions() def compute(): if random.uniform(0, 10) > 7: raise Exception("Random error")
Метрики по требованию с библиотекой Прометея
Ранее, наблюдаемое по заявлению по требованию может быть реализована с библиотекой PROMETHEUS, установив функцию обратного вызова при определении метрики:
stock_metric = Counter('stock', 'Stock count') stock_metric.set_function(compute_stock) def compute_stock(): res = query('SELECT count(*) FROM product_stock') for line in res: return line[0]
Вы можете, конечно, смешивать метрики, управляемые inc ()
и Установить ()
С другими метриками с использованием функции обратного вызова.
В следующем посте в блоге мы увидим:
- Как визуализировать показатели приложений с использованием композиции докера, которая включает PROMETHEUS и GRAFANA
- Как использовать новые метрики, чтобы контролировать приложение в кластере Kubernetes.
Оператор Premetheus для разработчиков (4 частью части)
Оригинал: “https://dev.to/camptocamp-ops/implement-prometheus-metrics-in-a-flask-application-p18”