rollbarで通知をフィルタリングする

# 背景

見る必要のないエラーがitemsにいっぱい出てくるなぁ……って思ったら設定します。
私の場合はローカルで開発・テストしてるときに発生するエラーまで載ってしまっていたので設定しました。
以下、そのつもりで例を書いていきます。

# 仕組み

通知する必要のないitemsの条件をjson形式で記述し、[Custom Fingerprinting](https://rollbar.com/lagless/lagless-reminder/settings/custom_fingerprinting/)のページの`Custom Fingerprinting Rules`に記入して保存すればOKです。

参考：[Rollbarでbotが出すエラーを無視する](https://wat-aro.hatenablog.com/entry/2016/10/19/223358)

# 書式

後述のドキュメントページからサンプルを引用します。

```json
[
  {
    "condition": {
      "path": "body.trace.exception.class",
      "in": ["EOFError", "Errno::ECONNREFUSED", "Errno::ETIMEDOUT"]
    },
    "fingerprint": "connection-error",
    "title": "Connection error"
  },
  {
    "condition": {"all": [
      {"path": "body.trace.exception.class", "eq": "TimeoutError"},
      {"path": "body.trace.frames.*.filename", "contains": "payments"}
    ]},
    "fingerprint": "payments-timeout-error",
    "title": "Timeout error in payments code"
  },
  {
    "condition": {
      "path": "body.trace.exception.class",
      "eq": "ActionController::RoutingError"
    },
    "fingerprint": "{{ default_fingerprint }}-{{ context }}",
    "title": "{{default_title }} in {{ context }}"
  }
]
```

ドキュメントは[Custom Fingerprinting Rules](https://docs.rollbar.com/docs/custom-grouping)に記載されています。
かいつまんで書くとこんな感じ。

- jsonには、condition, fingerprint, titleの3つのプロパティを記載する。
    - fingerprintは任意
    - titleは任意
    - conditionにはpathと、「pathの値」が満たす条件を記載する。

`path`とは、rollbarが送信するoccurrenceが持つraw jsonの中のプロパティを示す値です。
実際にraw jsonを見てみる方が早いと思います。
itemsから特定のitemをクリックし、`Occurrences`タブを開き、表示されているOccurrenceの`Timestamp`をクリックします。
Occurrenceのページが開くので、下の方にスクロールしてください。`Raw JSON`があるかと思います。
こんな感じになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336249/1f2bf5fb-ffc8-dd9f-df6c-f94fd8fa57df.png)
これがずっと下まで続きます。
たとえば、画像に写っている`"subtype": "DOMContentLoaded"`の通知を全て無視したい場合は（そんな大雑把なフィルタを設定することはありえないでしょうけど）先程の`path`に`body.telemetry.body.subtype`みたいな値を設定することになるわけですね。
実際にはtelemetryは配列なのでこれだと設定できませんけど。
とりあえずイメージとしてそんな感じ。
それで、pathの値と等しいことが条件であれば`eq`プロパティを、in条件を指定したければ`in`プロパティを`path`プロパティと兄弟の階層に記載するということですね。
改めて上記のサンプルを読んでみると、どういう書式でフィルタリングを定義すれば良いのか分かってきたのではないでしょうか？

# 実践

開発時のテストはまずlocalhostで行うので、とりあえずlocalhostで発生したoccurrenceだけ除外します。
`Raw JSON`を確認してみると、`path`は`request.url`のようです。
私は5500ポートをよく使うので、`127.0.0.1:5500`と`localhost:5500/`を除外しましょう。
出来上がったものがこちらになります。

```json
[
  {
    "title": "Local error",
    "fingerprint": "local-error",
    "condition": {
        "any": [
            {
                "path": "request.url",
                "contains": "127.0.0.1"
            },
            {
                "path": "request.url",
                "contains": "localhost"
            }
        ]
    }
  }
]
```

最後は`Or test (without saving) against this occurrence ID:`という欄に、実際に無視したいOccerrenceのIDを入力してみて、記入したjsonの内容でフィルタに引っかかるかどうかをテストします。
Occurrence IDは`Raw JSON`に載っている`uuid`ではなく、OccurrenceのページのURLから取得します（私は勘違いしました）。
有効でないIDを入力した時のエラーメッセージ`You can find it in a url like https://rollbar.com/MyCompany/Website/items/123/occurrences/456/ (In this example, the occurrence ID is 456)`からもそのことを確認できます。
有効なIDを入力し、晴れてjsonの条件で引っかかってくれれば成功の旨の表示が出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336249/30dc0730-5f69-6920-97ca-6f27fb388e7b.png)
jsonを保存して終わりです。めでたしめでたし。

# 仕上げ

これで終わり……と思ったらまだでした。詰めが甘かった。
以上の設定はあくまでもユーザ定義のfingerprintを作成するための設定です。要するに、この条件に当てはまったOccurrenceはjsonの中に記入した`fingerprint`の名前でまとめるよ、という設定。
最後にそのまとめたグループをMutedに設定する必要があります。
そのため意図的にエラーを起こし、`fingerprint`名のOccurrenceをrollbarに載せましょう。
itemsに設定したfingerprintのものが出ているはずなので、チェックボックスで選んでGroupへとMerge。
そのグループについては`Mute`する、という設定を行ってようやく通知がオフになります。お疲れ様でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336249/6665dd13-ecd6-a787-834f-92910da65b45.png)

# おまけ：chatworkに通知するのもやめる

上記のフィルタリングと、chatwork等の外部サービスへのnotificationのフィルタリングは別物です。
[Settings](https://rollbar.com/lagless/lagless-reminder/settings/general/)から[https://rollbar.com/lagless/lagless-reminder/settings/notifications/](Notifications)を開いて設定を変更しましょう。
私の場合はwebhookでcloud functionsにJSONを送信し、そこからchatworkに通知するという流れでrollbarの通知を出していました。
そこで、上記で設定したfingerprintのlevelを最低の「Debug」あたりにしておき、webhookのJSON送出のlevelをDebugより一つ上のinfo以上という設定にしておくと、chatworkへの通知等は送られなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336249/de4a579d-dadf-7995-aef3-f82f218c3d3d.png)
設定が終わるとこんな感じ。