Презентация

Метрики в Go и Prometheus: что считать и как это читать

Вводный материал о метриках: зачем они нужны, чем отличаются counter, gauge, summary и histogram, и как такие показатели выглядят в коде Go.

О чем этот материал

Prometheus, exporter, scrape, типы метрик и практический взгляд на observability.

Это адаптированная версия учебной презентации: слайды разобраны в формате обычной статьи, чтобы материал было легче читать с телефона и возвращаться к нужным блокам позже.

Что внутри

Ниже краткий план материала. По нему удобно понять, в каком порядке разбирать тему.

  1. Поговорим о том, зачем нам метрики и как они выглядят в Prometheus
  2. Поговорим о том, что такое exporter
  3. Рассмотрим основные типы метрик и их особенности
  4. Посмотрим как писать метрики из кода Go приложения
  5. Разберем вопросы

Метрики на примере

Prometheus

Эта тема начинает по-настоящему работать, когда вы связываете название метрики с вопросом, на который она должна ответить.

Основные понятия

Иллюстрация к теме Основные понятия
Иллюстрация из учебного материала.

http_requests_total{code="200", handler="billing", method="get"} 69875

Prometheus.

выполняются раз в интервал времени. Этот интервал называют scrape interval.

Экспортер, как правило, не хранит метрики во времени (хотя можно и так), а только конечные значения, которые перезаписываются

  • Метрика – имя, метки (теги, labels), значение.
  • Сбор метрик может происходить по модели Pull или Push
  • Exporter - это приложение, которая предоставляет метрики в формате
  • Запрос метрики у Экспортера называется scrape. Запросы

Prometheus. Типы метрик. Основные

старта (рестарта) Экспортера. По сути счетчик.

(например, объём используемой оперативной памяти). По сути датчик.

  • Counter - числовое значение, которое постоянно увеличивается, с самого
  • Gauge - значение, которое может как увеличиваться, так и уменьшаться
Эта тема начинает по-настоящему работать, когда вы связываете название метрики с вопросом, на который она должна ответить.

Prometheus. Типы метрик. Counter

Отображение метрик типа Counter в сыром виде

Эта тема начинает по-настоящему работать, когда вы связываете название метрики с вопросом, на который она должна ответить.

Prometheus. Типы метрик. Counter increase(some_metric_name{}[1m])

Эта тема начинает по-настоящему работать, когда вы связываете название метрики с вопросом, на который она должна ответить.

Prometheus. Типы метрик. Составные

Например: 0.5, 0.8, 0.9, 0.95, 1. Что соответствует процентам 50%, 80% и так далее;

для длительности http-запроса: 100мс, 200мс, 400мс, 800мс, 1.6с Если промахнулись с порогами – метрика может стать бесполезной.

  • Summary – Данные распределяются по квантилям, т.е. числа от 0 до 1.
  • Histogram – Задаем пороги для значений выборки (агрегации). Например,
Эта тема начинает по-настоящему работать, когда вы связываете название метрики с вопросом, на который она должна ответить.

Prometheus. Типы метрик. Summary

Значение квантиля попадает в метку (label) quantile.

были <= X.

событий – в метрику с постфиксом _count и общая сумма всех событий с постфиксом _sum.

Что это значит:

  • По всем событиям вычисляет квантили (0.5, 0.75, 0.9, 0.95, 0.99, 1).
  • Значение X для квантиля 0.9 означает, что для 90% событий показания
  • Помимо квантилей всегда записывается количество полученных
Эта тема начинает по-настоящему работать, когда вы связываете название метрики с вопросом, на который она должна ответить.

Prometheus. Типы метрик. Histogram

(buckets)

заданного порога

событий – в метрику с постфиксом _count и общая сумма всех событий с постфиксом _sum.

Что это значит:

  • Требует, чтобы при инициализации были заданы пороги для “бакетов”
  • Считает количество событий, значения которых были меньше
  • Помимо бакетов всегда записывается общее количество полученных
Эта тема начинает по-настоящему работать, когда вы связываете название метрики с вопросом, на который она должна ответить.

Пишем метрики из приложения Go https://github.com/prometheus/client_golang

Эту часть лучше читать как рабочую инструкцию: цель не выучить команды наизусть, а понять, какую проблему каждая из них решает.

Пишем метрики из приложения Go

значений мерики

  • Используем отдельный HTTP сервер на отдельном порту
  • Используем готовый хэндлер из библиотеки
  • Готовим переменную для метрики
  • Объявляем метрику и ее параметры
  • Пишем метод для обновления
Эта тема начинает по-настоящему работать, когда вы связываете название метрики с вопросом, на который она должна ответить.

Давайте посмотрим как это работает