Мониторинг MySQL с помощью Proto Observability

Сбор метрик MySQL

На этой странице:

Сбор основных метрик MySQL

Убедитесь, что у вас установлен и настроен ProtoOBP агент.

Конфигурация MySQL

Для подключения агента ProtoOBP к MySQL необходимо создать пользователя с правами только на чтение для этого:

  1. Создайте нового пользователя protoobp:

    CREATE USER 'protoobp'@'%' IDENTIFIED BY '<пароль>';
    
  2. Задайте права для сбора метрик пользователю 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'@'%';
      
  3. Если на сервере MySQL включена performance_schema (в MySQL 8.0 — по умолчанию), для сбора метрик добавьте соответствующие права пользователю protoobp:

    GRANT SELECT ON performance_schema.* TO 'protoobp'@'%';
    

Конфигурация ProtoOBP агента

Если агент запускается в виде службы на хосте

  1. Создайте файл /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
    
  2. Перезапустите агента: 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 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 агента

  1. В основном файле конфигурации 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://

  2. В файле конфигурации 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
    
  3. Перезапустите ProtoOBP агента выполнив systemctl restart protoobp-agent

  1. Передайте следующие переменные окружения контейнеру 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
    
  2. Добавьте следующие лейблы к 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}}]'
    
  3. Перезапустите контейнер с 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_connectionsconnection/секундуСкорость новых подключений к серверу (rate из Connections)
mysql_net_max_connectionsconnectionПиковое число одновременных подключений с момента старта (Max_used_connections)
mysql_net_max_connections_availableconnectionЛимит одновременных клиентских подключений (max_connections)
mysql_net_aborted_clientsconnection/секундуСкорость соединений, оборванных из-за того, что клиент не закрыл их корректно (extra_status_metrics)
mysql_net_aborted_connectsconnection/секундуСкорость неудачных попыток подключения (extra_status_metrics)
mysql_performance_threads_connectedconnectionЧисло открытых соединений сейчас (Threads_connected)
mysql_performance_threads_runningthreadЧисло потоков, выполняющих работу (не спящих) — Threads_running
mysql_performance_threads_cachedthreadЧисло потоков в thread cache (Threads_cached)
mysql_performance_threads_createdthread (count)Кумулятивно: потоки, созданные для обслуживания соединений (Threads_created)
mysql_performance_thread_cache_sizebyteСконфигурированный размер thread cache (thread_cache_size)
mysql_performance_user_connectionsconnectionЧисло пользовательских соединений; теги processlist_* (extra_performance_metrics)
mysql_performance_prepared_stmt_countquery/секундуТекущее число подготовленных выражений (Prepared_stmt_count)
mysql_performance_max_prepared_stmt_countЛимит подготовленных выражений на сервере (max_prepared_stmt_count)

Запросы и команды

Имя метрикиЕдиницаОписание
mysql_performance_queriesquery/секундуСкорость всех запросов (Queries)
mysql_performance_questionsquery/секундуСкорость выражений, выполненных сервером (Questions)
mysql_performance_slow_queriesquery/секундуСкорость медленных запросов — превысивших long_query_time (Slow_queries)
mysql_performance_com_selectquery/секундуСкорость SELECT (Com_select)
mysql_performance_com_insertquery/секундуСкорость INSERT (Com_insert)
mysql_performance_com_insert_selectquery/секундуСкорость INSERT ... SELECT
mysql_performance_com_updatequery/секундуСкорость UPDATE (Com_update)
mysql_performance_com_update_multiquery/секундуСкорость многотабличных UPDATE
mysql_performance_com_deletequery/секундуСкорость DELETE (Com_delete)
mysql_performance_com_delete_multiquery/секундуСкорость многотабличных DELETE
mysql_performance_com_replacequery/секундуСкорость REPLACE
mysql_performance_com_replace_selectquery/секундуСкорость REPLACE ... SELECT
mysql_performance_com_loadquery/секундуСкорость LOAD DATA
mysql_performance_bytes_sentbyte/секундуСкорость отправки данных всем клиентам (Bytes_sent)
mysql_performance_bytes_receivedbyte/секундуСкорость приёма данных от всех клиентов (Bytes_received)
mysql_performance_select_full_joinoperation/секундуSELECT, выполнившие table scan из-за отсутствия индекса (extra_status_metrics)
mysql_performance_select_full_range_joinoperation/секундуJoin’ы с range-поиском по reference-таблице (extra_status_metrics)
mysql_performance_select_rangeoperation/секундуJoin’ы с range по первой таблице (extra_status_metrics)
mysql_performance_select_range_checkoperation/секундуJoin’ы без ключей, проверяющие применимость индекса на каждой строке (extra_status_metrics)
mysql_performance_select_scanoperation/секундуJoin’ы, сделавшие full scan первой таблицы (extra_status_metrics)
mysql_performance_sort_merge_passesoperation/секундуMerge-проходы алгоритма сортировки (extra_status_metrics)
mysql_performance_sort_rangeoperation/секундуСортировки по диапазонам (extra_status_metrics)
mysql_performance_sort_rowsoperation/секундуОтсортированные строки (extra_status_metrics)
mysql_performance_sort_scanoperation/секундуСортировки, сделанные сканированием таблицы (extra_status_metrics)
mysql_performance_query_run_time_avgmicrosecondСреднее время выполнения запроса per schema (extra_performance_metrics)
mysql_performance_digest_95th_percentile_avg_usmicrosecond95-й перцентиль времени ответа 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_commitoperation/секундуВнутренние COMMIT
mysql_performance_handler_rollbackoperation/секундуВнутренние ROLLBACK
mysql_performance_handler_deleteoperation/секундуВнутренние DELETE-операции по строкам
mysql_performance_handler_updateoperation/секундуВнутренние UPDATE-операции по строкам
mysql_performance_handler_writeoperation/секундуВнутренние INSERT-операции по строкам
mysql_performance_handler_prepareoperation/секундуВнутренние PREPARE (двухфазный коммит)
mysql_performance_handler_read_firstoperation/секундуЧтение первой записи индекса
mysql_performance_handler_read_keyoperation/секундуЧтение строки по ключу — высокое значение = индексы работают
mysql_performance_handler_read_nextoperation/секундуЧтение следующей строки в порядке ключа
mysql_performance_handler_read_prevoperation/секундуЧтение предыдущей строки в порядке ключа
mysql_performance_handler_read_rndoperation/секундуЧтение строки по фиксированной позиции (сортировки)
mysql_performance_handler_read_rnd_nextoperation/секундуЧтение следующей строки в файле данных — рост = full scans
mysql_performance_created_tmp_tablestable/секундуСкорость создания внутренних временных таблиц в памяти
mysql_performance_created_tmp_disk_tablestable/секундуСкорость создания временных таблиц на диске (плохо для производительности)
mysql_performance_created_tmp_filesfile/секундуСкорость создания временных файлов
mysql_performance_open_filesfileЧисло открытых файлов
mysql_performance_open_tablestableЧисло открытых таблиц
mysql_performance_opened_tablestable/секундуСкорость открытия таблиц — высокое = мал table_open_cache
mysql_performance_table_open_cacheЧисло открытых таблиц для всех потоков
mysql_performance_table_cache_hitshit/секундуПопадания в кэш открытых таблиц (extra_performance_metrics)
mysql_performance_table_cache_missesmiss/секундуПромахи кэша открытых таблиц (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_totalbyteОбщий размер InnoDB buffer pool в байтах
mysql_innodb_buffer_pool_usedbyteЗанято байт в buffer pool
mysql_innodb_buffer_pool_freebyteСвободно байт в buffer pool
mysql_innodb_buffer_pool_databyteБайт buffer pool, содержащих данные (грязные + чистые страницы)
mysql_innodb_buffer_pool_dirtybyteБайт в грязных страницах buffer pool
mysql_innodb_buffer_pool_utilizationfractionДоля использования buffer pool
mysql_innodb_buffer_pool_pages_totalpageВсего страниц в buffer pool
mysql_innodb_buffer_pool_pages_datapageСтраниц с данными
mysql_innodb_buffer_pool_pages_dirtypageГрязных страниц
mysql_innodb_buffer_pool_pages_freepageСвободных страниц
mysql_innodb_buffer_pool_pages_flushedpage/секундуСкорость флаша страниц из buffer pool
mysql_innodb_buffer_pool_read_requestsread/секундуСкорость логических запросов на чтение
mysql_innodb_buffer_pool_readsread/секундуСкорость чтений, которые пришлось делать с диска (промах buffer pool)
mysql_innodb_buffer_pool_write_requestswrite/секундуСкорость записей в buffer pool
mysql_innodb_buffer_pool_wait_freewait (count)Число ожиданий из-за отсутствия свободных чистых страниц
mysql_innodb_buffer_pool_read_aheadpage/секундуСтраниц, прочитанных read-ahead потоком
mysql_innodb_buffer_pool_read_ahead_evictedpage/секундуRead-ahead страниц, вытесненных до использования
mysql_innodb_buffer_pool_read_ahead_rndoperationСлучайных read-ahead, инициированных InnoDB

Строки, транзакции, блокировки

Имя метрикиЕдиницаОписание
mysql_innodb_rows_insertedrow/секундуСкорость вставки строк в InnoDB-таблицы
mysql_innodb_rows_readrow/секундуСкорость чтения строк из InnoDB-таблиц
mysql_innodb_rows_updatedrow/секундуСкорость обновления строк в InnoDB-таблицах
mysql_innodb_rows_deletedrow/секундуСкорость удаления строк из InnoDB-таблиц
mysql_innodb_active_transactionsoperationЧисло активных транзакций по InnoDB-таблицам
mysql_innodb_current_transactionstransactionТекущие транзакции InnoDB
mysql_innodb_history_list_lengthДлина history list (несобранные старые версии строк / undo)
mysql_innodb_current_row_lockslockЧисло текущих блокировок строк
mysql_innodb_row_lock_waitsevent/секундуСкорость ситуаций, когда пришлось ждать блокировку строки
mysql_innodb_row_lock_current_waitsСколько операций сейчас ждут блокировку строки
mysql_innodb_row_lock_timemillisecondВремя, потраченное на ожидание блокировок строк
mysql_innodb_deadlockslock (count)Число дедлоков
mysql_innodb_lock_structsoperationЧисло lock-структур
mysql_innodb_tables_in_use / mysql_innodb_locked_tablesoperationТаблицы в использовании / заблокированные таблицы

I/O, redo log, прочее

Имя метрикиЕдиницаОписание
mysql_innodb_data_reads / mysql_innodb_data_writesread·write/секундуСкорость операций чтения / записи данных
mysql_innodb_data_read / mysql_innodb_data_writtenbyte/секундуОбъём прочитанных / записанных данных в секунду
mysql_innodb_data_fsyncsoperation/секундуСкорость fsync()
mysql_innodb_data_pending_reads / ..._writes / ..._fsyncsread·write·operationТекущее число ожидающих операций соответствующего типа
mysql_innodb_os_log_writtenbyte/секундуБайт, записанных в redo log
mysql_innodb_os_log_fsyncswrite/секундуСкорость fsync redo log
mysql_innodb_log_write_requests / mysql_innodb_log_writeswrite/секундуЗапросы на запись redo log / физические записи
mysql_innodb_log_waitswait/секундуОжидания флаша слишком маленького log buffer
mysql_innodb_lsn_current / ..._flushed / ..._last_checkpointLSN текущий / сброшенный / последнего чекпойнта (из секции LOG)
mysql_innodb_checkpoint_ageВозраст чекпойнта (из секции LOG)
mysql_innodb_pages_created / ..._read / ..._writtenpage/секундуСкорость создания / чтения / записи InnoDB-страниц
mysql_innodb_dblwr_writes / mysql_innodb_dblwr_pages_writtenbyte·page/секундуОперации / страницы doublewrite buffer в секунду
mysql_innodb_ibuf_merges / ibuf_merged* / ibuf_size / ibuf_free_list / ibuf_segment_sizeoperationАктивность и размер 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_poolbyteПамять 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_queuedqueryЗапросы внутри InnoDB / в очереди (из секции FILE I/O)
mysql_innodb_read_viewsЧисло open read views
mysql_innodb_s_lock_spin_waits / s_lock_os_waits / s_lock_spin_roundswait/секундуСемафоры shared-lock (из секции SEMAPHORES)
mysql_innodb_x_lock_spin_waits / x_lock_os_waits / x_lock_spin_roundswaitСемафоры exclusive-lock (из секции SEMAPHORES)
mysql_innodb_mutex_os_waits / mutex_spin_waits / mutex_spin_roundsevent/секунду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_fsyncsoperationДельта операций файлового I/O read/write-потоков InnoDB
mysql_innodb_os_log_pending_writes / os_log_pending_fsyncswrite·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_sizebyteРазмер буфера для индексных блоков MyISAM
mysql_myisam_key_buffer_bytes_usedbyteИспользовано байт key buffer (extra_status_metrics)
mysql_myisam_key_buffer_bytes_unflushedbyteНесброшенных байт key buffer (extra_status_metrics)
mysql_myisam_key_read_requestsread/секундуЗапросы на чтение индексного блока из key cache
mysql_myisam_key_readsread/секундуФизические чтения индексного блока с диска в key cache
mysql_myisam_key_write_requestswrite/секундуЗапросы на запись индексного блока в key cache
mysql_myisam_key_writeswrite/секундуФизические записи индексного блока из key cache на диск
mysql_performance_key_cache_utilizationfractionКоэффициент использования key cache (extra_status_metrics)
mysql_performance_qcache_hitshit/секундуСкорость попаданий в query cache (только при включённом query cache)
mysql_performance_qcache_insertsquery/секундуЗапросы, добавленные в query cache
mysql_performance_qcache_lowmem_prunesquery/секундуЗапросы, вытесненные из query cache из-за нехватки памяти
mysql_performance_qcache_not_cachedquery/секундуНекэшируемые запросы
mysql_performance_qcache_queries_in_cachequeryЗапросов в query cache
mysql_performance_qcache_total_blocks / qcache_free_blocksblockВсего / свободно блоков query cache
mysql_performance_qcache_size / qcache_free_memorybyteРазмер / свободная память query cache
mysql_performance_qcache_utilization / mysql_performance_qcache_utilization_instantfractionДоля памяти query cache, используемой с момента старта / с прошлого сбора
mysql_performance_cpu_time / user_time / kernel_timepercentПроцент CPU, потраченного MySQL (всего / user / kernel)

Binlog

Имя метрикиЕдиницаОписание
mysql_binlog_disk_usebyteСуммарный размер файлов бинарного лога
mysql_binlog_cache_usetransactionЧисло транзакций, использовавших binlog cache
mysql_binlog_cache_disk_usetransactionТранзакции, которым не хватило binlog_cache_size и пришлось использовать временный файл

Репликация

Появляются при replication: true (SHOW SLAVE STATUS / SHOW REPLICA STATUS) либо в окружении group replication.

Имя метрикиЕдиницаОписание
mysql_replication_seconds_behind_sourcesecondОтставание реплики от источника, секунд (Seconds_Behind_Source)
mysql_replication_seconds_behind_mastersecondТо же, deprecated-имя (Seconds_Behind_Master)
mysql_replication_replicas_connectedЧисло реплик, подключённых к источнику
mysql_replication_slaves_connectedТо же, deprecated-имя
mysql_replication_slave_runningDeprecated; булево «реплика/источник работает» — используйте сервис-проверку mysql_replication_replica_running
mysql_replication_group_member_statusСтатус узла в group replication (всегда 1, если узел в группе)
mysql_replication_group_transactionstransactionТранзакции в очереди на проверку конфликтов
mysql_replication_group_transactions_checktransactionТранзакции, прошедшие проверку конфликтов
mysql_replication_group_conflicts_detectedtransactionТранзакции, не прошедшие проверку конфликтов
mysql_replication_group_transactions_appliedtransactionТранзакции, полученные от группы и применённые этим узлом
mysql_replication_group_transactions_in_applier_queuetransactionТранзакции от группы, ожидающие применения
mysql_replication_group_transactions_proposed / ..._validating / ..._rollbacktransactionТранзакции, инициированные этим узлом: предложено / валидируется / откатано

Размеры схем и таблиц

Появляются при schema_size_metrics: true (запрос к information_schema — относительно тяжёлый, по умолчанию выключен).

Имя метрикиЕдиницаОписание
mysql_info_schema_sizemebibyteРазмер схемы, MiB (тег schema)
mysql_info_table_data_sizemebibyteРазмер данных таблицы, MiB
mysql_info_table_index_sizemebibyteРазмер индексов таблицы, MiB
mysql_index_sizebyteРазмер индекса в байтах (index_metrics)
mysql_index_reads / mysql_index_updates / mysql_index_deletesoperationЧисло read/update/delete-операций по индексу (Percona userstat / index_metrics)
mysql_info_table_rows_read / mysql_info_table_rows_changedrow (count)Прочитано / изменено строк по таблице (Percona userstat)

Метрики уровня SQL-запросов

Появляются при dbm: true и включённой performance_schema с digest-консьюмерами; все несут лейблы query_signature/digest (+ schema). Тип — count (кумулятив, дельту считает бэкенд).

Имя метрикиЕдиницаОписание
mysql_queries_countqueryВсего выполнений нормализованного запроса
mysql_queries_timenanosecondСуммарное время выполнения запроса
mysql_queries_lock_timenanosecondСуммарное время ожидания блокировок запросом
mysql_queries_errorserrorЧисло выполнений запроса с ошибкой
mysql_queries_rows_sentrowОтправлено строк
mysql_queries_rows_examinedrowПросмотрено строк
mysql_queries_rows_affectedrowИзменено строк
mysql_queries_no_index_used / mysql_queries_no_good_index_usedqueryВыполнений без индекса / с неоптимальным индексом
mysql_queries_select_full_join / mysql_queries_select_scanoperationFull 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_queries rate > 0 — медленные запросы; смотрите slow query log.
  • mysql_performance_created_tmp_disk_tables rate — временные таблицы уходят на диск (мал 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_examined per query_signature — какие запросы дороже всего.

InnoDB

  • mysql_innodb_buffer_pool_utilization близко к 1 + рост mysql_innodb_buffer_pool_reads — buffer pool мал, растут чтения с диска.
  • mysql_innodb_row_lock_waits rate и mysql_innodb_row_lock_time — рост = контеншн по строкам; mysql_innodb_deadlocks > 0 — дедлоки.
  • mysql_innodb_history_list_length растёт и не падает — purge не успевает (длинные транзакции держат старые версии строк).
  • mysql_innodb_log_waits rate > 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.

Проверка

В выводе agent status должен быть раздел Logs Agent со статусом running и хотя бы один источник mysql с ненулевым BytesRead (у источника типа «JSON-файл docker-контейнера» поле Status может отображаться как Pending даже при активном чтении — смотрите BytesRead и LogsProcessed):

docker exec protoobp-agent agent status \
  | sed -n '/^==== Logs Agent ====/,/^====/p'