NewRelicのグラフをMackerelで表示する

アプリケーションのパフォーマンス監視にNewRelicを利用してきたのですが、
サーバ監視を効率化するためMackerelも導入しました。

2つのツールをそれぞれ見るのは不便なので、NewRelicのグラフをMackerelにつくってみました。

# 平均のレスポンス速度のグラフをつくる

NewRelicから以下のような感じで取得できます。

参考:NewRelicのAPIでメトリックを取得
https://docs.newrelic.com/docs/apis/rest-api-v2/application-examples-v2/obtain-web-transaction-time-data-v2

```shell-session:NewRelicからレスポンス速度をとる
curl -X GET 'https://api.newrelic.com/v2/applications/${APPID}/metrics/data.json' \ 
       -H 'X-Api-Key:${APIKEY}' -i \ 
       -d 'names[]=WebTransactionTotalTime&values[]=average_response_time' 
```

```json:NewRelicからでてくるJson
{
  "metric_data": {
    "from": "2017-09-26T05:42:53+00:00",
    "to": "2017-09-26T06:12:53+00:00",
    "metrics_not_found": [],
    "metrics_found": [
      "WebTransactionTotalTime"
    ],
    "metrics": [
      {
        "name": "WebTransactionTotalTime",
        "timeslices": [
          {
            "from": "2017-09-26T05:41:00+00:00",
            "to": "2017-09-26T05:42:00+00:00",
            "values": {
              "average_response_time": 198
            }
          },
          {
            "from": "2017-09-26T05:42:00+00:00",
            "to": "2017-09-26T05:43:00+00:00",
            "values": {
              "average_response_time": 201
            }
          },
以下略
```

で、このJsonをMackerel用に整形してMackerelAPIにポストすればグラフができます。
NewRelicの日時をエポック秒に変換する必要があります。

参考:Mackerelにメトリックを投稿するAPI
https://mackerel.io/ja/api-docs/entry/host-metrics#post

```json:こんな感じに整形する
[
  {
    "hostId": "マカレルのホストのID",
    "name": "custom.newrelic_restime.BookLive",
    "time": 1506404760,
    "value": 210
  },
  {
    "hostId": "マカレルのホストのID",
    "name": "custom.newrelic_restime.BookLive",
    "time": 1506404820,
    "value": 216
  },
以下略
```
できた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143303/aecb3e0a-a9f2-9c1f-39de-ca226561ae7f.png)

# でも作りたいグラフはこれじゃない・・・

NewRelicでみるとDBや外部通信ごとにグラフが積みあがって見れます。これをMackerelで見たい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143303/b729398b-933f-2b37-8285-6f346f55090c.png)


ここの下の方をみると頑張って取得して計算しないといけないらしい・・・
https://docs.newrelic.com/docs/apis/rest-api-v2/application-examples-v2/obtain-web-transaction-time-data-v2

```shell-session:必要なやつを全部取る（環境にあわせて${DBTYPE}を書き換えて）
curl -X GET 'https://api.newrelic.com/v2/applications/${APPID}/metrics/data.json' \ 
       -H 'X-Api-Key:${APIKEY}' -i \ 
       -d 'names[]=Datastore/${DBTYPE}/allWeb
           &names[]=Datastore/${DBTYPE}/allWeb
           &names[]=Datastore/${DBTYPE}/allWeb
           &names[]=External/allWeb
           &names[]=WebTransactionTotalTime
           &names[]=HttpDispatcher
           &values[]=average_response_time
           &values[]=call_count'
```

取得したら計算して、エポック秒などをガラガラポンしてMackerelに投稿する

```shell-session:ApplicationTotalTime(プログラム処理の時間）
Application total time = WebTransactionTotalTime - Datastore time - Database time - (Ruby) Database - Web external - Memcache
```

```shell-session:Datastore（DBなどの時間）
Datastore time = ( Datastore/${DBTYPE}/allWeb:average_response_time * Datastore/${DBTYPE}/allWeb:call_count ) / HttpDispatcher:call_count
```

```shell-session:Datastore（外部通信の時間）
Web external = ( External/allWeb:average_response_time * External/allWeb:call_count ) / HttpDispatcher:call_count
```

出来た。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143303/f8241f2b-e731-266d-d7a5-9fb7a1a9f932.png)

これで、詳細を調べたいとき以外はNewRelic見なくてよさそうです。