Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
linux:prom [2023/11/26 07:01] admin |
linux:prom [2024/06/28 05:46] (текущий) admin |
||
---|---|---|---|
Строка 4: | Строка 4: | ||
==== Установка ==== | ==== Установка ==== | ||
==== Использование ==== | ==== Использование ==== | ||
+ | |||
+ | === Варианты тегов в легенде === | ||
+ | {{: | ||
+ | |||
+ | |||
+ | === Дефотное значение при отсутствии данных === | ||
+ | < | ||
+ | sum() OR vector(0) | ||
+ | |||
+ | или, в случае с VictoriaMetrics | ||
+ | sum() OR default 0 | ||
+ | </ | ||
+ | |||
+ | |||
+ | === === | ||
+ | |||
Строка 43: | Строка 59: | ||
Раз на sql это все не похоже то и поддерживать сложный язык запросов нет необходимости, | Раз на sql это все не похоже то и поддерживать сложный язык запросов нет необходимости, | ||
- | </ | ||
- | |||
- | |||
- | |||
- | < | ||
- | < | ||
- | |||
</ | </ | ||
Строка 89: | Строка 98: | ||
==== Prometheus ==== | ==== Prometheus ==== | ||
- | Текстовый формат метрик\\ | ||
Формат представления метрик текстом\\ | Формат представления метрик текстом\\ | ||
Большой шаг на пути к стандартизации формата представления метрик, | Большой шаг на пути к стандартизации формата представления метрик, | ||
- | Формат метрик | + | Включает в себя: |
+ | * сервер - хранился и сборщик | ||
+ | * формат данных | ||
+ | * язык запросов | ||
< | < | ||
- | < | + | < |
+ | Приложение выставляет HTTP страницу с метриками, | ||
+ | Идея в том что прометеус собирает срез во времени, | ||
+ | |||
+ | **Безопасность**\\ | ||
+ | По умолчанию ходит без аутентификации, | ||
+ | * настройка аутентификации средствами прометея | ||
+ | * хостить ендпоинт на отдельном порту | ||
+ | * файерволл | ||
+ | * whitelist на уровне приложения | ||
+ | |||
+ | **Альтернативные способы скрапинга**\\ | ||
+ | Если например приложение не запущено постоянно и/или не имеет HTTP ендпоинта, | ||
+ | * Pushgateway - компонент прометеус, | ||
+ | * Telegraf - в стоке есть output-плагин для публикации в HTTP endpoint | ||
+ | * StatsD Exporter - еще какая то тема, аналогично | ||
</ | </ | ||
Строка 103: | Строка 129: | ||
< | < | ||
- | < | + | < |
+ | <code bash> | ||
+ | # HELP http_requests_total Requests made to public API | ||
+ | # TYPE http_requests_total counter | ||
+ | http_requests_total{method=" | ||
+ | http_requests_total{method=" | ||
+ | http_requests_total{method=" | ||
+ | </code> | ||
+ | Каждая метрика содержит поля:\\ | ||
+ | * HELP описание | ||
+ | * TYPE тип метрики | ||
+ | * < | ||
+ | * набор key-value лейблов (теги) | ||
+ | * значение метрики (double) | ||
+ | * после сборка добавляется еще timestamp | ||
+ | |||
+ | Хранение: | ||
+ | Все теги вместе описывают собой **time series** (временной ряд), т.е. это как бы имя таблицы, | ||
+ | Из примера выше у нас одна метрика но три таблицы (GET /message; POST /message; POST /login), в каждую таблицу, | ||
+ | |||
+ | **Кардинальность**\\ | ||
+ | Каждое новое значение тега это уже новый временной ряд, т.е. новая таблица\\ | ||
+ | Например метрика о HTTP запросах, | ||
+ | В целом TSDB справляется и с десятками миллионов рядов, но комбинаторный взрыв устроить очень легко\\ | ||
</ | </ | ||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | В данном случае, | ||
+ | Тип скорее нужен для программистов и библиотек, | ||
+ | |||
+ | **Counter**\\ | ||
+ | Счетчик, | ||
+ | Как узнать сколько было запросов если есть всего одно число? смотреть дельту, | ||
+ | |||
+ | |||
+ | **Gauge**\\ | ||
+ | " | ||
+ | |||
+ | |||
+ | **Histogram**\\ | ||
+ | Гистограмма - агрегация чего то самим приложением, | ||
+ | |||
+ | Например определили 4 бакета с длительностью запроса, | ||
+ | В метриках добавляется тег " | ||
+ | :!: **Гистограмма считает кол-во попаданий** в какую то группу т.е. запоминает счетчики а не сами значения. Каждый бакет как бы отдельная метрика\\ | ||
+ | Агрегируется в т.н. **квантили**. Если вы не знаете какие именно бакеты нужны, есть другой тип **Summary** | ||
+ | |||
+ | <code bash> | ||
+ | # Пример метрики: | ||
+ | http_duration_bucket{url="/", | ||
+ | http_duration_bucket{url="/", | ||
+ | http_duration_bucket{url="/", | ||
+ | http_duration_bucket{url="/", | ||
+ | |||
+ | http_duration_sum{url="/" | ||
+ | http_duration_count{url="/" | ||
+ | </ | ||
+ | |||
+ | |||
+ | **Summary**\\ | ||
+ | Сводка. Это результат **агрегации гистрограммы**, | ||
+ | |||
+ | По сути получается что считаются квантили, | ||
+ | :!: интерпретация " | ||
+ | :!: Саммари не рекомендуется агрегировать или делать это аккуратно, | ||
+ | |||
+ | |||
+ | <code bash> | ||
+ | # Пример метрики: | ||
+ | http_duration_summary{quantile=" | ||
+ | http_duration_summary{quantile=" | ||
+ | http_duration_summary{quantile=" | ||
+ | http_duration_summary{quantile=" | ||
+ | http_duration_summary{quantile=" | ||
+ | |||
+ | http_duration_summary_sum 152.7625769 | ||
+ | http_duration_summary_count 141 # и количество значений | ||
+ | </ | ||
+ | |||
+ | Сводки хранятся в памяти на стороне приложения, | ||
+ | Есть разные алгоритмы для очистки старых данных, | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | === Перцентили === | ||
+ | Перцентили нужны для того чтобы описать массив данных одним числом\\ | ||
+ | Например чтобы понять как ведет себя приложение в целом, отбрасывая единичные выбросы\\ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | Метрика это временной ряд т.е. набор значений во времени, | ||
+ | условно [1, | ||
+ | |||
+ | Как обобщить эти данные ? самое популярное это вывести среднее, | ||
+ | |||
+ | В какой то теоретической сфере вполне правильно и удобно, | ||
+ | Но в какой то практическое сфере, прикладной, | ||
+ | |||
+ | |||
+ | **Медиана**\\ | ||
+ | Средний элемент т.е. буквально в середине (упорядоченного) массива, | ||
+ | Ну и даже на вскидку, | ||
+ | [0,1,3,7, 8, 12, | ||
+ | |||
+ | Восьмерка взята прямо из массива, | ||
+ | Так же можно выделить мин и макс в этом числовом ряду т.е. 0% и 100%\\ | ||
+ | < | ||
+ | 0% < 0 | ||
+ | 50% <= 8 | ||
+ | 100% <= 186 | ||
+ | </ | ||
+ | |||
+ | Будет полезно посчитать например 90%, 95%, 99% от подобного ряда, чтобы охватить как можно больше | ||
+ | Это и будет называться 90ым, 95ым, 99ым перцентилем, | ||
+ | |||
+ | :!: Перцентили позволяют нарезать слоями наш массив и понять на какие группы делятся элементы, | ||
+ | |||
+ | |||
+ | **Пример с мониторингом приложения**\\ | ||
+ | Предположим что этот массив чисел это длительность выполнения запросов в секундах к нашему приложению, | ||
+ | |||
+ | Среднее арифметическое будет 27.5с\\ | ||
+ | Медиана (он же 50% перцентиль) 8с\\ | ||
+ | p90,95 и 99 в данном случае будут 17с т.к. выборка очень небольшая они совпадают\\ | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | Для подсчета такой статистики нужна история данных, | ||
+ | |||
+ | Например в случае с временем запросов к приложению можем выделить несколько бакетов типа "<= 3,5,7 секунд" | ||
+ | </ | ||
+ | |||
+ | Возвращаясь к Prometheus, перцентили в нем встречаются в двух случаях, | ||
+ | |||
+ | **Процентиль** просто вариант перевода на русский язык т.е. полный синоним слова перцентиль\\ | ||
+ | |||
+ | **Квартиль** - это четверти т.е 25%, 50%, 75% и 100% (первый, | ||
+ | |||
+ | **Квантиль** - тоже самое что и перцентиль только в случае если вероятность выражается не в процентах\\ | ||
+ | |||
+ | | {{: | ||
+ | | {{: | ||
=== PromQL === | === PromQL === | ||
+ | Каждая метрика это временной ряд, отдельная таблица, | ||
+ | |||
< | < | ||
- | < | + | < |
+ | В самом простом случае, | ||
+ | |||
+ | < | ||
+ | http_requests_total | ||
+ | |||
+ | # Имя метрики тоже является тегом | ||
+ | {__name__=" | ||
+ | |||
+ | # Теги можно фильтровать | ||
+ | http_requests_total{job=" | ||
+ | </ | ||
+ | |||
+ | |||
+ | **Range vector**\\ | ||
+ | Так же можно задать временной диапазон, | ||
+ | В таком случае мы получаем т.н. **" | ||
+ | < | ||
+ | http_requests_total{job=" | ||
+ | </ | ||
+ | |||
+ | Простой запрос возвращает **" | ||
+ | |||
+ | В случае с **range вектором**, | ||
+ | < | ||
+ | [ 5, | ||
+ | [2], [3], [4] | ||
+ | [3], [4], [5] | ||
+ | [4], [5], [6] | ||
+ | </ | ||
+ | |||
+ | Но такие данные на двумерном графике ес-но рисоваться не могут, поэтому их нужно сначала привести к простому виду, к " | ||
+ | т.е. если мы применяем диапазон времени для сглаживания графика, | ||
+ | |||
+ | :!: На счет интервала, | ||
+ | |||
+ | < | ||
+ | В случае с графаной, | ||
+ | Переменная интервала призвана динамически подбирать интервал, | ||
+ | </code> | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | <summary>:!: Запросы</ | ||
+ | |||
+ | < | ||
+ | # OR | ||
+ | http_requests_total{app=~" | ||
+ | |||
+ | # AND (# найдет все tag, начинающиеся на aaa И заканчивающиеся на bbb) | ||
+ | metric{tag=~" | ||
+ | |||
+ | # запрос, | ||
+ | metric{tag=" | ||
+ | |||
+ | # вернет пересечение: | ||
+ | metric1 and metric2{tag=" | ||
+ | |||
+ | # Запрос, | ||
+ | total_ram{instance=" | ||
+ | </ | ||
+ | |||
+ | |||
+ | **Агрегация**\\ | ||
+ | < | ||
+ | # Сумма. Например есть метрика с двумя разными тегами | ||
+ | http_requests_total{app=" | ||
+ | http_requests_total{app=" | ||
+ | |||
+ | # Просуммируем значения со всеми вариантами (! попавшими под запрос) | ||
+ | sum(http_requests_total) | ||
+ | |||
+ | # Для того чтобы отображать не все теги, их можно группировать, | ||
+ | sum (http_requests_total) by (app, instance) | ||
+ | |||
+ | # Группировка по всем кроме указанных | ||
+ | sum (http_requests_total) without (instance) | ||
+ | </ | ||
+ | |||
+ | |||
+ | **Функции**\\ | ||
+ | Популярна ф-я **rate**. Применяется к постоянно возрастающим счетчикам, | ||
+ | Учитывает сбросы метрик приложения (рестарт например), | ||
+ | |||
+ | **deriv** аналог rate() но не для счетчиков а для метрик которые меняются в обе стороны, | ||
+ | Обе ф-ии принимают **range vector**\\ | ||
+ | |||
+ | **histogram_quantile**\\ | ||
+ | Принимает **instant vector**, позволяет посчитать нужный перцентиль из гистограммы, | ||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | rate(http_requests_total{app=" | ||
+ | deriv(ram_free{host=" | ||
- | В случае с Прометеем, для группировки интервалов следует использовать переменную **$__rate_interval** вместо " | + | histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) |
- | Переменная интервала призвана динамически подбирать интервал, для прометея rate_interval оптимизирована гораздо лучше\\ | + | histogram_quantile( |
+ | 0.95, | ||
+ | sum by (url, le) ( | ||
+ | rate(http_request_duration_seconds_bucket[5m]) | ||
+ | ) | ||
+ | ) | ||
+ | </ | ||