OpenWrtのethersデータベースを晒すPrometheus Exporterプローブをluaで作成

公開

OpenWrt でMACアドレスとホスト名が記された ethers データベースを、 Prometheus Node Exporter のメトリクスという形で晒すコレクタプローブを lua 言語で作成してみました。

OpenWrtのethersデータベースとPrometheus Exporter

以前、OpenWrtにPrometheus Node Exporterを導入した際に、ディスク情報を表示させるのにコレクタプローブファイルを決められたフォルダへ( /usr/lib/lua/prometheus-collectors/ )、追加したことがありました。

ここへ自作のコレクタプローブを配置すれば、欲しい情報をメトリクスという形で晒せるようになるのではないか、というのが今回の試みで、実際に晒したい情報は、MACアドレスとホスト名が記されたehtersデータベースです。

自身がDHCPサーバではないOpenWrt WiFi APで、接続中クライアントのホスト名が分からず名無しさんになってしまう問題を解決すべく、DHCPサーバを担う別のOpenWrtルータからMACアドレスとホスト名が記された、ethersデータベースファイルの提供を受ける仕組みを以前、構築したのですが、その内容をGUIベースで閲覧する手段が未だ無いのが難点。ethersデータベースの内容をPrometheus Node Exporterのメトリクスで公開できれば、参照手段の幅は広がります。

 

Ubuntu環境へのLua導入

稼働中のルータ上でコーディングするのは最小限で済ませたいので、別途Ubuntu PCへLuaをインストールし、開発環境とします。

まず、OpenWrtルータの中で使われているLuaのバージョンを確認、少し古めのv5.1.5が使われていました。

このバージョンと同等のLuaパッケージを、開発環境に見立てたUbuntu PCへインストール。

 

Luaにおけるタブ区切り文字列分割

/etc/ethers データベースファイルの中身は、次のようにMACアドレスとホスト名が一行にタブ区切りされた書式になっています。

これを一行ずつ読み込んで分割したいのですが、生憎とLuaには split 内部関数はありません。調べてみると、 string.gmatch 関数を使ったこちらの例を見つけました。

今回、これを有り難くほぼそのまま拝借して、 split 関数を作成しました。

実行結果は次の通り、MACアドレスとホスト名が1行にタブ分割されたethersデータベースの1エントリを、要素毎に分割できました。

 

ethers_database.luaの作成

ここからはPrometheus Node Exporterが導入済のOpenWrtルータへ移り、コレクタプローブが収録されている /usr/lib/lua/prometheus-collectors/ に次のファイルを新規作成します。

作成したファイルに実行権限を付与したら、サービスを再起動させて反映。

他のプローブを参考に、見よう見真似で初めてLua言語で組んだスクリプトですが、なんとか期待通りに動いてくれました。

図1.ethers_databaseのメトリクス

図1.ethers_databaseのメトリクス

副産物)dhcp_lease.luaの作成

以前の記事でも少し触れたDHCPサーバのリースファイル、 /tmp/dhcp.lease も似たようなテキストファイルで、リース期限やMACアドレス、ホスト名の他にIPアドレスがあるのが情報として特色。

せっかくなので、このリースファイルからMACアドレス、IPアドレス、ホスト名を出力するプローブも作ってみました。

ブラウザでメトリクスを確認、利用法は追々考えましょう。

図2.dhcp_leaseのメトリクス

図2.dhcp_leaseのメトリクス

 

実はこれ、わざわざ自作せずとも、prometheus-node-exporter-lua-uci_dhcp_hostパッケージという、全く同じ方法を晒すプローブコレクタが用意されていました。

こちらのスクリプトは uci コマンドを通じて、エレガントに同等の情報を得ているようです。

図3.uci_dhcp_hostのメトリクス

図3.uci_dhcp_hostのメトリクス

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA