アプリケーションのパフォーマンス監視に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
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'
{
"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
[
{
"hostId": "マカレルのホストのID",
"name": "custom.newrelic_restime.BookLive",
"time": 1506404760,
"value": 210
},
{
"hostId": "マカレルのホストのID",
"name": "custom.newrelic_restime.BookLive",
"time": 1506404820,
"value": 216
},
以下略
でも作りたいグラフはこれじゃない・・・
NewRelicでみるとDBや外部通信ごとにグラフが積みあがって見れます。これをMackerelで見たい。
ここの下の方をみると頑張って取得して計算しないといけないらしい・・・
https://docs.newrelic.com/docs/apis/rest-api-v2/application-examples-v2/obtain-web-transaction-time-data-v2
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に投稿する
Application total time = WebTransactionTotalTime - Datastore time - Database time - (Ruby) Database - Web external - Memcache
Datastore time = ( Datastore/${DBTYPE}/allWeb:average_response_time * Datastore/${DBTYPE}/allWeb:call_count ) / HttpDispatcher:call_count
Web external = ( External/allWeb:average_response_time * External/allWeb:call_count ) / HttpDispatcher:call_count
出来た。
これで、詳細を調べたいとき以外はNewRelic見なくてよさそうです。