Настало время поговорить о доп. возможностях прометея
Резервная копия prometheus
Необходимо бекапить-копировать директорию с данными
Добавьте prometheus опцию --web.enable-admin-api в конфиг запуска systemctl
Используйте обычный POST запрос для API для создания снапшота tsdb, пример:
# curl -XPOST -D - -s http://localhost:9090/api/v1/admin/tsdb/snapshot {"status":"success","data":{"name":"20180119T172548Z-78ec94e1b5003cb"}}
# cd data/snapshots && ls 20180119T172548Z-78ec94e1b5003cb
Аналог запуска из консоли:
# ./prometheus --storage.tsdb.path=data/ --web.enable-admin-api
Снапшот появится в директории даты, пример /opt/prometheus/data/snapshots
Просто скопируйте директорию для дальнейшего восстановления на любой сервер
Чтобы использовать снимок, укажите на него --storage.tsdb.path
Для восстановления просто скопируйте каталоги данных из снимка в /opt/prometheus/
TSDB
Метрики в prometheus группируются в двухчасовые блоки и сохраняются на диск
Один блок - отдельная директория, которая содержит:
- данные chunks - метрики внутри chunks директории группируются в файлы размером до 512Мб
- metadata файл
index файл, содержащий:
- информацию по метрикам за данный временной промежуток
- лейблы этих метрик
Пример вывода:
root@serv:/opt/prometheus/data# ls -la 12R31ZXTYYX12XZ2R5T3GBHUHH2/ drwxr-xr-x 1 prometheus prometheus 4096 May 09 12:41 chunks -rw-r--r-- 1 prometheus prometheus 31752 May 09 12:41 index
Метрики не сразу попадают на диск, некоторое время находясь в памяти
Для защиты от внезапного отказа, перезагрузки и прочего используется write ahead log (wal)
Благодаря write ahead log prometheus при запуске сможет прочитать историю получения метрик и сохранить их на диск в директории wal
После записи в wal, prometheus сохранит полученные метрики в блоки данных
Основные параметры:
--storage.tsdb.path - путь нахождения данных tsdb, при запуске prometheus в docker данную директорию лучше смонтировать на основную ОС
--storage.tsdb.retention.time - время хранения метрик, по дефолту 15 дней
# sudo -u postgres psql
password postgres;
create user test with password '123456789';
alter user test with superuser;
Подключаем расширение к постгресу:
postgresql.conf:
...
shared_preload_libraries = 'timescaledb'
...
# sudo systemctl restart postgresql
Создадим БД для promscale:
# sudo -u postgres psql
create database timescale owner test;
CREATE EXTENSION IF NOT EXISTS timescaledb;
\dx
You see the list of installed extensions:
List of installed extensions
Name | Version | Schema | Description
-------------+---------+------------+---------------------------------------------------------------------------------------
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
timescaledb | 2.15.1 | public | Enables scalable inserts and complex queries for time-series data (Community Edition)
Press q to exit the list of extensions.
Вывести помощь по утилите promscale:
# promscale --help
Подключение к бд через promscale:
# promscale -db-uri postgres://test:123456789@localhost:5432/timescale?sslmode=disable
Выше timescale - имя БД, структура в БД будет создана после исполнения команды
Настроим remote_write и remote_read в prometheus.yml:
global:
scrape_interval: 15s
evaluation_interval: 15s
Параметр external_labels - внешние теги, которые prometheus будет добавлять всем метрикам
- например когда второй prometheus будет забирать с него метрики через федерацию
- или когда prometheus передает алерты в alertmanager
- или когда prometheus пишет данные во вне
office: num_one - тег со значением
Файл с правилами - rules.yml, ранее уже делали для правил алертинга В данном случае будем добавлять правила создания новых метрик rules.yml:
groups:
- name: globaldc
interval: 5s
rules:
- record: job:node_memory_MemFree_bytes:sum
expr: sum without(instance)(node_memory_MemFree_bytes{job="node"})
По аналогии с правилами алертинга, создана группа globaldc
- Внутри globaldc задан интервал выполнения запросов - interval: 5s (каждые 5 секунд)
Правила rules задано в данном случае лишь одно
- Будет выполнять запрос sum without(instance)(node_memory_MemTotal{job="node"})
- Далее запишет результат выполнения в новую метрику job:node_memory_MemTotal:sum
В кратце: суммируем всю свободную память со всех узлов и сохраняем значение в переменную
Метрика (job:node_memory_MemFree_bytes:sum) отличается по виду от обычных
Правила записи должны иметь форму: level:metric:operations, где:
level - уровень агрегирования
metric - имя метрики, которое должно оставаться неизменным
operations - список действий, применимых к метрике
Добавлена задача с именем federation, параметры:
honor_labels: true - сохранять исходные теги instance и job, которые отдал экспортер (prometheus сервер)
metrics_path - откуда надозабирать метрики(exporter по умолчанию /metrics, prometheus по умолчанию federate)
params - описываtn фильтры для метрик, выше фильтруем все метрики по специальному тегу __name__, по имени метрик
- далее вытаскиваем все метрики, начинающиеся со слова job
static_configs - указываем prometheus сервер, с которого забираем метрики
Метрика была успешно забрана с первого prometheus сервера
К метрике добавился новый тег office: num_one из external_labels нашего первого prometheus сервера
Метрики памяти для использования:
node_memory_MemTotal_bytes
node_memory_MemFree_bytes
node_memory_Cached_bytes
node_memory_Buffers_bytes
Примеры
Объем памяти
Для всех узлов:
sum(node_memory_MemTotal_bytes{})
Для определенных:
sum(node_memory_MemTotal_bytes{instance=~"1.1.1.1:9100|1.1.1.2:9100"})
Минутка безопасности, сделаем задачу проксирования с авторизацией prometheus через nginx
Лучше конечно использовать какое-то доменное имя и сертификат например через letsencrypt
Доменное имя для статьи - serv.test.ru