mackerel-agent を使って異常を検知した際に自動で復旧させる
はじめに
普段会社では監視ツールとして mackerel などを使ったりしているのですが、mackerel を使っている場合 nginx が動いている server のメモリ使用量が一定割合を超えたらエスカレが来るみたいなことをしていると思います。
こういう場合の対応は基本的に nginx を reload させてあげて終わりとなることがほとんどなのでエスカレの電話きてわざわざ人が対応するよりは自動化できた方がいいよね?という気持ちになるわけです。
でそれが mackerel-agent を使えばできますという話。
mackerel-agent の設定
まずは mackerel-agent の conf を用意します。
mackerel-plugin-memory-checker.conf
[plugin.checks.memory] command = "/usr/local/bin/memory_checker" action = { command = "bash -c '[ \"$MACKEREL_STATUS\" != \"OK\" ]' && systemctl reload nginx", user = "root" }
これは command が正常に終了しなかった際に action を実行するという意味です。
memory_checker の中身はこんな感じ
#!/usr/bin/env ruby metrics = {} File.foreach("/proc/meminfo") do |line| if md = line.match(/(MemTotal|MemAvailable):[\s]+([0-9]+)/) metrics[md[1]] = md[2].to_i end end available_percentage = metrics["MemAvailable"] / metrics["MemTotal"].to_f * 100 if available_percentage < 20 puts "Memory WARNING: #{available_percentage}%" exit 1 else puts "Memory OK: #{available_percentage}%" end
メモリの残り容量が 20% をきっていたら exit 1 で異常終了させるというコードになります。
これによって mackerel-agent は conf で記述した action 内のコマンドを実行してくれます。