Рубрики
Без рубрики

Реализуйте метрики прометея в колбе приложения

Учитесь добавлять метрики PROMETHEUS в существующее приложение Python, шаг за шагом. Теги с колбой, Python, Premetheus, учебником.

Оператор 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”