Мониторинг долгих запросов PostgreSQL в Prometheus

Мониторинг долгих запросов PostgreSQL в Prometheus

Предположим, что у вас есть PostgreSQL (AWS RDS или классический PostgreSQL server), Prometheus, postgres exporter и alertmanager с Grafana.

Стоит задача присылать уведомления о том, что в Postgres подвис запрос. Причина и т.п. нас мало интересует. Нужно просто сказать всем, кому положено, что есть проблема и ее нужно решить.

Для этого нам понадобится немного допилить exporter кастомными метриками. Делается это отдельным файлом конфигурации. Пусть это будет /etc/queries.yaml.

pg_long_running_queries:
  query: |
    SELECT current_database(),
           pid,
           EXTRACT(EPOCH FROM age(clock_timestamp(), query_start)) AS duration_seconds,
           state,
           query
    FROM pg_stat_activity
    WHERE state = 'active' AND now() - query_start > interval '5 minutes';
  metrics:
    - current_database:
        usage: "LABEL"
        description: "Name of DataBase"
    - duration_seconds:
        usage: "GAUGE"
        description: "Duration of long-running queries in seconds"
    - pid:
        usage: "LABEL"
        description: "Process ID"
    - state:
        usage: "LABEL"
        description: "Query state"
    - query:
        usage: "LABEL"
        description: "SQL Query"
[Unit]
Description=Postgres exporter
After=network.target

[Service]
User=postgres
Group=postgres
Type=simple
EnvironmentFile=/etc/postgres_exporter.env
ExecStart=/usr/local/bin/postgres_exporter \
        --config.file=/etc/postgres_exporter.yaml \
        --auto-discover-databases \
        --exclude-databases="rdsadmin,template0,template1,postgres,unused" \
        --collector.stat_statements \
        --collector.long_running_transactions \
        --extend.query-path=/etc/queries.yaml
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

Конфиг самого exporter'a лежит в /etc/postgres_exporter.yaml и окружение в /etc/postgres_exporter.env.

Перезаупскаем postgres_exporter:

systemctl daemon-reload
service postgres_exporter restart

В результате мы в Prometheus должны увидеть метрику pg_long_running_queries_duration_seconds. По ней и строим вот такой алерт:

      - alert: LongQueryDetected
        expr: pg_long_running_queries_duration_seconds{query !~ "VACUUM ANALYZE .*"}
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: Long running query detected (instance {{ $labels.instance }})
          description: "Long running query detected\n  VALUE = {{ $value }}\n  LABELS = {{ $labels }}"

Задача решена.

Read more

🔄 Своя Dropbox-альтернатива: Syncthing

🔄 Своя Dropbox-альтернатива: Syncthing

🧠 Зачем? Облачные сервисы — удобно, но: * не хочется платить Google/Dropbox за хранение своих файлов * хочется моментально синхронизировать фото, документы и заметки между устройствами * и делать это на своём сервере, без отправки данных «в облако» 👉 Решение — Syncthing: децентрализованный, зашифрованный, open source-синк между любыми устройствами. 🚀 Что ты получишь? * 📂 Автосинк папок между сервером,

🎧 Свой подкаст-сервер за 5 минут: Podgrab

🎧 Свой подкаст-сервер за 5 минут: Podgrab

✨ Зачем? Подкасты — отличный способ учиться, развлекаться и быть в курсе мира. Но что, если: * Хочется слушать подкасты офлайн * Хочется архивировать любимые шоу * Не устраивают сторонние сервисы, реклама и трекеры Решение: Podgrab — простой подкаст-граббер, который автоматически скачивает новые выпуски с любого RSS. А в связке с Audiobookshelf ты получаешь полноценный медиасервер.

Безопасное управление конфигурациями в Ansible: Полное руководство по использованию rescue и always

Безопасное управление конфигурациями в Ansible: Полное руководство по использованию rescue и always

Введение: Почему это важно В мире DevOps и системного администрирования существует простое правило: всё ломается. Особенно в самый неподходящий момент. Когда вы изменяете конфигурацию критического сервиса (например, Nginx), цена ошибки может быть очень высока — от простого даунтайма до потери данных. Ansible предлагает элегантное решение для безопасного внесения изменений через механизм

Использование ~/.ssh/authorized_keys для управления входящими SSH-соединениями

Использование ~/.ssh/authorized_keys для управления входящими SSH-соединениями

Файл ~/.ssh/authorized_keys позволяет настроить команды, которые будут выполняться при входящих SSH-соединениях. Это полезный инструмент для управления доступом и обеспечения безопасности, особенно при работе с резервным копированием данных. Настройка резервного копирования с использованием authorized_keys В данном примере рассматривается использование authorized_keys для настройки резервного копирования базы данных Bacula