check_mysql_queryで範囲指定 - InnoDBの空き容量を監視する

なぎおす!

な!なんとなく〜
ぎ!ギャグでごまかそうと〜
お!おっさんどもが〜
す!すべってゆく〜

ハイ!ガショー!!



Nagios (nagios-plugins) にcheck_mysql_queryというのがあります。

MySQLに任意のクエリを発行して、その結果を元に監視の可否をするプラグインです。

「SELECT 1」とかを発行して期待した応答が返ってくるかとか死活監視に使えますが、結果が数値の場合、範囲内/外にあるかどうかの監視もできます。

例えば、(innodb_file_per_tableしていない場合の)InnoDBの空き容量を調べる設定はこんな感じになります。

前提:

  • "infra"というデータベースに、InnoDBの"health"というテーブルがある
  • MySQLのユーザー"health"は、infra.healthにアクセスできる権限を持っている
  • 空きが、8GBを切ったらcritical、10GBを切ったらwarning
define command {
  command_name  check_mysql_data_free
  command_line  $USER1$/check_mysql_query -H $HOSTADDRESS$ -u health -q 'select data_free from information_schema.tables where table_schema = "infra" and table_name = "health"' -c '@~:$ARG1$' -w '@$ARG1$:$ARG2$' $ARG3$
}

define service {
  host_name            db001
  use                  generic-service
  service_description  MYSQL_DATA_FREE
  check_command        check_mysql_data_free!8589934592!10737418240
  servicegroups        MYSQL
}

Nagiosプラグインの仕様に、値の範囲を指定する記法があります。

この記法を使って、空きが8G以上、10G以下ならwarning、

-w '@8589934592:10737418240'

空きが負の無限大以上、8G以下ならcritical

-c '@~:8589934592'

となるように設定しています。

ほかにもいろいろ活用できそうですね!!

蛇足#1

check_mysql_queryは-pオプションで接続ユーザーのパスワードを指定できます。

実行中は、psで見ると「-p XXXXX」と潰されているのでパスワードがだれにでも丸見えというわけではないですが、Nagiosの設定ファイル(resource.cfgに書いて、$USERXX$で参照するのがいいと思います)には書かないといけないのでちょっとアレですね。。

$HOMEをうまく設定すれば、~/.my.cnfに書いてもいけるかもしれません。

蛇足#2

サーバーによって確保している表領域の大きさがまちまちだと、空き容量ではなく、空き容量とか使用とかで監視したいわけですが、確保している表領域の大きさって簡単に知る方法ありますかね?

show variablesのinnodb_data_file_pathのibdata1:2G;ibdata2:2G;...から、単位を考慮してサイズを足しこむのが簡単かなぁと思うんですが、MySQLは返すデータの長さに上限があって(うろおぼえ。8KBぐらい?)、深遠な理由で細かく2G刻みで超絶たくさん並べているとちょん切れちゃって正確な値が取れなかったりするんで、ssh db001 'cat /etc/my.cnf|grep innodb_data_file_path'とかしないとかなぁと思ったり。