大破ログ

日々大破、それと側転少々。PC関連その他、気になったことなどをつらつらと。

mackerel-agentをOpenWrt/LEDE-Projectのパッケージ化してみる

今月9日と10日に明星大学で開催された、「OpenSourceConference (OSC) 2017 Tokyo/Fall」に参加してきました。

今年は東海道らぐのしまださんから "もしよければLTどうですか?" とお誘いいただいていたので、8日に急いでスライドを作って9日の東海道らぐLT枠で発表させていただきました。
ただ、LTに慣れていないために量が多すぎるスライドを作ってしまい、結果持ち時間の5分を大幅に過ぎてしまいました。反省。
1日目はルータを持っていこうと考えていたものの忘れてしまい、2日目持ってきて東海道らぐブースに展示させていただきました。

さて、そのLTの中で最後のほうに少し触れましたが、OpenWrt/LEDE-Projectにおけるmackerel-agentについてです。
スライド自体でもざっくりしたものだったうえに、時間が無かったためにかなり簡単に流してしまいました。

流れ

MackerelをOpenWrt/LEDEでゴリゴリやるまでのざっくりな流れです。

  • TwitterでOpenWrt/LEDE-ProjectにてMackerelを動かす記事を見かける
  • Mackerelについて調べる
  • 自分でもやってみよう、どうせならOpenWrt/LEDEの .ipkパッケージ化してみよう
  • パッケージ化はできたけど、ルータによって動作したりしなかったり
  • 正常終了時にpoweroffが通知されない

大体こんな感じ。OSCまでにはおおよそ解決したかったものの、上手くいかず若干問題を抱えたまま2日目東海道らぐブースにて展示しました。

Mackerel とは

"株式会社はてな" が提供する、サーバー監視ソリューション。”マカレル"。
Goで書かれたmackerel-agentをサーバ等で動作させ、収集したデータをエージェントが定期的にMackerel.io側に送信する。詳細については公式サイトで。

OpenWrt/LEDE-Projectの .ipk パッケージ

OpenWrt/LEDE-Projectがパッケージ管理として採用する "opkg" のパッケージ形式。今回Twitterで見つけてかなり参考にさせていただいた mackerel-agentをLinux/MIPS32環境で動かしてみた - Qiitaでは単体で直接ビルドしルータ上へもってきているものの、ファームへの組み込みや配布等を考慮するとパッケージ化するほうが良さそう、ということに。
必然的に、OpenWrtやLEDE-ProjectのBuildrootを利用したビルドになる。

ビルド用カスタムフィード

OpenWrt/LEDE-Project パッケージとしてビルドするにあたり、Buildrootに読み込ませるためのカスタムフィード(公式提供外のフィード)を、試行錯誤した末になんとか作成。 mackerel - taiha/taiha-pkgs OpenWrt/LEDE-Project Buildrootのfeeds.conf.defaultをfeeds.confとしてコピーし、 [sourcecode] src-git taiha https://github.com/taiha/taiha-pkgs.git [/sourcecode] を追記したうえで "./scripts/feeds update -a" "./scripts/feeds install -a" を走らせると、menuconfig のAdministrationに "mackerel-agent" が現れます。

Endianでコケた(?

エンディアン周りはいまいち正確に理解できていないものの、どうにもGoはMIPS用バイナリのビルドにおいては正しいエンディアンを選択してビルドする必要がある模様(GOARCH=mips or mipsle)。ビルドしたmackerel-agentバイナリがBIG EndianなAtheros AR7242を搭載するRouterBoard 750GLでは動作するものの、LITTLE EndianMediaTek MT7621では同一のバイナリが動作しないということが起きた。この辺については、雑記ブログのほうに多少まとめてあります。

なお、現状 taiha/taiha-pkgs のmackerel-agentはMIPSルータのみ対応。ARMはMakefileでGOARCHを指定するように記述しているものの、未だテストできていないのでビルドの可否と動作は不明。
2017/10/04 追記: LEDE-ProjectのBuildrootからARCHを取得し、targetのArchitectureに合わせてGOARCH, GOARM/GOMIPSを指定するよう変更しました。これにより、MIPS(LITTLE/BIG Endianness)とARM、x86/x86_64に対応しました。
(注: 検証済み環境 -> WZR-900DHP (ARM, bcm53xx), VR500 (MIPSLE, ramips), RB750GL (MIPSBE, ar71xx))

mackerel-agent終了時の問題

mackerel-agentには、プロセスが正常終了された場合Mackerel.io側にStatusの変更を通知して監視を停止、あるいは監視は続行するが障害の通知は行わないというような設定が可能。
弄り始めた当初この機能が効いてた記憶があるものの、何故か途中から機能せずプロセスを停止する度に障害メールが飛んでくる事態に。
色々弄ってみても解決しないため、mackerel-agentに "start" "stop" コマンドを追加し、プロセスの起動/停止とは関係なくMackerel.ioへの通知を個別で行えるようにし、強引に解決。

ただし、initスクリプトでMackerel.ioへの通知の成功/失敗を取っていないため、現状では場合によりStatus変更通知に失敗してもMackerel.io側がpoweroffのままエージェントが起動する、あるいはworkingのままでもエージェントが停止するということが起こり得ます。

2017/10/04 追記: mackerel-agent.confでの設定ミスが原因だった模様。現在は上記の変更は破棄し、feedでの使用リポジトリは公式リポジトリへ戻しました。現状、ビルド時のLDFLAGSのみfeed付属のpatchで追加しています。

スクリーンショットなど

↑ RouterBoard 750GL で動作させたときの様子。搭載SoCのAtheros AR7242やRAM容量などもしっかり表示された。各種グラフもOK。

課題 / やりたいこと

  • initスクリプトの強化(成功 / 失敗による処理など)
  • mackerel-agent のバイナリ圧縮(現状4.5MBほどあるのでUPX使用して)
  • ARM機種での動作確認 / 対応(手持ちのWZR-900DHP)Done(2017/10/04 追記)
  • (気分とか進捗によって増えるやも)