New Relic Synthetics: Web API のテストもできるよ

Happy Holidays! とうとう最終日 Advent Calendar 25日目。

デジカの宮澤です。19日の[New Relic Synthetics: selenium で画面遷移も楽々チェック。スクリーンショットも撮れるよ。](http://qiita.com/kumatronik/items/ce61b91d3609f409eb6b) に続き、New Relic Synthetics 4回目。API Test  を紹介したいと思います。

これも有料機能ですが、2週間無料で利用できるので、是非試してみてください。API Test も設定方法や結果表示画面は基本的に Ping モニターと同じなので、共通部分は省略していきます。気になる方は、[New Relic Synthetics: 無料のPingモニターでサイトの稼働状況をらくらくチェック](http://qiita.com/kumatronik/items/c542feac77b08c3ca646) をご覧ください。

# API Test とは

その名の通り、API のテストに特化した機能です。雰囲気としては、前回紹介した、Scripted Browser と同じです。専用のスクリプトを書いて、それを定期的に実行するというものです。API のテストに特化した変数などが用意されている点が違います。

New Relic Synthetics では、HTTP リクエストの送信と結果の検証に [http-request}(https://github.com/request/request) モジュールを使っています。それらは、`$http` オブジェクトを使って利用します。

これも Scripted Browser と同じで、JS ベースでスクリプトを書いていきます。

# 使い方

これまでのチェック方法(Ping モニターや Scripted Browser)と同様に、テスト名、実行地域、実行頻度、アラート通知の設定を行っていきます。詳しくは、[New Relic Synthetics: 無料のPingモニターでサイトの稼働状況をらくらくチェック](http://qiita.com/kumatronik/items/c542feac77b08c3ca646) をご覧ください。（なんか最近、地域の設定（Select monitoring locations）が表示されないのは僕だけだろうか。何回か画面更新してたら出てきた）

![synthetics_apitest_01.png](https://qiita-image-store.s3.amazonaws.com/0/46003/df91e185-e1e5-a884-d234-fa0550c3a1c1.png)

設定できたら、"Next: Write your script" ボタンを押して、スクリプト作成画面に移動します。

![synthetics_apitest_02.png](https://qiita-image-store.s3.amazonaws.com/0/46003/f8bb757f-63bd-a61d-1b27-f2f6ad36b0e7.png)

これは、前回の Scripted Browser で見たのとまったく同じ画面ですね。（もちろん中身のスクリプトは違うけど）

この状態で、徐に "Validate" ボタンを押してみます。

![synthetics_apitest_03.png](https://qiita-image-store.s3.amazonaws.com/0/46003/247e09c8-6131-c77c-a78e-d3ba76897098.png)

実行結果とレスポンスが確認できますね。

次はあえて、間違えてみます。以下の様にエラーは表示されます。だいたい Scripted Browser と同じ感じですね。

![synthetics_apitest_04.png](https://qiita-image-store.s3.amazonaws.com/0/46003/b603924d-14f6-1fb3-0f81-1f3708ccdc7c.png)


## サンプルスクリプト

上記で試したサンプルのスクリプトは以下のようになっています。参考まで。

```js
/**
 * Feel free to explore, or check out the full documentation
 * https://docs.newrelic.com/docs/synthetics/new-relic-synthetics/scripting-monitors/writing-api-tests
 * for details.
 */

var assert = require('assert');

$http.post('http://httpbin.org/post',
  // Post data
  {
    json: {
      widgetType: 'gear',
      widgetCount: 10
    }
  },
  // Callback
  function (err, response, body) {
    assert.equal(response.statusCode, 200, 'Expected a 200 OK response');

    console.log('Response:', body.json);
    assert.equal(body.json.widgetType, 'gear', 'Expected a gear widget type');
    assert.equal(body.json.widgetCount, 10, 'Expected 10 widgets');
  }
);
```


## Komoju で試して見る

サンプルの説明だけだと、あまり書く事ないので、今回はちょうど別の Advent Calendarで弊社の決済サービス[Komoju](https://komoju.jp/) のAPIの使い方「[決済 API Komoju を使って決済してみる](http://tech.degica.com/ja/2015/12/17/introducing-komoju-api/)」を紹介していたので、それを使ってテストをしてみたいと思います。

スクリプト

```js
var assert = require('assert');

var data = {
  "amount":1000,
  "currency":"JPY",
  "payment_details[type]":"credit_card",
  "payment_details[family_name]":"Yamada",
  "payment_details[given_name]":"Taro",
  "payment_details[month]":"01",
  "payment_details[year]":"2016",
  "payment_details[number]":"4111111111111111",
  "payment_details[verification_value]":123
};

var options = {
    uri: 'https://sandbox.komoju.jp/api/v1/payments.json',
    auth : { user: "[your_secret_key]"},
    form: data
};

$http.post(options,
  function (err, response, body) {
    assert.equal(response.statusCode, 200, 'Expected a 200 OK response');

    console.log('Response:', body);
    var json = JSON.parse(body);
    assert.equal(json.status, 'captured', 'Payment is captured');
    assert.equal(json.total , 1080, 'Total includes tax');
  }
);
```

※ [your_secret_key] は各自のシークレットキーに置き換えてください

実行(validate)すると、以下のように結果が返ってきます。大丈夫そうですね。

![synthetics_apitest_05.png](https://qiita-image-store.s3.amazonaws.com/0/46003/03d0bcef-3abc-ccd5-64d5-f333d023c868.png)

## スクリプトの参考情報

スクリプトを書く際は、以下の情報を参考にするといいと思います。
- [Request - Simplified HTTP client](https://github.com/request/request)
- [Write API tests](https://docs.newrelic.com/docs/synthetics/new-relic-synthetics/scripting-monitors/write-api-tests)

また、Synthetics の制限として、スクリプトの実行時間が３分を越えるものは、強制的にエラーとなるようです。

# 結果表示

結果画面(Overview ページ、Results ページ、Resources ページ）は Simple Browser と一緒なので、説明は省略します。Results ページの詳細ページの表示は一部異なりますので、ここでは違いを紹介します。

今日は各画面をスクリーンショットを乗っけていきます。スクリーンショットは、上記の Komoju API の実行結果のものです。

## 概要

![synthetics_apitest_komoju_1.png](https://qiita-image-store.s3.amazonaws.com/0/46003/98f8420c-aaef-6dd6-636e-1a8c6465ad37.png)

## 結果一覧

このモニターのチェック結果の一覧です。処理時間、レスポンスタイム、最新など様々な条件で並び替えができます。任意のチェック結果を選択すると、次の詳細を表示します。

![synthetics_apitest_komoju_2.png](https://qiita-image-store.s3.amazonaws.com/0/46003/c021b5e3-b6c2-2aab-22e1-28f23adaf8f8.png)

## 特定のチェック結果

![synthetics_apitest_komoju_3.png](https://qiita-image-store.s3.amazonaws.com/0/46003/65f1cea4-6682-84e5-be8c-d6ab6e61854f.png)

### 上記のチェック結果で、Script Log を選択したとき

ここでは、上記のサンプルで、`console.log` で指定した内容が出力されているのがわかります。

![synthetics_apitest_komoju_4.png](https://qiita-image-store.s3.amazonaws.com/0/46003/651182ed-1bb7-075b-c0b7-1671705c60c4.png)

## リソースページ

![synthetics_apitest_komoju_5.png](https://qiita-image-store.s3.amazonaws.com/0/46003/d52bca57-1625-b1f8-90ea-3fac2f76262e.png)


## 特定のリソースの詳細

各種 HTTP リクエスト、レスポンス、処理時間の内訳がみれます。

![synthetics_apitest_komoju_6.png](https://qiita-image-store.s3.amazonaws.com/0/46003/8c508df4-0da3-6e6a-0f1f-cef716058904.png)


# さいごに

どうでしたでしょうか？4回にわたり New Relic Synthetics の各機能を紹介してきました。Web のテストが楽になる感じでしょうか？

そういえば、Selenium 関連だと、[Selenium/Appium Advent Calendar 2015](http://qiita.com/advent-calendar/2015/selenium) があるようなので、selenium 自体に興味のある方は、そちらもみるとなんか知見が得られるかも。

今回、Komoju のチェックやってて思ったけど、あれは Webhook がいろんなところに仕込まれているんだけど、Webhook のチェックは今の Synthetics ではできないなぁ。それもチェックできるともっと便利なんだけどね。

ではでは、Synthetics を活用して、快適なシステム運用を!