fluent-bitとは
Fluentdのクライアントの軽量版。Fluentdはrubyで書かれていますが、fluent-bitは小さなシステム用にCで書かれています。
これを使うと、いろいろなログデータを簡単にサーバー側にアップロードすることができます。
センサーの計測データはもちろんですが、kernel log, syslog, cpu負荷、memory使用状況なども全部送信しておくと障害解析に役立ちます。
クロスビルド
今回はNanoPi NEOを題材にしますが、クロスコンパイラさえあれば他のボード向けにも同様にできます。
クロスコンパイラの準備
クロスコンパイラにはbuildrootで作成したarm-buildroot-linux-uclibcgnueabihf-gcc
を使用します。buildrootのソースディレクトリの下のoutput/host/usr/bin
にPATHを通しておきます。
fluent-bitのソースの入手
fluent-bitのgitリポジトリからとってきます。
今回は最新版でなくて、他のプロジェクトで使用経験のあるv0.11.x を使用します。
git clone https://github.com/fluent/fluent-bit.git
cd fluent-bit
git checkout -b v0.11 v0.11.17
クロスビルド
CMakeはあまり使ったことがなくて作法がよくわかりませんでしたが、試行錯誤した後、次のようにすればソースファイルを一切変更しなくてもクロスビルドできることがわかりました。
cd build
GNU_HOST=arm-buildroot-linux-uclibcgnueabihf
CC=${GNU_HOST}-gcc CXX=${GNU_HOST}-g++ cmake -D GNU_HOST=$GNU_HOST ..
make
インストール
デバッガをあてる時のことを想定して、シンボル情報付きの実行ファイルを _g
のsuffixをつけてコピーし、stripしたものを実機に持っていくことにします。
$ cd bin
$ file fluent-bit
fluent-bit: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, not stripped
$ cp fluent-bit fluent-bit_g
$ arm-buildroot-linux-uclibcgnueabihf-strip fluent-bit
$ ls -l fluent-bit*
-rwxrwxr-x 1 koba koba 2420796 Feb 13 02:41 fluent-bit
-rwxrwxr-x 1 koba koba 3613964 Feb 13 02:41 fluent-bit_g
$ ls -lh fluent-bit*
-rwxrwxr-x 1 koba koba 2.4M Feb 13 02:41 fluent-bit
-rwxrwxr-x 1 koba koba 3.5M Feb 13 02:41 fluent-bit_g
$
このfluent-bit を実機の/usr/local/bin
にコピーすればインストール完了。
軽く動作確認
NanoPi NEOで
# /usr/local/bin/fluent-bit -i mem -o stdout
Fluent-Bit v0.11.17
Copyright (C) Treasure Data
[1970/01/01 00:56:57] [ info] [engine] started
[0] mem.0: [3418, {"Mem.total"=>510556, "Mem.used"=>23276, "Mem.free"=>487280, "Swap.total"=>0, "Swap.used"=>0, "Swap.free"=>0}]
[1] mem.0: [3419, {"Mem.total"=>510556, "Mem.used"=>23276, "Mem.free"=>487280, "Swap.total"=>0, "Swap.used"=>0, "Swap.free"=>0}]
[2] mem.0: [3420, {"Mem.total"=>510556, "Mem.used"=>23276, "Mem.free"=>487280, "Swap.total"=>0, "Swap.used"=>0, "Swap.free"=>0}]
[3] mem.0: [3421, {"Mem.total"=>510556, "Mem.used"=>23276, "Mem.free"=>487280, "Swap.total"=>0, "Swap.used"=>0, "Swap.free"=>0}]
^C[engine] caught signal
#
fluentd に送信できることも確認しました。