Armadillo-IoT A6E とは
- アットマークテクノ社が販売しているIoT用途の小型Linuxマシン
- LTEやRS-422/485なども搭載しており、IoTっぽいことを簡単に色々やれちゃう素晴らしいデバイス
- Overlayfsおよびpodmanを標準搭載しており、コンテナ運用が大前提
- 特別に設定しない限りは再起動するとあらゆるデータがふっとび元に戻る
- アプリケーションはコンテナ化されているので、開発も運用もすごく楽
- 筆者はこのA6Eも含め他のArmadilloも何台も使っているが、非常に安定しており故障が少ない
- 少ないというか私の今までの開発および運用経験においては、今のところ一度もHW的な故障/障害がない
- めちゃくちゃ使いやすく、高耐久・長寿命であるため、この一連のArmadilloシリーズにはかなり大きな信頼を寄せている
何をしたいか
- A6Eの中でfluent-bitを動かして様々なモニタリングをしたい
- さらにDatadogを組み合わせて、fluent-bitで取得したメトリクス/ログなどをDatadogにぶんなげて管理したい
環境
- Armadillo-IoT A6E
- 非Cat1bisモデル
- 今、市場で手に入るやつはbisモデルになってるので、厳密には違う
- Linux v5.10.226
- ARMv7
- Armadillo Base OS v3.22.2-at.8
- Fluent Bit v4.2.0
fluent-bitのサンプルコンフィグ
- 例えばこんな感じ
- CPUとRAMの使用率とシステム温度をとる
- アプリケーションコンテナから吐き出されたログもDatadogに連携する
[INPUT]
Name cpu
Tag cpu
Interval_Sec 60
[INPUT]
Name thermal
Tag thermal
Interval_Sec 900
[INPUT]
Name mem
Tag memory
Interval_Sec 60
[INPUT]
Name tail
Path /var/log/your_app_log
Tag your_app_log
[FILTER]
Name record_modifier
Match *
Record hostname ${HOSTNAME}
[OUTPUT]
Name datadog
Match *
Host http-intake.logs.datadoghq.com
TLS on
compress gzip
apikey your_api_key
dd_source your_app
dd_service your_app_service
どんな問題が発生したか
- まぁfluent-bitを動かすだけなら楽勝
- 上述のサンプルコンフィグぐらいでも全然実用に耐えるし、fluent-bit自体は世の中でめちゃくちゃ使われているのでノウハウはいくらでも手に入る
が・・・・・・・・・・
-
実際には
Datadogに全く表示されない / 保存されてない -
flueent-bitのコンフィグをイジってデバッグログを出してみる一応HTTP的には20xで終わっており問題ないように見える
fluent-bit.conf[SERVICE] Log_Level debug -
podman logs fluent-bit[2025/12/03 23:23:38.767208589] [debug] [input:tail:tail.5] inode=17, /var/log/your_app_log, events: IN_MODIFY [2025/12/03 23:23:38.794614708] [debug] [output:datadog:datadog.0] https://http-intake.logs.datadoghq.com, port=443, HTTP status=202 payload={}
が・・・・・・・・・何度も繰り返すが、一切Datadogに表示されてない
ちなみに全く同じコンフィグを別で動かすとバッチリ動く。つまり、このA6Eの環境固有の何かによって問題が引き起こされている可能性が高いと判断した。
原因
-
timestampがめちゃくちゃになっているのでDatadogで落とされている (と考えられる)
- HTTP Status Code: 20xではあるが、一旦取り込まれたあと、恐らくその後のパイプラインの中で異常値として落としてるのだと思う
-
以下はfluient-bitがDatadogに投げるときの通信をパケットキャプチャしたものなのだが、timestampがマイナスにふれている
-
事象発生時、なんで??となって、あまりにもわからなすぎてパケットキャプチャしてみたら、あーこれが理由かとなった
- わからんことがあったら気軽に tcpdump か strace するタイプの人間です
-
この事象はどうもARMv7環境でのみ起こるらしい
- 同じLinuxカーネルVerであっても他のARMv8環境だと問題なく動く
真因
- まだ不明, そこまで調査できてない
- 是非追いかけたいが… ちょっと時間がとれてない
- 何かしらの不具合であるのは間違いないと思う
- 私が調べる限り、fluent-bitのリポジトリでそれっぽいIssueなどは特に存在しなかった
暫定対策
-
理由がわかってしまえば簡単
-
正しいtimestampのフォーマットで送れたらいいんでしょ?
-
fluent-bitには、処理パイプラインの中でLuaスクリプトを挟ませる機能がある
-
これを使って、HTTPリクエストボディの中身を書き換える
-
そもそものソースの発生時点と処理時点で厳密にはtimestampはズレることになるが、どうせmsec程度なわけで、その程度のズレは今回の場合は全く問題なかった
-
こんな感じ
timestamp.luafunction add_custom_timestamp(tag, timestamp, record) new_record = record new_record["timestamp"] = math.floor(os.time() * 1000) return 2, timestamp, new_record endfluent-bit.conf[FILTER] Name lua Match * script ./timestamp.lua call add_custom_timestamp -
以後はばっちりDatadog側に保存/表示されるようになった
あとがき
- ヤマハのRTXでLua動かして色々やってたとき以来にLua触ったわ, なつかしすぎる
- たぶんもっと良い方法があると思う
- この方法が最良だとは全く思ってない
- そもそも根本を直すべきである
- 何か他の良い情報をご存知の方がいれば是非教えてほしい
