複数データをまとめて送信するノードが絶対時刻を持っていない場合に,Fluentd で適切に処理する方法を紹介します.
はじめに
前回,ESP32 の ULP で複数回計測を行って,まとめて CPU で処理する方法を紹介しました.この方法を使って Fluentd にデータを送る場合,1 つ問題があります.
ESP32 の消費電力をなるべく抑えることを考えると,ESP32 では測定時点の時刻を把握できない形となります.この状況で普通に Fluentd に複数データを送りつけると,Fluentd はデータ受信時の時刻を全てのデータの計測時刻として扱ってしまいます.
その解決方法を紹介します.
解決方法
この問題は,次の流れで解決することができます.
- データの送信時,計測時刻と送信時刻の差(オフセット)を,データとして含める.
- サーバ側でデータを受信する際,受信時刻と前項のデータから,計測時刻を算出.
- Fluentd に算出した時刻をデータの計測時刻として扱うように指示
順に詳細を説明していきます.
時刻オフセットの設定
Fluentd に送る JSON に時刻オフセット情報を入れます.以降では,下記のように self_time というパラメータに設定する前提で話を進めます.オフセットは,30 秒前の測定データに対しては 30 を設定するものとします.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
json=[ { "temp":23.779663, "humi":46.045624, "hostname":"sht3x-sensor", "self_time":0 }, { "temp":23.934540, "humi":45.842678, "hostname":"sht3x-sensor", "self_time":30 // 30 秒前 }, { "temp":24.046692, "humi":45.423058, "hostname":"sht3x-sensor", "self_time":60 // 60 秒前 } ] |
計測時刻の算出
record_transformer Filter Plugin を使って,オフセット時間から絶対時間を算出します.
設定としては下記のようにします.
1 2 3 4 5 6 7 |
<filter sensor.**> type record_transformer enable_ruby <record> self_time ${Time.now.to_i - record["self_time"].to_i } </record> </filter> |
Fluentd に対する時刻の指示
前項と同じく,record_transformer Filter Plugin を使います.追加する設定としては,「renew_time_key self_time」だけで OK.
1 2 3 4 5 6 7 8 |
<filter sensor.**> type record_transformer enable_ruby renew_time_key self_time <record> self_time ${Time.now.to_i - record["self_time"].to_i } </record> </filter> |
以上です.
コメント