初めに
2013年07月に/proc/meminfoの情報をzabbixで収集してみるという記事をQiitaに投稿しました。
Linuxのメモリーに関する情報を/proc/meminfoという特殊なファイルから取得してZabbixで集計してみた、というものでしたが、当時はsystem.run
アイテムで実行したスクリプトで/proc/meminfoを処理してzabbix_sender
コマンドでTrapperアイテムに値を登録するといった内容で、今見返してみると面倒上級者向けな方法だったように感じます。
今回は、2018年12月時点での最新バージョンであるZabbix 4.0が備える機能を活用すると同じ監視内容が手軽に実現できるという内容についてご紹介します。
前提条件
- Zabbix 4.0を対象にしています
- 動作確認はRHEL7/CentOS7で行っています
手順
必要なファイルはGitHub上のリポジトリで公開しています。
監視対象ホストでの作業
- 上記のリポジトリをクローン
- 必要なファイルはuserparameter_meminfo.confとzbx_templates_meminfo_40.xmlの二つだけなので、ファイルだけダウンロードしても構いません
$ git clone https://github.com/mutz0623/zabbix_meminfo
- ユーザーパラメーターを記述した設定ファイルをコピー
$ sudo cp zabbix_meminfo/userparameter_meminfo.conf /etc/zabbix/zabbix_agentd.d/
- Zabbix agentを再起動
$ sudo systemctl restart zabbix-agent.service
ZabbixサーバーのWeb UIでの作業
- テンプレートのXML(
zbx_templates_meminfo_40.xml
)をインポート - テンプレートを対象ホストに割り当てる
- 少し待つ
対象ホストのホストスクリーンで値が見え始めたらOKです。
仕組み
大きく二つの機能の組み合わせで実現しています。
ローレベルディスカバリー
/proc/meminfoの項目数は環境によって増減します。
試しにMicrosoft Azure上のRHEL 7.6で数えてみたところ46個、RaspberryPi 3B+にインストールしたFedora 29では44個でした。
このように、環境によって異なる項目を柔軟に監視する上で欠かせないのがローレベルディスカバリーです。
Zabbixエージェントにはあらかじめネットワークインターフェースやファイルシステム、CPUコアといった、環境によって個数や名前の異なる項目の一覧を取得するためのアイテムが組み込まれていますが、いずれもZabbixサーバーからのリクエストに対して比較的平易なJSON形式のテキストデータを返送するアイテムとして実現されており、ワンライナーを使ったユーザーパラメーターでも容易に実現できるものです。
今回はユーザーパラメーターで「/proc/meminfoに含まれる項目」のディスカバリーを行うアイテムを実装しました。
(ちなみに2013年の記事では、すべてのアイテムを手作業で個別に登録するといったことをやっていました)
依存アイテム機能
バルクメトリクスと言った方が分かりやすいかもしれませんが、要するに複数の値を含む情報を一度にまとめて取得するといったものです。
上述のローレベルディスカバリーのみでも今回ご紹介する内容と同様の監視は実現可能ですが、「個別の項目に対してそれぞれサーバーとエージェント間での値の取得が取得が実行される」と「すべての値をまとめて取得する」とではアイテム取得の実行頻度やエージェントの処理の負荷が大きく変わってくるほか、アイテム取得の実行タイミングの微妙なずれによる影響を低減することができます。
また、依存アイテム機能自体はZabbix 3.4で追加された機能でしたが、Zabbix 4.0でローレベルディスカバリーとの組み合わせが強化され、監視項目の柔軟性が向上しました。
今回は、/proc/meminfoから取得した値をJSON形式にまとめるワンライナーをユーザーパラメーターとして登録し、JSONから値を取り出す依存アイテムをローレベルディスカバリーのアイテムのプロトタイプとしてテンプレートに記述しています。
以上の機能を組み合わせることにより、/proc/meminfoに含まれる40以上の項目の値を一度に取得してまとめてサーバーに返送するといったことが可能になります。
終わりに
「/proc/meminfoの情報をZabbixで監視したい!」と思う人はあまりいないかもしれませんが、ローレベルディスカバリーと依存アイテムの組み合わせは柔軟な監視を実現する上で非常に強力な機能だと思います。