yseto.github.io/blog

mackerel でネットワークスイッチのトラフィックを監視する

Sat Dec 3 00:00:00 2022

この記事は、Mackerel Advent Calendar 2022 3日目の記事です。

@yseto と申します。

以前勤めていた会社では、オンプレミス機器でWebサービスを構築していました。その際に、ラックのスイッチの不調が原因であろう不具合というものがあり、スイッチのトラフィックについて監視をしていく必要に迫られました。

当時は、Cactiを使用していましたが、監視のソリューションの見直しが行われることになり、mackerelを使用しはじめました。

mackerel でのスイッチの監視、主にトラフィック量を見ておきたいために、 sorah さんの snmp2mkr を使用していましたが、たくさんのインターフェイスがあるスイッチに対して使用すると、mackerelで見た時にメトリックの取りこぼしが多々発生することがありました。これは、このツールが悪いのではなく、使い方が悪い。というものであったこと、また兆候がつかめればよい。という要求を満たせればよかったため、そのままにしていました。

この記事では、現時点(2022/12)で、この仕組みを置き換えるソリューションを作るとしたらどういうものが良いか。ということを題材に SNMP をしゃべり、ネットワークインターフェイスを順に走査することで、インターフェイスのトラフィック量やエラーパケット数などを取得して、mackerelに投稿する仕組みを作ってみた。というものです。

当時、欲していた機能的な要求を以下にあげてみます。

これらを処理するために、Go で実装し、ライブラリには gosnmp を使用することにしました。

以下のスクリーンショットは、手元にあるXenServerのネットワークインターフェイスをターゲットに通信量などをメトリックで取得したものです

メトリックが取得できてる様子

実際のオフィスやデータセンターで使われてるスイッチなどを手元に持ち合わせていないので、負荷や処理の検証が十分にできているとは言えないのですが、ソースコードを公開する前に、そういった機材を持つ知人に依頼し動作を軽く見てもらいましたが、おおよそ動いていそうだ。という好意的な反応を得ることができました。

この実装では、mackerelにシステムメトリックとして送信することで、アプリケーションが停止した際に気づけるようにするという実装を行っています。connectivity監視を使うことで、アプリケーションが停止した場合に通信が途絶えることで検知できるような形をとっています。

インターフェイスの条件でのスキップについては、インターフェイス名をSNMPで取得し、正規表現でフィルターをするようにしたり、インターフェイスのリンクアップ状態についても同様に取得して、フィルタするようにしたので、重点的に監視したいインターフェイスのみに絞って監視をできるようになっています。

mackerelでは、いくつかの言語で使える公式のクライアントライブラリがあるので、監視対象とするものにあわせた通信ライブラリと組み合わせることで、自前の専用エージェントを作ることができます。

ソースコード: https://github.com/yseto/switch-traffic-to-mackerel

お断り: 本実装は、あくまで例示的な実装であり、パフォーマンス評価などは十分に行えていないため、実使用に耐えれない可能性があります。