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

Сбор метрик MySQL

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

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

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

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

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

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

    CREATE USER 'protoobp'@'%' IDENTIFIED BY '<пароль>';
    
  2. Задайте права для сбора метрик для пользователя protoobp:

    • Для MySQL 5.6 и 5.7:

      GRANT REPLICATION CLIENT ON *.* TO 'protoobp'@'%' WITH MAX_USER_CONNECTIONS 5;
      GRANT PROCESS ON *.* TO 'protoobp'@'%';
      
    • Для MySQL 8.0+:

      GRANT REPLICATION CLIENT ON *.* TO 'protoobp'@'%'
      GRANT PROCESS ON *.* TO 'protoobp'@'%';
      
  3. Если на сервере MySQL включена performance_schema, для сбора метрик добавьте соответствующие права пользователю protoobp:

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

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

  1. В файле конфигурации MySQL ProtoOBP агента (/etc/protoobp-agent/conf.d/mysql.d/conf.yaml) укажите следующее:

    init_config:
    instances:
      - host: 127.0.0.1       # Не используйте localhost
        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
    
  2. Перезапустите ProtoOBP агента выполнив systemctl restart protoobp-agent

  1. Добавьте следующие лейблы к Docker контейнеру с MySQL:

    В docker-compose.yaml:

    labels:
      com.protoobp.ad.check_names: '["mysql"]'
      com.protoobp.ad.init_configs: "[{}]"
      com.protoobp.ad.instances: '[{"server": "%%host%%", "username": "protoobp","password": "<пароль>"}]'
    

    или в Dockerfile:

    LABEL "com.protoobp.ad.check_names"='["mysql"]'
    LABEL "com.protoobp.ad.init_configs"='[{}]'
    LABEL "com.protoobp.ad.instances"='[{"server": "%%host%%", "username": "protoobp","password": "<пароль>"}]'
    

Для проверки корректности подключения в веб-интерфейсе 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/protobop.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 (если они не были ранее добавлены):

    В docker-compose.yaml:

    labels:
      com.protoobp.ad.check_names: '["mysql"]'
      com.protoobp.ad.init_configs: "[{}]"
      com.protoobp.ad.instances: '[{"server": "%%host%%", "username": "protoobp","password": "<пароль>"}]'
    

    или в Dockerfile:

    LABEL "com.protoobp.ad.check_names"='["mysql"]'
    LABEL "com.protoobp.ad.init_configs"='[{}]'
    LABEL "com.protoobp.ad.instances"='[{"server": "%%host%%", "username": "protoobp","password": "<пароль>"}]'
    
  3. Перезапустите контейнер с ProtoOBP агентом и MySQL, например, выполнив docker compose up -d.

Для проверки корректности подключения в веб-интерфейсе ProtoOBP перейдите в раздел Базы данных > MySQL > имя сервера > вкладка SQL запросы и убедитесь, что в дашборде отображаются данные по производительности SQL запросов. Для отображения данных может потребоваться около 1 минуты.