Mackerel
mackerel-agent

mackerel-plugin-accesslogで2つ以上のログファイルを対象に監視を行いたい時のconfの書き方

Mackerelとは

https://mackerel.io/ja/

Mackerel(マカレル)は、運用中のクラウドもしくはオンプレミスのサーバにエージェントを1つ入れるだけで、簡単にサーバ管理を始められます。監視サーバ自身の構築・運用は不要です。さらに負荷のリソース状況などの数値をグラフに可視化します。障害発生時にはアラートが記録され、様々なツールに通知できます。システム運用保守に最適な監視サービスです。

昔Zabbixの運用経験もあったので、色々念入りに細かく設定できるミドルウェアの良さもあったのですが、少人数で運用する際の機能としては十分なほど揃っているというところと、費用面でだいぶ割安なイメージがあったので、Mackerelの導入を決めました。

AWSのCloudWatchの運用も考えましたが、自分たちのサービス独自のメトリクスの監視やアラートに対応しているところも、Mackerelの推しポイントです。

Blogもめっちゃ更新されてるので是非チェックしてみてください。
https://mackerel.io/ja/blog/

Mackerelプラグイン(mackerel-agent-plugins)について

基本的にMackerelのエージェントを入れると、サーバのメトリクス(CPUやMemory)は自動的に監視ができるようになるのですが、サーバーにインストールしている様々なミドルウェアや、アプリケーション独自のログ監視などをするために、公式のプラグインが提供されています。それが mackerel-agent-plugins です。

https://mackerel.io/ja/docs/entry/howto/mackerel-agent-plugins

下記のGithubレポジトリを見るとわかるんですが、「どんだけあんねん!!!!」と突っ込みたくなるほどの品揃え。これだけあれば、大抵のニーズには応えられるのではないかと思いつつ、しかもソースが公開されてるので自前でなんでも書こうと思えば書けてしまう気前のよさ。

好きだなーMackerel。

mackerel-plugin-accesslogについて

上記で紹介したプラグインの一つである、 mackerel-plugin-accesslog というのがあるんですが、ApacheやNginxのアクセスログを解釈して、リクエスト数やステータスコードのカウント、レイテンシーなどのメトリクスを監視できるようになります。

詳しくは、こちらをご覧くださいませ。
https://mackerel.io/ja/blog/entry/advent-calendar2017/day9-mackerel-plugin-accesslog

困ったこと

で、ですよ、

仕様をよく確認すると、LTSVフォーマットのログであれば、このプラグインが解釈してくれるという開発者の想いのこもった拡張があるわけです。

つまり、

「Apacheのアクセスログと別にあるアプリケーションのログも一緒にこのプラグインで監視したい」

っていうことも可能なのです。

さて、mackerel-plugin-accesslogで2つ以上のログファイルを対象に監視を行いたい時のconfの書き方はどう書けばいいのでしょうか?

例1)2回書く

  [plugin.metrics.accesslog]
  command = "mackerel-plugin-accesslog /var/log/a.log"

  [plugin.metrics.accesslog]
  command = "mackerel-plugin-accesslog /var/log/b.log"

例2)引数を増やす

  [plugin.metrics.accesslog]
  command = "mackerel-plugin-accesslog /var/log/a.log /var/log/b.log"

こんな想像をしていたのですが、どちらも違いました。

解決方法

以下のように metric-key-prefix オプションを指定する。

(参考:https://github.com/mackerelio/mackerel-agent-plugins/blob/master/mackerel-plugin-accesslog/lib/accesslog.go#L185

[plugin.metrics.accesslog_a]
command = "mackerel-plugin-accesslog /var/log/a.log --metric-key-prefix accesslog_a"

[plugin.metrics.accesslog_b]
command = "mackerel-plugin-accesslog /var/log/b.log --metric-key-prefix accesslog_b"

mackerel-agent.confはTOML形式で書かれているので、 [plugin.metrics.accesslog_a][plugin.metrics.accesslog_b] のように、設定名は別々のユニークな名前にしておくのもポイントです。

Mackerelはソースコードも公開されてるので、ちゃんと読んで理解しておけば、公式マニュアルに載ってないようなオプションも使ってみることができるのもいいところだなあと思いました。