3: 理論編3: 監視製品の紹介 - New Relic を使ったアプリケーションのパフォーマンス監視入門

New Relic Advent Calendar 2017 16日目。

New Relic を使ったアプリケーションのパフォーマンス監視入門 理論編: ３日目。

- [1: 理論編 1: アプリケーションパフォーマンス監視とは](https://qiita.com/kumatronik/items/1b93d7e03bdabd76d8f2)
- [2: 理論編2: New Relic とは](https://qiita.com/kumatronik/items/abd3e327d84b5b543026)

# 理論編 その3 : New Relic 製品の紹介

New Relic が現在提供してる製品は、5つの監視製品と２つの補助製品。

**監視製品**

- New Relic APM: アプリケーションパフォーマンス監視製品
- New Relic Browser: リアルユーザーモニタリング
- New Relic Synthetics: 外形監視/死活監視
- New Relic Mobile: ネイティブアプリ監視
- New Relic Infrastructure: サーバー監視/設定変更監視/クラウド・ミドルウェア監視

**補助製品**

- New Relic Insights: ダッシュボードツール
- New Relic Alerts: アラート

今回は5つの監視製品について簡単に紹介していきます。

## New Relic APM 

アプリケーションパフォーマンス監視製品。現時点のサーバーサイドのアプリのパフォーマンス(処理時間、スループット、エラー率、ユーザー満足度等)を知ることができる。

以下は、APM の概要ページ。現在のアプリの状態を一目でわかる UI となっている。このページを起点に、問題の詳細を絞り込んでいく。

![スクリーンショット 2017-12-16 23.29.18.png](https://qiita-image-store.s3.amazonaws.com/0/46003/2a6167d8-2347-6bfc-0ea2-40ac23a5d6d1.png)

また、ここでは、平均のレスポンスタイムだけでなく、パーセンタイルやヒストグラムでもパフォーマンスを確認できる。ユーザー満足度の指標である Apdex については[こちらの記事](https://qiita.com/kumatronik/items/71815c823255cf84dd79)を参照。


特に、トランザクション毎の絞り込みでは、SQL まで確認することができる。（すごいざっくりだが、概要ページからいくつか操作して、SQLを表示するまでの手順が以下）

![test4.gif](https://qiita-image-store.s3.amazonaws.com/0/46003/66eb0f10-ae9c-d26b-b8d1-4cae96dc711c.gif)


主な機能は以下がある。

- トランザクションのパフォーマンス確認一覧: トランザクションの遅い順やスループットの多い順などでトランザクションを確認できる。また、あるトランザクションで行われた処理のどの処理が何秒掛かっているかもわかる。
- DB 処理パフォーマンス確認一覧: DB 処理を軸に、遅い処理を確認できる。それがどのトランザクションで使われているかもわかる。
- 外部サービスパフォーマンス確認一覧: 呼び出された外部サービスのパフォーマンスが確認できる。
- 言語処理系のパフォーマンス (言語によって提供していない場合もある): Ruby や Java なら、Ruby VM や Java VM のパフォーマンス(GC、メモリやヒープサイズなど)がわかる。
- エラー分析: 未キャッチ例外を分析、確認できる。
- キートランザクション: 重要なトランザクション専用の概要ページが作れる。特定のトランザクション専用のアラートを設定できる。
- デプロイ追跡: 本番へのリリースタイミング(デプロイタイミング)を New Relic 上で管理できる。これによって、デプロイタイミング前後のパフォーマンスがよく分かる。
- サービスマップ: 複数アプリを New Relic で管理していおり、それぞれが呼出し関係にある場合、サービス間の連携とパフォーマンスがわかる。
- ヘルスマップ: New Relic APM と New Relic Infrastructure を利用している場合に、アプリのパフォーマンスとそれを稼働しているサーバーのパフォーマンスが一目でわかる。
- SLA レポート: SLA (サービス品質保証)用のレポート。日毎、週毎、月毎で、パフォーマンスを簡単に比較できる。

## Infrastructure との連携も

APM と Infrastructure を同じ New Relic アカウント内で使っている場合は、連携機能がいくつかある。ヘルスマップページで、アプリとそれを稼働しているサーバーのパフォーマンスを簡単に確認できる。これにより、アプリでアラートが出ているときに、サーバーでもアラートが出ているか確認できるので、原因がサーバーリソースなのかアプリ側なのか判断を下せる。

また、概要ページで、そのアプリを稼働しているサーバーを確認できる。そして、そのアプリのCPU利用率やメモリ使用量など確認できる。そこから、直接 Infrastructure へ移動し、そのサーバーのパフォーマンスを確認することもできる。

### 仕組み

New Relic APM は、サーバーサイドアプリの開発言語用のエージェントと呼ばれるライブラリを利用して、パフォーマンスデータの収集及び、New Relic サーバーへデータ送信を行う。対応している言語は以下の通り。サーバーアプリにライブリを組み込み、アプリサーバーを起動すると、自動的に、APM エージェントが起動し、データ収集し、定期的(１分に１回)に New Relic サーバーへデータを送信する。エージェントが本体のアプリの処理をフックして、データを収集する。また、言語にもよるかもしれないが、Ruby などは別スレッドで動いているワーカースレッドが収集したデータを New Relic サーバーへ送信する。

ちなみに、Go 以外の言語に監視しては、特にコードなどに手を入れなくても、パフォーマンスデータをいい感じに収集し、画面でみることができる。Go に関しては、コードに計測ポイントを指定する必要があるらしい。

#### 利用可能言語や環境

現時点で、それぞれの言語ごとに利用可能なバージョン、フレームワークやライブラリなどはそれぞれの言語ごとの互換性と要件ページを参照。

- [.NET](https://docs.newrelic.com/docs/agents/net-agent/getting-started/introduction-new-relic-net):
  - [互換性と要件](https://docs.newrelic.com/docs/agents/net-agent/getting-started/compatibility-requirements-net-framework-agent)
  - [インストール手順](https://docs.newrelic.com/docs/agents/net-agent/installation/install-net-agent-windows)
  - [リリースノート](https://docs.newrelic.com/docs/release-notes/agent-release-notes/net-release-notes)
- [Java](https://docs.newrelic.com/docs/agents/java-agent):
  - [互換性と要件](https://docs.newrelic.com/docs/agents/java-agent/getting-started/compatibility-requirements-java-agent)
  - [インストール手順](https://docs.newrelic.com/docs/agents/java-agent/installation/install-java-agent)
  - [リリースノート](https://docs.newrelic.com/docs/release-notes/agent-release-notes/java-release-notes)
- [Ruby](https://docs.newrelic.com/docs/agents/ruby-agent/getting-started/introduction-new-relic-ruby): 
  - [互換性と要件](https://docs.newrelic.com/docs/agents/ruby-agent/getting-started/ruby-agent-requirements-supported-frameworks)
  - [インストール手順](https://docs.newrelic.com/docs/agents/ruby-agent/installation/install-new-relic-ruby-agent)
  - [リリースノート](https://docs.newrelic.com/docs/release-notes/agent-release-notes/ruby-release-notes)
- [Python](https://docs.newrelic.com/docs/agents/python-agent/getting-started/introduction-new-relic-python):
  - [互換性と要件](https://docs.newrelic.com/docs/agents/python-agent/getting-started/compatibility-requirements-python-agent)
  - [インストール手順](https://docs.newrelic.com/docs/agents/python-agent/installation/standard-python-agent-install)
  - [リリースノート](https://docs.newrelic.com/docs/release-notes/agent-release-notes/python-release-notes)
- [PHP](https://docs.newrelic.com/docs/agents/php-agent/getting-started/introduction-new-relic-php):
  - [互換性と要件](https://docs.newrelic.com/docs/agents/php-agent/getting-started/php-agent-compatibility-requirements)
  - [インストール手順](https://docs.newrelic.com/docs/agents/php-agent/installation/php-agent-installation-overview)
  - [リリースノート](https://docs.newrelic.com/docs/release-notes/agent-release-notes/php-release-notes)
- [Node.js](https://docs.newrelic.com/docs/agents/nodejs-agent/getting-started/introduction-new-relic-nodejs):
  - [互換性と要件](https://docs.newrelic.com/docs/agents/nodejs-agent/getting-started/compatibility-requirements-nodejs-agent)
  - [インストール手順](https://docs.newrelic.com/docs/agents/nodejs-agent/installation-configuration/install-nodejs-agent)
  - [リリースノート](https://docs.newrelic.com/docs/release-notes/agent-release-notes/nodejs-release-notes)
- [Go](https://docs.newrelic.com/docs/agents/go-agent):
  - [互換性と要件](https://docs.newrelic.com/docs/agents/go-agent/get-started/go-agent-compatibility-requirements)
  - [インストール手順](https://docs.newrelic.com/docs/agents/go-agent/get-started/install-new-relic-go)
  - [リリースノート](https://docs.newrelic.com/docs/release-notes/agent-release-notes/go-release-notes)

エージェントは定期的にアップグレードされます。新機能によってはエージェントを更新しないと利用できなかったりしますので、上記の言語ごとのリリースノートをチェックして、最新版に保つようにしてください。


また、OS は特に気にしないが、Windows Server と PHP の組み合わせは対応していない模様。

New Relic APM のプランや価格帯については[ここ](https://qiita.com/kumatronik/items/8cf6e077a4f0832f66a6#new-relic-apm)を参照。

## New Relic Browser 

リアルユーザーモニタリング製品。ユーザーのブラウザ上のパフォーマンスを計測できるサービス。DOM 処理、レンダリング、ネットワーク、サーバーサイド処理時間を確認できる。どのレイヤーの処理に時間が掛かっているか、簡単に確認できる。

![スクリーンショット 2017-12-16 23.52.13.png](https://qiita-image-store.s3.amazonaws.com/0/46003/97dda61b-383b-6b83-59ec-18990e75fae7.png)


主な機能は以下がある。

- ページビューごとのパフォーマンス一覧: 遅いページビューのパフォーマンスを確認できる。
- セッション単位のパフォーマンス一覧: セッション単位で遅いパフォーマンスを確認できる。Google Chrome の DevTools の Network タブのような感じで、あるセッション時の各アセット(画像、CSS、JS）の読み込み時間や処理時間、Ajax 処理の呼出しタイミングや処理時間を確認できる。
- Ajax リクエスト単位のパフォーマンス一覧: 呼び出された Ajax のパフォーマンスを確認できる。
- JavaScript エラー一覧: 発生した JavaScript エラーを確認できる。
- ブラウザごとのパフォーマンス一覧: どのブラウザでの多くリクエストがあったとか、遅いとかがわかる。特定のブラウザを選択すれば、どのバージョンが遅いかもわかる。
- 地理を軸にしたパフォーマンス一覧: どの地域からアクセスが多いとか、遅いとかがわかる。URLごとや、デバイスごとなど様々な項目で絞り込みが可能。
- SPA 対応: 初期ロードとルート変更のパフォーマンスを確認できる。

![スクリーンショット 2017-12-16 23.53.05.png](https://qiita-image-store.s3.amazonaws.com/0/46003/41687709-183e-1685-7ce9-c3725e2a1d4c.png)
セッショントレース画面。

### 仕組み

専用の JS を HTML に埋め込んでおき、それが自動的に、データを収集し、New Relic サーバーに送信する。埋め込み方法は、APM を使っている場合は、APM が自動でレスポンスの HTML に埋め込んでくれる。また、手動で JS を埋め込むこともできる。

インストール手順

- [APM を利用している場合](https://newrelic.degica.com/docs/browser/new-relic-browser/installation-configuration/adding-apps-new-relic-browser#select-apm-app)
- [手動で JS を埋め込む場合](https://newrelic.degica.com/docs/browser/new-relic-browser/installation-configuration/adding-apps-new-relic-browser#copy-paste-app)

エージェントは定期的にアップグレードされます。新機能によってはエージェントを更新しないと利用できなかったりしますので、[リリースノート](https://docs.newrelic.com/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes)をチェックして、最新版に保つようにしてください。

New Relic Browser のプランや価格帯については[ここ](https://qiita.com/kumatronik/items/8cf6e077a4f0832f66a6#new-relic-browser)を参照。


## New Relic Synthetics 

外形監視/死活監視と呼ばれる製品。New Relic が世界中に配備した箇所(20箇所くらい）から一定間隔で、特定のサービスやページ(URL)にリクエストを送り、死活やパフォーマンスを確認できる。これは、New Relic Browser と対となる製品として紹介される。New Relic Browser は実際のユーザーのパフォーマンスを監視することで、実際のユーザーのパフォーマンスがわかるが、一方、ブラウザ越しのアプリのパフォーマンスを一定期間で比較する際には、あまり適していない。なぜなら、ユーザーの環境によって、パフォーマンスが安定しないから。一方、New Relic Synthetics は、常に一定間隔で同じ環境からリクエストを送るため、パフォーマンスの比較に向いている。

![スクリーンショット 2017-12-16 23.55.24.png](https://qiita-image-store.s3.amazonaws.com/0/46003/975f5617-d38c-e5da-1bd4-df1ed3364bec.png)

![スクリーンショット 2017-12-16 23.56.11.png](https://qiita-image-store.s3.amazonaws.com/0/46003/e495eab0-f56d-0a67-4a3f-cfe0a4c49aff.png)

監視方法が４タイプ用意されている。

- Ping : HTTP Head リクエスト送って、その結果見る。
- Simple Browser: HTTP Get リクエストを送って、その結果を見る。New Relic Browser のように、HTML、CSS、JS、画像などの読み込み時間や処理時間を確認できる。
- Scripted Browser: Simple Browser の複数ページ版。特定のURLを指定するのではなく、Selenium 専用の JS を記述することで、振舞いやページを跨いだパフォーマンスの確認ができる。
- API Test: Scripted Browser の API 版。ページではなく、API を対象に、JS を記述する。


可用性の監視や、ブラウザ越しでのパフォーマンス計測、比較をしたい場合に便利なサービス。例えば、パフォーマンス改善を行った場合に、ユーザー目線でパフォーマンスが改善されているかを確認できる。また、UI 上で監視の設定が完了するため、非常にお手軽に利用できるサービスでもある。

### 仕組み

上記でも書いたが、New Relic が世界中に配備したサーバーから定期的にリクエストを送る。よって、他の監視サービスと違い New Relic 利用者が何かインストールするとは必要ない。ただし、New Relic が用意しているサーバー以外の場所からリクエストを送る仕組みを構築したい場合は、その仕組みを構築する必要がある。(これは別料金がかかる)

### 利用方法

New Relic Synthetics のページにアクセスし、監視の設定を行う。以下の設定は共通。

- 地点(20箇所)
- 頻度(１時間、１日)
- 監視に失敗した場合に送信するメールアドレス

Ping, Simple Browser の場合は、対象の URL。Scripted Browser、API Test の場合は、JS のコードを専用のJSエディタで記述する。

New Relic Synthetics のプランや価格帯については[ここ](https://qiita.com/kumatronik/items/8cf6e077a4f0832f66a6#new-relic-synthetics)を参照。


## New Relic Mobile 

モバイルデバイス(iOS、Android)アプリのパフォーマンス分析や障害分析を行えるサービス。

アプリのバージョンごとに、インストール数や更新数、障害発生率などを一覧で確認できる。これによって、バージョンアップした際に、それが使われているかや、パフォーマンスが良くなったとか、悪くなったとかが直ぐにわかる。

また、アプリがクラッシュした際に、クラッシュを起こすまでのユーザーの行動を追跡できるため、どういった処理の流れでクラッシュに至ったのか知ることができる。これは、同じ原因でクラッシュした場合、複数のユーザーの行動を簡単に知ることができるので、クラッシュが起こる共通のパターンを探せるので、根本的な原因の分析に非常に役に立つ。

### 仕組み

iOS、Android、tvOS 用の SDK があるので、それを各環境(Xcode 等)でアプリに組み込み、各ストアで公開する。ユーザーがアプリを起動したタイミングで、New Relic Mobile SDK も起動し、パフォーマンスや障害を収集し、New Relic サーバーにデータを送信する。

iOS の場合は計測ポイントを指定しなくても、いい感じにデータを収集できるが、Android の場合は必要なポイントに計測ポイント指定する必要がある。

Unity にも対応している。

インストール手順は以下

- Android へのインストール: [Gradle と Android Studio](https://docs.newrelic.com/docs/mobile-monitoring/new-relic-mobile-android/install-configure/install-android-apps-gradle-android-studio)、[Maven](https://docs.newrelic.com/docs/mobile-monitoring/new-relic-mobile-android/install-configure/installing-android-apps-maven)
- iOS へのインストール: [Cocoa Pods](https://docs.newrelic.com/docs/mobile-monitoring/new-relic-mobile-ios/installation/cocoapods-installation)、[手動](https://docs.newrelic.com/docs/mobile-monitoring/new-relic-mobile-ios/installation/ios-manual-installation)
- [Unity へのインストール](https://docs.newrelic.com/docs/mobile-monitoring/new-relic-mobile-unity/install-configure/unity-plugin-installation-configuration)

エージェントは定期的にアップグレードされます。新機能によってはエージェントを更新しないと利用できなかったりしますので、リリースノート([iOS](https://docs.newrelic.com/docs/release-notes/mobile-release-notes/ios-release-notes)、[Android](https://docs.newrelic.com/docs/release-notes/mobile-release-notes/android-release-notes)、[tvOS](https://docs.newrelic.com/docs/release-notes/mobile-release-notes/tvos-release-notes)、[Unity](https://docs.newrelic.com/docs/release-notes/mobile-release-notes/unity-release-notes))をチェックして、最新版に保つようにしてください。


New Relic Mobile のプランや価格帯については[ここ](https://qiita.com/kumatronik/items/8cf6e077a4f0832f66a6#new-relic-mobile)を参照。


## New Relic Infrastructure

サーバー監視、設定変更監視、IT資産管理、ミドルウェア監視製品。特に、現代のインフラ環境にあう用に、数十、数百台のサーバーを効率良く監視、分析できるように考えられた UI が特徴。

![スクリーンショット 2017-12-16 23.49.51.png](https://qiita-image-store.s3.amazonaws.com/0/46003/13ea8938-ee3e-cd63-8bd0-bbee1a0f7619.png)


- **サーバー監視**:
  - ホスト単位のパフォーマンス(CPU、メモリ、ロードアベレージ)
  - デバイスごとのストレージのパフォーマンス(使用ディスク容量、使用率、読み込み/書き込み量)
  - インスタンスごとのネットワークの送信量、受信量や受信エラー
  - プロセスごとのパフォーマンス(CPU、メモリ、I/0)
- **イベント履歴** (サーバー設定の変更履歴): いつ誰がサーバー上でどんな変更(パッケージをインストールしたとき、SSHでログインしたとか、サービスやアプリが起動/終了したとかがわかる。また、これは上のサーバー監視とも結びついており、サーバーのパフォーマンスが異常なときにそれがサーバーの設定変更が原因かどうかが簡単にあたりがつく。
- **IT 資産の管理**: New Relic Infrastructure の監視下のホストにインストールされている全パッケージを簡単に検索、一覧できる。(Heartbeat のSSH の時のような)あるパッケージに脆弱性が発見されたときに、自分たちのどのサーバーのパッケージをアップグレードしないといけないか、調べたり、アップグレード後に全部もれなく更新できているかを確認するのに便利。
- **クラウド・ミドルウェア監視**: クラウド(AWS、Azure)の各サービス (AWS なら EC2やS3、Lambdaなど24のサービス)のパフォーマンスを New Relic 上で確認できる。また、Apache、MySQL、Nginx、Redis、Cassanadra (現時点でこれだけだが、今後は増えていく)のパフォーマンスも確認できる。

### 充実したフィルタリング

New Relic Infrastructure ではフィルター機能が充実している。クラウドの場合は、リージョンやインスタンスタイプ、ロールなど様々項目でフィルタリングができる。数百ホストがあっても簡単にいい感じにグルーピングができるので、見たいホスト群のみにフォーカスすることが可能。また、EC2 を使っている場合は、自動的にタグが取り込まれるので、EC2と同じクラスタですぐにパフォーマンス管理ができる。

Docker などのコンテナにも対応しているため、コンテナごとのパフォーマンスも確認できる。

### アラート

アラートは、CPU 使用率やメモリ使用量、ディスク使用量など一般的なサーバー監視に必要なアラート項目が用意されています。さらに、ホストが応答しなくなった場合のアラートや AWS やミドルウェア監視の対象に対してもアラートが設定できます。

上記で説明したフィルタリングは、アラートとも結びついているため、フィルタリンググループ単位でアラートの設定ができる。そうすることで、アラート設定後に、そのグループにホストが追加された場合も自動的にアラートの設定対象となり、わざわざ設定し直す必要がない。


### APM との連携も

APM の項目でも書いたが、APM と Infrastructure を同じ New Relic アカウント内で使っている場合は、連携機能がいくつかある。ヘルスマップページで、アプリとそれを稼働しているサーバーのパフォーマンスを簡単に確認できる。これにより、アプリでアラートが出ているときに、サーバーでもアラートが出ているか確認できるので、原因がサーバーリソースなのかアプリ側なのか判断を下せる。

### 仕組み

Infrastructure エージェント(Linux,Windows)をサーバーにインストールし、設定を行うと、サーバー上で起動し、定期的に New Relic サーバーにデータを送信する。

インストール手順は以下

- [Linux へのインストール](https://newrelic.degica.com/docs/infrastructure/new-relic-infrastructure/installation/install-infrastructure-linux)
- [Windows Server へのインストール](https://newrelic.degica.com/docs/infrastructure/new-relic-infrastructure/installation/install-infrastructure-windows-server)

エージェントは定期的にアップグレードされます。新機能によってはエージェントを更新しないと利用できなかったりしますので、[リリースノート](https://docs.newrelic.com/docs/release-notes/infrastructure-release-notes/infrastructure-agent-release-notes)をチェックして、最新版に保つようにしてください。

New Relic Infrastructure のプランや価格帯については[ここ](https://qiita.com/kumatronik/items/8cf6e077a4f0832f66a6#new-relic-infrastructure)を参照。

## まとめ

各監視製品について簡単ではあるが紹介した。明日は残りの製品と New Relic の共通項目について紹介する。