セルフホストの MySQL のデータベースモニタリングの設定
データベースモニタリングは、InnoDB ストレージエンジンのクエリメトリクス、クエリサンプル、説明プラン、接続データ、システムメトリクス、テレメトリを公開することにより、MySQL データベースの詳細な可視性を提供します。
Agent は、読み取り専用のユーザーとしてログインすることでデータベースから直接テレメトリーを収集します。MySQL データベースでデータベースモニタリングを有効にするには、以下の設定を行ってください。
- データベースのパラメーターを構成する
- Agent にデータベースへのアクセスを付与する
- Agent をインストールする
はじめに
- サポートされている MySQL バージョン
- 5.6、5.7、または 8.0+
- サポート対象の Agent バージョン
- 7.36.1+
- パフォーマンスへの影響
- データベースモニタリングのデフォルトの Agent コンフィギュレーションは保守的ですが、収集間隔やクエリのサンプリングレートなどの設定を調整することで、よりニーズに合ったものにすることができます。ワークロードの大半において、Agent はデータベース上のクエリ実行時間の 1 % 未満、および CPU の 1 % 未満を占めています。
データベースモニタリングは、ベースとなる Agent 上のインテグレーションとして動作します (ベンチマークを参照してください)。 - プロキシ、ロードバランサー、コネクションプーラー
- Datadog Agent は、監視対象のホストに直接接続する必要があります。セルフホスト型のデータベースの場合は、
127.0.0.1
またはソケットが推奨されます。Agent は、プロキシ、ロードバランサー、またはコネクションプーラーを介してデータベースに接続すべきではありません。Agent が実行中に異なるホストに接続すると (フェイルオーバーやロードバランシングなどの場合)、Agent は 2 つのホスト間で統計情報の差を計算し、不正確なメトリクスを生成します。 - データセキュリティへの配慮
- Agent がお客様のデータベースからどのようなデータを収集するか、またそのデータの安全性をどのように確保しているかについては、機密情報を参照してください。
MySQL 設定を構成する
クエリのメトリクス、サンプル、および実行計画を収集するには、MySQL パフォーマンススキーマを有効にし、以下のパフォーマンススキーマオプションをコマンドラインまたはコンフィギュレーションファイル (例: mysql.conf
) で構成します。
パラメーター | 値 | 説明 |
---|
performance_schema | ON | 必須。パフォーマンススキーマを有効にします。 |
max_digest_length | 4096 | より大きなクエリの収集に必要です。デフォルト値のままにすると、1024 文字より長いクエリは収集されません。 |
performance_schema_max_digest_length
| 4096 | max_digest_length と一致する必要があります。 |
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 | オプション。スレッドごとに最近のクエリの履歴を追跡することができます。この機能を有効にすると、頻度の低いクエリの実行情報を取得できる可能性が高まります。 |
パラメーター | 値 | 説明 |
---|
performance_schema | ON | 必須。パフォーマンススキーマを有効にします。 |
max_digest_length | 4096 | より大きなクエリの収集に必要です。デフォルト値のままにすると、1024 文字より長いクエリは収集されません。 |
performance_schema_max_digest_length
| 4096 | Must match max_digest_length . |
performance_schema_max_sql_text_length
| 4096 | max_digest_length と一致する必要があります。 |
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 | オプション。スレッドごとに最近のクエリの履歴を追跡することができます。この機能を有効にすると、頻度の低いクエリの実行情報を取得できる可能性が高まります。 |
注: Agent へのアクセス権限付与の一環として、Agent がランタイム時に動的に performance-schema-consumer-*
設定を有効にできるようにすることを推奨します。ランタイムセットアップコンシューマーを参照してください。
Agent にアクセスを付与する
Datadog Agent が統計やクエリを収集するためには、データベースへの読み取り専用のアクセスが必要となります。
The following instructions grant the Agent permission to login from any host using datadog@'%'
. You can restrict the datadog
user to be allowed to login only from localhost by using datadog@'localhost'
. See the MySQL documentation for more info.
datadog
ユーザーを作成し、基本的なアクセス許可を付与します。
CREATE USER datadog@'%' IDENTIFIED BY '<UNIQUEPASSWORD>';
GRANT REPLICATION CLIENT ON *.* TO datadog@'%' WITH MAX_USER_CONNECTIONS 5;
GRANT PROCESS ON *.* TO datadog@'%';
GRANT SELECT ON performance_schema.* TO datadog@'%';
datadog
ユーザーを作成し、基本的なアクセス許可を付与します。
CREATE USER datadog@'%' IDENTIFIED by '<UNIQUEPASSWORD>';
ALTER USER datadog@'%' WITH MAX_USER_CONNECTIONS 5;
GRANT REPLICATION CLIENT ON *.* TO datadog@'%';
GRANT PROCESS ON *.* TO datadog@'%';
GRANT SELECT ON performance_schema.* TO datadog@'%';
次のスキーマを作成します。
CREATE SCHEMA IF NOT EXISTS datadog;
GRANT EXECUTE ON datadog.* to datadog@'%';
GRANT CREATE TEMPORARY TABLES ON datadog.* TO datadog@'%';
Agent が説明プランを収集できるようにするには、explain_statement
プロシージャを作成します。
DELIMITER $$
CREATE PROCEDURE datadog.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 ;
さらに、説明プランを収集するすべてのスキーマでこのプロシージャを作成します。<YOUR_SCHEMA>
をデータベーススキーマに置き換えます。
DELIMITER $$
CREATE PROCEDURE <YOUR_SCHEMA>.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 <YOUR_SCHEMA>.explain_statement TO datadog@'%';
ランタイムセットアップコンシューマー
Datadogは、ランタイムで performance_schema.events_*
コンシューマーを有効にする機能を Agent に与えるために、次のプロシージャを作成することをお勧めします。
DELIMITER $$
CREATE PROCEDURE datadog.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 datadog.enable_events_statements_consumers TO datadog@'%';
Securely store your password
Store your password using secret management software such as Vault. You can then reference this password as ENC[<SECRET_NAME>]
in your Agent configuration files: for example, ENC[datadog_user_database_password]
. See Secrets Management for more information.
The examples on this page use datadog_user_database_password
to refer to the name of the secret where your password is stored. It is possible to reference your password in plain text, but this is not recommended.
Agent のインストール
Datadog Agent をインストールすると、MySQL でのデータベースモニタリングに必要な MySQL チェックもインストールされます。MySQL データベースホストの Agent をまだインストールしていない場合は、Agent のインストール手順を参照してください。
ホストで実行中の Agent に対してこのチェックを構成するには
MySQL のメトリクスとログの収集を開始するには、Agent のコンフィギュレーションディレクトリのルートにある conf.d/
フォルダーの mysql.d/conf.yaml
ファイルを編集します。カスタムメトリクスのオプションなど、使用可能なすべてのコンフィギュレーションオプションについては、サンプル mysql.d/conf.yaml を参照してください。
メトリクスの収集
MySQL メトリクスを収集するには、mysql.d/conf.yaml
に次のコンフィギュレーションブロックを追加します。
init_config:
instances:
- dbm: true
host: 127.0.0.1
port: 3306
username: datadog
password: 'ENC[datadog_user_database_password]' # from the CREATE USER step earlier
datadog
ユーザーは、localhost
ではなく host: 127.0.0.1
として MySQL インテグレーション構成内にセットアップされる必要があります。または、sock
を使用することもできます。
Agent を再起動すると、Datadog への MySQL メトリクスの送信が開始されます。
ログ収集 (オプション)
Agent によってデータベースから収集されたテレメトリーに加えて、データベースのログを直接 Datadog に送信することも選択できます。
MySQL は、デフォルトでは /var/log/syslog
内のすべてをログに記録しますが、これには、読み取りのルートアクセス許可が必要です。ログへのアクセス可能性を高めるには、以下の手順に従ってください。
/etc/mysql/conf.d/mysqld_safe_syslog.cnf
を編集して、すべての行をコメントアウトします。/etc/mysql/my.cnf
を編集して、必要なログ設定を有効にします。例えば、一般ログ、エラーログ、低速クエリのログを有効にするには、次のコンフィギュレーションを使用します。
[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 = 3
- Save the file and restart MySQL.
- Agent が
/var/log/mysql
ディレクトリとその中のすべてのファイルに対する読み取りアクセス許可を持つことを確認します。logrotate
コンフィギュレーションもチェックして、これらのファイルが考慮され、アクセス許可が正しく設定されていることを確認します。
/etc/logrotate.d/mysql-server
の内容は次のようになります。
/var/log/mysql.log /var/log/mysql/mysql.log /var/log/mysql/mysql_slow.log {
daily
rotate 7
missingok
create 644 mysql adm
Compress
}
Datadog Agent で、ログの収集はデフォルトで無効になっています。以下のように、datadog.yaml
ファイルでこれを有効にします。
MySQL のログの収集を開始するには、次の構成ブロックを mysql.d/conf.yaml
ファイルに追加します。
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+
Agent を再起動します。
UpdateAzureIntegration
Agent の status サブコマンドを実行し、Checks セクションで mysql
を探します。または、データベースのページを参照してください。
Agent の構成例
One agent connecting to multiple hosts
It is common to configure a single Agent host to connect to multiple remote database instances (see Agent installation architectures for DBM). To connect to multiple hosts, create an entry for each host in the MySQL integration config.
In these cases, Datadog recommends limiting the number of instances per Agent to a maximum of 10 database instances to guarantee reliable performance.
init_config:
instances:
- dbm: true
host: example-service-primary.example-host.com
port: 3306
username: datadog
password: 'ENC[datadog_user_database_password]'
tags:
- 'env:prod'
- 'team:team-discovery'
- 'service:example-service'
- dbm: true
host: example-service-replica-1.example-host.com
port: 3306
username: datadog
password: 'ENC[datadog_user_database_password]'
options:
replication: true
tags:
- 'env:prod'
- 'team:team-discovery'
- 'service:example-service'
- dbm: true
host: example-service-replica-2.example-host.com
port: 3306
username: datadog
password: 'ENC[datadog_user_database_password]'
options:
replication: true
tags:
- 'env:prod'
- 'team:team-discovery'
- 'service:example-service'
[...]
Running custom queries
To collect custom metrics, use the custom_queries
option. See the sample mysql.d/conf.yaml for more details.
init_config:
instances:
- dbm: true
host: localhost
port: 3306
username: datadog
password: 'ENC[datadog_user_database_password]'
custom_queries:
- query: SELECT age, salary, hours_worked, name FROM hr.employees;
columns:
- name: custom.employee_age
type: gauge
- name: custom.employee_salary
type: gauge
- name: custom.employee_hours
type: count
- name: name
type: tag
tags:
- 'table:employees'
Working with hosts through a proxy
If the Agent must connect through a proxy such as the Cloud SQL Auth proxy, all telemetry is tagged with the hostname of the proxy rather than the database instance. Use the reported_hostname
option to set a custom override of the hostname detected by the Agent.
init_config:
instances:
- dbm: true
host: localhost
port: 5000
username: datadog
password: 'ENC[datadog_user_database_password]'
reported_hostname: example-service-primary
- dbm: true
host: localhost
port: 5001
username: datadog
password: 'ENC[datadog_user_database_password]'
reported_hostname: example-service-replica-1
トラブルシューティング
インテグレーションと Agent を手順通りにインストール・設定しても期待通りに動作しない場合は、トラブルシューティングを参照してください。
参考資料