j3iiifn’s blog

ネットワーク、インフラ、セキュリティ、プログラミング(Python、Android)についての備忘録

SNMP TrapをAlertmanagerでアラート化する試み

SNMP Trapを受信したらメールやSlack等で通知する仕組みはsnmptrapdのtraphandleで簡単に実現できる。

単発のTrapがときどき来る程度であればその仕組みでも良いと思う。 しかし、大抵のシステムは何らかの故障時にTrapが大量に発生する。 すると、通知もそれだけ大量に来て、受信ボックスが大変なことになる。

そのようなケースに対応するため、Alertmanagerでアラートを集約・抑制する仕組みを試してみた。

Alertmanagerの公式サイト:

一般的に、AlertmanagerはPrometheusと併用するものだが、Alertmanager単体でも使用できる。 そして、amtoolというAlertmanagerのコマンドラインツールでアラートを追加できる。

amtoolの使い方については以下のページが詳しい。

snmptrapdのtraphandleでamtoolを叩くサンプルを書いてみた。

/etc/snmp/snmptrapd.conf

disableAuthorization yes
authCommunity execute public
traphandle default /usr/local/bin/trap.sh

/usr/local/bin/trap.sh

#!/bin/bash

msg=$(</dev/stdin)
instance=$(echo "${msg}" | head -n1)

echo "${msg}" >> /var/log/trap.log
echo "=====" >> /var/log/trap.log

amtool \
  --alertmanager.url http://localhost:9093 \
  alert add "SNMP Trap - ${instance}" \
  project=test-project instance="${instance}" timestamp="$(date +%Y-%m-%d_%H:%M:%S)"\
  --annotation=description="${msg}"

この設定でVyOSのBGP peer down/upのパケットを別ホストから流してみる。

$ sudo tcpreplay -i ens38 -K -l1 --pps 1 vyos-bgp.pcap

AlertmanagerのWeb GUIはこのようになる。

f:id:j3iiifn:20190930015414p:plain

Annotationにsnmptrapdの出力を入れているのだが、改行が消えて見づらくなるのが残念である。

あとはalertmanager.ymlでグループや通知の設定を試行錯誤して完成の予定。