システム監視&パフォーマンスチューニングその他色々! New Relicでどこまでやれるかまとめてみた

New Relicロゴ

はじめに

こんにちは!ecbeingの蓑代です。
近頃はめっきり冷え込み、また年末もあともう少し…仕事納めでちょうどバタバタしちゃう時期ですね。

そんなちょっとバタバタっとしている時期にもかかわらず、私はとあるサービスの虜になってしまいました。
その名もNew Relic(ニュー レリック)!

newrelic.com

New Relic知らない方向けにざっくり説明しますと、監視ツールの一種です。
※詳しくは後ほど説明します

「監視ツール…単にLOGとかが取れて分析できるだけのツールでしょ?」と思うなかれ。
New Relicを使えば、システム監視だけではなくパフォーマンスチューニングに役立つデータ、果てはビジネスサイドに役立つデータも(工夫次第で)取ることが出来ます!

年末とセットで来る「長期休暇」に備え、監視用のアラートをいっぱい立てヤバい時だけ通知が来るようにし…。
他はゆっくり休みを満喫といった、そんな優雅な長期休暇がNew Relicを使えば実現できる!…かもしれません。

上記も含め、今回の記事では「New Relicを使ってどんなことが出来るのか」+「実際にやってみた活用事例」を見ていこうと思います。
それでは行きましょう!

New Relicって?

では早速「どんなことが出来るのか」の紹介…の前に、まずNew Relicとは何かを見てみましょう。
公式サイトのTOPページにはこんなことが書かれています:

スタック全体をモニタリングし、デバッグし、改善する
New Relic Oneは、開発チームと運用チームが一緒にデータ関連の問題を解決できる、業界トップクラスのオブザーバビリティプラットフォームです。
参照: New Relic | スタック全体をモニタリングし、デバッグし、改善する | New Relic

New Relicと連携さえしてしまえば、アプリケーションのログだけではなく、クラウドサービス基盤のインフラログ、果てはk8sのモニタリングまで出来ちゃいます。
更に、様々なOSSとのインテグレーションも完備されている無敵っぷり。

AWSやAzure, GCP等の有名どころもばっちり押さえられており、これらサービスにNew Relicを導入するのはとても簡単です。
※インテグレーション出来るサービス一覧はこちら: インテグレーション | New Relic

集めたログの分析も「NRQL」というSQLクエリに似た独自記法で、簡単に集計&グラフ化出来ちゃいます。

New Relic使用イメージ
こんな感じ(公式サイトから引用)
グラフ化もワンクリックで「棒グラフ」「円グラフ」「テーブル表示」など多彩に切り替えられ…目的に合った形にシュパっとデータ表示出来ちゃいます。

また、個人的推しポイントとして「画面のUIがとても洗練されている」というのがあります。
イカしたビジュアルでカッコよく分析出来るので、業務中のテンションアゲアゲなこと間違いなしです!

難点としては、ネット上に流れているNew Relicに関する記事が少ないことです。
(AWSといった大きなサービスと比較して、というイメージです)
特に「個人開発でNew Relicをやってみた」系の記事は本当に少ないです…。

ただ、個人開発のサービスでNew Relicを入れる₌ログ監視するほどの規模のサービスを扱うのは稀でしょうからね。
大体は会社単位で導入されることになるでしょうし、個人にとっては敷居が高いサービスという表れかもしれません。

「New Relicとは何か」という章はここまで。
お次はいよいよ、New Relicを使って「どんなことが出来るのか」を見ていきます!

どんなことが出来るのか

New Relicを活用すると、様々なLOGが見れるようになるというのは先に伝えました通りですが…。
ここからは「具体的にどんなLOGが見れるのか」「そのLOGを使ってどのようなことが出来るのか」を見ていこうかと。

注意:New Relicを活用する前の下準備について

New Relicを活用するためには「お使いのサービスにNew Relicを導入」してあげないといけません。
※どんなサービスを導入するにあたっても必要なこととは思いますがね

例えばAWSを使っているのであれば、IAMを使ってNew Relicを連携したり…。
といった様に、使っているサービスに応じて各サービスにNew Relicを連携してあげなければなりません。

…が、本記事ではそれら手順については省略します。
「どんなことが出来るのか」という記事は、上記の導入を終えないと出来ないという点だけご注意を。

具体的にどんなLOGが見れるのか

まず前提としてですが、New Relicは「New Relicを導入した先」によって取れるログが異なります。

例えばアプリケーション側だと「トランザクション(Transaction)」というデータを取得できます。
その中には:

  • 1リクエストで何回DBへアクセスしたか
  • 1リクエストの応答時間
  • 1リクエストのDB応答時間
  • 1リクエストのリクエストヘッダー
    • UA、Sec-CH-UA-*、Origin
  • 1リクエストのレスポンスステータス

…などといった情報が取得できますが、RDSの様なDB側だと「データストアサンプリング(DatastoreSample)」データを取得でき…。
その中には各DBインスタンスの:

  • CPU使用率
  • キャッシュヒット率
  • デッドロック数
  • レイテンシ平均&最小値&最大値
  • スループット平均&最小値&最大値

…などといった情報が取得できます。

他にもLambdaと連携していれば、Lambdaのログデータを取得出来たり…。
k8sと連携していれば、そちらのデータも取ることが出来たりと…。
導入した先によって、むっちゃ色んなデータをものすごい量取ることができます

また、New Relicは色んなクラウド基盤に入れることが出来ます。

例えば社内で「AWS」と「Azure」を両方使っていて、両方のログを見るのにそれぞれのサービスのポータルからアクセスしないといけない、なんて事態も…。
New Relicに連携してしまえば、AWSもAzureも両方同じ「New Relic上」から見れるというメリットもあります。

そのLOGを使ってどのようなことが出来るのか

ここからは「取得したLOGを使ってどのようなことが出来るのか」を見ていきます。
New Relicでは、先に上げたデータを表示することはもちろん、「集計してグラフィカルに表示」することや「データを絞り込む」こともできます。

なお、集計にはNRQL(New Relic Query Language)というものを使います。
こちらはSQLクエリに似たような形で、データの集計や絞り込みが簡単にできる代物です。

例えば下記のNRQLだと:

SELECT Count(*)
From Transaction
FACET errorMessage

「トランザクション」データの項目「エラーメッセージ」でグルーピングし、その数を集計して表示してくれます。

大量に同系統のエラーメッセージが出力されていれば、そこからバグやパフォーマンス面の改善も出来るかもしれませんので…。
たったこれだけのNRQLでも、かなり有用なデータが取れるかなと!

また、集計以外にも「時系列データで表示」することもできます。
こんな感じに、NRQLにTIMESERIES [集計間隔]を入れてあげるだけで実現できます。
※下記の例だと、「15分おきにトランザクションデータを集計し表示」という感じです

SELECT Count(*)
From Transaction
TIMESERIES 15 minutes

構文がSQLクエリに似ているのと、クエリベースで様々に情報を表示できるので…。
ログ分析や監視業務に慣れていなくても、それっぽいデータ集計を簡単にできるのは魅力かなと!

「New Relicを使ってどんなことが出来るのか」という章はここまで。
お次は紹介したNRQLを活用し、実業務ベースの活用事例を紹介できればと!

活用事例

早速活用事例を紹介…と言いたいところですが、結構事例量が多いので。
下記のカテゴリごとに紹介できたらと思います。

  • システム監視面
  • パフォーマンスチューニング面
  • ビジネスサイド面

※なお、私が所属するReviCoというサービスで活用している事例を紹介しますが…。
ReviCoのクラウド基盤はAWSであるため、AWS絡みの用語がたくさん出てきます。事前にご了承をば。

システム監視面

DatastoreSampleデータを活用

New RelicにてDatastoreSampleという、DB関連の情報をサンプリングして表示してくれるデータがあり…。
そこを活用すれば「DBのCPU使用率」「キャッシュヒット率」「メモリ使用率」等といった情報を可視化することが出来ます。

ReviCoではDBにAmazon RDSを使用しているため、こんな感じのクエリを書けば「DBのCPU使用率のグラフ」を出すことが出来ます:

SELECT average(`provider.cpuUtilization.Average`)
From DatastoreSample
WHERE provider = 'RdsDbInstance'
  AND providerAccountId = '[AccountId]'
  AND displayName = '[displayName]'
TIMESERIES 6 minute facet displayName
FinanceSampleデータを活用

New Relicにて、FinanceSampleというコスト関連の情報をサンプリングしてくれるデータを使えば、毎月クラウドサービスにかかっているコストについても可視化することが出来ます。

下記の様なクエリを書けば、1か月ごとのクラウドサービスにかかっているコストを可視化することが出来ます。

SELECT latest(`provider.estimatedCharges.Maximum`)
FROM FinanceSample
WHERE provider='BillingServiceCost'
  AND providerAccountId = '[AccountId]'
FACET `provider.serviceName`
SINCE 1 month ago
ComputeSampleデータを活用

先ほどDBに関する可視化が出来ると述べましたが、ComputeSampleを使えばEC2やECSといったサーバー絡みのデータも可視化することが出来ます。

このデータからは「メモリ使用率」や「CPU使用率」、ECSでは「立ち上がってるコンテナの数」「待機中のコンテナの数」といった情報も見ることが出来ます。
ReviCoではECSを使用しているので、こんな感じのクエリを書けば「各コンテナサービスのメモリ使用率のグラフ」を出すことが出来ます:

SELECT average(provider.memoryUtilization.Average)
FROM ComputeSample 
WHERE provider='EcsService'
  AND providerAccountId = '[AccountId]'
  AND displayName = '[displayName]'
  AND provider.clusterName = '[displayName]'
TIMESERIES 5 minutes
FACET `provider.serviceName`

パフォーマンスチューニング面

SqlTraceデータを活用

New RelicではSqlTraceという「DBで実行されたSQLをトレースする」データがあります。
「どんなSQLが発行されたか」「そのSQLが何回呼ばれているか」「呼ばれ元のリクエストURL」「レスポンス最長時間」といった情報を見ることが出来ます。

これを使い、例えば「1秒以上かかっているSQL一覧」を出し疑似的なSlowQuery一覧を出したり…:

SELECT maxCallTime, callCount, sql, path, timestamp
FROM SqlTrace
WHERE maxCallTime >= 1
ORDER BY maxCallTime DESC
LIMIT 20

SlowQuery一覧と組み合わせ「そのSlowQueryがどこのリクエスト元から呼び出されているのか」を可視化もできます。

SELECT uri, maxCallTime, callCount, path, timestamp, sql
FROM SqlTrace
WHERE maxCallTime >= 1
ORDER BY maxCallTime DESC
LIMIT 20
Transactionデータを活用

New RelicではTransactionというトランザクションデータも取れます。
これを使えば、「クライアントのリクエスト絡みのデータ」と「レスポンスデータ」、更には「リクエスト内部で実行されたDB関連データ」まで知ることが出来ます。

具体的には「リクエスト先のURL」や「クライアントのアクセス元のoriginreferer」、「リクエスト内部で実行されたDBのレスポンスタイム」といった情報を知ることが出来ます。
「アクセスログデータとしての側面」と、「DB関連のパフォーマンスデータとしての側面」、両方のデータが見れるといったイメージでしょうか。

アクセスログデータとしての側面を活用し、この後紹介するビジネスサイド面でも大いに活用できるのですが…。
この章ではパフォーマンスデータとしての側面からお話しします。

ReviCoはマルチテナント型のサービスであるため、1つのアプリケーションにたくさんのテナント(お客様)からのリクエストが来ることになります。
そして、よくあるのが「特定のテナントさんからのアクセスが急激に上がり、負荷が高くなること」。

TVで紹介された、ネットでバズったなどアクセス急増には様々な経路がありますが…なんにせよ突然来るので、検知も難しいところです。

対策として、ReviCoでは下記の様なNRQLを使用し「テナントさん毎のアクセス数を可視化」しています。

SELECT Count(*)
FROM Transaction
WHERE appName = '[appName]'
FACET request.headers.origin
SINCE 3 days ago
LIMIT 30
TIMESERIES 15 minutes 

request.headers.originTransactionデータをグルーピングすることで実現しています。

ビジネスサイド面

Transactionデータを活用

ビジネスサイド面については、パフォーマンスチューニング面の章にて話したTransactionデータを活用出来るかと思います。

例えばReviCoでは「レビュー投稿」はPOSTメソッドで特定URLに送付し処理を行っているのですが…。
このことを活用し、この様に記載することで疑似的な「レビュー投稿率」を図ることもできます。

SELECT count(*)
FROM Transaction
WHERE request.uri = '[レビュー投稿POST先URL]'
  AND appName = '[appName]'
SINCE 1 month ago
TIMESERIES 1 day

もしSPA構成を取っているのであれば、request.uriという値を「レビュー投稿を行うAPIのリクエストURL」に書き換えるだけでも対応可能かと。

また、上記クエリはrequest.uriの部分を変えることでいかようにも応用できます!

例えばrequest.uriを「ログイン画面URL」にすれば「ログイン数状況」を見ることもできますし、
「レビュー表示時のAPIリクエストURL」にすれば「レビュー閲覧数」を見ることもできます。

URLで一意にユーザーの行動が特定できる処理であれば、上記クエリでその行動を分析することが出来ちゃうのでかなりおすすめです。

おわりに

本記事では「New Relicとは何か?」から始まり「New Relicを使うとどんなことが出来るのか」「活用事例」について見ていきました。

New Relicを使ってデータを可視化することで、「システム監視やパフォーマンスチューニングに何から取り掛かればいいか分からない」といった方の第1歩(現状のシステムを把握する)になるでしょうし、
活用事例にも上げたような「ビジネスサイドで役立つデータ」を可視化してあげれば、開発職の方以外にも役立つデータを提供できるかもしれません。

ただ、活用事例をいろいろ上げましたが「New Relicを使えば、まだまだもっともっといろんなことが出来る」と思っていますので…。
もっともっとNew Relicのことを知って、その活用方法を模索していきたいです。

といったところで本記事はここまで。
それでは~!

ecbeingでは、新技術を活用し広めてくれる仲間を募集しています!

careers.ecbeing.tech