0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ARMv7なArmadillo-IoT A6E で fluent-bit with datadog 構成がうまく動かないので何とかする

Posted at

Armadillo-IoT A6E とは

  • アットマークテクノ社が販売しているIoT用途の小型Linuxマシン
  • LTEやRS-422/485なども搭載しており、IoTっぽいことを簡単に色々やれちゃう素晴らしいデバイス
  • Overlayfsおよびpodmanを標準搭載しており、コンテナ運用が大前提
    • 特別に設定しない限りは再起動するとあらゆるデータがふっとび元に戻る
    • アプリケーションはコンテナ化されているので、開発も運用もすごく楽
  • 筆者はこのA6Eも含め他のArmadilloも何台も使っているが、非常に安定しており故障が少ない
    • 少ないというか私の今までの開発および運用経験においては、今のところ一度もHW的な故障/障害がない
    • めちゃくちゃ使いやすく、高耐久・長寿命であるため、この一連のArmadilloシリーズにはかなり大きな信頼を寄せている

何をしたいか

環境

  • 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がマイナスにふれている

    image.png

  • 事象発生時、なんで??となって、あまりにもわからなすぎてパケットキャプチャしてみたら、あーこれが理由かとなった

    • わからんことがあったら気軽に tcpdump か strace するタイプの人間です
  • この事象はどうもARMv7環境でのみ起こるらしい

    • 同じLinuxカーネルVerであっても他のARMv8環境だと問題なく動く

真因

  • まだ不明, そこまで調査できてない
  • 是非追いかけたいが… ちょっと時間がとれてない
  • 何かしらの不具合であるのは間違いないと思う
  • 私が調べる限り、fluent-bitのリポジトリでそれっぽいIssueなどは特に存在しなかった

暫定対策

  • 理由がわかってしまえば簡単

  • 正しいtimestampのフォーマットで送れたらいいんでしょ?

  • fluent-bitには、処理パイプラインの中でLuaスクリプトを挟ませる機能がある

  • これを使って、HTTPリクエストボディの中身を書き換える

  • そもそものソースの発生時点と処理時点で厳密にはtimestampはズレることになるが、どうせmsec程度なわけで、その程度のズレは今回の場合は全く問題なかった

  • こんな感じ

    timestamp.lua
    function add_custom_timestamp(tag, timestamp, record)
        new_record = record
        new_record["timestamp"] = math.floor(os.time() * 1000)
        return 2, timestamp, new_record
    end
    
    fluent-bit.conf
    
    [FILTER]
        Name   lua
        Match  *
        script ./timestamp.lua
        call   add_custom_timestamp
    
  • 以後はばっちりDatadog側に保存/表示されるようになった

あとがき

  • ヤマハのRTXでLua動かして色々やってたとき以来にLua触ったわ, なつかしすぎる
  • たぶんもっと良い方法があると思う
    • この方法が最良だとは全く思ってない
    • そもそも根本を直すべきである
    • 何か他の良い情報をご存知の方がいれば是非教えてほしい
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?