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

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

# データが切れちゃう

「[Gravio 4からCO2データをAmbientに送って可視化する](https://qiita.com/zrock/items/8b78ad085025bf5e760a)」でGravioからAmbientに毎日CO2データを送るようにしたんですが、他のPowerBIやMachinistへはちゃんと送れてるのにAmbientだけはなんだか毎日朝の8時半前くらいに途切れてしまうんです。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/ca44c870-01eb-34ed-78fb-39de4ec6bddc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/642d9d0a-9540-897e-bcf2-1aee6a760a6d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/65942ded-7d37-0740-9245-3c77c7138779.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/1341945f-ef09-a3d5-51d6-cb97ff1a62b4.png)

# 調査してみた

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/adefcac9-0d82-3c51-7c4c-886367841733.png)

```
[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-Length`は`40`。中身を見ても大したデータじゃない。
だけどレスポンスは `HTTP/1.1 413 Payload Too Large`。

HTTPレスポンスの413はリクエストペイロードが大きすぎるときと[Wikipedia先生](https://ja.wikipedia.org/wiki/HTTP%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89)もおっしゃってます。

で、仕方ないので「[Ambientの諸元/制限](https://ambidata.io/refs/spec/)」を調べてみることに。すると下記のように書いてある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/3dc57f91-f42a-4b4c-0414-36aabd7b57bb.png)

> 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秒ちょうどでデータを受信した場合、余計に間隔があいてしまうから。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/71162d8b-cb23-3c6f-034a-b8eb55f71973.png)

# データ削除

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/8514ad70-9b8d-b31b-759e-7033bca757a0.png)

諸元のところには、

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/e5766417-c7d5-67af-162b-178a2ca296b5.png)

# 結果
無事丸一日のデータが取得できました。めでたしめでたし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/72010a8d-66fe-fd34-837d-65a2704067c3.png)


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

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

# 参考
* [RFC 2616/413 Request Entity Too Large](https://tools.ietf.org/html/rfc2616#section-10.4.14)