スマートスタイル TECH BLOG

データベース&クラウド技術情報

Percona Monitoring and Managementで任意のSQLの結果を収集する

はじめに

Percona社が開発したモニタリングツールPercona Monitoring and Management (以下 PMM)ではあらかじめ用意されたメトリクスの他に、任意のクエリを実行しメトリクスを取得することができます。

以前の記事でtextfile collectorを使用した任意のコマンド結果の収集方法を紹介しました。
本記事ではcustom queriesという機能を使用して、任意のSELECTクエリを実行した結果を収集してみたいと思います。

前提

本記事では、PMM2.9.0を使用します。PMM1とPMM2ではディレクトリのパスなどが変更されているので注意してください。
また、PMM ServerとPMM Clientはインストール済みで、PMM ClientがPMM Serverに接続済みであることを前提としています。
インストール方法などは以前こちらの記事でも紹介しているのでそちらをご覧ください。

また、取得したメトリクスの確認方法についてはtextfile collectorを紹介した記事で詳しく説明しているのでそちらをご覧ください。

手順

custom queriesの設定はYAML形式でファイルを作成し、/usr/local/percona/pmm2/collectors/custom-queries/mysql/配下の3つのサブディレクトリのいずれかに保存します。

high,low,mediumはそれぞれ収集間隔を意味します。デフォルトでlow:60秒,medium:10秒,high:5秒です。
詳しくはこちらのマニュアルをご確認ください。

今回はhigh-resolutionサブディレクトリのqueries-mysqld.ymlファイルに設定を記述します。
こちらの手順のようにyumを使用してパッケージをインストールした場合は、queries-mysqld.ymlファイルはインストール時に自動で作成されました。

形式

queries-mysqld.ymlファイルには以下のような形式で記述します。

具体例

この具体例は、information_schema.triggersからスキーマごとのトリガーの数を取得するクエリを使用しています。

各項目について簡単に説明します。
1) メトリクス名のプレフィックス
mysql_information_schema_triggerがこのメトリクスの名前のプレフィックスです。
メトリクス名は自由に設定できますが、prometheusのドキュメントに命名規則が紹介されているので、参考にしてください。
メトリクス名はこのプレフィックスに_<カラム名>を加えたものになります。
例えば、具体例のnum_per_dbの値を取得するメトリクス名はmysql_information_schema_trigger_num_per_dbとなります。

2) MySQLで実行するSELECT文
MySQLで実行するクエリです。
SELECT col1,col2 ….の部分はSELECT * とすることもできます。

3) カラム名
SELECT文で取得したカラム名です。
SELECT col1 AS column1 from …のように別名を付けた場合はその別名を記載します。

4) メトリクスの種類
メトリクスの種類を選択します。
取得するデータが文字列の場合はLABEL、数値の場合はLABELまたはGAUGE、COUNTERに設定できます。
GAUGEやCOUNTERに設定されたカラムのデータはメトリクスとして収集されます。
COUNTERにはエラー数など単調に増加する値を設定します。増減する値はGAUGEに設定します。
LABELについての詳細は後述の[LABELについて]をご参照ください。

5) カラムの説明
カラムの説明を記載できます。ここで記載した説明はPMMのMetricsの入力ボックスなどのサジェストで表示されます。

確認

PMMのモニタリング画面からデータが取得されているか確認してみます。
任意のメトリクスの確認はExploreからできます。

入力ボックスにmysql_information_schema_trigger_num_per_dbを入力して右上のRun Queryのボタンを押すとグラフが表示されます。

なお、Exploreでは複数の値を表示する場合は凡例にラベルが表示されわかりにくいため、グラフ作成画面でMetricsの項目にmysql_information_schema_trigger_num_per_dbを入力してLegendに{{ラベル名}}を入力することでラベルを凡例にすることができます。

LABELについて

データはメトリクス名とラベルの組み合わせによって識別されます。
PMMの場合、取得されるメトリクスにはノード名やサービス名などもラベルとしてデフォルトで設定されています。

例えば、2つのDBをPMMでモニタリングしていて、それぞれサービス名をmysql1,mysql2としているとします。
PMMはデフォルトSHOW GLOBAL STATUSの値を収集していてメトリクス名はmysql_global_status_<variable_name>となっていますが、Metricsをmysql_global_status_threads_connectedとするとmysql1とmysql2の各threads_connectedの値が表示されます。

次にラベルの条件を指定してみます。
Metricsをmysql_global_status_threads_connected{service_name="mysql1"}とした場合はmysql1のthreads_connectedの値のみが表示されます。

このようにLABELはメトリクス名と組み合わせることで表示するメトリクスを指定することができます。

PMM(Prometheus)で使用するPromQL(Prometheus Query Language)についてはこちらを参考にしてください。

カスタムクエリでLABELを設定する場合

前述の具体例ではTRIGGER_SCHEMAカラムをLABELとしています。これによって値をTRIGGER_SCHEMAごとに取得することができます。
MySQLで具体例のクエリを実行した場合は以下のような結果となります。

次にPMMで取得したメトリクスmysql_information_schema_trigger_num_per_dbを確認すると、下図のようにTRIGGER_SCHEMAごとに値を取得していることがわかります。

一方、次のようにTRIGGER_SCHEMAをLABELに指定しないで設定をファイルに記述します。

取得したメトリクスmysql_information_schema_trigger_2_num_per_dbを確認すると、スキーマごとのメトリクスは取得されていません。検証したところ num_per_dbの結果の1行目がメトリクスとして取得されていました。


このように、LABELを設定することはメトリクスの収集に役立ちます。ただし、カーディナリティの高い項目を設定するとデータの増大につながります。LABELに設定する項目には気を付けてください。

CAUTION: Remember that every unique combination of key-value label pairs represents a new time series, which can dramatically increase the amount of data stored. Do not use labels to store dimensions with high cardinality (many different label values), such as user IDs, email addresses, or other unbounded sets of values.

引用元 : Prometheus

まとめ

データの取得方法はSQLを使用して記述できるため、普段からSQLに慣れ親しんでいる人なら簡単にcustom queries機能を使いこなせると思います。PMMで収集されていない値をモニタリングしたいときや、自身で作成したテーブルの値もPMMで表示したいときはcustom queries機能を試してみてください。


Percona

 

Return Top