доступность и нагрузка, использование ресурсов, работа InnoDB, медленные запросы и блокировки.

Ниже приведены главные метрики Prometheus (mysqld_exporter), которые обязательно нужно выводить на дашборд, и их критические пороги.

---

1. Доступность и подключения

  • mysql_up — статус доступности MariaDB (1 — работает, 0 — база упала).
  • mysql_global_status_threads_connected — текущее количество активных клиентов.
  • mysql_global_variables_max_connections — лимит подключений.
  • *Формула утилизации пул-подключений:* (threads_connected / max_connections) * 100
  • *Что смотреть:* Если значение превышает 80–85%, база скоро начнет отклонять новые соединения с ошибкой Too many connections.
  • mysql_global_status_threads_running — количество потоков, выполняющих запрос *прямо сейчас*.
  • *Что смотреть:* В норме значение не должно превышать количество CPU-ядер сервера. Резкий спайк говорит об «аварии» или зависших блокировках.

---

2. Производительность (QPS / TPS)

  • rate(mysql_global_status_questions[5m]) — количество запросов в секунду (QPS).
  • rate(mysql_global_status_commands_total[5m]) — разбивка запросов по типам (select, insert, update, delete).
  • *Что смотреть:* Помогает понять профиль нагрузки (Read-Heavy или Write-Heavy) и отследить аномальные всплески трафика.

---

3. Буферный пул InnoDB (InnoDB Buffer Pool)

Буферный пул — главный элемент кэширования MariaDB.

  • mysql_global_status_buffer_pool_reads / mysql_global_status_buffer_pool_read_requests
  • *Формула Cache Hit Ratio (эффективность кэша):*

$$100 - \left( \frac{\text{rate}(\text{buffer\_pool\_reads}[5m])}{\text{rate}(\text{buffer\_pool\_read\_requests}[5m])} \times 100 \right)$$

*   *Что смотреть:* Значение **Cache Hit Ratio должно быть \(> 99\%\)**. Если оно падает ниже 95%, оперативной памяти не хватает для рабочей выборки (Working Set), и MariaDB постоянно читает данные с диска.
  • mysql_global_status_innodb_buffer_pool_pages_dirty — количество «грязных» страниц в памяти, которые ещё не скинуты на диск.
  • *Что смотреть:* Если показатель стабильно высок, дисковая подсистема не успевает сбрасывать данные.

---

4. Медленные запросы и блокировки (Slow Queries & Locks)

  • rate(mysql_global_status_slow_queries[5m]) — динамика роста медленных запросов.
  • *Что смотреть:* Любой рост графика сигнализирует о неоптимизированных SQL-запросах или отсутствии индексов.
  • mysql_global_status_innodb_row_lock_waits — количество ожиданий разблокировки строк.
  • mysql_global_status_innodb_row_lock_time_avg — среднее время ожидания блокировки строки (в мс).
  • *Что смотреть:* Рост этих показателей указывает на транзакции, которые блокируют таблицы/строки и выстраивают очереди из других запросов.

---

5. Дисковый ввод-вывод и лог транзакций (Redo Log)

  • rate(mysql_global_status_innodb_data_written[5m]) / rate(mysql_global_status_innodb_data_read[5m]) — объем чтения и записи на диск за секунду.
  • mysql_global_status_innodb_os_log_pending_writes — очереди на запись в Redo Log.
  • *Что смотреть:* Значение больше 0 говорит об упирании в IOPS/пропускную способность диска.

---

Готовые ID дашбордов для импорта в Grafana

Чтобы не собирать дашборд вручную, импортируйте готовые комьюнити-панели (в Grafana: Dashboards -> Import):

1. 7362 (*MySQL / MariaDB Overview*) — базовый сбалансированный дашборд.
2. 14057 (*MySQL Full*) — детализированный дашборд с глубокой аналитикой InnoDB и потоков.

******

Вот готовые PromQL-выражения с оптимальными параметрами усреднения и защиты от дивизии на ноль (деления на 0).

---

1. % задействованных подключений (Connection Pool Usage)

Вычисляет процент используемых клиентских подключений от установленного лимита max_connections.

(
  mysql_global_status_threads_connected 
  / 
  mysql_global_variables_max_connections
) * 100
  • Единицы измерения в Grafana: Percent (0-100) или percent (0.0-1.0) *(если убрать * 100)*.
  • Порог для предупреждений: $> 80\%$.

---

2. QPS (Queries Per Second)

Общее количество выполняемых базой данных SQL-запросов в секунду.

rate(mysql_global_status_questions[5m])
  • Единицы измерения в Grafana: ops/sec (short: ops).
  • Альтернатива (все команды): Если questions не учитывает подготовленные стейтменты (prepared statements) в вашей сборке, используйте:
sum(rate(mysql_global_status_commands_total[5m]))

---

3. InnoDB Buffer Pool Hit Ratio (Эффективность кэша)

Процент запросов к данным, успешно прочитанных из оперативной памяти (буферного пула), а не с диска.

(
  1 - (
    rate(mysql_global_status_buffer_pool_reads[5m])
    / 
    clamp_min(rate(mysql_global_status_buffer_pool_read_requests[5m]), 1)
  )
) * 100
  • Единицы измерения в Grafana: Percent (0-100).
  • Особенности: Функция clamp_min(..., 1) исключает ошибку деления на ноль при отсутствии нагрузки на БД.
  • Целевое значение: $> 99\%$. Падение ниже 95% указывает на нехватку innodb_buffer_pool_size.

---

Дополнительные полезные выражения для этого же дашборда

  • Thread Concurrency (Running vs Connected):
  • Активно выполняют запросы: mysql_global_status_threads_running
  • Все подключенные: mysql_global_status_threads_connected
  • Slow Queries Rate (Рост медленных запросов в секунду):
rate(mysql_global_status_slow_queries[5m])
  • InnoDB Dirty Pages Ratio (% "грязных" страниц в памяти):
(
  mysql_global_status_buffer_pool_pages_dirty 
  / 
  mysql_global_status_buffer_pool_pages_total
) * 100