SNMP Trapを受信したらメールやSlack等で通知する仕組みはsnmptrapdのtraphandleで簡単に実現できる。
単発のTrapがときどき来る程度であればその仕組みでも良いと思う。 しかし、大抵のシステムは何らかの故障時にTrapが大量に発生する。 すると、通知もそれだけ大量に来て、受信ボックスが大変なことになる。
そのようなケースに対応するため、Alertmanagerでアラートを集約・抑制する仕組みを試してみた。
Alertmanagerの公式サイト:
一般的に、AlertmanagerはPrometheusと併用するものだが、Alertmanager単体でも使用できる。 そして、amtoolというAlertmanagerのコマンドラインツールでアラートを追加できる。
amtoolの使い方については以下のページが詳しい。
- Prometheus から切り離して Alertmanager を運用するための amtool の取り扱い - Qiita
- amtoolの使い方 - Prometheusドキュメント - it-engineer’s blog
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はこのようになる。
Annotationにsnmptrapdの出力を入れているのだが、改行が消えて見づらくなるのが残念である。
あとはalertmanager.ymlでグループや通知の設定を試行錯誤して完成の予定。