はじめに
Datadogのdatabase monitoring機能が便利と聞いていたので試してみました。
いざ試すとなった際に、「あれ?データどうしよう?」、「設定どうするんだっけ?」みたいにいくつか詰まったことがあるので、本記事にまとめます。
この記事を見た人が、10分でdatabase monitoring機能を試せるようになることが目標です。
想定する読者
- 急いでいる方
- Datadogのdatabase monitoring何が出来るのか試したい人
この記事で得られること
- MySQLのダミーデータベースの作成
- Datadog database monitoringの導入手順(ローカル)
- Datadog database monitoringで出来ること
前提
以下は事前にInstallをお願いいたします。
- Homebrew
実行環境
- mac os Big Sur(m1)
- mysql Ver 8.0.30 for macos11.6 on x86_64 (Homebrew)
- DD_AGENT_VERSION=7.36.1
本題
それでは本題を進めて参ります。
MySQLをInstallして、ダミーデータベースを作成してから、
Datadogの設定に入る流れとなっております。
環境構築
MySQLをInstallして、サーバを起動します。
$ brew install mysql
$ mysql --version
mysql Ver 8.0.30 for macos11.6 on x86_64 (Homebrew)
$ mysql.server start
ダミーデータの準備
モニタリング対象となるデータベースが無いとどうしようもないので入れます。
MySQL公式サイトにダミーデータベースがあるので、これをインポートします。
MySQL公式:https://dev.mysql.com/doc/index-other.html
今回は「world」を選びました。
Zipでダウンロードして解凍します。
$ brew install mysql
$ mysql --version
mysql Ver 8.0.30 for macos11.6 on x86_64 (Homebrew)
$ mysql.server start
Zipでダウンロードして解凍します。
mysql> SOURCE /Users/hogehoge/Downloads/world-db/world.sql
mysql> show databases;
+------------------------+
| Database |
+------------------------+
| world |
+------------------------+
mysql> use world
Database changed
mysql> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city |
| country |
| countrylanguage |
+-----------------+
3 rows in set (0.01 sec)
これでデータの準備は完了です。
Datadogの登録(2週間無料)
Datadogのトライアルに登録して、datadogのAPIキーを入手します。
https://www.datadoghq.com/ja/free-datadog-trial/
database monitoringの設定
ここから、もろもろ設定を加えていきます。
基本的には以下の公式ドキュメントに沿って設定します。
https://docs.datadoghq.com/database_monitoring/setup_mysql/selfhosted/?tab=mysql56
Configure database parameters
mysqlのパラメータを設定します。
設定ファイルの場所が分からない場合
~ ❯❯❯ mysql --help | grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
↑ 左から優先して読み込まれる
以下のファイルを編集。
/usr/local/etc/my.cnf
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
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
my.cnfを上記のように編集します。
その後、パラメータ反映のためにMySQLを再起動。
~/D/learn ❯❯❯ mysql.server restart
Shutting down MySQL ... SUCCESS!
Starting MySQL .... SUCCESS!
mysql> SHOW VARIABLES LIKE 'perf%';
| performance_schema | ON | を確認
Grant the Agent access to the database
datadog-agentが情報収集するためのdatadogユーザをmysqlに作成します。
対象のデータベースは「world」としています。
別のデータベースを使用している人は適宜読み替えてください。
CREATE USER datadog@'%' IDENTIFIED WITH mysql_native_password by 'testhogehoge'; # 「testhogehoge」はパスワードのなので適宜設定してください 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@'%'; 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 ; # データベース名は適宜設定してください DELIMITER $$ CREATE PROCEDURE world.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 world.explain_statement TO datadog@'%'; 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@'%';
Install the Agent
datadog-agentをローカルにインストールして設定を加えます。
datadogのトライアル開始後に、agentインストールのチュートリアルが始まるので、それに従います。
参考:https://app.datadoghq.com/account/settings#agent
筆者が実行したInstallコマンドを参考までに貼っておきます DD_AGENT_MAJOR_VERSION=7 DD_API_KEY=APIキーを入れる DD_SITE="us5.datadoghq.com" bash -c "$(curl -L https://s3.amazonaws.com/dd-agent/scripts/install_mac_os.sh)" サンプルの設定ファイルをコピーしてきて使います。 ll /opt/datadog-agent/etc/conf.d/mysql.d/conf.yaml.example cp /opt/datadog-agent/etc/conf.d/mysql.d/conf.yaml.example /opt/datadog-agent/etc/conf.d/mysql.d/conf.yaml
以下のファイルにAgentの設定を加えます。
/opt/datadog-agent/etc/conf.d/mysql.d/conf.yaml
init_config: instances: - dbm: true host: 127.0.0.1 port: 3306 username: datadog password: 'testhogehoge' # from the CREATE USER step earlier
~/D/l/datadog ❯❯❯ launchctl stop com.datadoghq.agent ~/D/l/datadog ❯❯❯ launchctl start com.datadoghq.agent
動作確認
ここまで設定すると、database monitoringの設定完了です。
以下から、ローカルのMySQLがモニタリングできているはず。
https://us5.datadoghq.com/databases/
試しに適当なSQLを打ってみましょう。
mysql -u root
mysql> use world;
mysql> select * from country;
mysql> select * from city;
モニタリングできるようになってます。
さっき打ったSelectもいますね。
Planの結果も見れるようになっています。
Full Scanのクエリを探すのとか楽になりますね。
もうちょっと遊びでクエリ打ってみます。
mysql> SELECT id, name from city WHERE name = "Nablus";
+------+--------+
| id | name |
+------+--------+
| 4078 | Nablus |
+------+--------+
1 row in set (0.00 sec)
mysql> SELECT id, name from city WHERE id = "4078";
+------+--------+
| id | name |
+------+--------+
| 4078 | Nablus |
+------+--------+
1 row in set (0.00 sec)
さっき打ったクエリですね。
PLANの結果を見てみると、フルスキャン(ALL)になっているのもわかります。
id直指定だとこんな感じ。
クエリを重い順にソートさせたり。
巨大なDBで試してみたい。
パフォーマンスチューニングにおいては大活躍しそう。
おわりに
今回はサクッとdatabase monitoringを試してみました。
一言で言って、便利!
皆さんもぜひぜひお試しください。