NewRelic Rest API と Sensu との連携


## はじめに

NewRelic Advent Calendar 12日目は、Rest API の紹介とそれを使う実例として、Sensu との連携について書きたいと思います。

最初に結論から書きます。NewRelic のWeb版UIでグラフとして見ることのできるほとんどのデータは、下記のようなコマンドで取得することができます。

```
$ curl -s -X GET 'https://api.newrelic.com/v2/servers/99999999/metrics/data.json'  -H 'X-Api-Key:xxxxxxxx' -d 'names[]=ProcessSamples/ubuntu/ruby&summarize=true&raw=false' | jq -r '.metric_data.metrics[].timeslices[].values.average_value'
7.41
```

これは、NewRelic Servers が稼働しているあるサーバで、'ruby' というプロセスが使用している CPU使用率の値になります。

今では、多くのサービスで、このような REST 形式の API を使用できますが、多くの場合、このコマンドを組み立てるのが大変だと思います。

マニュアルが不十分だったり、実際に稼働してるバージョンと一致してなかったり、IDとか属性名を調べる方法がわからなかったりします。

NewRelic では、API Explore というページがあって、上記のような `curl` のコマンドラインを、Web上で対話的に組み立てることができます。最初にこれを説明します。

## API Explore

Api Explore のトップページは、ここです。

* https://rpm.newrelic.com/api/explore

まずは、ここの Servers -> GET List というところをクリックしてみてください。次のページが表示されます。

https://rpm.newrelic.com/api/explore/servers/list

<img width="548" alt="New_Relic_API_Explorer.png" src="https://qiita-image-store.s3.amazonaws.com/0/34107/14868940-38d0-832b-7b45-67a04d122ebb.png">

下部には、このエンドポイントに送れるパラメータがフォームになっています。このフォームに値を入れると、一番上のコマンドが変化します。

さらに、この下の方には実行ボタンがあって、実際に API を実行するとどういうデータが返ってくるか確かめてみることができます。

<img width="387" alt="New_Relic_API_Explorer.png" src="https://qiita-image-store.s3.amazonaws.com/0/34107/59d84711-276e-ef0d-4f04-f75ba75637e7.png">

ここで試している https://api.newrelic.com/v2/servers.json というエンドポイントは、Servers のクライアントが稼働しているサーバ一覧を得るものです。ここでは、api-keyを入力するだけで、全サーバの情報がレスポンスに含まれています。

冒頭の例では、情報を取りたいサーバのIDが必要なのですが、このページから、それを知ることができます。

同様に、[Servers -> GET Metrics Names](https://rpm.newrelic.com/api/explore/servers/names) というページから、metricsの名前を得ることができます。

サーバのIDとメトリクス名がわかったら、[Servers -> GET Metrics Data](https://rpm.newrelic.com/api/explore/servers/data) というページで実際にデータを取得するコマンドを組み立てることができます。


<img width="374" alt="New_Relic_API_Explorer.png" src="https://qiita-image-store.s3.amazonaws.com/0/34107/21821074-3c3c-6eed-c682-c17722878efc.png">

* API Key: [5日目の記事 (NewRelic Serverの概要)](http://qiita.com/essa/items/d3efd235fe72d65b0d3d) に取得方法が書いてあります
* server_id: Servers -> GET List で取得した ID
* names: Servers -> GET Metrics Names で取得した Metrics Name
* summarize: true

これを入力すると、一番上に、この条件に合わせた `curl` のコマンドラインが表示され、一番下に実行結果が表示されます。

<img width="370" alt="New_Relic_API_Explorer.png" src="https://qiita-image-store.s3.amazonaws.com/0/34107/ddc73762-fdae-7f8a-e9d8-cce8751b3fdf.png">

あとは、この中の "average_value" という値を `jq` で取り出せば、結果を得ることができます。

```
$ curl -s -X GET 'https://api.newrelic.com/v2/servers/99999999/metrics/data.json'  -H 'X-Api-Key:xxxxxxxx' -d 'names[]=ProcessSamples/ubuntu/ruby&summarize=true&raw=false' | jq -r '.metric_data.metrics[].timeslices[].values.average_value'
7.41
```

## Sensu でメトリクス収集

さて、実際には、NewRelic のWebUIは、このアドベントカレンダーの記事でも紹介されているように、非常に使いやすく機能も豊富なので、わざわざ REST API を使うことが必要になる状況は稀かもしれません。

特に、[６日目の記事](http://qiita.com/kumatronik/items/b25313a8631e46140499) で紹介されている Insight というダッシュボードサービスは強力で、NewRelic APM のデータを二次編集したいという要望は、ほとんどの場合、この Insight で実現できると思います。

しかし、[5日目の記事](http://qiita.com/essa/items/d3efd235fe72d65b0d3d) に書いたように、NewRelic Servers のデータは今のところ、Insights のデータソースにすることができません。

デジカでは、複数のアプリケーションサーバで、[Blue Green Deployment](http://tech.degica.com/ja/2015/11/20/bluegreen/) を実施している関係もあって、サーバのメトリクスは、複数台の状況をまとめて見る必要があります。

そこで次に、Sensu との連動をどのようにやっているかを紹介したいと思います。

なお、Sensu及び、これと連動する InfulxDB/Grafana のインストールや基本的な設定については省略させていただきます。

### APM と Sensu との連動

まず、最初に、毎朝、運用担当の私が最初に見るグラフを紹介します。

<img width="301" alt="Grafana_-_Sites.png" src="https://qiita-image-store.s3.amazonaws.com/0/34107/6adb2193-c4dc-efb7-dad7-5cbd7ae40ce9.png">


APMでは、Apdex というアプリケーションのサービスレベルを端的に示す数値があります。このグラフは重要な３つのアプリケーションについて、この数値とレスポンスタイムを一枚のグラフとして表示したものです。

このグラフの線が、上と下にに固まっていれば順調で、中央に寄ってくるとレスポンスが遅いということが一目でわかります。

これは、次のようなメトリクス収集指示によって、NewRelic の情報を Sensu配下のInfuluxDBで収集し、それを grafana で表示することによって実現しています。

```json
{
  "checks": {
    "metrics_basecamp2": {
      "command": "/opt/sensu/embedded/bin/ruby /etc/sensu/sensu-community-plugins/plugins/newrelic/newrelic-metrics.rb -k :::api_keys.newrelic_api_key::: -n 'App Name'",
      "handlers": [
        "metrics"
      ],
      "subscribers": [
        "cluster-monitor"
      ],
      "type": "metric",
      "interval": 300
    }
  }
}
```

これは、[sensu/sensu-community-plugins](https://github.com/sensu/sensu-community-plugins) の NewRelic plugin を使用しています。最終的には、冒頭に紹介した REST API が使用されます。

## Servers データの収集

冒頭で紹介した、Servers の中の ruby プロセスのCPU使用率を収集する指示は下記のようなものです。

```son
{
  "checks": {
    "metrics_ruby_cpu": {
      "command": "V=`curl -s -X GET 'https://api.newrelic.com/v2/servers/5056880/metrics/data.json'  -H 'X-Api-Key::::api_keys.newrelic_api_key:::' -d 'names[]=ProcessSamples/ubuntu
/ruby&summarize=true&raw=false' | jq -r '.metric_data.metrics[].timeslices[].values.average_value'` ruby -e \"puts %Q[bpap01.newrelic.ruby_cpu #{ENV[%q[V]]} #{Time.now.to_i}]\"",
      "handlers": [
        "metrics"
      ],
      "subscribers": [
        "cluster-monitor"
      ],
      "type": "metric",
      "interval": 300
    }
  }
}
```

Sensu の metrics収集ハンドラは、メトリクスの数値に加えて、メトリクス名とタイムスタンプを付加する必要があるので、それをちょっとトリッキーなワンライナーで記述しています。

複数のサーバについて、この数値を一枚のグラフとして見ることができるようにしています。

<img width="282" alt="Grafana_-_Servers.png" src="https://qiita-image-store.s3.amazonaws.com/0/34107/23e8a592-a062-f028-a0b6-768dba0e5e57.png">

### まとめ

NewRelic が収集しているメトリクスは、[API Explore](https://rpm.newrelic.com/api/explore) によって、非常に簡単に参照することができます。

これによって、Sensu など他のモニタリングシステムと連動させることも容易にできて、重要な情報だけに絞り込んだグラフやダッシュボードを作成することができます。

モニタリングシステムの基盤がすでに構築されている場合は、この API を活用することで、NewRelic を既存のシステムと連動させることができます。

あと、英語ですが、下記のページにはREST API について入門用の情報がたくさんあります。

* [New Relic REST API (v2): Getting started | New Relic Documentation](https://docs.newrelic.com/docs/apis/rest-api-v2/requirements/new-relic-rest-api-v2-getting-started)