[PoC]New Relicでエラーを検知したらJiraチケットを作る

# はじめに
- 基本的に無料で試せます。
- 間違っている部分があれば教えてください。
- 「もっとこうやるといいよ」や「こんなのもあるよ」と教えてもらえると喜びます

# 今回やること
アプリケーションエラー発生 -> New Relicが検知 -> Jiraチケット作成

もう少し詳しく
1. New Relic APMでエラー発生
1. New Relic Alert Conditionがトリガーになって
1. New Relic Workflowが起動 -> Webhook（HTTPリクエスト）を自動で発行
1. Jira チケット作成！

## 制限事項
- 	Jira Softwareの無料プランの都合でユーザー数10人
- 	ストレージは2GBまで
- 	New Relicの無料プランの都合でデータ保持期間（最大13日）
- 	通知数も制限があるみたい
PoCなので一旦OK

# 手順
### TL;DR
4ステップ
1. JiraのアカウントとAPIトークン作成
1. Spring Bootプロジェクト作成
1. New Relicのアカウント作成とアプリ連携
1. New RelicとJira連携

## Jira側の設定
### Jira Software アカウント登録（無料）
- https://www.atlassian.com/ja/software/jira にアクセス
- 適当なメールアドレスでサインアップ
- 「Jira Software」の「Free」プランを選ぶ（最大10ユーザー）
- プロジェクト作成（例：名前 PoC, key POC）
- 作成されたらURLを確認（例：https://your-domain.atlassian.net）
（ブラウザのURLに書いてる）
このURLが Jira APIのベースURL（Webhook POST先）になります！
### JiraのAPIトークン作成
- 以下のURLにアクセス（Atlassian公式）
https://id.atlassian.com/manage-profile/security/api-tokens
- 「APIトークンを作成」をクリック
- ラベルに NewRelicPoC などと入力して作成
- トークン期限は適当に入力
- トークンが表示されるので、必ずコピーして控えておく
:::note warn
 後から再表示できません
:::

## 監視するSpring Bootアプリケーション作成
### Springアプリケーション作成
https://start.spring.io/

### アクセスしたらエラーを吐くようにする
1.build.gradleにnewrelicを追加
``` gradle
implementation 'com.newrelic.agent.java:newrelic-api:8.10.0'
```

2.com.example.demoディレクトリにTestController.javaを作る
``` java
// TestController.java
package com.example.demo;

import com.newrelic.api.agent.NewRelic;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @GetMapping("/test-error")
    public String testError() {
        try {
            throw new RuntimeException("PoCビジネスエラー発生！");
        } catch (Exception e) {
            NewRelic.noticeError(e); // New Relic に通知
            throw e;
        }
    }
}
```

### JARファイル作成

```
./gradlew bootRun         # 起動
./gradlew bootJar         # JARファイルを生成
```

## New Relic側の設定
### New Relic アカウント登録（無料）
- https://newrelic.com/signup にアクセス
- メールアドレス・パスワードを登録
- 「Standard（無料プラン）」を選択
国：Japan でOK（電話番号は任意）

### アプリ→New Relic連携
監視するアプリケーションの設定
今回はSpring bootアプリケーションにします。
手順はそれほど変わらないので作りたいアプリに応じて進めてください。
基本は画面ぽちぽちするだけなので読み飛ばしてもOK。APM画面まできたら次のステップへ行ってください。

- Tell us about your stackで「Java」を選択し、Nextボタンをクリック
- Instrument your hostsはサーバー監視。今回はスキップする
Don't have access to hostをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/67e5a04b-4a59-4cea-bc3a-4ab6e837b4f8.png)

- Select instrumentation method
どの方法でJava AgentをSpring Bootアプリに導入するか
「On a host」 を選んで、ローカルで Spring Boot アプリに Java Agent を直接読み込ませる方式にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/fc12b946-2cbe-4ada-97e6-6d25fdf4eb52.png)
- Enter your credentials
license keyやuser key
両方Create a new keyを選択し、キーを控えておく
- Tell us about your application
好みで選択してください。私の環境はMacなのでLinuxを選択。
Choose your frameworkはSpring Bootにする
- Choose your download option
Java Agentのダウンロードするステップ。
指示通りでOK。
- Finish your installation (Spring Boot)
表示されているjavaコマンドをターミナルで実行
:::note warn
>java -javaagent:/full/path/to/newrelic.jar -jar app.jar

- /full/path/to/newrelic.jarにはnewrelic.jarフルパスを入れること
手順通りなら/opt/newrelic/newrelic.jarになるはず
- app.jarはちゃんと自分の作ったアプリのjar名を指定すること
:::

- Optional: Connect logs and infrastructure
スキップ
- Optional: Connect your repository
スキップ
- Test the connection
```
java -javaagent:/opt/newrelic/newrelic.jar -jar demo-0.0.1-SNAPSHOT.jar
```
などでアプリを起動した状態でテストする。
Infrastructure agentやOn-host logsは、今は無視してOK。
（オプションスキップしてるので）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/f2a9f3bd-4f65-4a71-800e-e46fbb19ab59.png)

## アプリ→New Relic連携確認
New Relic側でエラーが出ているか確認する
### アプリを起動させてアクセスする
```
curl http://localhost:8080/test-error
```
New RelicのAPM&Services Errorsでこんな風に出ていたらOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/541232c0-3653-4024-8be1-fd89b585ae8a.png)

## New RelicとJira連携
New Relicでエラー検知 -> Jiraでチケット作成するようにする
### アラートポリシーの作成
- 左メニューのAlerts選択 -> Create alert condition
- Use guide mode
- Tell us where to look
デフォルトでOK
- Tell us what to watch
    - Select the entities to watch (max 20)
    自分の作ったアプリを選択
    - Select a metric to monitor
    Error rateを選択
    クエリはこんな感じにしておく
``` SQL
SELECT percentage(count(*), WHERE error IS true) AS 'Error rate (%)' FROM Transaction
```

- Set thresholds
こんな感じにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/be1fdd0c-896c-40b7-90ab-f3af920289ff.png)
- Add details
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/9178c1ac-f7bd-4d95-b0fa-af08b8570b8a.png)

- 動作確認
何回かtest-errorにアクセスして、こんな感じでIncedentsが上がってくればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/19edcae0-6e0e-421e-8220-94a16e292a34.png)

### WebhooksでJira連携設定
- Alerts Workflowsを開いて「+ Create a workflow」ボタンをクリック
- Configure your workflow
適当なワークフロー名
- Filter data
Basicフィルターで、次のように設定：
    - Policy：自分が作ったアラートポリシー
    他は空欄でOK（必要に応じてPriorityなど設定可能）
- Notify：Jira
    - Name：自由
    - URL：Jira側の設定の時に確認したベースURL
    - Username：Jiraアカウント作成時のメールアドレス
    - API token：作成したAPIトークン
    - Two-way integration：オン
Test connectionが成功すればOK
- Project：作っておいたJiraプロジェクト
- 他はお好みでOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/bbdd6abe-01d6-4016-906e-7b69626b3623.png)

 test workflowでJiraにチケットができていればOK
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/8f99fdaa-a1b2-4630-b236-8950326ce675.png)

## 最終動作確認
test-errorにアクセス

:::note warn
openのインシデントがあったらcloseしておく。
New Relicでは既存のインシデントが開いている間は、同じ条件の新しいアラートは発火しません。
:::

```
curl http://localhost:8080/test-error
```
Incidentが発生し・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/04afdb9a-d4da-4922-8aba-267cfd6e898e.png)

workflowが回って・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/27a001dc-b576-4b06-b641-1650edd2a925.png)

Jiraチケット作成！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/0d1e3334-e0d5-4c12-b750-1e64ed05ac5e.png)


#### Tips
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/6f876c88-e0d2-4348-b753-e966cf25f084.png)

Notify Jira右側の三点リーダー Notify when...をこんな風にしとくと
New RelicでincidentをcloseするとJiraチケットもcloseされる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/b3b80704-7faf-49bb-a376-5e0900ef66c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/900752/b10350ab-b02e-43a2-8593-410df7e9559d.png)