えいのうにっき

a-knowの日記です

Mackerel のログ監視で検知された出力行をグラフにプロットする

本日、mackerel-agent の v0.64.0 がリリースされました。

github.com

これにより、取り込まれたいくつかの Pull Request が v0.64.0 に含まれているわけですが、そのうちの Pass the check monitoring result message to "action" by env という Pull Request により、以下のスクリーンショットのようなことができるようになったので、その実現方法も含めてこの記事で紹介したいと思います。(この Pull Request も私が出したものなので、マッチポンプ感ありますが......。& この記事は Mackerelチームに所属する CRE でもある人間がお届けしています。)

f:id:a-know:20191025144700p:plain
検出したログ出力行をグラフにプロットしている様子です

前提・下準備

前提として、mackerel-agent がインストールされたホストがあるとします。また、以下のようなログ監視設定がすでに設定されていることとします。

[plugin.checks.applog]
command = ["check-log", "--file", "/var/www/app/log/production.log", "--pattern", "failed", "--return"]

この設定内容は、ログファイル /var/www/app/log/production.log の毎分の出力差分をチェックして、 failed という文字列があったらアラートとして発報する。というチェック監視設定になります。Mackerel における「チェック監視」や「ログ監視」に馴染みのない方は、以下のヘルプもご覧ください。

mackerel.io

mackerel.io

またそもそも mackerel-agent をインストールしてない!という方は、下記を参考にぜひインストールしてみてください。

mackerel.io

手順1:エージェントを最新の v0.64.0 にアップデートする

今回紹介するものは最新版の mackerel-agent でなければできないことなので、まずはこれを実施します。

$ sudo yum upgrade mackerel-agent

手順2:ホストに mkr をインストールする

mkr とは、Mackerel公式のCLIツールです。厳密には mkr を使わずに API コールをすることでも代用は可能なのですが、まぁ楽なので、あるものは使ってしまいましょう。

mackerel.io

$ sudo yum install mkr
読み込んだプラグイン:fastestmirror
Determining fastest mirrors
 * base: ty1.mirror.newmediaexpress.com
 * extras: ty1.mirror.newmediaexpress.com
 * updates: ty1.mirror.newmediaexpress.com
(中略)
Running transaction
  インストール中          : mkr-0.39.2-1.el7.centos.x86_64                                                                  1/1 
  検証中                  : mkr-0.39.2-1.el7.centos.x86_64                                                                  1/1 

インストール:
  mkr.x86_64 0:0.39.2-1.el7.centos                                                                                              

完了しました!

インストールできました。

手順3:ログ監視設定に action を追加指定する

Mackerel のチェック監視では、監視のためのコマンド実行 command に加えて、そのコマンド実行後に任意の動作をおこなわせることのできる action を指定することができます。以下の記事は、この機能がリリースされた当時の告知記事です。

mackerel.io

この機能を使うことで、例えば「Webサーバープロセスの死活状況を監視して、NGだったらWebサーバー再起動コマンドを自動実行させる」ということも可能になります。

じゃあ今回はどんな記述を action として追加するの、ってことですけど、以下のような感じで追記してみます。追記後はエージェントの再起動を忘れずに。

[plugin.checks.applog]
command = ["check-log", "--file", "/var/www/app/log/production.log", "--pattern", "failed", "--return"]
action = { command = "bash -c '[ \"$MACKEREL_STATUS\" != \"OK\" ]' && mkr annotations create --service hoge-service --role fuga-role --from `date +%s` --to `date +%s` --title plugin.checks.applog --description \"$MACKEREL_CHECK_MESSAGE\"" }

冒頭でお見せした画像は、実は Mackerel のグラフアノテーションという機能による様子でした。

mackerel.io

action で指定しているコマンドを解説すると、

  • ログ監視結果が OK 以外( CRITICALWARNING )のときに、
  • mkr annotations コマンドを使って、
  • check-log プラグインの --return オプションにより、検知対象ログ出力行が標準出力されたものが $MACKEREL_CHECK_MESSAGE にセットされているため、それをそのままグラフアノテーションとして投稿する

というものになっています。

あとは、問題のあるログ出力があれば自動的にグラフアノテーションがグラフにプロットされます。

f:id:a-know:20191025144700p:plain

注意点

注意点、もちろんあって、

  • $MACKEREL_CHECK_MESSAGE に設定される、検出ログ出力行の最大メッセージ長は1024文字
  • グラフアノテーションはサービスメトリックグラフ、もしくはロールグラフに対して投稿できるが、それらは複数のホストを束ねるための概念
    • その一方でログ監視はホスト単位で設定されるもの

といったようなところがあります。特に実用面を考えると後者については、グラフアノテーションに投稿する情報に「どのホストからあがってきたものか」という情報も付与してあげるとよいかもしれません。

あ、ちなみに逆の注意点(?)として、チェック監視も・ログ監視も・グラフアノテーション投稿もすべて追加料金なくおこなえます。無料のFreeプランでも全く同じように試せますので、よろしければぜひ。

まとめ

最近、「Observability」「可観測性」というキーワードをよく耳にするかと思います。可観測性を構成する主要な要素として、

  • Metrics
  • Logging
  • Tracing

があると思いますが、Mackerel はこの中でも特に Metrics に強みを持つプロダクトです。なのですが、今回ご紹介したように、ログに対する監視についても全くできないわけではありません。もちろん、世の中のログ監視基盤の水準はまた違ったレベルにあると思うのですが、仮に Mackerel でアプローチするとなるとどうなるか?ということをやってみた次第です。

また、冒頭にも書いているように、今回のこの仕組みは mackerel-agent のコードに対して手を加える(しかもたった一行!)ことでできるようになったものです。私の好きな言葉に「ソフトウェアの梃子を効かせる」という言葉があります。Mackerel という SaaS が持っている機能・mackerel-agent やプラグインが持っている機能に加えて、「ハックすることで新たに持たせられる機能やエッセンス」というのもまだまだたくさんあると考えています。そういうところも私が Mackerel を好きな理由の一つなのですが、みなさんにも、そういった側面でも Mackerel を好きになってもらえたら嬉しいなー、と思っています。