Ambientで413 Payload Too Largeでエラーになってしまう


(2021/5/10追記)
本件、Ambientサービス側で、1日の送信回数制限を超過した時のエラーコードを413:Payload Too Largeから429:Too Many Requestsに変更していただいたようです。ありがとうございます!

データが切れちゃう

Gravio 4からCO2データをAmbientに送って可視化する」でGravioからAmbientに毎日CO2データを送るようにしたんですが、他のPowerBIやMachinistへはちゃんと送れてるのにAmbientだけはなんだか毎日朝の8時半前くらいに途切れてしまうんです。。。



どうもおかしいと思って、アクションを実行してみたらAPIからPayload Too Largeとのエラーが返ってきているみたい。

調査してみた

リクエストのペイロードはそんなに大きくないんだがと思いつつ、少し詳しく調べてみることに。ダンプをログに出してみる。

[2021-02-22 06:53:41.487] INFO (action) [652bdc0f] Starting Action: CO2-Ambient
[2021-02-22 06:53:41.488] INFO (action) [652bdc0f] S POST /api/v2/channels/32659/data HTTP/1.1
[2021-02-22 06:53:41.488] INFO (action) [652bdc0f] S Host: ambidata.io
[2021-02-22 06:53:41.488] INFO (action) [652bdc0f] S User-Agent: Go-http-client/1.1
[2021-02-22 06:53:41.488] INFO (action) [652bdc0f] S Content-Length: 40
[2021-02-22 06:53:41.488] INFO (action) [652bdc0f] S Content-Type: application/json
[2021-02-22 06:53:41.488] INFO (action) [652bdc0f] S Accept-Encoding: gzip
[2021-02-22 06:53:41.488] INFO (action) [652bdc0f] S
[2021-02-22 06:53:41.489] INFO (action) [652bdc0f] S {"d1":414,"writeKey":"xxxxxxxxxxxxxxxx"}
[2021-02-22 06:53:41.606] INFO (action) [652bdc0f] R HTTP/1.1 413 Payload Too Large
[2021-02-22 06:53:41.606] INFO (action) [652bdc0f] R Connection: close
[2021-02-22 06:53:41.606] INFO (action) [652bdc0f] R Content-Length: 17
[2021-02-22 06:53:41.606] INFO (action) [652bdc0f] R Content-Type: text/plain; charset=utf-8
[2021-02-22 06:53:41.606] INFO (action) [652bdc0f] R Date: Mon, 22 Feb 2021 06:53:41 GMT
[2021-02-22 06:53:41.606] INFO (action) [652bdc0f] R Etag: W/"11-5Cz16jijtGT0sGOMKrOipQ"
[2021-02-22 06:53:41.606] INFO (action) [652bdc0f] R X-Powered-By: Express
[2021-02-22 06:53:41.606] INFO (action) [652bdc0f] R
[2021-02-22 06:53:41.607] INFO (action) [652bdc0f] R Payload Too Large
[2021-02-22 06:53:41.607] INFO (action) [652bdc0f] Action Ended
[2021-02-22 06:53:41.607] INFO (action) action executed: "CO2-Ambient"
[2021-02-22 06:53:42.577] INFO (action) [0dfd5214] Action Ended

リクエストのContent-Length40。中身を見ても大したデータじゃない。
だけどレスポンスは HTTP/1.1 413 Payload Too Large

HTTPレスポンスの413はリクエストペイロードが大きすぎるときとWikipedia先生もおっしゃってます。

で、仕方ないので「Ambientの諸元/制限」を調べてみることに。すると下記のように書いてある。

1チャネルあたり1日3,000件までデーターを登録できます。平均すると28.8秒に1回のペースです。

おお。今のペースは10秒に1回なので完全にオーバーペースです。しかも、

件数のカウントは0時に0クリアされます。

なるほど。毎日0時以降はチャートが描画されていたのはそのせい?
で、計算してみる。

3000件 × 10秒 = 30000秒 = 約8.3時間

ビンゴ!
というわけで、

送信間隔の調整

とりあえず28.8秒に1件と書いてあるので余裕を見て1分単位くらいにしてみる。
一番簡単な方法は、トリガーの間隔で調整。59000 を指定して、59秒以内の場合は無視されるようにする。
60秒にしないのは、60秒ちょうどでデータを受信した場合、余計に間隔があいてしまうから。

データ削除

あとは、Ambientのチャネル一覧からデータを削除して待ってみる。

諸元のところには、

チャネルデーターを削除しても1日の登録件数のカウントは0クリアされません。

と書いてあったけど、データを削除すると1分間隔で受信はじめました。

結果

無事丸一日のデータが取得できました。めでたしめでたし。

最後に

今回はチャネルあたりのデータが1種類なのでこれでいけましたが、データ1~8まで使ってる場合、別々にAPI呼んでると要注意かも。逆に、1回のAPIコールで複数種類のデータを包んで送信すれば大丈夫なのかは要検証。

あと、HTTPレスポンスに413は適切じゃないと思うので直してほしいなぁ。正しくは 429 Too Many Requestsあたりなのかなぁ。だったらもっと早く気付けたはず。^^;

参考