Образовательный проект «SnakeProject» Михаила Козлова

Навигация

⇒ FreeBSD and Nix ⇐

CISCO

Voice(Asterisk\Cisco)

Microsoft

Powershell

Python

SQL\T-SQL

Общая

WEB Разработка

ORACLE SQL \ JAVA

Мото

Стрельба, пневматика, оружие

Саморазвитие и психология


Prometheus часть 7 допы


Prometheus часть 7 допы

В продолжении статьи:
http://snakeproject.ru/rubric/article.php?art=prometheus_6_16072024

Настало время поговорить о доп. возможностях прометея


Резервная копия 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

Пример сервиса:
# cat <<'EOF' > /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/opt/prometheus/prometheus \
    --config.file /opt/prometheus/prometheus.yml \
    --storage.tsdb.retention.time=1y \
    --storage.tsdb.path /opt/prometheus/data/ \
    --web.console.templates=/opt/prometheus/consoles \
    --web.console.libraries=/opt/prometheus/console_libraries \
    --web.enable-admin-api

[Install]
WantedBy=multi-user.target
EOF

Перечитать конфиг:
# systemctl daemon-reload
# systemctl restart prometheus
# systemctl status prometheus

Пример бэкапа

# apt install jq

Создай снапшот:
# snapshot=$(curl -s -XPOST http://127.0.0.1:9090/api/v1/admin/tsdb/snapshot|jq .data.name|sed 's/"//g')

Переносим снапшот:
# tar -czf backup_name.tgz /opt/prometheus/snapshots/${snapshot}

Удаляем снапшот:
# rm -rf /opt/prometheus/snapshots/*

Для восстановления просто скопируйте каталоги данных из снимка в /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 дней

Метрики, относящиеся к tsdb:
root@serv:/opt/prometheus/data# curl -s localhost:9090/metrics | grep tsdb | grep -v ^#

Для хранения большого количества метрик выгружайте ихи во внешнее хранилище например postgres, используйте remote write / read api

Список remote адаптеров:
https://prometheus.io/docs/operating/integrations/#remote-endpoints-and-storage

Ранее был доступен вариант с postgresq:
https://github.com/timescale/prometheus-postgresql-adapter
Однако он был заменен на PROMSCALE, который более не поддерживается

Попробуем установить аналог - timescaledb:
https://docs.timescale.com/self-hosted/latest/install/installation-linux/

Установите последние пакеты PostgreSQL:
# sudo apt install gnupg postgresql-common apt-transport-https lsb-release wget
# sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
# sudo apt install postgresql-server-dev-14

Добавьте репозитории timescaledb:
# echo "deb https://packagecloud.io/timescale/timescaledb/ubuntu/ $(lsb_release -c -s) main" | sudo tee /etc/apt/sources.list.d/timescaledb.list
# wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/timescaledb.gpg
# wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | sudo apt-key add -
# sudo apt update

Установите TimescaleDB:
# sudo apt install timescaledb-2-postgresql-14 postgresql-client-14 promscale=0.12.1 promscale-extension-postgresql-14
# sudo timescaledb-tune
# sudo systemctl restart postgresql

# 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 можно так:
# wget https://github.com/timescale/promscale/releases/download/0.4.1/promscale_0.4.1_Linux_x86_64
# mv promscale_0.4.1_Linux_x86_64 promscale
# chmod +x promscale
# ./promscale -db-uri postgres://test:123456789@localhost:5432/timescale?sslmode=disable

Вывести помощь по утилите 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

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']

remote_write:
  - url: "http://localhost:9201/write"
remote_read:
  - url: "http://localhost:9201/read"
    read_recent: true

Перезапуск:
# systemctl restart prometheus

Подключимся к БД promscale и посмотрим пришедшие данные:
# sudo -u postgres psql
\c timescale
select * from label;
select * from metric;

Таким образом мы научили прометея писать, читать и хранить метрики во внешней базе данных


Федерация

Оф. док.:
https://prometheus.io/docs/prometheus/latest/federation/

Возможность передавать метрики с одного сервера prometheus на другой

Настройте для начала правила агрегации в rule_files

Пример, имеется экземпляр prometheus, который собирает данные с целей через node_exporter

prometheus.yml:
global:
  scrape_interval:     15s
  evaluation_interval: 15s
  external_labels:
    office: num_one

rule_files:
  - "rules.yml"

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']

  - job_name: 'node'
    static_configs:
    - targets: ['localhost:9100']

Параметр 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 - список действий, применимых к метрике

Проверка:
# ./promtool check config ./prometheus.yml
# systemctl restart prometheus

# ./promtool query instant http://localhost:9090/ 'sum without(instance)(node_memory_MemFree_bytes{job="node"})'
{job="node"} => 987654321 @[111.222]

# ./promtool query instant http://localhost:9090/ 'job:node_memory_MemFree_bytes:sum'
job:node_memory_MemFree_bytes:sum{job="node"} => 987654321 @[111.222]

Теперь мы имеем новую агрегированную метрику

На втором сервере

prometheus.yml:
global:
  scrape_interval:     15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']

  - job_name: federation
    honor_labels: true
    metrics_path: /federate
    params:
      match[]:
        - '{__name__=~"^job:.*"}'
    static_configs:
      - targets:
        - 167.172.104.138:9090

Добавлена задача с именем federation, параметры:
honor_labels: true - сохранять исходные теги instance и job, которые отдал экспортер (prometheus сервер)
metrics_path - откуда надозабирать метрики(exporter по умолчанию /metrics, prometheus по умолчанию federate)
params - описываtn фильтры для метрик, выше фильтруем все метрики по специальному тегу __name__, по имени метрик
- далее вытаскиваем все метрики, начинающиеся со слова job
static_configs - указываем prometheus сервер, с которого забираем метрики

Проверка:
# systemctl restart prometheus
# ./promtool query instant http://localhost:9090/ 'job:node_memory_MemFree_bytes:sum'
job:node_memory_MemFree_bytes:sum{office="num_one", job="node"} => 987654321 @[111.222]

Метрика была успешно забрана с первого 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"})

По отдельности:
node_memory_MemTotal_bytes{}

Использование памяти

Свободно:
100 * (1 - ((avg_over_time(node_memory_MemFree_bytes[5m]) + avg_over_time(node_memory_Cached_bytes[5m]) + avg_over_time(node_memory_Buffers_bytes[5m])) / avg_over_time(node_memory_MemTotal_bytes[5m])))

Занято:
100 * ((avg_over_time(node_memory_MemFree_bytes[5m]) + avg_over_time(node_memory_Cached_bytes[5m]) + avg_over_time(node_memory_Buffers_bytes[5m])) / avg_over_time(node_memory_MemTotal_bytes[5m]))


Проксируем через NGINX

Минутка безопасности, сделаем задачу проксирования с авторизацией prometheus через nginx
Лучше конечно использовать какое-то доменное имя и сертификат например через letsencrypt
Доменное имя для статьи - serv.test.ru

# apt install nginx letsencrypt apache2-utils openssl openssl-blacklist ssl-cert

Сгенерируем хеш пароля для учетки basic авторизации:
# htpasswd -n MyAuthUserName
MyAuthUserName:$1X2X3

# cat /etc/nginx/.htpasswd
MyAuthUserName:$1X2X3

ПОлучим сертификат для домена и настроем базовую аутентификацию

# cd /etc/nginx/sites-enabled/ && rm -rf default

# cat serv.test.ru.conf
server {
  listen 80;
  server_name serv.test.ru;
  location /.well-known {
    root /opt/ssl;
  }
  location / {
    return 301 https://serv.test.ru$request_uri;
  }
}

# nginx -t && systemctl restart nginx
# mkdir /opt/ssl
# letsencrypt certonly --webroot -w /opt/ssl/ -d serv.test.ru

# cat serv.test.ru.conf
server {
  listen 80;
  server_name serv.test.ru;
  location /.well-known {
    root /opt/ssl;
  }
  location / {
    return 301 https://serv.test.ru$request_uri;
  }
}
server {
  listen 443 ssl;
  server_name serv.test.ru;
  ssl on;
  ssl_certificate /etc/letsencrypt/live/serv.test.ru/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/serv.test.ru/privkey.pem;
  location / {
    auth_basic "Restricted";
    auth_basic_user_file .htpasswd;
    proxy_pass http://127.0.0.1:9090;
  }
}

# nginx -t && systemctl restart nginx

Если домена нет, ниже пример с самоподписанным сертификатом

Создать самоподписанный сертификат и ключ:
# openssl genrsa -des3 -out /opt/ssl/server.key 2048
# openssl req -new -key /opt/ssl/server.key -out /opt/ssl/server.csr
# cp /opt/ssl/server.key /opt/ssl/server.key.orig
# openssl rsa -in /opt/ssl/server.key.orig -out /opt/ssl/server.key
# openssl x509 -req -days 3650 -in /opt/ssl/server.csr -signkey /opt/ssl/server.key -out /opt/ssl/server.crt

Далее в конфиге nginx ссылаемся на созданные файлы сертификата SSL:
ssl_certificate /opt/ssl/server.crt;
ssl_certificate_key /opt/ssl/server.key;

Закроем прометей извне /etc/systemd/system/prometheus.service:
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
ExecStart=/opt/prometheus/prometheus \
    --config.file=/opt/prometheus/prometheus.yml \
    --storage.tsdb.path=/opt/prometheus/data \
    --web.console.templates=/opt/prometheus/consoles \
    --web.console.libraries=/opt/prometheus/console_libraries \
    --web.listen-address="127.0.0.1:9090"

[Install]
WantedBy=default.target

Рестарт сервиса:
# systemctl daemon-reload
# systemctl restart prometheus
# systemctl status prometheus

Готово, мы закрыли прометея извне базовой аутентификацией

 


Комментарии пользователей

Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!

Контакты Группа ВК Сборник материалов по Cisco, Asterisk, Windows Server, Python и Django, SQL и T-SQL, FreeBSD и LinuxКод обмена баннерами Видео к IT статьям на YoutubeВидео на другие темы Смотреть
Мои друзья: Советы, помощь, инструменты для сис.админа, статическая и динамическая маршрутизация, FreeBSD

© Snakeproject.ru создан в 2013 году.
При копировании материала с сайта - оставьте ссылку.
Весь материал на сайте носит ознакомительный характер,
за его использование другими людьми, автор ответственности не несет.

Рейтинг@Mail.ru
Рейтинг@Mail.ru Яндекс.Метрика





Поддержать автора и проект