10: 応用編 1: デプロイ時や重要なトランザクションのパフォーマンス監視をしよう - New Relic を使ったアプリケーションのパフォーマンス監視入門

New Relic Advent Calendar 2017 24日目。とうとう残り２日。今日から応用編。だけど、最終日は、目次とまとめを書くので、残りの応用編はアドベントカレンダー外となるまさかの展開。

----

「[基礎編 4: 外部サービスやVMを軸にしたパフォーマンス調査方法](https://qiita.com/kumatronik/items/824c824de505f0355704) 」までの基礎編では、UI 上だけで完結できるパフォーマンス分析を紹介してきました。[前回](https://qiita.com/kumatronik/items/0ab5b1a37442940ce0a2)はサーバー監視の話でしたが、今回は APM の話に戻ります。

今までは、New Relic がデフォルトで収集したデータを元にパフォーマンス分析を行ってきましたが。より効率的にパフォーマンス分析するためには、サービス固有の状況に合わせてカスタマイズを行うべきです。今回は、APM のカスタマイズポイントを紹介していきます。サービスにあった部分をうまく取り込んで貰えればと思う。

## デプロイ追跡を利用してデプロイ前後のパフォーマンスを比較しよう

パフォーマンスが低下するタイミングで一番多いと言われているのが、デプロイ時です。バグが入り込んだりとコードの変化による影響を一番受けるタイミングです。そのため、リリース後のパフォーマンスを監視し、リリース前より著しくパフォーマンスが落ちた場合は迅速に知ることができる必要があります。速く気づければ前のバージョンにロールバックし、ユーザーへの影響も最小限に抑えられるでしょう。New Relic では、デプロイ時点をマーキングし、その前後のパフォーマンスを一目で知ることができる機能があります。

この画面では、デプロイ時が各チャートの中央に来ます。(グレーのライン)よって、一目で前後でパフォーマンスが低下したか、よくなったかをは比較できます。

![](https://camo.qiitausercontent.com/428dcd16977057ad5602aeb1822bfc06baf6faa9/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34363030332f31333236383838612d386662342d346630622d346237392d3638366565353633313165332e706e67)


### デプロイ履歴へのアクセス

デプロイ履歴を確認したい場合は、左メニュー真中くらいの **Deployments** メニューを選択します。

すると、以下のような履歴が表示されます。そこから気になるデプロイタイミングを選択します。選択すると上記のスクリーンショットのような画面が表示されます。

![](https://camo.qiitausercontent.com/135b2a47b9443a40db06d3b84c546fe542190935/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34363030332f36623763343931622d363930302d626565622d653732392d6634363739303739323633652e706e67)


### 前回遅かったトランザクションとの比較も可能

**Deployments** にはもう一つタブがあります。それが **Change report** です。ここで確認できるのは、前回のデプロイで遅かったトランザクショントップ10が今回のデプロイでどうなったか知ることができます。

![20170521_deployments_02.png](https://qiita-image-store.s3.amazonaws.com/0/46003/a1092b52-0b19-cdd7-4d8f-f93a5e07dfea.png)

上のスクリーンショット上から4つ目の「/vets(GET)」を見てみると、前回は、1,390ms だった平均レスポンスタイムが、3,23ms と劇的に早くなっていることが簡単に分かります。

この画面を使うことで、パフォーマンス改善した際にそれが効果があったのか簡単に知ることができます。

### Overview 画面でも簡単に確認できる

デプロイタイミングが良い点は、専用の **Deployments** だけでなく、メインの **Overview** でも確認できる点です。デプロイマーカーはメインチャートでは、青い垂直線として表現されます。

そのため、**Overview** を見ていれば、いつデプロイが行われたのか知ることができます。もし、青い線の後にパフォーマンスが低下しているのが分かったら、その原因が直前のデプロイでしこまれた何かである可能性が高いとすぐに気付けるでしょう。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34363030332f38393861366435342d633262362d393965662d373439652d3662653962353236663037382e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/46003/2fc2d9f9-6349-488b-d9a3-f50bf40465a7.png)


### デプロイタイミングのマーカーの付け方

デプロイタイミング自体は、New Relic はどの時点かは判断できません。よって、デプロイ時にアプリごとにマーキング(デプロイの記録)してもらう必要があります。

マーキング方法はいくつかありますが、汎用的な方法は、`curl` で以下の New Relic のデプロイマーカー用の API を叩くだけです。

```shell
curl -X POST 'https://api.newrelic.com/v2/applications/${APP_ID}/deployments.json' \
     -H 'X-Api-Key:${API_KEY}' -i \
     -H 'Content-Type: application/json' \
     -d \
'{
  "deployment": {
    "revision": "REVISION",
    "changelog": "Added: /v2/deployments.rb, Removed: None",
    "description": "Added a deployments resource to the v2 API",
    "user": "datanerd@example.com"
  }
}' 
```

他にも記録方法はあります。気になる方は[こちら](https://newrelic.degica.com/docs/apm/new-relic-apm/maintenance/recording-deployments)のドキュメントをご覧ください。

## サービスに重要なトランザクションは専用の監視、Apdex 設定、アラート設定をしよう

**Transaction** ページでトランザクションに関するパフォーマンスは知ることができます。しかし、ここで表示されているトランザクション全てのパフォーマンスに気を使うというよりも、サービスの中で売上やビジネスの競争上重要なトランザクションの方が、常に監視、パフォーマンスを気にしておきたいものだと思います。あまり使われないトランザクションが非常に遅くなったことよりも、検索やログイン処理が少し遅くなったことの方が問題だというケースはよくあります。

このように、特定のトランザクションを重要視してい監視する機能が、**キートランザクション** です。あるトランザクションをキートランザクションとして登録すると、以下の利点があります。

- そのトランザクション専用の **Overview** 画面ができる。
- そのトランザクション専用の Apdex の閾値の設定ができる
- そのトランザクション専用のアラート設定ができる
- そのトランザクション専用の SLA レポートがある
- (言語によって) X-Ray セッションという、トランザクションのメソッド呼出し単位のパフォーマンス計測処理が行える

キートランザクションとして登録すると、以下ように専用の画面用意されます。ここで、そのトランザクションだけのレスポンスタイムやスループット、Apdex、エラー率などを知ることができます。

![](https://camo.qiitausercontent.com/1f56b51214f36f886e2261b62a56f9b1d7a56f94/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34363030332f31356338346266312d366134312d643938612d616332382d6436623161383463393238372e706e67)

### キートランザクションへのアクセス方法

キートランザクションページへは、APM のトップメニューの左から３番目の **Key transactions** をクリックします。アクセスすると、現在登録中のキートランザクション一覧が表示されます。

![スクリーンショット_2017-12-24_17_25_28.png](https://qiita-image-store.s3.amazonaws.com/0/46003/f7334cd1-f323-ec48-d3f6-826bc30bace5.png)


### キートランザクションへの追加方法

トランザクションをキートランザクションに追加するには、上のキートランザクション一覧の **Add more** ボタンを押す方法があります。ただ、これはその後に対象のトランザクションを選択するのが結構めんどいので、別の方法をオススメします。それが、**Transactions** から追加する方法です。

**Transactions** の一覧からキートランザクションに追加したいトランザクションを選択します。 すると、トランザクション名の横に、**Track as key transaction** というリンクが表示されます。(既にキートランザクションに追加済みの場合は、キートランザクションへのリンクとなります）

<img width="300" alt="スクリーンショット 2017-12-24 18.28.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/46003/31103385-f8d9-6d4a-627e-d7559412adfa.png">

リンクをクリックすると、ポップアップが表示されるので、**Track Key Transaction** ボタンを押します。すると専用のキートランザクション画面が作成されます。

### キートランザクションの Apdex の閾値の設定方法

キートランザクションごとに Apdex を設定することで、トランザクション単位でユーザー満足度を計測、監視できます。特にビジネスに重要なトランザクションはアプリ全体の閾値より厳密に設定、管理する方が良いでしょう。サイト全体では、0.5秒でいいが、検索処理は0.3秒であるべきとかの場合、検索処理をキートランザクションに登録し、閾値を 0.3秒に設定することでそういった柔軟な管理ができます。

キートランザクションごとに Apdex の閾値を設定するには、キートランザクション一覧画面で、対象のキートランザクションの一番右のギアアイコンをクリックします。すると、以下のポップアップが表示されます。

<img width="400" alt="スクリーンショット 2017-12-24 18.32.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/46003/6d755e90-eb59-a263-a909-c986751693f2.png">

この Apdex T にの App にこのキートランザクション用の Apdex の閾値を設定します。

### キートランザクションのアラートの設定方法

Apdex と同じく、キートランザクションごとにアラートの設定が行えます。アラートの設定は、[以前](https://qiita.com/kumatronik/items/b3bdbea4da4aa4b4761e#2-%E3%82%A2%E3%83%A9%E3%83%BC%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A)も説明したように、画面トップの **Alerts** から行っていきます。

アラート条件の画面で、製品を APM (デフォルト)、条件のタイプを **Key tansacation metric** を選択します。

<img width="300" alt="スクリーンショット 2017-12-24 18.41.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/46003/f88c3c18-7699-d3bc-1a58-dc48b8f12a7f.png">

２番めの **Select entities** では対象のキートランザクションを選択します。

３番目のアラート条件の設定では、以下の項目から対象を選択し、閾値を設定します。

<img width="350" alt="スクリーンショット 2017-12-24 18.46.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/46003/0b629e1f-1d25-7044-6f1e-4b71cb165317.png">

これにより、アプリ自体は正常であっても、重要なトランザクションに異常が発生した場合に、素早く知ることができます。

### X-Ray セッション - スレッドプロファイル

注: この機能は現時点で、Java/Ruby/Python のみで利用可能

[X-Ray セッション](https://newrelic.degica.com/docs/apm/transactions/x-ray-sessions/x-ray-sessions-traces-thread-profiles-key-transactions)は対象のトランザクションに対して、スレッドプロファイルを実行できます。スレッドプロファイルは、メソッド呼出し単位レベルで、パフォーマンスを計測、確認できるものです。


![](https://camo.qiitausercontent.com/26b89a25ef9cefb74c942d88797f009728c4e8b6/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34363030332f34303162353537382d653466622d353764392d633136622d3662613266353432353166662e706e67)

トレースディテールのように具体的に何秒掛かっているかは分かりませんが、どの処理に多くの時間(割合）を費やしているかを、メソッド呼出し単位に確認できます。New Relic 上でより詳細なパフォーマンスを確認したい場合には、便利な機能です。

一方、この機能は、非常にアプリ自体に負荷を与えるため、ユーザー側で実行タイミングを指定して、その期間だけ実行し、データを収集します。

#### 設定方法

キートランザクションページの左メニュー **X-Ray** を選択。**Start X-Ray Session** ボタンをクリック。すると、以下のポップアップが表示される。名前を付け、トレース数と実行時間を設定し、**Start X-Ray Session** を押す。

<img width="400" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34363030332f37663364393637352d636166372d653066382d313266372d6531393563356435303461342e706e67.png" src="https://qiita-image-store.s3.amazonaws.com/0/46003/9e181546-001a-099c-287b-66919ce4c65a.png">

X-Ray セッションは、設定したトレース数か実行時間のどちらかを満たしたら終了する。


## まとめ

デプロイマーカーは少しデプロイスクリプトなどにコマンドの追加が必要だが、そこまで難しわけではないので、是非、取り入れていただきたい機能です。また、キートランザクションもビジネス上重要なトランザクションを重点的に監視する必要があるというは皆が同意する点だと思うので、これも是非、活用してもらえればと思う。