MySQL

Supported OS Linux Mac OS Windows

Intégration8.2.1

Dashboard MySQL

Présentation

L’Agent Datadog peut recueillir de nombreuses métriques à partir des bases de données MySQL, notamment (sans s’y limiter) :

  • Le débit de requêtes
  • Les performances des requêtes, notamment le délai d’exécution moyen des requêtes et les requêtes lentes
  • Les connexions, notamment les connexions actives, les connexions interrompues et les erreurs
  • InnoDB, notamment les métriques de pool de buffer

Vous pouvez également créer vos propres métriques à l’aide de requêtes SQL personnalisées.

Remarque : cette intégration est également compatible avec MariaDB, car elle sert de « remplacement » pour MySQL.

Configuration

Cette page décrit le fonctionnement de l'intégration d'Agent MySQL. Si vous souhaitez obtenir des informations sur la solution Database Monitoring pour MySQL, consultez la section Database Monitoring.

Installation

Le check MySQL est inclus avec le package de l’Agent Datadog. Vous n’avez donc rien d’autre à installer sur votre serveur MySQL.

Préparer MySQL

Sur chaque serveur MySQL, créez un utilisateur de base de données pour l’Agent Datadog.

Les instructions suivantes autorisent l’Agent à se connecter depuis n’importe quel host à l’aide de datadog@'%'. Vous pouvez restreindre l’utilisateur datadog avec datadog@'localhost', de façon à ce qu’il soit uniquement autorisé à se connecter depuis localhost. Consultez la section Ajouter des comptes, attribuer des droits d’accès et supprimer des comptes de la documentation MySQL (en anglais) pour en savoir plus.

mysql> CREATE USER 'datadog'@'%' IDENTIFIED BY '<MOT_DE_PASSE_UNIQUE>';
Query OK, 0 rows affected (0.00 sec)

Pour mySQL 8.0 et ultérieur, créez l’utilisateur datadog avec la méthode de hachage de mot de passe natif :

mysql> CREATE USER 'datadog'@'%' IDENTIFIED WITH mysql_native_password by '<MOT_DE_PASSE_UNIQUE>';
Query OK, 0 rows affected (0.00 sec)

Vérifiez que l’utilisateur a bien été créé à l’aide des commandes ci-dessous. Remplacez <MOT_DE_PASSE_UNIQUE> par le mot de passe que vous avez créé ci-dessus :

mysql -u datadog --password=<MOT_DE_PASSE_UNIQUE> -e "show status" | \
grep Uptime && echo -e "\033[0;32mMySQL user - OK\033[0m" || \
echo -e "\033[0;31mCannot connect to MySQL\033[0m"
mysql -u datadog --password=<MOT_DE_PASSE_UNIQUE> -e "show slave status" && \
echo -e "\033[0;32mMySQL grant - OK\033[0m" || \
echo -e "\033[0;31mMissing REPLICATION CLIENT grant\033[0m"

L’Agent a besoin de certains privilèges pour recueillir des métriques. Accordez à l’utilisateur les privilèges limités suivants UNIQUEMENT :

mysql> GRANT REPLICATION CLIENT ON *.* TO 'datadog'@'%' WITH MAX_USER_CONNECTIONS 5;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> GRANT PROCESS ON *.* TO 'datadog'@'%';
Query OK, 0 rows affected (0.00 sec)

Pour MySQL 8.0+, définissez max_user_connections avec :

mysql> ALTER USER 'datadog'@'%' WITH MAX_USER_CONNECTIONS 5;
Query OK, 0 rows affected (0.00 sec)

Si cette option est activée, les métriques peuvent être recueillies à partir de la base de données performance_schema en accordant un privilège supplémentaire :

mysql> show databases like 'performance_schema';
+-------------------------------+
| Database (performance_schema) |
+-------------------------------+
| performance_schema            |
+-------------------------------+
1 row in set (0.00 sec)

mysql> GRANT SELECT ON performance_schema.* TO 'datadog'@'%';
Query OK, 0 rows affected (0.00 sec)

Procédure à suivre

Suivez les instructions ci-dessous pour configurer ce check lorsque l’Agent est exécuté sur un host. Consultez la section Docker, Kubernetes ou ECS pour la configuration dans un environnement conteneurisé.

Host

Pour configurer ce check lorsque l’Agent est exécuté sur un host :

Modifiez le fichier mysql.d/conf.yaml dans le dossier conf.d/ à la racine du répertoire de configuration de votre Agent pour commencer à recueillir vos métriques et logs MySQL. Consultez le fichier d’exemple mysql.d/conf.yaml pour découvrir toutes les options de configuration disponibles.

Collecte de métriques
  • Ajoutez ce bloc de configuration à votre fichier mysql.d/conf.yaml pour recueillir vos métriques MySQL :

    init_config:
    
    instances:
      - server: 127.0.0.1
        user: datadog
        password: "<YOUR_CHOSEN_PASSWORD>" # from the CREATE USER step earlier
        port: "<YOUR_MYSQL_PORT>" # e.g. 3306
        options:
          replication: false
          galera_cluster: true
          extra_status_metrics: true
          extra_innodb_metrics: true
          extra_performance_metrics: true
          schema_size_metrics: false
          disable_innodb_metrics: false
    

Remarque : ajoutez des guillemets simples autour de votre mot de passe s’il contient un caractère spécial.

Pour recueillir d’autres métriques de performance (extra_performance_metrics), l’option performance_schema doit être activée sur votre serveur MySQL. Sinon, extra_performance_metrics doit être défini sur false. Pour en savoir plus sur performance_schema, consultez la section Prise en main du schéma de performance de la documentation MySQL (en anglais).

Remarque : l’utilisateur datadog doit être défini dans la configuration de l’intégration MySQL en tant que host: 127.0.0.1 au lieu de localhost. Vous pouvez également utiliser sock.

Consultez le fichier d’exemple mysql.yaml pour découvrir toutes les options de configuration disponibles, notamment pour les métriques custom.

Redémarrez l’Agent pour commencer à envoyer des métriques MySQL à Datadog.

Collecte de logs

Disponible à partir des versions > 6.0 de l’Agent

  1. Par défaut, MySQL enregistre tous ses logs dans /var/log/syslog, dont la lecture nécessite un accès root. Pour rendre les logs plus accessibles, voici les étapes à suivre :

    • Modifiez /etc/mysql/conf.d/mysqld_safe_syslog.cnf et supprimez ou commentez les lignes.

    • Modifiez /etc/mysql/my.cnf et ajoutez les lignes suivantes pour activer les logs généraux, d’erreurs et de requêtes lentes :

        [mysqld_safe]
        log_error = /var/log/mysql/mysql_error.log
      
        [mysqld]
        general_log = on
        general_log_file = /var/log/mysql/mysql.log
        log_error = /var/log/mysql/mysql_error.log
        slow_query_log = on
        slow_query_log_file = /var/log/mysql/mysql_slow.log
        long_query_time = 2
      
    • Enregistrez le fichier et redémarrez MySQL à l’aide des commandes suivantes : service mysql restart

    • Assurez-vous que l’Agent dispose d’une autorisation de lecture pour le répertoire /var/log/mysql et tous ses fichiers. Vérifiez votre configuration de logrotate pour vous assurer que ces fichiers sont pris en compte et que les autorisations sont correctement définies.

    • Dans /etc/logrotate.d/mysql-server, vous devriez voir des lignes similaires à ce qui suit :

        /var/log/mysql.log /var/log/mysql/mysql.log /var/log/mysql/mysql_slow.log {
                daily
                rotate 7
                missingok
                create 644 mysql adm
                Compress
        }
      
  2. La collecte de logs est désactivée par défaut dans l’Agent Datadog. Vous devez l’activer dans datadog.yaml :

    logs_enabled: true
    
  3. Ajoutez ce bloc de configuration à votre fichier mysql.d/conf.yaml pour commencer à recueillir vos logs MySQL :

    logs:
      - type: file
        path: "<ERROR_LOG_FILE_PATH>"
        source: mysql
        service: "<SERVICE_NAME>"
    
      - type: file
        path: "<SLOW_QUERY_LOG_FILE_PATH>"
        source: mysql
        service: "<SERVICE_NAME>"
        log_processing_rules:
          - type: multi_line
            name: new_slow_query_log_entry
            pattern: "# Time:"
            # If mysqld was started with `--log-short-format`, use:
            # pattern: "# Query_time:"
            # If using mysql version <5.7, use the following rules instead:
            # - type: multi_line
            #   name: new_slow_query_log_entry
            #   pattern: "# Time|# User@Host"
            # - type: exclude_at_match
            #   name: exclude_timestamp_only_line
            #   pattern: "# Time:"
    
      - type: file
        path: "<GENERAL_LOG_FILE_PATH>"
        source: mysql
        service: "<SERVICE_NAME>"
        # For multiline logs, if they start by the date with the format yyyy-mm-dd uncomment the following processing rule
        # log_processing_rules:
        #   - type: multi_line
        #     name: new_log_start_with_date
        #     pattern: \d{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])
        # If the logs start with a date with the format yymmdd but include a timestamp with each new second, rather than with each log, uncomment the following processing rule
        # log_processing_rules:
        #   - type: multi_line
        #     name: new_logs_do_not_always_start_with_timestamp
        #     pattern: \t\t\s*\d+\s+|\d{6}\s+\d{,2}:\d{2}:\d{2}\t\s*\d+\s+
    

    Consultez le fichier d’exemple mysql.yaml pour découvrir toutes les options de configuration disponibles, notamment pour les métriques custom.

  4. Redémarrez l’Agent.

Docker

Pour configurer ce check lorsque l’Agent est exécuté sur un conteneur :

Collecte de métriques

Définissez des modèles d’intégration Autodiscovery en tant qu’étiquettes Docker sur votre conteneur d’application :

LABEL "com.datadoghq.ad.check_names"='["mysql"]'
LABEL "com.datadoghq.ad.init_configs"='[{}]'
LABEL "com.datadoghq.ad.instances"='[{"server": "%%host%%", "user": "datadog","password": "<MOT_DE_PASSE_UNIQUE>"}]'

Consultez la documentation relative aux template variables Autodiscovery pour découvrir comment utiliser <MOT_DE_PASSE_UNIQUE> en tant que variable d’environnement plutôt que sous forme d’étiquette.

Collecte de logs

La collecte des logs est désactivée par défaut dans l’Agent Datadog. Pour l’activer, consultez la section Collecte de logs avec Docker.

Définissez ensuite des intégrations de logs en tant qu’étiquettes Docker :

LABEL "com.datadoghq.ad.logs"='[{"source":"mysql","service":"mysql"}]'

Kubernetes

Pour configurer ce check lorsque l’Agent est exécuté sur Kubernetes :

Collecte de métriques

Définissez des modèles d’intégration Autodiscovery en tant qu’annotations de pod sur votre conteneur d’application. Vous pouvez également configurer des modèles avec un fichier, une configmap ou un stockage key/value.

apiVersion: v1
kind: Pod
metadata:
  name: mysql
  annotations:
    ad.datadoghq.com/mysql.check_names: '["mysql"]'
    ad.datadoghq.com/mysql.init_configs: '[{}]'
    ad.datadoghq.com/mysql.instances: |
      [
        {
          "server": "%%host%%", 
          "user": "datadog",
          "password": "<MOT_DE_PASSE_UNIQUE>"
        }
      ]      
  labels:
    name: mysql
spec:
  containers:
    - name: mysql

Consultez la documentation relative aux template variables Autodiscovery pour découvrir comment utiliser <MOT_DE_PASSE_UNIQUE> en tant que variable d’environnement plutôt que sous forme d’étiquette.

Collecte de logs

La collecte des logs est désactivée par défaut dans l’Agent Datadog. Pour l’activer, consultez la section Collecte de logs avec Kubernetes.

Définissez ensuite des intégrations de logs en tant qu’annotations de pod. Cette configuration peut également être réalisée avec un fichier, une configmap ou un stockage key/value.

apiVersion: v1
kind: Pod
metadata:
  name: mysql
  annotations:
    ad.datadoghq.com/mysql.logs: '[{"source": "mysql", "service": "mysql"}]'
  labels:
    name: mysql

ECS

Pour configurer ce check lorsque l’Agent est exécuté sur ECS :

Collecte de métriques

Définissez des modèles d’intégration Autodiscovery en tant qu’étiquettes Docker sur votre conteneur d’application :

{
  "containerDefinitions": [{
    "name": "mysql",
    "image": "mysql:latest",
    "dockerLabels": {
      "com.datadoghq.ad.check_names": "[\"mysql\"]",
      "com.datadoghq.ad.init_configs": "[{}]",
      "com.datadoghq.ad.instances": "[{\"server\": \"%%host%%\", \"user\": \"datadog\",\"password\": \"<MOT_DE_PASSE_UNIQUE>\"}]"
    }
  }]
}

Consultez la documentation relative aux template variables Autodiscovery pour découvrir comment utiliser <MOT_DE_PASSE_UNIQUE> en tant que variable d’environnement plutôt que sous forme d’étiquette.

Collecte de logs

Disponible à partir des versions > 6.0 de l’Agent

La collecte des logs est désactivée par défaut dans l’Agent Datadog. Pour l’activer, consultez la section Collecte de logs Amazon ECS.

Définissez ensuite des intégrations de logs en tant qu’étiquettes Docker :

{
  "containerDefinitions": [{
    "name": "mysql",
    "image": "mysql:latest",
    "dockerLabels": {
      "com.datadoghq.ad.logs": "[{\"source\":\"mysql\",\"service\":\"mysql\"}]"
    }
  }]
}

Validation

Lancez la sous-commande status de l’Agent et cherchez mysql dans la section Checks.

Données collectées

Métriques

Par défaut, le check ne recueille pas toutes les métriques. Définissez les options de configuration booléennes suivantes sur true pour activer les métriques correspondantes :

extra_status_metrics ajoute les métriques suivantes :

Nom de la métriqueType de la métrique
mysql.binlog.cache_disk_useGAUGE
mysql.binlog.cache_useGAUGE
mysql.performance.handler_commitRATE
mysql.performance.handler_deleteRATE
mysql.performance.handler_prepareRATE
mysql.performance.handler_read_firstRATE
mysql.performance.handler_read_keyRATE
mysql.performance.handler_read_nextRATE
mysql.performance.handler_read_prevRATE
mysql.performance.handler_read_rndRATE
mysql.performance.handler_read_rnd_nextRATE
mysql.performance.handler_rollbackRATE
mysql.performance.handler_updateRATE
mysql.performance.handler_writeRATE
mysql.performance.opened_tablesRATE
mysql.performance.qcache_total_blocksGAUGE
mysql.performance.qcache_free_blocksGAUGE
mysql.performance.qcache_free_memoryGAUGE
mysql.performance.qcache_not_cachedRATE
mysql.performance.qcache_queries_in_cacheGAUGE
mysql.performance.select_full_joinRATE
mysql.performance.select_full_range_joinRATE
mysql.performance.select_rangeRATE
mysql.performance.select_range_checkRATE
mysql.performance.select_scanRATE
mysql.performance.sort_merge_passesRATE
mysql.performance.sort_rangeRATE
mysql.performance.sort_rowsRATE
mysql.performance.sort_scanRATE
mysql.performance.table_locks_immediateGAUGE
mysql.performance.table_locks_immediate.rateRATE
mysql.performance.threads_cachedGAUGE
mysql.performance.threads_createdMONOTONIC

extra_innodb_metrics ajoute les métriques suivantes :

Nom de la métriqueType de la métrique
mysql.innodb.active_transactionsGAUGE
mysql.innodb.buffer_pool_dataGAUGE
mysql.innodb.buffer_pool_pages_dataGAUGE
mysql.innodb.buffer_pool_pages_dirtyGAUGE
mysql.innodb.buffer_pool_pages_flushedRATE
mysql.innodb.buffer_pool_pages_freeGAUGE
mysql.innodb.buffer_pool_pages_totalGAUGE
mysql.innodb.buffer_pool_read_aheadRATE
mysql.innodb.buffer_pool_read_ahead_evictedRATE
mysql.innodb.buffer_pool_read_ahead_rndGAUGE
mysql.innodb.buffer_pool_wait_freeMONOTONIC
mysql.innodb.buffer_pool_write_requestsRATE
mysql.innodb.checkpoint_ageGAUGE
mysql.innodb.current_transactionsGAUGE
mysql.innodb.data_fsyncsRATE
mysql.innodb.data_pending_fsyncsGAUGE
mysql.innodb.data_pending_readsGAUGE
mysql.innodb.data_pending_writesGAUGE
mysql.innodb.data_readRATE
mysql.innodb.data_writtenRATE
mysql.innodb.dblwr_pages_writtenRATE
mysql.innodb.dblwr_writesRATE
mysql.innodb.hash_index_cells_totalGAUGE
mysql.innodb.hash_index_cells_usedGAUGE
mysql.innodb.history_list_lengthGAUGE
mysql.innodb.ibuf_free_listGAUGE
mysql.innodb.ibuf_mergedRATE
mysql.innodb.ibuf_merged_delete_marksRATE
mysql.innodb.ibuf_merged_deletesRATE
mysql.innodb.ibuf_merged_insertsRATE
mysql.innodb.ibuf_mergesRATE
mysql.innodb.ibuf_segment_sizeGAUGE
mysql.innodb.ibuf_sizeGAUGE
mysql.innodb.lock_structsRATE
mysql.innodb.locked_tablesGAUGE
mysql.innodb.locked_transactionsGAUGE
mysql.innodb.log_waitsRATE
mysql.innodb.log_write_requestsRATE
mysql.innodb.log_writesRATE
mysql.innodb.lsn_currentRATE
mysql.innodb.lsn_flushedRATE
mysql.innodb.lsn_last_checkpointRATE
mysql.innodb.mem_adaptive_hashGAUGE
mysql.innodb.mem_additional_poolGAUGE
mysql.innodb.mem_dictionaryGAUGE
mysql.innodb.mem_file_systemGAUGE
mysql.innodb.mem_lock_systemGAUGE
mysql.innodb.mem_page_hashGAUGE
mysql.innodb.mem_recovery_systemGAUGE
mysql.innodb.mem_thread_hashGAUGE
mysql.innodb.mem_totalGAUGE
mysql.innodb.os_file_fsyncsRATE
mysql.innodb.os_file_readsRATE
mysql.innodb.os_file_writesRATE
mysql.innodb.os_log_pending_fsyncsGAUGE
mysql.innodb.os_log_pending_writesGAUGE
mysql.innodb.os_log_writtenRATE
mysql.innodb.pages_createdRATE
mysql.innodb.pages_readRATE
mysql.innodb.pages_writtenRATE
mysql.innodb.pending_aio_log_iosGAUGE
mysql.innodb.pending_aio_sync_iosGAUGE
mysql.innodb.pending_buffer_pool_flushesGAUGE
mysql.innodb.pending_checkpoint_writesGAUGE
mysql.innodb.pending_ibuf_aio_readsGAUGE
mysql.innodb.pending_log_flushesGAUGE
mysql.innodb.pending_log_writesGAUGE
mysql.innodb.pending_normal_aio_readsGAUGE
mysql.innodb.pending_normal_aio_writesGAUGE
mysql.innodb.queries_insideGAUGE
mysql.innodb.queries_queuedGAUGE
mysql.innodb.read_viewsGAUGE
mysql.innodb.rows_deletedRATE
mysql.innodb.rows_insertedRATE
mysql.innodb.rows_readRATE
mysql.innodb.rows_updatedRATE
mysql.innodb.s_lock_os_waitsRATE
mysql.innodb.s_lock_spin_roundsRATE
mysql.innodb.s_lock_spin_waitsRATE
mysql.innodb.semaphore_wait_timeGAUGE
mysql.innodb.semaphore_waitsGAUGE
mysql.innodb.tables_in_useGAUGE
mysql.innodb.x_lock_os_waitsRATE
mysql.innodb.x_lock_spin_roundsRATE
mysql.innodb.x_lock_spin_waitsRATE

extra_performance_metrics ajoute les métriques suivantes :

Nom de la métriqueType de la métrique
mysql.performance.query_run_time.avgGAUGE
mysql.performance.digest_95th_percentile.avg_usGAUGE

schema_size_metrics ajoute la métrique suivante :

Nom de la métriqueType de la métrique
mysql.info.schema.sizeGAUGE

Événements

Le check MySQL n’inclut aucun événement.

Checks de service

mysql.can_connect
Renvoie CRITICAL si l’Agent n’est pas capable de se connecter à l’instance MySQL qu’il surveille. Si ce n’est pas le cas, renvoie OK.
Statuses: ok, critical

Dépannage

Pour aller plus loin

Documentation, liens et articles supplémentaires utiles :

PREVIEWING: may/embedded-workflows