MySQL

MySQL

Agent Check Agent Check

Supported OS Linux Mac OS Windows

Integrationv7.0.1

MySQL Dashboard

Overview

The Datadog Agent can collect many metrics from MySQL databases, including (but not limited to):

  • Query throughput
  • Query performance (e.g. average query run time, slow queries, etc.)
  • Connections (e.g. currently open connections, aborted connections, errors, etc.)
  • InnoDB (e.g. buffer pool metrics, etc.)

You can also create your own metrics using custom SQL queries.

Note: This integration is also compatible with MariaDB, as it serves as a “drop-in replacement” for MySQL.

Setup

This page describes the MySQL Agent integration. If you are looking for the Database Monitoring product for MySQL, see Datadog Database Monitoring.

Installation

The MySQL check is included in the Datadog Agent package. No additional installation is needed on your MySQL server.

Prepare MySQL

On each MySQL server, create a database user for the Datadog Agent:

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

For mySQL 8.0+ create the datadog user with the native password hashing method:

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

Note: @'localhost' is only for local connections. For remote connections, use the hostname/IP of your Agent. For more information, see the MySQL documentation.

Note: If you encounter the following error message (1045, u"Access denied for user 'datadog'@'127.0.0.1' (using password: YES)")), see the MySQL Localhost Error documentation.

Verify the user was created successfully using the following commands - replace <UNIQUEPASSWORD> with the password you created above:

mysql -u datadog --password=<UNIQUEPASSWORD> -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=<UNIQUEPASSWORD> -e "show slave status" && \
echo -e "\033[0;32mMySQL grant - OK\033[0m" || \
echo -e "\033[0;31mMissing REPLICATION CLIENT grant\033[0m"

The Agent needs a few privileges to collect metrics. Grant the user the following limited privileges ONLY:

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

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

For MySQL 8.0+ set max_user_connections with:

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

If enabled, metrics can be collected from the performance_schema database by granting an additional privilege:

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'@'localhost';
Query OK, 0 rows affected (0.00 sec)

Configuration

Follow the instructions below to configure this check for an Agent running on a host. For containerized environments, see the Docker, Kubernetes, or ECS sections.

Host

To configure this check for an Agent running on a host:

Edit the mysql.d/conf.yaml file, in the conf.d/ folder at the root of your Agent’s configuration directory to start collecting your MySQL metrics and logs. See the sample mysql.d/conf.yaml for all available configuration options.

Metric collection
  • Add this configuration block to your mysql.d/conf.yaml to collect your MySQL metrics:

    init_config:
    
    instances:
      - server: 127.0.0.1
        user: datadog
        pass: "<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
    

Note: Wrap your password in single quotes in case a special character is present.

To collect extra_performance_metrics, your MySQL server must have performance_schema enabled - otherwise set extra_performance_metrics to false. For more information on performance_schema, see the MySQL documentation.

Note that the datadog user should be set up in the MySQL integration configuration as host: 127.0.0.1 instead of localhost. Alternatively, you may also use sock.

See our sample mysql.yaml for all available configuration options, including those for custom metrics.

Restart the Agent to start sending MySQL metrics to Datadog.

Log collection

Log collection is not supported for the Datadog site.

Available for Agent versions >6.0

  1. By default MySQL logs everything in /var/log/syslog which requires root access to read. To make the logs more accessible, follow these steps:

    • Edit /etc/mysql/conf.d/mysqld_safe_syslog.cnf and remove or comment the lines.

    • Edit /etc/mysql/my.cnf and add following lines to enable general, error, and slow query logs:

        [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
      
    • Save the file and restart MySQL using following commands: service mysql restart

    • Make sure the Agent has read access on the /var/log/mysql directory and all of the files within. Double-check your logrotate configuration to make sure those files are taken into account and that the permissions are correctly set there as well.

    • In /etc/logrotate.d/mysql-server there should be something similar to:

        /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. Collecting logs is disabled by default in the Datadog Agent, enable it in your datadog.yaml file:

    logs_enabled: true
    
  3. Add this configuration block to your mysql.d/conf.yaml file to start collecting your MySQL logs:

    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+
    

    See our sample mysql.yaml for all available configuration options, including those for custom metrics.

  4. Restart the Agent.

Docker

To configure this check for an Agent running on a container:

Metric collection

Set Autodiscovery Integration Templates as Docker labels on your application container:

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

See the Autodiscovery template variables documentation to learn how to pass <UNIQUEPASSWORD> as an environment variable instead of a label.

Log collection

Log collection is not supported for the Datadog site.

Collecting logs is disabled by default in the Datadog Agent. To enable it, see the Docker log collection documentation.

Then, set Log Integrations as Docker labels:

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

Kubernetes

To configure this check for an Agent running on Kubernetes:

Metric collection

Set Autodiscovery Integrations Templates as pod annotations on your application container. Alternatively, you can configure templates with a file, configmap, or key-value store.

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",
          "pass": "<UNIQUEPASSWORD>"
        }
      ]      
  labels:
    name: mysql
spec:
  containers:
    - name: mysql

See the Autodiscovery template variables documentation to learn how to pass <UNIQUEPASSWORD> as an environment variable instead of a label.

Log collection

Log collection is not supported for the Datadog site.

Collecting logs is disabled by default in the Datadog Agent. To enable it, see the Kubernetes log collection documentation.

Then, set Log Integrations as pod annotations. Alternatively, you can configure this with a file, configmap, or key-value store.

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

ECS

To configure this check for an Agent running on ECS:

Metric collection

Set Autodiscovery Integrations Templates as Docker labels on your application container:

{
  "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\",\"pass\": \"<UNIQUEPASSWORD>\"}]"
    }
  }]
}

See the Autodiscovery template variables documentation to learn how to pass <UNIQUEPASSWORD> as an environment variable instead of a label.

Log collection

Log collection is not supported for the Datadog site.

Available for Agent versions >6.0

Collecting logs is disabled by default in the Datadog Agent. To enable it, see the ECS log collection documentation.

Then, set Log Integrations as Docker labels:

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

Validation

Run the Agent’s status subcommand and look for mysql under the Checks section.

Data Collected

Metrics

mysql.info.schema.size
(gauge)
Size of schemas in MiB
Shown as mebibyte
mysql.galera.wsrep_cluster_size
(gauge)
The current number of nodes in the Galera cluster.
Shown as node
mysql.innodb.buffer_pool_free
(gauge)
The number of free pages in the InnoDB Buffer Pool.
Shown as page
mysql.innodb.buffer_pool_total
(gauge)
The total number of pages in the InnoDB Buffer Pool.
Shown as page
mysql.innodb.buffer_pool_used
(gauge)
The number of used pages in the InnoDB Buffer Pool.
Shown as page
mysql.innodb.buffer_pool_utilization
(gauge)
The utilization of the InnoDB Buffer Pool.
Shown as fraction
mysql.innodb.current_row_locks
(gauge)
The number of current row locks.
Shown as lock
mysql.innodb.data_reads
(gauge)
The rate of data reads.
Shown as read
mysql.innodb.data_writes
(gauge)
The rate of data writes.
Shown as write
mysql.innodb.mutex_os_waits
(gauge)
The rate of mutex OS waits.
Shown as event
mysql.innodb.mutex_spin_rounds
(gauge)
The rate of mutex spin rounds.
Shown as event
mysql.innodb.mutex_spin_waits
(gauge)
The rate of mutex spin waits.
Shown as event
mysql.innodb.os_log_fsyncs
(gauge)
The rate of fsync writes to the log file.
Shown as write
mysql.innodb.row_lock_time
(gauge)
Fraction of time spent (ms/s) acquiring row locks.
Shown as fraction
mysql.innodb.row_lock_waits
(gauge)
The number of times per second a row lock had to be waited for.
Shown as event
mysql.net.connections
(gauge)
The rate of connections to the server.
Shown as connection
mysql.net.max_connections
(gauge)
The maximum number of connections that have been in use simultaneously since the server started.
Shown as connection
mysql.net.max_connections_available
(gauge)
The maximum permitted number of simultaneous client connections.
Shown as connection
mysql.performance.com_delete
(gauge)
The rate of delete statements.
Shown as query
mysql.performance.com_delete_multi
(gauge)
The rate of delete-multi statements.
Shown as query
mysql.performance.com_insert
(gauge)
The rate of insert statements.
Shown as query
mysql.performance.com_insert_select
(gauge)
The rate of insert-select statements.
Shown as query
mysql.performance.com_replace_select
(gauge)
The rate of replace-select statements.
Shown as query
mysql.performance.com_select
(gauge)
The rate of select statements.
Shown as query
mysql.performance.com_update
(gauge)
The rate of update statements.
Shown as query
mysql.performance.com_update_multi
(gauge)
The rate of update-multi.
Shown as query
mysql.performance.created_tmp_disk_tables
(gauge)
The rate of internal on-disk temporary tables created by second by the server while executing statements.
Shown as table
mysql.performance.created_tmp_files
(gauge)
The rate of temporary files created by second.
Shown as file
mysql.performance.created_tmp_tables
(gauge)
The rate of internal temporary tables created by second by the server while executing statements.
Shown as table
mysql.performance.kernel_time
(gauge)
Percentage of CPU time spent in kernel space by MySQL.
Shown as percent
mysql.performance.key_cache_utilization
(gauge)
The key cache utilization ratio.
Shown as fraction
mysql.performance.open_files
(gauge)
The number of open files.
Shown as file
mysql.performance.open_tables
(gauge)
The number of of tables that are open.
Shown as table
mysql.performance.qcache_hits
(gauge)
The rate of query cache hits.
Shown as hit
mysql.performance.questions
(gauge)
The rate of statements executed by the server.
Shown as query
mysql.performance.slow_queries
(gauge)
The rate of slow queries.
Shown as query
mysql.performance.table_locks_waited
(gauge)
The total number of times that a request for a table lock could not be granted immediately and a wait was needed.
mysql.performance.table_locks_waited.rate
(gauge)
The rate of times that a request for a table lock could not be granted immediately and a wait was needed.
mysql.performance.threads_connected
(gauge)
The number of currently open connections.
Shown as connection
mysql.performance.threads_running
(gauge)
The number of threads that are not sleeping.
Shown as thread
mysql.performance.cpu_time
(gauge)
Percentage of CPU time spent by MySQL.
Shown as percent
mysql.performance.user_time
(gauge)
Percentage of CPU time spent in user space by MySQL.
Shown as percent
mysql.replication.seconds_behind_master
(gauge)
The lag in seconds between the master and the slave.
Shown as second
mysql.replication.seconds_behind_source
(gauge)
The lag in seconds between the source and the replica.
Shown as second
mysql.replication.slave_running
(gauge)
Deprecated. Use service check mysql.replication.replica_running instead. A boolean showing if this server is a replication slave / master that is running.
mysql.replication.slaves_connected
(gauge)
Deprecated. Use mysql.replication.replicas_connected instead. Number of slaves connected to a replication master.
mysql.replication.replicas_connected
(gauge)
Number of replicas connected to a replication source.
mysql.performance.queries
(gauge)
The rate of queries.
Shown as query
mysql.performance.com_replace
(gauge)
The rate of replace statements.
Shown as query
mysql.performance.com_load
(gauge)
The rate of load statements.
Shown as query
mysql.net.aborted_clients
(gauge)
The number of connections that were aborted because the client died without closing the connection properly.
Shown as connection
mysql.net.aborted_connects
(gauge)
The number of failed attempts to connect to the MySQL server.
Shown as connection
mysql.performance.bytes_sent
(gauge)
The number of bytes sent to all clients.
Shown as byte
mysql.performance.bytes_received
(gauge)
The number of bytes received from all clients.
Shown as byte
mysql.performance.qcache_inserts
(gauge)
The number of queries added to the query cache.
Shown as query
mysql.performance.qcache_lowmem_prunes
(gauge)
The number of queries that were deleted from the query cache because of low memory.
Shown as query
mysql.myisam.key_read_requests
(gauge)
The number of requests to read a key block from the MyISAM key cache.
Shown as read
mysql.myisam.key_reads
(gauge)
The number of physical reads of a key block from disk into the MyISAM key cache. If Key_reads is large, then your key_buffer_size value is probably too small. The cache miss rate can be calculated as Key_reads/Key_read_requests.
Shown as read
mysql.myisam.key_write_requests
(gauge)
The number of requests to write a key block to the MyISAM key cache.
Shown as write
mysql.myisam.key_writes
(gauge)
The number of physical writes of a key block from the MyISAM key cache to disk.
Shown as write
mysql.myisam.key_buffer_size
(gauge)
Size of the buffer used for index blocks.
Shown as byte
mysql.performance.qcache_size
(gauge)
The amount of memory allocated for caching query results.
Shown as byte
mysql.performance.table_open_cache
(gauge)
The number of open tables for all threads. Increasing this value increases the number of file descriptors that mysqld requires.
mysql.performance.thread_cache_size
(gauge)
How many threads the server should cache for reuse. When a client disconnects, the client's threads are put in the cache if there are fewer than thread_cache_size threads there.
Shown as byte
mysql.innodb.active_transactions
(gauge)
The number of active transactions on InnoDB tables.
Shown as operation
mysql.innodb.buffer_pool_dirty
(gauge)
The total current number of bytes held in dirty pages in the InnoDB buffer pool.
Shown as byte
mysql.innodb.buffer_pool_read_requests
(gauge)
The number of logical read requests.
Shown as read
mysql.innodb.buffer_pool_reads
(gauge)
The number of logical reads that InnoDB could not satisfy from the buffer pool, and had to read directly from disk.
Shown as read
mysql.innodb.ibuf_merged_delete_marks
(gauge)
Insert buffer and adaptative hash index merged delete marks
Shown as operation
mysql.innodb.ibuf_merged_deletes
(gauge)
Insert buffer and adaptative hash index merged delete
Shown as operation
mysql.innodb.ibuf_merged_inserts
(gauge)
Insert buffer and adaptative hash index merged inserts
Shown as operation
mysql.innodb.ibuf_merged
(gauge)
Insert buffer and adaptative hash index merged
Shown as operation
mysql.innodb.ibuf_merges
(gauge)
Insert buffer and adaptative hash index merges
Shown as operation
mysql.innodb.lock_structs
(gauge)
Lock structs
Shown as operation
mysql.innodb.os_file_fsyncs
(gauge)
(Delta) The total number of fsync() operations performed by InnoDB.
Shown as operation
mysql.innodb.os_file_reads
(gauge)
(Delta) The total number of files reads performed by read threads within InnoDB.
Shown as operation
mysql.innodb.os_file_writes
(gauge)
(Delta) The total number of file writes performed by write threads within InnoDB.
Shown as operation
mysql.innodb.row_lock_current_waits
(gauge)
The number of row locks currently being waited for by operations on InnoDB tables.
mysql.innodb.semaphore_waits
(gauge)
The number semaphore currently being waited for by operations on InnoDB tables.
mysql.innodb.semaphore_wait_time
(gauge)
Semaphore wait time
mysql.binlog.cache_disk_use
(gauge)
The number of transactions that used the temporary binary log cache but that exceeded the value of binlog_cache_size and used a temporary file to store statements from the transaction.
Shown as transaction
mysql.binlog.cache_use
(gauge)
The number of transactions that used the binary log cache.
Shown as transaction
mysql.replication.group.member_status
(gauge)
Information about the node status in a group replication environment, always equal to 1.
mysql.replication.group.conflicts_detected
(gauge)
The number of transactions that have not passed the conflict detection check.
Shown as transaction
mysql.replication.group.transactions
(gauge)
The number of transactions in the queue pending conflict detection checks.
Shown as transaction
mysql.replication.group.transactions_applied
(gauge)
Number of transactions this member has received from the group and applied.
Shown as transaction
mysql.replication.group.transactions_in_applier_queue
(gauge)
The number of transactions that this member has received from the replication group which are waiting to be applied.
Shown as transaction
mysql.replication.group.transactions_check
(gauge)
The number of transactions that have been checked for conflicts.
Shown as transaction
mysql.replication.group.transactions_proposed
(gauge)
The number of transactions which originated on this member and were sent to the group.
Shown as transaction
mysql.replication.group.transactions_rollback
(gauge)
The number of transactions which originated on this member and were rolled back by the group.
Shown as transaction
mysql.replication.group.transactions_validating
(gauge)
The number of transaction rows which can be used for certification, but have not been garbage collected.
Shown as transaction
mysql.performance.handler_commit
(gauge)
The number of internal COMMIT statements.
Shown as operation
mysql.performance.handler_delete
(gauge)
The number of internal DELETE statements.
Shown as operation
mysql.performance.handler_prepare
(gauge)
The number of internal PREPARE statements.
Shown as operation
mysql.performance.handler_read_first
(gauge)
The number of internal READ_FIRST statements.
Shown as operation
mysql.performance.handler_read_key
(gauge)
The number of internal READ_KEY statements.
Shown as operation
mysql.performance.handler_read_next
(gauge)
The number of internal READ_NEXT statements.
Shown as operation
mysql.performance.handler_read_prev
(gauge)
The number of internal READ_PREV statements.
Shown as operation
mysql.performance.handler_read_rnd
(gauge)
The number of internal READ_RND statements.
Shown as operation
mysql.performance.handler_read_rnd_next
(gauge)
The number of internal READ_RND_NEXT statements.
Shown as operation
mysql.performance.handler_rollback
(gauge)
The number of internal ROLLBACK statements.
Shown as operation
mysql.performance.handler_update
(gauge)
The number of internal UPDATE statements.
Shown as operation
mysql.performance.handler_write
(gauge)
The number of internal WRITE statements.
Shown as operation
mysql.performance.opened_tables
(gauge)
The number of tables that have been opened. If Opened_tables is big, your table_open_cache value is probably too small.
Shown as table
mysql.performance.qcache_total_blocks
(gauge)
The total number of blocks in the query cache.
Shown as block
mysql.performance.qcache_free_blocks
(gauge)
The number of free memory blocks in the query cache.
Shown as block
mysql.performance.qcache_free_memory
(gauge)
The amount of free memory for the query cache.
Shown as byte
mysql.performance.qcache_not_cached
(gauge)
The number of noncached queries (not cacheable, or not cached due to the query_cache_type setting).
Shown as query
mysql.performance.qcache_queries_in_cache
(gauge)
The number of queries registered in the query cache.
Shown as query
mysql.performance.select_full_join
(gauge)
The number of joins that perform table scans because they do not use indexes. If this value is not 0, you should carefully check the indexes of your tables.
Shown as operation
mysql.performance.select_full_range_join
(gauge)
The number of joins that used a range search on a reference table.
Shown as operation
mysql.performance.select_range
(gauge)
The number of joins that used ranges on the first table. This is normally not a critical issue even if the value is quite large.
Shown as operation
mysql.performance.select_range_check
(gauge)
The number of joins without keys that check for key usage after each row. If this is not 0, you should carefully check the indexes of your tables.
Shown as operation
mysql.performance.select_scan
(gauge)
The number of joins that did a full scan of the first table.
Shown as operation
mysql.performance.sort_merge_passes
(gauge)
The number of merge passes that the sort algorithm has had to do. If this value is large, you should consider increasing the value of the sort_buffer_size system variable.
Shown as operation
mysql.performance.sort_range
(gauge)
The number of sorts that were done using ranges.
Shown as operation
mysql.performance.sort_rows
(gauge)
The number of sorted rows.
Shown as operation
mysql.performance.sort_scan
(gauge)
The number of sorts that were done by scanning the table.
Shown as operation
mysql.performance.table_locks_immediate
(gauge)
The number of times that a request for a table lock could be granted immediately.
mysql.performance.table_locks_immediate.rate
(gauge)
The rate of times that a request for a table lock could be granted immediately.
mysql.performance.threads_cached
(gauge)
The number of threads in the thread cache.
Shown as thread
mysql.performance.threads_created
(count)
The number of threads created to handle connections. If Threads_created is big, you may want to increase the thread_cache_size value.
Shown as thread
mysql.performance.table_cache_hits
(gauge)
The number of hits for open tables cache lookups.
Shown as hit
mysql.performance.table_cache_misses
(gauge)
The number of misses for open tables cache lookups.
Shown as miss
mysql.innodb.buffer_pool_data
(gauge)
The total number of bytes in the InnoDB buffer pool containing data. The number includes both dirty and clean pages.
Shown as byte
mysql.innodb.buffer_pool_pages_data
(gauge)
The number of pages in the InnoDB buffer pool containing data. The number includes both dirty and clean pages.
Shown as page
mysql.innodb.buffer_pool_pages_dirty
(gauge)
The current number of dirty pages in the InnoDB buffer pool.
Shown as page
mysql.innodb.buffer_pool_pages_flushed
(gauge)
The number of requests to flush pages from the InnoDB buffer pool.
Shown as page
mysql.innodb.buffer_pool_pages_free
(gauge)
The number of free pages in the InnoDB buffer pool.
Shown as page
mysql.innodb.buffer_pool_pages_total
(gauge)
The total size of the InnoDB buffer pool, in pages.
Shown as page
mysql.innodb.buffer_pool_read_ahead
(gauge)
The number of pages read into the InnoDB buffer pool by the read-ahead background thread.
Shown as page
mysql.innodb.buffer_pool_read_ahead_evicted
(gauge)
The number of pages read into the InnoDB buffer pool by the read-ahead background thread that were subsequently evicted without having been accessed by queries.
Shown as page
mysql.innodb.buffer_pool_read_ahead_rnd
(gauge)
The number of random read-aheads initiated by InnoDB. This happens when a query scans a large portion of a table but in random order.
Shown as operation
mysql.innodb.buffer_pool_wait_free
(count)
When InnoDB needs to read or create a page and no clean pages are available, InnoDB flushes some dirty pages first and waits for that operation to finish. This counter counts instances of these waits.
Shown as wait
mysql.innodb.buffer_pool_write_requests
(gauge)
The number of writes done to the InnoDB buffer pool.
Shown as write
mysql.innodb.current_transactions
(gauge)
Current InnoDB transactions
Shown as transaction
mysql.innodb.data_fsyncs
(gauge)
The number of fsync() operations per second.
Shown as operation
mysql.innodb.data_pending_fsyncs
(gauge)
The current number of pending fsync() operations.
Shown as operation
mysql.innodb.data_pending_reads
(gauge)
The current number of pending reads.
Shown as read
mysql.innodb.data_pending_writes
(gauge)
The current number of pending writes.
Shown as write
mysql.innodb.data_read
(gauge)
The amount of data read per second.
Shown as byte
mysql.innodb.data_written
(gauge)
The amount of data written per second.
Shown as byte
mysql.innodb.dblwr_pages_written
(gauge)
The number of pages written per second to the doublewrite buffer.
Shown as page
mysql.innodb.dblwr_writes
(gauge)
The number of doublewrite operations performed per second.
Shown as byte
mysql.innodb.history_list_length
(gauge)
History list length as shown in the TRANSACTIONS section of the SHOW ENGINE INNODB STATUS output.
mysql.innodb.log_waits
(gauge)
The number of times that the log buffer was too small and a wait was required for it to be flushed before continuing.
Shown as wait
mysql.innodb.log_write_requests
(gauge)
The number of write requests for the InnoDB redo log.
Shown as write
mysql.innodb.log_writes
(gauge)
The number of physical writes to the InnoDB redo log file.
Shown as write
mysql.innodb.hash_index_cells_total
(gauge)
Total number of cells of the adaptive hash index
mysql.innodb.hash_index_cells_used
(gauge)
Number of used cells of the adaptive hash index
mysql.innodb.ibuf_free_list
(gauge)
Insert buffer free list, as shown in the INSERT BUFFER AND ADAPTIVE HASH INDEX section of the SHOW ENGINE INNODB STATUS output.
mysql.innodb.ibuf_segment_size
(gauge)
Insert buffer segment size, as shown in the INSERT BUFFER AND ADAPTIVE HASH INDEX section of the SHOW ENGINE INNODB STATUS output.
mysql.innodb.ibuf_size
(gauge)
Insert buffer size, as shown in the INSERT BUFFER AND ADAPTIVE HASH INDEX section of the SHOW ENGINE INNODB STATUS output.
mysql.innodb.pending_aio_log_ios
(gauge)
As shown in the FILE I/O section of the SHOW ENGINE INNODB STATUS output.
mysql.innodb.pending_aio_sync_ios
(gauge)
As shown in the FILE I/O section of the SHOW ENGINE INNODB STATUS output.
mysql.innodb.pending_ibuf_aio_reads
(gauge)
As shown in the FILE I/O section of the SHOW ENGINE INNODB STATUS output.
mysql.innodb.pending_normal_aio_reads
(gauge)
As shown in the FILE I/O section of the SHOW ENGINE INNODB STATUS output.
Shown as read
mysql.innodb.pending_normal_aio_writes
(gauge)
As shown in the FILE I/O section of the SHOW ENGINE INNODB STATUS output.
Shown as write
mysql.innodb.pending_buffer_pool_flushes
(gauge)
As shown in the FILE I/O section of the SHOW ENGINE INNODB STATUS output.
Shown as flush
mysql.innodb.pending_log_flushes
(gauge)
As shown in the FILE I/O section of the SHOW ENGINE INNODB STATUS output.
Shown as flush
mysql.innodb.pending_log_writes
(gauge)
As shown in the FILE I/O section of the SHOW ENGINE INNODB STATUS output.
Shown as write
mysql.innodb.checkpoint_age
(gauge)
Checkpoint age as shown in the LOG section of the SHOW ENGINE INNODB STATUS output.
mysql.innodb.lsn_current
(gauge)
Log sequence number as shown in the LOG section of the SHOW ENGINE INNODB STATUS output.
mysql.innodb.lsn_flushed
(gauge)
Flushed up to log sequence number as shown in the LOG section of the SHOW ENGINE INNODB STATUS output.
mysql.innodb.lsn_last_checkpoint
(gauge)
Log sequence number last checkpoint as shown in the LOG section of the SHOW ENGINE INNODB STATUS output.
mysql.innodb.pending_checkpoint_writes
(gauge)
As shown in the FILE I/O section of the SHOW ENGINE INNODB STATUS output.
mysql.innodb.queries_inside
(gauge)
As shown in the FILE I/O section of the SHOW ENGINE INNODB STATUS output.
Shown as query
mysql.innodb.queries_queued
(gauge)
As shown in the FILE I/O section of the SHOW ENGINE INNODB STATUS output.
Shown as query
mysql.innodb.read_views
(gauge)
As shown in the FILE I/O section of the SHOW ENGINE INNODB STATUS output.
mysql.myisam.key_buffer_bytes_unflushed
(gauge)
MyISAM key buffer bytes unflushed.
Shown as byte
mysql.myisam.key_buffer_bytes_used
(gauge)
MyISAM key buffer bytes used.
Shown as byte
mysql.innodb.mem_adaptive_hash
(gauge)
As shown in the BUFFER POOL AND MEMORY section of the SHOW ENGINE INNODB STATUS output.
Shown as byte
mysql.innodb.mem_dictionary
(gauge)
As shown in the BUFFER POOL AND MEMORY section of the SHOW ENGINE INNODB STATUS output.
Shown as byte
mysql.innodb.mem_total
(gauge)
As shown in the BUFFER POOL AND MEMORY section of the SHOW ENGINE INNODB STATUS output.
Shown as byte
mysql.innodb.mem_additional_pool
(gauge)
As shown in the BUFFER POOL AND MEMORY section of the SHOW ENGINE INNODB STATUS output.
Shown as byte
mysql.innodb.mem_file_system
(gauge)
As shown in the BUFFER POOL AND MEMORY section of the SHOW ENGINE INNODB STATUS output.
mysql.innodb.mem_lock_system
(gauge)
As shown in the BUFFER POOL AND MEMORY section of the SHOW ENGINE INNODB STATUS output.
mysql.innodb.mem_page_hash
(gauge)
As shown in the BUFFER POOL AND MEMORY section of the SHOW ENGINE INNODB STATUS output.
mysql.innodb.mem_recovery_system
(gauge)
As shown in the BUFFER POOL AND MEMORY section of the SHOW ENGINE INNODB STATUS output.
mysql.innodb.os_log_pending_fsyncs
(gauge)
Number of pending InnoDB log fsync (sync-to-disk) requests.
Shown as operation
mysql.innodb.os_log_pending_writes
(gauge)
Number of pending InnoDB log writes.
Shown as write
mysql.innodb.os_log_written
(gauge)
Number of bytes written to the InnoDB log.
Shown as byte
mysql.innodb.pages_created
(gauge)
Number of InnoDB pages created.
Shown as page
mysql.innodb.pages_read
(gauge)
Number of InnoDB pages read.
Shown as page
mysql.innodb.pages_written
(gauge)
Number of InnoDB pages written.
Shown as page
mysql.innodb.rows_deleted
(gauge)
Number of rows deleted from InnoDB tables.
Shown as row
mysql.innodb.rows_inserted
(gauge)
Number of rows inserted into InnoDB tables.
Shown as row
mysql.innodb.rows_read
(gauge)
Number of rows read from InnoDB tables.
Shown as row
mysql.innodb.rows_updated
(gauge)
Number of rows updated in InnoDB tables.
Shown as row
mysql.innodb.s_lock_os_waits
(gauge)
As shown in the SEMAPHORES section of the SHOW ENGINE INNODB STATUS output
mysql.innodb.s_lock_spin_rounds
(gauge)
As shown in the SEMAPHORES section of the SHOW ENGINE INNODB STATUS output.
mysql.innodb.s_lock_spin_waits
(gauge)
As shown in the SEMAPHORES section of the SHOW ENGINE INNODB STATUS output.
Shown as wait
mysql.innodb.x_lock_os_waits
(gauge)
As shown in the SEMAPHORES section of the SHOW ENGINE INNODB STATUS output.
Shown as wait
mysql.innodb.x_lock_spin_rounds
(gauge)
As shown in the SEMAPHORES section of the SHOW ENGINE INNODB STATUS output.
mysql.innodb.x_lock_spin_waits
(gauge)
As shown in the SEMAPHORES section of the SHOW ENGINE INNODB STATUS output.
Shown as wait
mysql.galera.wsrep_local_recv_queue_avg
(gauge)
Shows the average size of the local received queue since the last status query.
mysql.galera.wsrep_flow_control_paused
(gauge)
Shows the fraction of the time, since FLUSH STATUS was last called, that the node paused due to Flow Control.
Shown as fraction
mysql.galera.wsrep_flow_control_paused_ns
(count)
Shows the pause time due to Flow Control, in nanoseconds.
Shown as nanosecond
mysql.galera.wsrep_flow_control_recv
(count)
Shows the number of times the galera node has received a pausing Flow Control message from others
mysql.galera.wsrep_flow_control_sent
(count)
Shows the number of times the galera node has sent a pausing Flow Control message to others
mysql.galera.wsrep_cert_deps_distance
(gauge)
Shows the average distance between the lowest and highest sequence number, or seqno, values that the node can possibly apply in parallel.
mysql.galera.wsrep_local_send_queue_avg
(gauge)
Show an average for the send queue length since the last FLUSH STATUS query.
mysql.performance.qcache.utilization
(gauge)
Fraction of the query cache memory currently being used.
Shown as fraction
mysql.performance.digest_95th_percentile.avg_us
(gauge)
Query response time 95th percentile per schema.
Shown as microsecond
mysql.performance.query_run_time.avg
(gauge)
Avg query response time per schema.
Shown as microsecond
mysql.binlog.disk_use
(gauge)
Total binary log file size.
Shown as byte
mysql.queries.count
(count)
The total count of executed queries per normalized query and schema. (DBM only)
Shown as query
mysql.queries.errors
(count)
The total count of queries run with an error per normalized query and schema. (DBM only)
Shown as error
mysql.queries.time
(count)
The total query execution time per normalized query and schema. (DBM only)
Shown as nanosecond
mysql.queries.select_scan
(count)
The total count of full table scans on the first table per normalized query and schema. (DBM only)
mysql.queries.select_full_join
(count)
The total count of full table scans on a joined table per normalized query and schema. (DBM only)
mysql.queries.no_index_used
(count)
The total count of queries which do not use an index per normalized query and schema. (DBM only)
Shown as query
mysql.queries.no_good_index_used
(count)
The total count of queries which used a sub-optimal index per normalized query and schema. (DBM only)
Shown as query
mysql.queries.lock_time
(count)
The total time spent waiting on locks per normalized query and schema. (DBM only)
Shown as nanosecond
mysql.queries.rows_affected
(count)
The number of rows mutated per normalized query and schema. (DBM only)
Shown as row
mysql.queries.rows_sent
(count)
The number of rows sent per normalized query and schema. (DBM only)
Shown as row
mysql.queries.rows_examined
(count)
The number of rows examined per normalized query and schema. (DBM only)
Shown as row

The check does not collect all metrics by default. Set the following boolean configuration options to true to enable the respective metrics:

extra_status_metrics adds the following metrics:

Metric name Metric type
mysql.binlog.cache_disk_use GAUGE
mysql.binlog.cache_use GAUGE
mysql.performance.handler_commit RATE
mysql.performance.handler_delete RATE
mysql.performance.handler_prepare RATE
mysql.performance.handler_read_first RATE
mysql.performance.handler_read_key RATE
mysql.performance.handler_read_next RATE
mysql.performance.handler_read_prev RATE
mysql.performance.handler_read_rnd RATE
mysql.performance.handler_read_rnd_next RATE
mysql.performance.handler_rollback RATE
mysql.performance.handler_update RATE
mysql.performance.handler_write RATE
mysql.performance.opened_tables RATE
mysql.performance.qcache_total_blocks GAUGE
mysql.performance.qcache_free_blocks GAUGE
mysql.performance.qcache_free_memory GAUGE
mysql.performance.qcache_not_cached RATE
mysql.performance.qcache_queries_in_cache GAUGE
mysql.performance.select_full_join RATE
mysql.performance.select_full_range_join RATE
mysql.performance.select_range RATE
mysql.performance.select_range_check RATE
mysql.performance.select_scan RATE
mysql.performance.sort_merge_passes RATE
mysql.performance.sort_range RATE
mysql.performance.sort_rows RATE
mysql.performance.sort_scan RATE
mysql.performance.table_locks_immediate GAUGE
mysql.performance.table_locks_immediate.rate RATE
mysql.performance.threads_cached GAUGE
mysql.performance.threads_created MONOTONIC

extra_innodb_metrics adds the following metrics:

Metric name Metric type
mysql.innodb.active_transactions GAUGE
mysql.innodb.buffer_pool_data GAUGE
mysql.innodb.buffer_pool_pages_data GAUGE
mysql.innodb.buffer_pool_pages_dirty GAUGE
mysql.innodb.buffer_pool_pages_flushed RATE
mysql.innodb.buffer_pool_pages_free GAUGE
mysql.innodb.buffer_pool_pages_total GAUGE
mysql.innodb.buffer_pool_read_ahead RATE
mysql.innodb.buffer_pool_read_ahead_evicted RATE
mysql.innodb.buffer_pool_read_ahead_rnd GAUGE
mysql.innodb.buffer_pool_wait_free MONOTONIC
mysql.innodb.buffer_pool_write_requests RATE
mysql.innodb.checkpoint_age GAUGE
mysql.innodb.current_transactions GAUGE
mysql.innodb.data_fsyncs RATE
mysql.innodb.data_pending_fsyncs GAUGE
mysql.innodb.data_pending_reads GAUGE
mysql.innodb.data_pending_writes GAUGE
mysql.innodb.data_read RATE
mysql.innodb.data_written RATE
mysql.innodb.dblwr_pages_written RATE
mysql.innodb.dblwr_writes RATE
mysql.innodb.hash_index_cells_total GAUGE
mysql.innodb.hash_index_cells_used GAUGE
mysql.innodb.history_list_length GAUGE
mysql.innodb.ibuf_free_list GAUGE
mysql.innodb.ibuf_merged RATE
mysql.innodb.ibuf_merged_delete_marks RATE
mysql.innodb.ibuf_merged_deletes RATE
mysql.innodb.ibuf_merged_inserts RATE
mysql.innodb.ibuf_merges RATE
mysql.innodb.ibuf_segment_size GAUGE
mysql.innodb.ibuf_size GAUGE
mysql.innodb.lock_structs RATE
mysql.innodb.locked_tables GAUGE
mysql.innodb.locked_transactions GAUGE
mysql.innodb.log_waits RATE
mysql.innodb.log_write_requests RATE
mysql.innodb.log_writes RATE
mysql.innodb.lsn_current RATE
mysql.innodb.lsn_flushed RATE
mysql.innodb.lsn_last_checkpoint RATE
mysql.innodb.mem_adaptive_hash GAUGE
mysql.innodb.mem_additional_pool GAUGE
mysql.innodb.mem_dictionary GAUGE
mysql.innodb.mem_file_system GAUGE
mysql.innodb.mem_lock_system GAUGE
mysql.innodb.mem_page_hash GAUGE
mysql.innodb.mem_recovery_system GAUGE
mysql.innodb.mem_thread_hash GAUGE
mysql.innodb.mem_total GAUGE
mysql.innodb.os_file_fsyncs RATE
mysql.innodb.os_file_reads RATE
mysql.innodb.os_file_writes RATE
mysql.innodb.os_log_pending_fsyncs GAUGE
mysql.innodb.os_log_pending_writes GAUGE
mysql.innodb.os_log_written RATE
mysql.innodb.pages_created RATE
mysql.innodb.pages_read RATE
mysql.innodb.pages_written RATE
mysql.innodb.pending_aio_log_ios GAUGE
mysql.innodb.pending_aio_sync_ios GAUGE
mysql.innodb.pending_buffer_pool_flushes GAUGE
mysql.innodb.pending_checkpoint_writes GAUGE
mysql.innodb.pending_ibuf_aio_reads GAUGE
mysql.innodb.pending_log_flushes GAUGE
mysql.innodb.pending_log_writes GAUGE
mysql.innodb.pending_normal_aio_reads GAUGE
mysql.innodb.pending_normal_aio_writes GAUGE
mysql.innodb.queries_inside GAUGE
mysql.innodb.queries_queued GAUGE
mysql.innodb.read_views GAUGE
mysql.innodb.rows_deleted RATE
mysql.innodb.rows_inserted RATE
mysql.innodb.rows_read RATE
mysql.innodb.rows_updated RATE
mysql.innodb.s_lock_os_waits RATE
mysql.innodb.s_lock_spin_rounds RATE
mysql.innodb.s_lock_spin_waits RATE
mysql.innodb.semaphore_wait_time GAUGE
mysql.innodb.semaphore_waits GAUGE
mysql.innodb.tables_in_use GAUGE
mysql.innodb.x_lock_os_waits RATE
mysql.innodb.x_lock_spin_rounds RATE
mysql.innodb.x_lock_spin_waits RATE

extra_performance_metrics adds the following metrics:

Metric name Metric type
mysql.performance.query_run_time.avg GAUGE
mysql.performance.digest_95th_percentile.avg_us GAUGE

schema_size_metrics adds the following metric:

Metric name Metric type
mysql.info.schema.size GAUGE

Events

The MySQL check does not include any events.

Service Checks

mysql.can_connect
Returns CRITICAL if the Agent is unable to connect to the monitored MySQL instance. Returns OK otherwise.
Statuses: ok, critical

mysql.replication.slave_running
Deprecated. Returns CRITICAL for a replica that’s not running Slave_IO_Running or Slave_SQL_Running, WARNING if one of the two is not running. Returns OK otherwise.
Statuses: ok, warning, critical

mysql.replication.replica_running
Returns CRITICAL for a replica that’s not running Replica_IO_Running or Replica_SQL_Running, WARNING if one of the two is not running. Returns OK otherwise.
Statuses: ok, warning, critical

mysql.replication.group.status
Returns OK if the host status is ONLINE, returns CRITICAL otherwise.
Statuses: ok, critical

Troubleshooting

Further Reading

Read our series of blog posts about monitoring MySQL with Datadog.