技術(tech)

10分でDatadogのDatabase Monitoringを試す(ローカルMySQL環境)

はじめに

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
解凍された「world.sql」を適当なフォルダに配置して、インポートします。

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
agent再起動後、agentからMySQLへの接続エラーが出ていなければ良いです。
> ~/D/l/datadog ❯❯❯ tail -f /opt/datadog-agent/logs/agent.log

 

 

動作確認

ここまで設定すると、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を試してみました。

一言で言って、便利!

皆さんもぜひぜひお試しください。