Мониторинг MySQL с помощью Proto Observability
На этой странице:
- Сбор основных метрик MySQL
- Сбор метрик уровня SQL-запросов
- Собираемые метрики
- Ключевые метрики для дашбордов и алертов
- Сбор логов MySQL
Сбор основных метрик MySQL
Убедитесь, что у вас установлен и настроен ProtoOBP агент.
Конфигурация MySQL
Для подключения агента ProtoOBP к MySQL необходимо создать пользователя с правами только на чтение для этого:
Создайте нового пользователя
protoobp:CREATE USER 'protoobp'@'%' IDENTIFIED BY '<пароль>';Задайте права для сбора метрик пользователю
protoobp:Для MySQL 5.6 и 5.7:
ALTER USER 'protoobp'@'%' WITH MAX_USER_CONNECTIONS 5; GRANT REPLICATION CLIENT ON *.* TO 'protoobp'@'%'; GRANT PROCESS ON *.* TO 'protoobp'@'%';Для MySQL 8.0+ (
MAX_USER_CONNECTIONSзадаётся черезALTER USER):ALTER USER 'protoobp'@'%' WITH MAX_USER_CONNECTIONS 5; GRANT REPLICATION CLIENT ON *.* TO 'protoobp'@'%'; GRANT PROCESS ON *.* TO 'protoobp'@'%';
Если на сервере MySQL включена
performance_schema(в MySQL 8.0 — по умолчанию), для сбора метрик добавьте соответствующие права пользователюprotoobp:GRANT SELECT ON performance_schema.* TO 'protoobp'@'%';
`host` вместо `localhost`
В конфигурации проверки (host: или autodiscovery-лейбл com.protoobp.ad.instances)
указывайте 127.0.0.1 или имя docker-сервиса/хоста — не localhost:
клиент MySQL для localhost ходит через Unix-сокет, которого в контейнере
агента нет.Конфигурация ProtoOBP агента
Если агент запускается в виде службы на хосте
Создайте файл
/etc/protoobp-agent/conf.d/mysql.d/conf.yaml:init_config: instances: - host: 127.0.0.1 # Не используйте localhost port: 3306 # Порт MySQL username: protoobp password: "<пароль>" # Пароль пользователя protoobp options: replication: false # true — если экземпляр в репликации galera_cluster: false # true — для узла Galera/PXC extra_status_metrics: true # доп. метрики из SHOW GLOBAL STATUS extra_innodb_metrics: true # доп. метрики SHOW ENGINE INNODB STATUS extra_performance_metrics: true # per-schema метрики из performance_schema schema_size_metrics: false # размеры схем (тяжёлый запрос — выключено) disable_innodb_metrics: falseПерезапустите агента:
systemctl restart protoobp-agent.
Если агент запускается в виде Docker контейнера
Добавьте autodiscovery-лейблы к контейнеру MySQL. В docker-compose.yaml:
labels:
com.protoobp.ad.check_names: '["mysql"]'
com.protoobp.ad.init_configs: '[{}]'
com.protoobp.ad.instances: '[{"host": "%%host%%", "port": 3306, "username": "protoobp", "password": "<пароль>", "options": {"replication": false, "extra_status_metrics": true, "extra_innodb_metrics": true, "extra_performance_metrics": true, "schema_size_metrics": false}}]'
или в Dockerfile:
LABEL "com.protoobp.ad.check_names"='["mysql"]'
LABEL "com.protoobp.ad.init_configs"='[{}]'
LABEL "com.protoobp.ad.instances"='[{"host": "%%host%%", "port": 3306, "username": "protoobp", "password": "<пароль>", "options": {"replication": false, "extra_status_metrics": true, "extra_innodb_metrics": true, "extra_performance_metrics": true, "schema_size_metrics": false}}]'
%%host%% — шаблонная переменная autodiscovery, агент подставляет IP контейнера
MySQL в общей docker network.
Контейнер агента
Контейнер агента должен находиться в той же docker network, что и MySQL, и иметь смонтированный/var/run/docker.sock:/var/run/docker.sock:ro для
autodiscovery контейнеров. JMX-образ (-jmx) здесь не нужен — mysql это
не JMX-проверка.Проверка
Убедитесь, что проверка запустилась и собирает метрики:
docker exec protoobp-agent agent status | grep -A 8 "mysql ("
Ожидаемый вывод — Instance ID: ... [OK] и ненулевое число Metric Samples
(например, около 153 уникальных метрик mysql_*):
mysql (8.5.1)
-------------
Instance ID: mysql:21409e6f77f7014b [OK]
Total Runs: 12
Metric Samples: Last Run: 154, Total: 1,845
Service Checks: Last Run: 1, Total: 12
Average Execution Time : 48ms
Сервис-проверка подключения должна быть OK:
docker exec protoobp-agent agent check mysql | grep -A2 mysql.can_connect
Полный список собранных серий и их значения:
docker exec protoobp-agent agent check mysql --check-rate
В веб-интерфейсе ProtoOBP метрики появятся в разделе Базы данных > MySQL
(новый сервис именуется по хосту; на появление данных нужно около 1 минуты).
Обратите внимание
Для отображения нового хоста СУБД следует обновить страницу браузера целиком (кнопкаОбновить в правом верхнем углу веб-консоли обновляет только значения
метрик на дашборде, но не список серверов).Сбор метрик уровня SQL-запросов
Данная опция позволяет видеть метрики по каждому SQL-запросу используя performance_schema.
Конфигурация MySQL
Включение performance_schema
Измените файл конфигурации MySQL (обычно /etc/my.cnf) и включите performance_schema, а также необходимые параметры:
[mysqld]
performance_schema=ON
max_digest_length=4096
performance_schema_max_digest_length=4096
performance_schema_max_sql_text_length=4096
performance-schema-consumer-events-statements-current=ON
performance-schema-consumer-events-waits-current=ON
performance-schema-consumer-events-statements-history-long=ON
performance-schema-consumer-events-statements-history=ON
Примените конфигурацию, перезапустив MySQL.
Создание или изменение служебного пользователя
CREATE USER protoobp@'%' IDENTIFIED by '<пароль>';
ALTER USER protoobp@'%' WITH MAX_USER_CONNECTIONS 5;
GRANT REPLICATION CLIENT ON *.* TO protoobp@'%';
GRANT PROCESS ON *.* TO protoobp@'%';
GRANT SELECT ON performance_schema.* TO protoobp@'%';
Создание служебных таблиц в базе
CREATE SCHEMA IF NOT EXISTS protoobp;
GRANT EXECUTE ON protoobp.* to protoobp@'%';
GRANT CREATE TEMPORARY TABLES ON protoobp.* TO protoobp@'%';
DELIMITER $$
CREATE PROCEDURE protoobp.explain_statement(IN query TEXT)
SQL SECURITY DEFINER
BEGIN
SET @explain := CONCAT('EXPLAIN FORMAT=json ', query);
PREPARE stmt FROM @explain;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END $$
DELIMITER ;
DELIMITER $$
CREATE PROCEDURE protoobp.enable_events_statements_consumers()
SQL SECURITY DEFINER
BEGIN
UPDATE performance_schema.setup_consumers SET enabled='YES' WHERE name LIKE 'events_statements_%';
UPDATE performance_schema.setup_consumers SET enabled='YES' WHERE name = 'events_waits_current';
END $$
DELIMITER ;
GRANT EXECUTE ON PROCEDURE protoobp.enable_events_statements_consumers TO protoobp@'%';
Для каждой БД выполните:
DELIMITER $$
CREATE PROCEDURE <ИМЯ-БД>.explain_statement(IN query TEXT)
SQL SECURITY DEFINER
BEGIN
SET @explain := CONCAT('EXPLAIN FORMAT=json ', query);
PREPARE stmt FROM @explain;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END $$
DELIMITER ;
GRANT EXECUTE ON PROCEDURE <ИМЯ-БД>.explain_statement TO protoobp@'%';
Конфигурация ProtoOBP агента
В основном файле конфигурации ProtoOBP агента (
/etc/protoobp-agent/protoobp.yaml) добавьте:skip_ssl_validation: true database_monitoring: metrics: pobp_url: <адрес-бэкенда> activity: pobp_url: <адрес-бэкенда> samples: pobp_url: <адрес-бэкенда>Где
<адрес-бэкенда>– FQDN или IP адрес бэкенд сервера ProtoOBP.В данном разделе указывается только адрес, без префиксов
http://илиhttps://В файле конфигурации MySQL ProtoOBP агента (
/etc/protoobp-agent/conf.d/mysql.d/conf.yaml) добавьтеdbm: true:init_config: instances: - host: 127.0.0.1 # Не используйте localhost dbm: true username: protoobp password: "<пароль>" # Пароль пользователя protoobp port: "<MYSQL_PORT>" # Порт, например 3306 options: replication: false galera_cluster: true extra_status_metrics: true extra_innodb_metrics: true schema_size_metrics: false disable_innodb_metrics: falseПерезапустите ProtoOBP агента выполнив
systemctl restart protoobp-agent
Передайте следующие переменные окружения контейнеру c ProtoOBP агентом:
POBP_DATABASE_MONITORING_SAMPLES_POBP_URL: <адрес-бэкенда> POBP_DATABASE_MONITORING_METRICS_POBP_URL: <адрес-бэкенда> POBP_DATABASE_MONITORING_ACTIVITY_POBP_URL: <адрес-бэкенда> POBP_SKIP_SSL_VALIDATION: trueГде
<адрес-бэкенда>– FQDN или IP адрес бэкенд сервера ProtoOBP.В данных переменных указывается только адрес, без префиксов
http://илиhttps://Например в
docker-compose.yaml:services: protoobp-agent: restart: always container_name: protoobp-agent image: registry.git.proto.group/protoobp/protoobp-artifacts/protoobp-agent:7.40.3 networks: - some-network-name pid: host volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - /proc/:/host/proc/:ro - /sys/fs/cgroup/:/host/sys/fs/cgroup:ro - /etc/os-release:/host/etc/os-release:ro environment: #### прочие переменные POBP_DATABASE_MONITORING_SAMPLES_POBP_URL: backend-04 POBP_DATABASE_MONITORING_METRICS_POBP_URL: backend-04 POBP_DATABASE_MONITORING_ACTIVITY_POBP_URL: backend-04 POBP_SKIP_SSL_VALIDATION: trueДобавьте следующие лейблы к Docker контейнеру с MySQL (если они не были ранее добавлены) — с
dbm: trueвcom.protoobp.ad.instances:В
docker-compose.yaml:labels: com.protoobp.ad.check_names: '["mysql"]' com.protoobp.ad.init_configs: '[{}]' com.protoobp.ad.instances: '[{"host": "%%host%%", "port": 3306, "dbm": true, "username": "protoobp", "password": "<пароль>", "options": {"replication": false, "extra_status_metrics": true, "extra_innodb_metrics": true, "extra_performance_metrics": true, "schema_size_metrics": false}}]'или в
Dockerfile:LABEL "com.protoobp.ad.check_names"='["mysql"]' LABEL "com.protoobp.ad.init_configs"='[{}]' LABEL "com.protoobp.ad.instances"='[{"host": "%%host%%", "port": 3306, "dbm": true, "username": "protoobp", "password": "<пароль>", "options": {"replication": false, "extra_status_metrics": true, "extra_innodb_metrics": true, "extra_performance_metrics": true, "schema_size_metrics": false}}]'Перезапустите контейнер с ProtoOBP агентом и MySQL, например, выполнив
docker compose up -d.
Проверка
В agent status проверка mysql должна быть status : OK с ненулевым
metric_count, а в разделе Database Monitoring — без ошибок:
docker exec protoobp-agent agent status | grep -A 8 "^ mysql$"
docker exec protoobp-agent agent status | sed -n '/Database Monitoring/,/^=/p'
В веб-интерфейсе ProtoOBP перейдите в раздел Базы данных > MySQL >
имя сервера > вкладка SQL запросы и убедитесь, что в дашборде отображаются
данные по производительности SQL-запросов. Для отображения данных может
потребоваться около 1 минуты.
Обратите внимание
Для отображения нового хоста СУБД следует обновить страницу браузера целиком (кнопкаОбновить в правом верхнем углу веб-консоли обновляет только значения
метрик на дашборде, но не список серверов).Собираемые метрики
Проверка mysql собирает метрики через клиентское подключение к MySQL: основной
источник — SHOW GLOBAL STATUS и SHOW GLOBAL VARIABLES, плюс
SHOW ENGINE INNODB STATUS (при extra_innodb_metrics), SHOW SLAVE STATUS
(при replication: true) и performance_schema (per-schema метрики при
extra_performance_metrics, метрики уровня запросов при dbm: true).
Большинство метрик имеют тип gauge. Часть из них — это «дельта в секунду»
от кумулятивных счётчиков MySQL (агент сам конвертирует прирост счётчика в
rate); такие помечены единицей <единица>/секунду. Несколько метрик
публикуются как count (кумулятивный счётчик, бэкенд считает дельту сам) —
это отдельно отмечено в таблицах.
Ниже — основные группы. Метрики, перечисленные с пометкой «(extra_*)»,
появляются только при включённой соответствующей опции.
Лейблы
| Лейбл | Источник / значение |
|---|---|
host | Хост, на котором работает агент (или reported_hostname, если задан) |
port | Порт MySQL (3306 и т.п.) |
server | Адрес MySQL из конфига проверки |
service | Тег service (через com.protoobp.tags.service или POBP_TAGS) |
env | Тег env |
docker_image / image_name / image_tag / short_image | Атрибуты образа контейнера MySQL (при autodiscovery) |
schema | Имя схемы — на per-schema метриках (extra_performance_metrics) |
digest / query_signature | Нормализованный отпечаток SQL-запроса — на метриках mysql_queries_* и части mysql_performance_* (при dbm: true) |
processlist_db / processlist_user / processlist_host / processlist_state | Атрибуты сессии — на mysql_performance_user_connections |
Соединения и потоки
| Имя метрики | Единица | Описание |
|---|---|---|
mysql_net_connections | connection/секунду | Скорость новых подключений к серверу (rate из Connections) |
mysql_net_max_connections | connection | Пиковое число одновременных подключений с момента старта (Max_used_connections) |
mysql_net_max_connections_available | connection | Лимит одновременных клиентских подключений (max_connections) |
mysql_net_aborted_clients | connection/секунду | Скорость соединений, оборванных из-за того, что клиент не закрыл их корректно (extra_status_metrics) |
mysql_net_aborted_connects | connection/секунду | Скорость неудачных попыток подключения (extra_status_metrics) |
mysql_performance_threads_connected | connection | Число открытых соединений сейчас (Threads_connected) |
mysql_performance_threads_running | thread | Число потоков, выполняющих работу (не спящих) — Threads_running |
mysql_performance_threads_cached | thread | Число потоков в thread cache (Threads_cached) |
mysql_performance_threads_created | thread (count) | Кумулятивно: потоки, созданные для обслуживания соединений (Threads_created) |
mysql_performance_thread_cache_size | byte | Сконфигурированный размер thread cache (thread_cache_size) |
mysql_performance_user_connections | connection | Число пользовательских соединений; теги processlist_* (extra_performance_metrics) |
mysql_performance_prepared_stmt_count | query/секунду | Текущее число подготовленных выражений (Prepared_stmt_count) |
mysql_performance_max_prepared_stmt_count | — | Лимит подготовленных выражений на сервере (max_prepared_stmt_count) |
Запросы и команды
| Имя метрики | Единица | Описание |
|---|---|---|
mysql_performance_queries | query/секунду | Скорость всех запросов (Queries) |
mysql_performance_questions | query/секунду | Скорость выражений, выполненных сервером (Questions) |
mysql_performance_slow_queries | query/секунду | Скорость медленных запросов — превысивших long_query_time (Slow_queries) |
mysql_performance_com_select | query/секунду | Скорость SELECT (Com_select) |
mysql_performance_com_insert | query/секунду | Скорость INSERT (Com_insert) |
mysql_performance_com_insert_select | query/секунду | Скорость INSERT ... SELECT |
mysql_performance_com_update | query/секунду | Скорость UPDATE (Com_update) |
mysql_performance_com_update_multi | query/секунду | Скорость многотабличных UPDATE |
mysql_performance_com_delete | query/секунду | Скорость DELETE (Com_delete) |
mysql_performance_com_delete_multi | query/секунду | Скорость многотабличных DELETE |
mysql_performance_com_replace | query/секунду | Скорость REPLACE |
mysql_performance_com_replace_select | query/секунду | Скорость REPLACE ... SELECT |
mysql_performance_com_load | query/секунду | Скорость LOAD DATA |
mysql_performance_bytes_sent | byte/секунду | Скорость отправки данных всем клиентам (Bytes_sent) |
mysql_performance_bytes_received | byte/секунду | Скорость приёма данных от всех клиентов (Bytes_received) |
mysql_performance_select_full_join | operation/секунду | SELECT, выполнившие table scan из-за отсутствия индекса (extra_status_metrics) |
mysql_performance_select_full_range_join | operation/секунду | Join’ы с range-поиском по reference-таблице (extra_status_metrics) |
mysql_performance_select_range | operation/секунду | Join’ы с range по первой таблице (extra_status_metrics) |
mysql_performance_select_range_check | operation/секунду | Join’ы без ключей, проверяющие применимость индекса на каждой строке (extra_status_metrics) |
mysql_performance_select_scan | operation/секунду | Join’ы, сделавшие full scan первой таблицы (extra_status_metrics) |
mysql_performance_sort_merge_passes | operation/секунду | Merge-проходы алгоритма сортировки (extra_status_metrics) |
mysql_performance_sort_range | operation/секунду | Сортировки по диапазонам (extra_status_metrics) |
mysql_performance_sort_rows | operation/секунду | Отсортированные строки (extra_status_metrics) |
mysql_performance_sort_scan | operation/секунду | Сортировки, сделанные сканированием таблицы (extra_status_metrics) |
mysql_performance_query_run_time_avg | microsecond | Среднее время выполнения запроса per schema (extra_performance_metrics) |
mysql_performance_digest_95th_percentile_avg_us | microsecond | 95-й перцентиль времени ответа per schema (extra_performance_metrics) |
mysql_performance_performance_schema_digest_lost | — | Число digest-инстансов, не уместившихся в events_statements_summary_by_digest (extra_performance_metrics) |
Обработчики и временные таблицы
Метрики mysql_performance_handler_* (rate из Handler_*) появляются при
extra_status_metrics и показывают внутреннюю активность storage engine.
| Имя метрики | Единица | Описание |
|---|---|---|
mysql_performance_handler_commit | operation/секунду | Внутренние COMMIT |
mysql_performance_handler_rollback | operation/секунду | Внутренние ROLLBACK |
mysql_performance_handler_delete | operation/секунду | Внутренние DELETE-операции по строкам |
mysql_performance_handler_update | operation/секунду | Внутренние UPDATE-операции по строкам |
mysql_performance_handler_write | operation/секунду | Внутренние INSERT-операции по строкам |
mysql_performance_handler_prepare | operation/секунду | Внутренние PREPARE (двухфазный коммит) |
mysql_performance_handler_read_first | operation/секунду | Чтение первой записи индекса |
mysql_performance_handler_read_key | operation/секунду | Чтение строки по ключу — высокое значение = индексы работают |
mysql_performance_handler_read_next | operation/секунду | Чтение следующей строки в порядке ключа |
mysql_performance_handler_read_prev | operation/секунду | Чтение предыдущей строки в порядке ключа |
mysql_performance_handler_read_rnd | operation/секунду | Чтение строки по фиксированной позиции (сортировки) |
mysql_performance_handler_read_rnd_next | operation/секунду | Чтение следующей строки в файле данных — рост = full scans |
mysql_performance_created_tmp_tables | table/секунду | Скорость создания внутренних временных таблиц в памяти |
mysql_performance_created_tmp_disk_tables | table/секунду | Скорость создания временных таблиц на диске (плохо для производительности) |
mysql_performance_created_tmp_files | file/секунду | Скорость создания временных файлов |
mysql_performance_open_files | file | Число открытых файлов |
mysql_performance_open_tables | table | Число открытых таблиц |
mysql_performance_opened_tables | table/секунду | Скорость открытия таблиц — высокое = мал table_open_cache |
mysql_performance_table_open_cache | — | Число открытых таблиц для всех потоков |
mysql_performance_table_cache_hits | hit/секунду | Попадания в кэш открытых таблиц (extra_performance_metrics) |
mysql_performance_table_cache_misses | miss/секунду | Промахи кэша открытых таблиц (extra_performance_metrics) |
mysql_performance_table_locks_immediate | — | Блокировки таблицы, выданные сразу (extra_status_metrics) |
mysql_performance_table_locks_immediate_rate | — | Скорость блокировок таблицы, выданных сразу (extra_status_metrics) |
mysql_performance_table_locks_waited | — | Блокировки таблицы, потребовавшие ожидания (extra_status_metrics) |
mysql_performance_table_locks_waited_rate | — | Скорость блокировок таблицы с ожиданием (extra_status_metrics) |
InnoDB
Появляются при extra_innodb_metrics (поверх базового набора Innodb_* из
SHOW GLOBAL STATUS). Часть значений берётся из секций SHOW ENGINE INNODB STATUS.
Buffer pool
| Имя метрики | Единица | Описание |
|---|---|---|
mysql_innodb_buffer_pool_total | byte | Общий размер InnoDB buffer pool в байтах |
mysql_innodb_buffer_pool_used | byte | Занято байт в buffer pool |
mysql_innodb_buffer_pool_free | byte | Свободно байт в buffer pool |
mysql_innodb_buffer_pool_data | byte | Байт buffer pool, содержащих данные (грязные + чистые страницы) |
mysql_innodb_buffer_pool_dirty | byte | Байт в грязных страницах buffer pool |
mysql_innodb_buffer_pool_utilization | fraction | Доля использования buffer pool |
mysql_innodb_buffer_pool_pages_total | page | Всего страниц в buffer pool |
mysql_innodb_buffer_pool_pages_data | page | Страниц с данными |
mysql_innodb_buffer_pool_pages_dirty | page | Грязных страниц |
mysql_innodb_buffer_pool_pages_free | page | Свободных страниц |
mysql_innodb_buffer_pool_pages_flushed | page/секунду | Скорость флаша страниц из buffer pool |
mysql_innodb_buffer_pool_read_requests | read/секунду | Скорость логических запросов на чтение |
mysql_innodb_buffer_pool_reads | read/секунду | Скорость чтений, которые пришлось делать с диска (промах buffer pool) |
mysql_innodb_buffer_pool_write_requests | write/секунду | Скорость записей в buffer pool |
mysql_innodb_buffer_pool_wait_free | wait (count) | Число ожиданий из-за отсутствия свободных чистых страниц |
mysql_innodb_buffer_pool_read_ahead | page/секунду | Страниц, прочитанных read-ahead потоком |
mysql_innodb_buffer_pool_read_ahead_evicted | page/секунду | Read-ahead страниц, вытесненных до использования |
mysql_innodb_buffer_pool_read_ahead_rnd | operation | Случайных read-ahead, инициированных InnoDB |
Строки, транзакции, блокировки
| Имя метрики | Единица | Описание |
|---|---|---|
mysql_innodb_rows_inserted | row/секунду | Скорость вставки строк в InnoDB-таблицы |
mysql_innodb_rows_read | row/секунду | Скорость чтения строк из InnoDB-таблиц |
mysql_innodb_rows_updated | row/секунду | Скорость обновления строк в InnoDB-таблицах |
mysql_innodb_rows_deleted | row/секунду | Скорость удаления строк из InnoDB-таблиц |
mysql_innodb_active_transactions | operation | Число активных транзакций по InnoDB-таблицам |
mysql_innodb_current_transactions | transaction | Текущие транзакции InnoDB |
mysql_innodb_history_list_length | — | Длина history list (несобранные старые версии строк / undo) |
mysql_innodb_current_row_locks | lock | Число текущих блокировок строк |
mysql_innodb_row_lock_waits | event/секунду | Скорость ситуаций, когда пришлось ждать блокировку строки |
mysql_innodb_row_lock_current_waits | — | Сколько операций сейчас ждут блокировку строки |
mysql_innodb_row_lock_time | millisecond | Время, потраченное на ожидание блокировок строк |
mysql_innodb_deadlocks | lock (count) | Число дедлоков |
mysql_innodb_lock_structs | operation | Число lock-структур |
mysql_innodb_tables_in_use / mysql_innodb_locked_tables | operation | Таблицы в использовании / заблокированные таблицы |
I/O, redo log, прочее
| Имя метрики | Единица | Описание |
|---|---|---|
mysql_innodb_data_reads / mysql_innodb_data_writes | read·write/секунду | Скорость операций чтения / записи данных |
mysql_innodb_data_read / mysql_innodb_data_written | byte/секунду | Объём прочитанных / записанных данных в секунду |
mysql_innodb_data_fsyncs | operation/секунду | Скорость fsync() |
mysql_innodb_data_pending_reads / ..._writes / ..._fsyncs | read·write·operation | Текущее число ожидающих операций соответствующего типа |
mysql_innodb_os_log_written | byte/секунду | Байт, записанных в redo log |
mysql_innodb_os_log_fsyncs | write/секунду | Скорость fsync redo log |
mysql_innodb_log_write_requests / mysql_innodb_log_writes | write/секунду | Запросы на запись redo log / физические записи |
mysql_innodb_log_waits | wait/секунду | Ожидания флаша слишком маленького log buffer |
mysql_innodb_lsn_current / ..._flushed / ..._last_checkpoint | — | LSN текущий / сброшенный / последнего чекпойнта (из секции LOG) |
mysql_innodb_checkpoint_age | — | Возраст чекпойнта (из секции LOG) |
mysql_innodb_pages_created / ..._read / ..._written | page/секунду | Скорость создания / чтения / записи InnoDB-страниц |
mysql_innodb_dblwr_writes / mysql_innodb_dblwr_pages_written | byte·page/секунду | Операции / страницы doublewrite buffer в секунду |
mysql_innodb_ibuf_merges / ibuf_merged* / ibuf_size / ibuf_free_list / ibuf_segment_size | operation | Активность и размер insert buffer / adaptive hash index |
mysql_innodb_hash_index_cells_total / ..._used | — | Всего / используется ячеек adaptive hash index |
mysql_innodb_mem_total / mem_adaptive_hash / mem_dictionary / mem_additional_pool | byte | Память InnoDB по категориям (из секции BUFFER POOL AND MEMORY) |
mysql_innodb_mem_file_system / mem_lock_system / mem_page_hash / mem_recovery_system | — | Прочие категории памяти InnoDB |
mysql_innodb_queries_inside / mysql_innodb_queries_queued | query | Запросы внутри InnoDB / в очереди (из секции FILE I/O) |
mysql_innodb_read_views | — | Число open read views |
mysql_innodb_s_lock_spin_waits / s_lock_os_waits / s_lock_spin_rounds | wait/секунду | Семафоры shared-lock (из секции SEMAPHORES) |
mysql_innodb_x_lock_spin_waits / x_lock_os_waits / x_lock_spin_rounds | wait | Семафоры exclusive-lock (из секции SEMAPHORES) |
mysql_innodb_mutex_os_waits / mutex_spin_waits / mutex_spin_rounds | event/секунду | Mutex-ожидания (только MySQL 5.6/5.7) |
mysql_innodb_semaphore_waits / mysql_innodb_semaphore_wait_time | — | Число / время семафорных ожиданий |
mysql_innodb_os_file_reads / os_file_writes / os_file_fsyncs | operation | Дельта операций файлового I/O read/write-потоков InnoDB |
mysql_innodb_os_log_pending_writes / os_log_pending_fsyncs | write·operation | Ожидающие записи / fsync redo log |
mysql_innodb_pending_* (buffer_pool_flushes, log_flushes, log_writes, normal_aio_reads, normal_aio_writes, aio_log_ios, aio_sync_ios, checkpoint_writes, ibuf_aio_reads) | flush·write·read | Различные счётчики ожидающих операций (секция FILE I/O) |
Кэши и буферы (MyISAM, query cache)
| Имя метрики | Единица | Описание |
|---|---|---|
mysql_myisam_key_buffer_size | byte | Размер буфера для индексных блоков MyISAM |
mysql_myisam_key_buffer_bytes_used | byte | Использовано байт key buffer (extra_status_metrics) |
mysql_myisam_key_buffer_bytes_unflushed | byte | Несброшенных байт key buffer (extra_status_metrics) |
mysql_myisam_key_read_requests | read/секунду | Запросы на чтение индексного блока из key cache |
mysql_myisam_key_reads | read/секунду | Физические чтения индексного блока с диска в key cache |
mysql_myisam_key_write_requests | write/секунду | Запросы на запись индексного блока в key cache |
mysql_myisam_key_writes | write/секунду | Физические записи индексного блока из key cache на диск |
mysql_performance_key_cache_utilization | fraction | Коэффициент использования key cache (extra_status_metrics) |
mysql_performance_qcache_hits | hit/секунду | Скорость попаданий в query cache (только при включённом query cache) |
mysql_performance_qcache_inserts | query/секунду | Запросы, добавленные в query cache |
mysql_performance_qcache_lowmem_prunes | query/секунду | Запросы, вытесненные из query cache из-за нехватки памяти |
mysql_performance_qcache_not_cached | query/секунду | Некэшируемые запросы |
mysql_performance_qcache_queries_in_cache | query | Запросов в query cache |
mysql_performance_qcache_total_blocks / qcache_free_blocks | block | Всего / свободно блоков query cache |
mysql_performance_qcache_size / qcache_free_memory | byte | Размер / свободная память query cache |
mysql_performance_qcache_utilization / mysql_performance_qcache_utilization_instant | fraction | Доля памяти query cache, используемой с момента старта / с прошлого сбора |
mysql_performance_cpu_time / user_time / kernel_time | percent | Процент CPU, потраченного MySQL (всего / user / kernel) |
Binlog
| Имя метрики | Единица | Описание |
|---|---|---|
mysql_binlog_disk_use | byte | Суммарный размер файлов бинарного лога |
mysql_binlog_cache_use | transaction | Число транзакций, использовавших binlog cache |
mysql_binlog_cache_disk_use | transaction | Транзакции, которым не хватило binlog_cache_size и пришлось использовать временный файл |
Репликация
Появляются при replication: true (SHOW SLAVE STATUS / SHOW REPLICA STATUS)
либо в окружении group replication.
| Имя метрики | Единица | Описание |
|---|---|---|
mysql_replication_seconds_behind_source | second | Отставание реплики от источника, секунд (Seconds_Behind_Source) |
mysql_replication_seconds_behind_master | second | То же, deprecated-имя (Seconds_Behind_Master) |
mysql_replication_replicas_connected | — | Число реплик, подключённых к источнику |
mysql_replication_slaves_connected | — | То же, deprecated-имя |
mysql_replication_slave_running | — | Deprecated; булево «реплика/источник работает» — используйте сервис-проверку mysql_replication_replica_running |
mysql_replication_group_member_status | — | Статус узла в group replication (всегда 1, если узел в группе) |
mysql_replication_group_transactions | transaction | Транзакции в очереди на проверку конфликтов |
mysql_replication_group_transactions_check | transaction | Транзакции, прошедшие проверку конфликтов |
mysql_replication_group_conflicts_detected | transaction | Транзакции, не прошедшие проверку конфликтов |
mysql_replication_group_transactions_applied | transaction | Транзакции, полученные от группы и применённые этим узлом |
mysql_replication_group_transactions_in_applier_queue | transaction | Транзакции от группы, ожидающие применения |
mysql_replication_group_transactions_proposed / ..._validating / ..._rollback | transaction | Транзакции, инициированные этим узлом: предложено / валидируется / откатано |
Размеры схем и таблиц
Появляются при schema_size_metrics: true (запрос к information_schema —
относительно тяжёлый, по умолчанию выключен).
| Имя метрики | Единица | Описание |
|---|---|---|
mysql_info_schema_size | mebibyte | Размер схемы, MiB (тег schema) |
mysql_info_table_data_size | mebibyte | Размер данных таблицы, MiB |
mysql_info_table_index_size | mebibyte | Размер индексов таблицы, MiB |
mysql_index_size | byte | Размер индекса в байтах (index_metrics) |
mysql_index_reads / mysql_index_updates / mysql_index_deletes | operation | Число read/update/delete-операций по индексу (Percona userstat / index_metrics) |
mysql_info_table_rows_read / mysql_info_table_rows_changed | row (count) | Прочитано / изменено строк по таблице (Percona userstat) |
Метрики уровня SQL-запросов
Появляются при dbm: true и включённой performance_schema с digest-консьюмерами;
все несут лейблы query_signature/digest (+ schema). Тип — count
(кумулятив, дельту считает бэкенд).
| Имя метрики | Единица | Описание |
|---|---|---|
mysql_queries_count | query | Всего выполнений нормализованного запроса |
mysql_queries_time | nanosecond | Суммарное время выполнения запроса |
mysql_queries_lock_time | nanosecond | Суммарное время ожидания блокировок запросом |
mysql_queries_errors | error | Число выполнений запроса с ошибкой |
mysql_queries_rows_sent | row | Отправлено строк |
mysql_queries_rows_examined | row | Просмотрено строк |
mysql_queries_rows_affected | row | Изменено строк |
mysql_queries_no_index_used / mysql_queries_no_good_index_used | query | Выполнений без индекса / с неоптимальным индексом |
mysql_queries_select_full_join / mysql_queries_select_scan | operation | Full table scan на присоединённой / первой таблице по запросу |
Ключевые метрики для дашбордов и алертов
Доступность
- Отсутствие свежих серий по сервису
mysql— алерт: сервер недоступен или агент не может подключиться (проверьте права пользователяprotoobpиMAX_USER_CONNECTIONS). - Сервис-проверка
mysql_can_connectсо статусомCRITICAL— то же.
Соединения
mysql_performance_threads_connected/mysql_net_max_connections_available— приближение к лимиту → отказ новым клиентам. Алерт по доле (например> 80 %).mysql_net_aborted_connects> 0 устойчиво — проблемы аутентификации/сети/таймаутов.mysql_performance_threads_runningстабильно высокий — затык: блокировки, тяжёлые запросы, нехватка CPU.
Производительность запросов
mysql_performance_queries/questions— базовая пропускная способность; резкое падение при ожидаемой нагрузке = деградация.mysql_performance_slow_queriesrate > 0 — медленные запросы; смотрите slow query log.mysql_performance_created_tmp_disk_tablesrate — временные таблицы уходят на диск (малtmp_table_size/ неоптимальные запросы).mysql_performance_handler_read_rnd_nextвысокий относительноhandler_read_key— много full scans, не хватает индексов.mysql_performance_select_full_join/select_scan> 0 устойчиво — join’ы без индексов.- При
dbm: true: топ поmysql_queries_time/mysql_queries_count/mysql_queries_rows_examinedperquery_signature— какие запросы дороже всего.
InnoDB
mysql_innodb_buffer_pool_utilizationблизко к1+ ростmysql_innodb_buffer_pool_reads— buffer pool мал, растут чтения с диска.mysql_innodb_row_lock_waitsrate иmysql_innodb_row_lock_time— рост = контеншн по строкам;mysql_innodb_deadlocks> 0 — дедлоки.mysql_innodb_history_list_lengthрастёт и не падает — purge не успевает (длинные транзакции держат старые версии строк).mysql_innodb_log_waitsrate > 0 — малinnodb_log_buffer_size.mysql_innodb_data_pending_fsyncs/pending_*устойчиво ненулевые — диск не справляется с I/O.
Репликация
mysql_replication_seconds_behind_source(или..._behind_master) растёт — реплика отстаёт; алерт по порогу.mysql_replication_slave_running == 0/ сервис-проверкаmysql_replication_replica_runningнеOK— поток репликации остановлен.mysql_replication_group_conflicts_detected> 0 — конфликты в group replication.
Сбор логов MySQL
Логи MySQL собираются ProtoOBP агентом и отправляются в бэкенд ProtoOBP.
Здесь — только специфичные для MySQL настройки. Включение логов на стороне
агента (logs_enabled, logs_pobp_url) описано в
Получение данных логов.
У MySQL есть несколько логов:
- error log — старт/стоп сервера, ошибки, предупреждения. В пакетной
установке обычно
/var/log/mysql/error.log; в официальном образеmysql:8.0по умолчанию пишется в stdout контейнера. - slow query log — запросы дольше
long_query_time. Включается отдельно (--slow_query_log=ON --slow_query_log_file=... --long_query_time=...), обычно/var/log/mysql/mysql-slow.log. - general query log — все запросы; для продакшна, как правило, выключен.
Конфигурация ProtoOBP агента
Если агент запускается в виде службы на хосте
Дополните /etc/protoobp-agent/conf.d/mysql.d/conf.yaml (тот же файл, в котором
лежит instances:) блоком logs::
logs:
- type: file
path: /var/log/mysql/error.log
source: mysql
service: mysql
log_processing_rules:
- type: multi_line
name: log_start_with_date
pattern: \d{4}-\d{2}-\d{2}
- type: file
path: /var/log/mysql/mysql-slow.log
source: mysql
service: mysql
log_processing_rules:
- type: multi_line
name: new_slow_query_log_entry
# Записи slow query log начинаются со строки "# Time: ..." либо
# "# User@Host: ..." — склеиваем многострочную запись по ним.
pattern: '# Time: |# User@Host: '
Пути зависят от дистрибутива (см. log_error / slow_query_log_file в
SHOW GLOBAL VARIABLES). Перезапустите агента: systemctl restart protoobp-agent.
Если агент запускается в виде Docker контейнера
Шаг 1 — включите сбор логов в самом агенте через переменные окружения и смонтируйте директорию JSON-логов docker-демона:
services:
protoobp-agent:
environment:
POBP_LOGS_ENABLED: "true"
POBP_LOGS_CONFIG_USE_HTTP: "true"
POBP_LOGS_CONFIG_LOGS_POBP_URL: <protoobp-backend>:<port>
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
# Прямое чтение JSON-лог файлов docker-демона быстрее,
# чем тянуть их через Docker socket API.
- /var/lib/docker/containers:/var/lib/docker/containers:ro
Шаг 2 — добавьте лейбл com.protoobp.ad.logs к контейнеру MySQL. Образ
mysql:8.0 пишет error log в stdout — агент подхватит его и пометит записи
указанными source и service:
services:
mysql:
labels:
com.protoobp.ad.logs: '[{"source": "mysql", "service": "mysql", "log_processing_rules": [{"type": "multi_line", "name": "log_start_with_date", "pattern": "\\d{4}-\\d{2}-\\d{2}"}]}]'
Slow query log в контейнере пишется в файл, а не в stdout. Чтобы собрать
и его, направьте файл на общий том и добавьте отдельный источник типа file
(через conf.d/mysql.d/conf.yaml host-агента или
POBP_LOGS_CONFIG_.../смонтированный conf.yaml в контейнере агента) — с
path: <том>/mysql-slow.log и тем же source: mysql.
Только нужные контейнеры
Если в агенте не задана переменнаяPOBP_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true,
агент собирает логи только тех контейнеров, на которых есть лейбл
com.protoobp.ad.logs.Multi-line
Записи error logmysqld начинаются с метки времени ISO-8601, например
2026-05-12T10:00:00.123456Z 0 [System] [MY-010931] [Server] …. Правило
log_processing_rules с type: multi_line и якорем \d{4}-\d{2}-\d{2}
склеивает строки-продолжения (многострочные сообщения) в одну логическую
запись. Без этого правила каждая строка попадёт в ProtoOBP отдельной записью.Проверка
В выводе agent status должен быть раздел Logs Agent со статусом running
и хотя бы один источник mysql с ненулевым BytesRead (у источника типа
«JSON-файл docker-контейнера» поле Status может отображаться как Pending
даже при активном чтении — смотрите BytesRead и LogsProcessed):
docker exec protoobp-agent agent status \
| sed -n '/^==== Logs Agent ====/,/^====/p'