Armadillo
Armadillo-Box WS1/BLE Gateway

Armadillo-Box WS1/fluentd

Armadillo-Box WS1 はカーネルもユーザーランドも Armadillo-IoT と共通点が多く、
ROM イメージのサイズに注意すれば Armadillo-IoT で動作するアプリケーションは
ほとんど動作させることができます。

Armadillo-Box WS1/BLE対応Armadillo-Box WS1/Wifi対応 を加えた Armadillo-Box WS1 で
flunetd を動作させ、BLE 経由で集めたデータをログ収集用のサーバーへ送信するための変更手順を
以下に記します。

収集データの形式

fluentd でサーバへ送信するデータは、Bluetooth Low Energy で専用アプリケーションが収集し、
以下のようなフォーマットで atmark dist の syslog が出力される /var/log/messages へ定期的に書き込まれるものとします。
tempgw が syslog へ出力するデータ収集アプリ名、ADV は BLE デバイスの MACアドレス、serial は複数から受信している場合の識別ID、
temp は温度、rssi は受信強度です。

Nov 30 15:00:43 (none) user.info tempgw: ADV: E0:40:56:7E:2A:DC serial:3 temp:25.125000 rssi:-79

これを fluentd の tail plugin で読み込み、適切にフォーマットしてサーバーの受信用 fluentd に送信します。
syslog plugin を使ってしまうと format せず message: に全体がそのまま入ってしまい、
データ利用のための検索がしにくいなどの問題があるため tail plugin を使用します。

fluentd 追加

atmark dist の make menuconfig で fluentd 関連ファイルを追加します。

vendor/Product を指定します。

(AtmarkTechno) Vendor
(Armadillo-Box WS1) AtmarkTechno Products

ユーザーランドのコンフィギュレーションを行い、 flunetd と fluentd に必要なものを有効にします。

 [*] Customize Vendor/User Settings (NEW)
     Miscellaneous Applications --->
         :
         :
        ---     extension
         :
         :
        [*] ruby                  <-- チェックをいれ有効にする
        (2.1.2)   Version         <-- 2.1.2 にする。2.0.0-p451 だと flunetd 他のビルドがエラーになる。
        [*]   fluentd             <-- ruby にチェックをいれると表示されるので、チェックをいれ有効にする
         :
        [*]   http_parser.rb      <-- ruby にチェックをいれると表示されるので、チェックをいれ有効にする
        [*]   ruby-cool.io        <-- ruby にチェックをいれると表示されるので、チェックをいれ有効にする
         :
        [*]   ruby-macaddr        <-- ruby にチェックをいれると表示されるので、チェックをいれ有効にする
         :
        [*]   ruby-sigdump        <-- ruby にチェックをいれると表示されるので、チェックをいれ有効にする
        [*]   ruby-systemu        <-- ruby にチェックをいれると表示されるので、チェックをいれ有効にする
        [*]   ruby-string-scrub   <-- ruby にチェックをいれると表示されるので、チェックをいれ有効にする
        [*]   ruby-thread_safe    <-- ruby にチェックをいれると表示されるので、チェックをいれ有効にする
        [*]   ruby-tzinfo         <-- ruby にチェックをいれると表示されるので、チェックをいれ有効にする
        [*]   ruby-tzinfo-data    <-- ruby にチェックをいれると表示されるので、チェックをいれ有効にする
         :
        [*]   msgpack-ruby        <-- ruby にチェックをいれると表示されるので、チェックをいれ有効にする
         :
        [*]   yajl-ruby           <-- ruby にチェックをいれると表示されるので、チェックをいれ有効にする
         :
         :
         :

カーネルとユーザーランドのビルド

上記の変更を反映したカーネルとユーザーランドを一旦ビルドします。

atmark@atde5:~/atmark-dist$ make clean
atmark@atde5:~/atmark-dist$ make

fluent.conf の配置

ROM イメージディレクトリの /etc に fluentディレクトリを作成し、そこに fluent.conf を配置します。

ただし、 ramfs で起動する atmark dist の特徴として /etc/config/ 以下か microSD や USBメモリなどの外部ストレージにしか
起動後の変更内容を保存できないので、設定ファイルへの変更修正を保存できるよう
/etc/fluent/fluent.conf は /etc/config/fluent.conf への symlink として作成します。

atmark@atde5:~/atmark-dist$ cd romfs/etc
atmark@atde5:~/atmark-dist/romfs/etc$ mkdir fluent
atmark@atde5:~/atmark-dist/romfs/etc$ cd fluent
atmark@atde5:~/atmark-dist/romfs/etc/fluent$ ln -s /etc/config/fluent.conf fluent.conf

また、/etc/config/ 以下の設定ファイルは初回起動時に /etc/default/ 以下のものがコピーされて
Armadillo-Box 本体内フラッシュメモリの config 保存領域に保存されるので、
fluent.conf の実体は /etc/default/ の下に保存しておきます。

atmark@atde5:~/atmark-dist/romfs/etc/fluent$ cd ../default/
atmark@atde5:~/atmark-dist/romfs/etc/default$ cp ~/atmark-dist/user/fluentd/fluent.conf .

イメージ再作成

fluent.conf の配置が完了したら、上記の設定ファイル配置変更を含むユーザーランドのイメージを再度作成します。

atmark@atde5:~$ cd atmark-dist
atmark@atde5:~/atmark-dist$ make image

動作確認

Armadillo-Box WS1 がネットワークに接続してある場合に一番速い書き換え方法である
12.4. TFTPを使用してフラッシュメモリを書き換える
http://manual.atmark-techno.com/armadillo-box-ws1/armadillo-box-ws1_product_manual_ja-1.0.0/ch12.html#sct.update_image-with-tftpdl
でカーネルとユーザーランドを再作成したものに書き換えます。

hermit> tftpdl 192.168.0.90 192.168.0.164 --blksize=1024 --kernel=linux.bin.gz
hermit> tftpdl 192.168.0.90 192.168.0.164 --blksize=1024 --userland=romfs.img.gz

新しいカーネルとユーザーランドで起動しネットワークに正常に接続できることを確認したら、
まず時間を合わせます。

[root@abws1-0 (ttymxc1) ~]# ntpclient -h ntp.nict.jp -s
25567 00180.848    8769.0      0.8  1448951602547493.0      0.0         0
[root@abws1-0 (ttymxc1) ~]# date
Tue Nov 25 15:36:24 JST 2015

fluent.conf を以下の内容にします。

<source>
  @type tail
  format /^(?<time>[^ ]* [^ ]* [^ ]*) (?<host>[^ ]*) (?<class>[^ ]*) (?<ident>[^ ]*): .*: (?<ADV>([A-Z0-9]{2}[:]){5}([A-Z0-9]{2})) .*:(?<temp>[0-9]{2}[\.][0-9]{6}) (?<message>.*)$/
  time_format %b %d %H:%M:%S
  path /var/log/messages
  pos_file /var/tmp/mesagges.pos
  types temp:float
  tag syslog.ble
</source>

<match syslog.**>
  @type copy
  <store>
    @type forward
    heartbeat_interval 60s
    heartbeat_type tcp
    flush_interval 60s ##600s at realuse
    buffer_type file
    buffer_path /var/tmp/in_ble_app.syslog.*.buffer
    buffer_chunk_limit 3072k
    buffer_queue_limit 425
    retry_wait 2s
    max_retry_wait 1h
    retry_limit  72 # retry count

    <server>
      host 192.168.0.80
      port 24224
    </server>
  </store>
  <store>
    type stdout
  </store>
</match>

fluentd をデバッグオプション付きでフォアグラウンド実行してみます。

[root@abws1-0 (ttymxc1) ~]# fluentd -c /etc/fluent/fluent.conf -vv
2015-11-25 16:09:28 +0900 [info]: fluent/supervisor.rb:341:read_config: reading config file path="/etc/fluent/fluent.conf"
2015-11-25 16:09:29 +0900 [info]: fluent/supervisor.rb:239:supervise: starting fluentd-0.12.2
2015-11-25 16:09:30 +0900 [trace]: fluent/plugin.rb:98:register_impl: registered buffer plugin 'file'
2015-11-25 16:09:30 +0900 [trace]: fluent/plugin.rb:98:register_impl: registered buffer plugin 'memory'
〜〜 中略 〜〜
2015-12-01 16:09:37 +0900 [info]: fluent/agent.rb:123:add_match: adding match pattern="syslog.**" type="stdout"
2015-12-01 16:09:37 +0900 [info]: fluent/root_agent.rb:142:add_source: adding source type="tail"
2015-12-01 16:09:37 +0900 [info]: plugin/in_tail.rb:474:initialize: following tail of /var/log/messages
2015-12-01 16:09:56 +0900 syslog.ble: {"host":"(none)","class":"user.info","ident":"tempgw","ADV":"ED:B2:9F:B5:70:CD","serial":"1","temp":27.375,"message":"rssi:-57"}
2015-12-01 16:10:56 +0900 syslog.ble: {"host":"(none)","class":"user.info","ident":"tempgw","ADV":"ED:B2:9F:B5:70:CD","serial":"1","temp":27.25,"message":"rssi:-59"}
2015-12-01 16:11:56 +0900 syslog.ble: {"host":"(none)","class":"user.info","ident":"tempgw","ADV":"ED:B2:9F:B5:70:CD","serial":"1","temp":27.25,"message":"rssi:-59"}

stdout への出力を確認し、 tail plugin の format の正規表現で syslog に書かれた message が
key ごとに正しく分割できていたら fluentd を停止、
flatfsd -s で fluent.conf の変更内容を保存します。

起動時実行設定

Armadillo-Box WS1 起動時に fluentd 関連のアプリケーションが動作する設定を追加します。
http://manual.atmark-techno.com/armadillo-box-ws1/armadillo-box-ws1_product_manual_ja-1.1.0/ch09.html#sct.userland_spec.rc_local

/etc/config.rc.local に以下の内容を追加し、flatfsd -s で保存します。

#!/bin/sh

. /etc/init.d/functions

PATH=/bin:/sbin:/usr/bin:/usr/sbin

# ntp
ntpclient -h ntp.nict.jp -s

# BLE temperature log application
tempgw &

# fleuntd
fluentd -c /etc/fluent/fluent.conf -o /var/log/fluent.log &

ここでは fluentd は直接 rc.local の中で実行していますが、
/etc/init.d/ に fluentd 専用の起動スクリプトを置いたり
Armadillo-IoTでfluentdを利用してTreasureDataにデータを溜める
https://users.atmark-techno.com/blog/46/1219
にあるように start-stop-daemon で管理して起動してもいいでしょう。

fluentd を rc.local から起動すると、root の shell 上で実行するのと異なり timezone が反映されません。
この点は fluentd で送信する log の日付に影響するので注意が必要です。

受信側 fluentd

上記の設定で Bluetooth Low Energy Gateway に設定した Armadillo-Box WS1 の fluentd で送信したログは
ログ集約サーバーの fluentd で受信します。
ログ集約サーバーのソフトウェア設定は fluentd/ログ集約サーバー をご覧ください。

更新履歴

2015/12/08 初稿掲載

Satoshi OTSUKA

BC::labsへの質問は、bc9-dev @ googlegroups.com までお願い致します。
トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2015-12-08 (火) 12:53:03 (477d)