New Relic の Synthetic Monitoring (Scripted API) を使って RSS の情報を収集

　New Relic の Synthetic Monitoring の一つであるScripted APIを使用して RSS で公開されている情報を New Relic に収集する方法を紹介します。利用している SaaS の障害情報を New Relic にまとめておくことができるので増え続ける SaaS の業務アプリの状態をまとめて管理するといった活用方法が考えられます。

# 今回のポイント
この記事で紹介しているポイントは、次の２つです。
1. **Scripted API の使い方がわかる**
 スクリプトの作成方法や参考になるサンプルの情報を紹介します。
2. **実行したスクリプトの結果を New Relic に保存する方法がわかる**
 スクリプトの実行結果を New Relic のデータベースに保存して、NRQL でそのデータを確認する方法を紹介します。
:::note info
最新のアップデートの詳細はこちら
[New Relic アップデート一覧
](https://newrelic.com/jp/blog/nerdlog/new-relic-update  "New Relic アップデート一覧")
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::

# 概要
　今回は、New Relic のステータスページ( https://status.newrelic.com )の RSS フィードから情報を取得して、タイトルや公開日時等の情報を Synthetic Monitoring の実行結果に付与して保存していきます。

# 設定手順
## Synthetic Monitoring の実行情報を設定
　New Relic のメニューから Synthetic monitoring を開いて Create a monitor を選択するとタイプを選択する画面が表示されます。Scripted API の機能を使用するので **Endpoint availability** を選択します。 
![Endpoint availability.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043202/12350a48-b5c3-a4d9-e02f-0fe5a3ec46b2.png)

　次にモニターの名前と実行間隔を設定します。今回は **NewRelic-StatusRSS** という名前のモニターを**30分間隔**で実行するように設定しています。
![name_etc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043202/498a3897-0d6d-aa23-bf01-2f1399b56c1a.png)

　最後に実行するロケーションを設定します。RSSの情報を取得するのが目的なので1拠点のみ選択して実行します。
![location.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043202/efae62cc-04e5-e078-ff3a-dfc530dc11c6.png)

## 実行するスクリプトを設定
　ここから実際に実行するスクリプトを設定していきます。実行する拠点を選択するとこのような画面が表示されてスクリプトの設定ができるようになります。
![script_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043202/f30345f1-9727-773c-2d6b-7346d803bbe1.png)

下記が今回使用するスクリプトです。
 
```javascript:
var parseString = require('xml2js').parseString;
 
// New Relic のステータスページのRSSを取得
$http.get('https://status.newrelic.com/history.rss', function(err, response, body) {
  parseString(body, function(err, result){
    // 取得した結果をパースして、最新の情報を取得
    var latestIncident = result.rss.channel[0].item[0];
    
    // 取得した情報を属性に設定
    $util.insights.set('IncidentTitle', latestIncident.title[0]);
    $util.insights.set('Description', latestIncident.description[0]);
    $util.insights.set('Date', latestIncident.pubDate[0]);
  });
});
```
このスクリプトでは下記4つの処理を実行しています。
1. **New Relic のステータスページのRSSから情報をXMLで取得**
1. **取得した XML を JSON にパース**
xml2jsを使用してパースしていますが、この他にも使用できるサードパーティのモジュールが用意されています。[こちらのドキュメント](https://docs.newrelic.com/docs/synthetics/synthetic-monitoring/using-monitors/manage-monitor-runtimes/#Chrome100)を確認してください。
1. **変換した結果の先頭のデータを取得（このケースでは先頭が最新値）**
1. **最新値のタイトル等をKey-Valueの形式でモニターの実行結果の属性に設定**
$util.insightsを使用するとモニターの結果に付加するカスタム属性を制御することができます。詳細については[こちらのドキュメント](https://docs.newrelic.com/jp/docs/synthetics/synthetic-monitoring/scripting-monitors/add-custom-attributes-synthetic-monitoring-data/)を確認してください。

　**Validate** を実行して成功することが確認できたら保存しましょう。これで設定は完了です。
![Validate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043202/e2681f40-4964-3600-b142-d398c2483640.png)

## 実行結果を確認する
　取り込んだ実行結果を確認していきます。Scripted API の結果は **SyntheticCheck** のEventに格納されているため、そこからNRQLを使ってデータを取得します。今回のスクリプトは実行毎に最新の値を取得し続けるため、同じ値が複数保存させています。同じデータをまとめるためにタイトルと配信日時でグループ化して取得します。追加した属性は、custom.* の形式で属性名が設定されるため、設定した Key に合わせて変更してください。

 ```SQL:NRQL
FROM SyntheticCheck 
SELECT latest(custom.Description) 
FACET custom.Date, custom.Incident 
 ```

![クエリ結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043202/5caa4a67-a6c6-f356-00cf-a15c043845be.png)

# 最後に
　New Relic の Scripted API でどういったことができるのかわからない場合にはサンプルが用意されているのでぜひ参考にしてみてください。

https://newrelic.github.io/quickstarts-synthetics-library/

# その他
New Relicでは、**新しい機能やその活用方法**について、QiitaやXで発信しています！
**無料でアカウント作成**も可能なのでぜひお試しください！

:::note info
New Relic株式会社の[X(旧Twitter)](https://x.com/NewRelicJapan) や [Qiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::