New RelicのAPMエージェントを使ってエラーのユーザーへの影響度合いを計測してみた

# 概要
　New RelicのErrors Inboxは、カスタム属性を活用することでエラーの影響を受けているユニークユーザー数を簡単に確認することが可能です。またその値を元にしたユーザーへの影響度を基準としてエラーグループをランキング形式で表示してくれるため、対応の優先順位付けが容易になります。
　今回のアップデートではこれまで使用してきたカスタム属性を設定するAPIを使用せずにユーザーを識別するIDを設定する方法が提供されました。

:::note info
このアップデートの詳細はこちら。
[New Relic アップデート(2023年3月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202303 "New Relic アップデート(2023年3月)")
[New Relic アップデート一覧](https://newrelic.com/jp/blog/nerdlog/new-relic-update "New Relic アップデート一覧")
:::

では実際にやっていきましょう。

# 設定手順
　Javaアプリケーションを例に紹介します。ユーザーを識別するIDの設定は非常に簡単です。
まずはドキュメントを確認していきましょう。

```java:Java
setUserId​(java.lang.String userId)
```
この関数にユーザーを識別するIDを設定することでTransactionイベントにカスタム属性``enduser.id``が追加される仕様です。

https://docs.newrelic.com/docs/apm/agents/java-agent/api-guides/guide-using-java-agent-api/#transactions

http://newrelic.github.io/java-agent-api/javadoc/index.html?com/newrelic/api/agent/NewRelic.html

実際にこの関数を使ってみましょう。
```java:JavaでsetUserIdを使用する
import com.newrelic.api.agent.NewRelic;

@Controller
public class XXXXXXXXXController {
    @RequestMapping("/XXXXXXXXX")
    public String xxxxxxxxx(...) {
    ... ( コントローラのロジック )
    NewRelic.setUserId​(userid);
    ...
    }
}
```
　これでTransactionイベントにカスタム属性``enduser.id``が設定されます。そしてこのトランザクションの中でエラーが発生した場合には、UserImpactedとしてユニークユーザー数がカウントされるようになります。

# 確認
　それでは設定されていることを確認していきましょう。
## カスタム属性enduser.idがTransactionイベントに設定されている
　まずは、Transactionイベントに``enduser.id``が設定されていることを確認します。アプリケーション名``appName``とカスタム属性``enduser.id``でグループ化してトランザクションの数を取得するNRQLを使っていきます。
```:NRQL
SELECT count(*) 
FROM Transaction 
FACET appName, enduser.id SINCE 1 day ago
```
![NRQL_enduserid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043202/b4a6ca4c-07ec-f9a5-02d6-12c96ac20f02.png)
　``Enduser.Id``の列に今回設定したuseridが設定されていることが確認できました。
## Errors（errors inbox）のTriageタブでUserImpactを確認
　それではエラーが発生した際のユーザーへの影響度（UserImpact）がErrors（errors inbox）のTriageタブに表示されていることを確認していきましょう。
　New Relic APMの画面でメニューからErrors（errors inbox）を開きます。
![UserImpact_APM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043202/144aa78e-7a91-82c0-82d0-2c1af78314c7.png)
　エラーグループの一覧のUsersの列にUserImpactが表示されています（赤枠）。エラーの詳細画面で属性値も確認してみましょう。
![user impact_detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043202/7d093616-711f-e959-6c79-cf06a5056581.png)
　左のパネルには**Occurrences**にエラーが発生した件数を時系列のチャートで表示しています。そしてそのチャート上で**Users Impacted**がユニークユーザー数を表現しています。
　右のパネルの**Occurrencesタブ**でエラーに関連するスタックトレースや分散トレーシング、ログ、属性値が確認できます。今回追加したカスタム属性``enduser.id``も**Attributes**の一覧で設定された値が確認できます。
## エラーの影響を受けるユーザーの数をNRQLで取得
　エラーグループの影響を受けるユーザーの数は、``newrelic.error.group.userImpact``という名称のメトリックデータとして記録されます。
```:UserImpact を取得するNRQL
SELECT uniqueCount(newrelic.error.group.userImpact) 
FROM Metric 
WHERE metricName='newrelic.error.group.userImpact'
```
　 ``newrelic.error.group.userImpact``は、Errorsでグループ化されたエラーグループの``error.group.guid ``とエラーが検出しているAPMの``entity.guid``でグループ化できます。
![NRQL-UserImpact.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043202/eaba116b-026e-0f95-2771-d6fd0c0d0d09.png)
　このNRQLを活用するとエラーの影響を受けるユーザーの数に閾値を設定してアラートをトリガーすることが可能です。
# まとめ
　New RelicのErrors Inboxの最新アップデートにより、ユーザーへのエラーの影響度を簡易に把握できるようになりました。Javaアプリケーションでの設定手順を紹介しましたが、APM（Go、 .Net、 Node.js、 Python、 Ruby）、Browser、 MobileでもsetUserの関数から``enduser.id``の設定が可能です。[こちらのドキュメント](https://docs.newrelic.com/jp/docs/errors-inbox/error-users-impacted/#set-users)で詳細が確認できます。ぜひアプリケーションの環境に合わせてご利用ください。

https://docs.newrelic.com/jp/docs/errors-inbox/error-users-impacted/#set-users

:::note info
このアップデートの詳細はこちら。
[New Relic アップデート(2023年3月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202303 "New Relic アップデート(2023年3月)")
[New Relic アップデート一覧](https://newrelic.com/jp/blog/nerdlog/new-relic-update "New Relic アップデート一覧")
:::