「Mackerelエージェントのプラグインの仕組みを知り、プラグインを書いてみる」練習として。プラグインテンプレートとしてGo言語のは用意されているのだけど、さっちゃんのアドベントカレンダー記事にもあるとおり、メトリック自体は「メトリックに付ける一意な名前」「値」「Unix時刻」をタブ区切りで出力するだけでよい。
ではRubyでさくっと書いてみるかーということで、題材としてはかねてからやろうかなと思っていた、Fail2banのBAN IP数を測ってみる。できたのはこちら。
kmuto.jpに訪れるいろいろな攻撃をFail2banで叩き落としているが、そのJAILルールごとに現在BANしているIP数をグラフ化している。
BANしているのを眺めてどんなメリットがあるんだという意見もあるが、「お、今日も攻撃お疲れさまです! 拒否させていただきます!」という気持ちを視覚化できる。ほかには、「年末年始、sshdはbotネットワークのマシンも休みなのか静かめだけど、PostfixへのAUTH試行はわりとずっとあるんだなぁ」といった手法の違いも目に見える。
余談
Fail2banからは fail2ban-client banned
を使えばJSONっぽいというかRubyオブジェクトっぽいのが出てくる。
Ruby的にはevalしてそのまま使えるし、fail2banのログ化されている時点で安全だろうとは思うが、mackerel-agentはrootで動いているのもあってさすがにevalは抵抗がある。
じゃぁJSONとして使うか、としたところでなんかパースエラーになってしまってしばし悩んだのだが、結局シングルクォート(')がダメで、ダブルクォート(")にしろということだった。経験値が1上がった。