CLOVER🍀

That was when it all began.

MySQL Server Exporterを使って、Prometheus × Grafanaでモニタリングする

これは、なにをしたくて書いたもの?

というわけで、MySQLで取得できるメトリクスを、Prometheusで収集してGrafanaで表示してみようというチャレンジです。

お題と環境

登場する要素は、以下となります。

  • MySQL(メトリクス収集対象) / 8.0.13 … 172.17.0.2
  • MySQL Server Exporter / 0.11.0 … 172.17.0.3
  • sysbenchを実行するサーバー … 172.17.0.4
  • Prometheus / 2.6.0 … 172.17.0.5
  • Grafana / 5.4.2 … 172.17.0.6

環境は、いずれもUbuntu Linux 18.04 LTSです。

Prometheusでサードパーティ製のシステムからメトリクスをエクスポートするには、Exporterを使用します。Exporterがあると、
そこにPrometheusからメトリクスをPullしにいくため、対象のシステムのメトリクスを収集できるという流れです。

Exporters and integrations | Prometheus

Exporterには様々な種類があり、MySQLの場合はMySQL Server Exporterを使用します。

GitHub - prometheus/mysqld_exporter: Exporter for MySQL server metrics

Exporterを提供しているのは、Prometheusなこともあれば、コミュニティなこともあります。

で、今回はMySQLサーバーに対して、メトリクスをエクスポートするMySQL Server Exporterを用意し、この状態でsysbenchで
MySQLに負荷をかけます。

その様子をPrometheusで収集し、Grafanaで可視化しようというのが今回のお題です。

参考)

Prometheusでのさまざまな監視データ取得法 | さくらのナレッジ

Prometheus, Grafana を利用して MySQL の各種パフォーマンスをモニタリングする - Neinvalli

MySQL側の用意

MySQL側は、MySQL Server Exporterの手順に従い、ユーザーの作成と権限の付与を行います。

Building and running / Required Grants

mysql> CREATE USER 'exporter'@'%' IDENTIFIED BY 'password' WITH MAX_USER_CONNECTIONS 3;
Query OK, 0 rows affected (0.13 sec)

mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
Query OK, 0 rows affected (0.08 sec)

このユーザーを使用して、MySQL Server Exporterがメトリクスをエクスポートすることになります。

MySQL側の準備は、これだけです。

MySQL Server Exporterで、MySQLのメトリクスをエクスポートできるようにする

では、MySQL Server Exporterをインストールして、起動します。

MySQL Server Exporterのダウンロード。GitHubのreleasesから取得すればOKです。

$ wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.11.0/mysqld_exporter-0.11.0.linux-amd64.tar.gz
$ tar xvf mysqld_exporter-0.11.0.linux-amd64.tar.gz
$ cd mysqld_exporter-0.11.0.linux-amd64

Building and running / Running

MySQLへの接続情報を環境変数に設定して、起動。

$ export DATA_SOURCE_NAME='exporter:password@(172.17.0.2:3306)/'
$  ./mysqld_exporter

9104ポートでListenするみたいですね。

INFO[0000] Listening on :9104                            source="mysqld_exporter.go:232"

なお、今回は使いませんが、起動時にフラグを付けて収集する内容をコントロールすることもできるようです。

Building and running / Running

Building and running / Collector Flags

Building and running / Setting the MySQL server's data source name

Prometheusで、MySQL Server Exporter経由でMySQLのメトリクスを収集する

Prometheusは、scrape_configsにジョブを設定して起動します。targetsに、先ほど起動したMySQL Server Exporterを設定。

scrape_configs:
  - job_name: 'mysql'
    static_configs:
    - targets: ['172.17.0.3:9104']

これで、MySQLのメトリクスが収集できるようになりました。

Grafanaで取得したメトリクスを可視化する

最後は、Grafanaです。

とりあえず、Data SourceとしてPrometheusは設定されているものとします。

ダッシュボードは、すでに作成済みのものを使ってみることにしましょう。

左のメニューから「Create」→「Import」を選択します。

f:id:Kazuhira:20181218214947p:plain

表示された画面で、インポートするダッシュボードのIDを入力して「Load」します。

f:id:Kazuhira:20181218215008p:plain

ここでは、こちらのダッシュボードを使用しています。

Mysql - Prometheus dashboard for Grafana | Grafana Labs

下の方で、現在Data Sourceとして設定しているPrometheusを選択して、「Import」を押します。

f:id:Kazuhira:20181218215036p:plain

すると、ダッシュボードができ、収集したMySQLのメトリクスが表示されることが確認できます。

f:id:Kazuhira:20181218215146p:plain

ここで、sysbenchを使ってちょっと負荷をかけてみましょう。
※負荷をかけるのに使用しているMySQLのユーザーやデータベースは、あらかじめ作成済みのものです

## 準備
$ sysbench oltp_read_write \
  --db-driver=mysql --table-size=1000000 \
  --mysql-host=172.17.0.2 \
  --mysql-db=sbtest \
  --mysql-user=myuser \
  --mysql-password=password \
  prepare


## ベンチマーク実行
$ sysbench oltp_read_write \
  --threads=8 \
  --time=120 \
  --db-driver=mysql \
  --table-size=1000000 \
  --mysql-host=172.17.0.2 \
  --mysql-db=sbtest \
  --mysql-user=myuser \
  --mysql-password=password \
  run

グラフに、変化があったことが確認できます。

f:id:Kazuhira:20181218215358p:plain

ただ、このダッシュボードは表示項目が少ないようです。他のものを探してみましょう。

調べてみると、Perconaのダッシュボードが使われていそうな感じだったので、こちらで試してみましょう。

GitHub - percona/grafana-dashboards: Grafana dashboards for MySQL and MongoDB monitoring using Prometheus

ダッシュボードの内容は、こちらのディレクトリ配下にあるJSONファイルをコピーしてImportすることにしましょう。

https://github.com/percona/grafana-dashboards/tree/v1.17.0/dashboards

先ほど、ダッシュボードをImportする際にIDを入れた箇所ではなく、その下のテキストエリアにJSONを貼り付けます。

f:id:Kazuhira:20181218221331p:plain

あとは「Load」を押して、次のページで「Import」を押すと、ダッシュボードが作成されます。今回はInnoDBのメトリクスを
表示するダッシュボードを選択しました。

f:id:Kazuhira:20181218221343p:plain

InnoDB関連の情報がいろいろ表示されます。

f:id:Kazuhira:20181218221354p:plain

なのですが、これを実際に見てみるとわかるのですが、グラフを表示できていないパネルがけっこう目立ちます。
最新のExporterに対応していないとかでしょうか?

MySQL Overview dashboard for Grafana | Grafana Labs

もうひとつ、PerconaのダッシュボードをImportしてみます。

f:id:Kazuhira:20181218221702p:plain

ですが、ここでも表示されないパネルがまあまああったり。

実際に使う時には、こちらのソースコードを見ながら必要なメトリクスを表示するようにパネルを作成していくのでしょうね。

https://github.com/prometheus/mysqld_exporter/tree/v0.11.0/collector

なお「http://[MySQL Server Exporterが動作しているサーバー]:9104/」にアクセスすると、その時の情報ですが、
エクスポートされたメトリクスを見ることができます。
※「Metrics」リンクを押すと表示されます

f:id:Kazuhira:20181218222410p:plain

f:id:Kazuhira:20181218222345p:plain

項目、多いですねぇ…。

あと、ダッシュボードの内容はJSONで確認することができるので、ダッシュボードの定義を保存して、別の環境で利用する
場合には、こちらを使うのでしょうね。

f:id:Kazuhira:20181218222907p:plain

f:id:Kazuhira:20181218222917p:plain

グラフに表示する内容などはけっこう適当でしたが、とりあえずExporterを使ってMySQLのメトリクスをエクスポートし、
それをPrometheusで収集、Grafanaで可視化、という一連の流れが確認できました。

ダッシュボードをImportしたり、JSONとして定義を見れることも知ることができましたね。