フレクトのクラウドblog re:newal

http://blog.flect.co.jp/cloud/からさらに引っ越しています

Heroku NewRelic APMを始めよう!

こんにちは。エンジニアのオクダです。今回のテーマは「Heroku NewRelic APMを始めよう!」です。

必要最小限の工数でNewRelic APMを利用する方法についてご紹介いたします。

Heroku NewRelic APMとは

まず最初に、Heroku NewRelic APMとは、ということで、 この章では、Heroku NewRelic APMで何ができるか? ということについて説明します。

NewRelicで何ができる

サーバーの監視に必要なことは一通り揃っています。 死活管理も追加できます。その場合、New Relic Syntheticsを利用することになります。 ジョブの状態が分かるので、ジョブの謎の死にも気づける可能性もあります。 モニタリングに必要なスクリプトAPM agentが自動で注入してくれるので、設定は不要となっています。 インフラ監視用のNew Relic Infrastructureもありますが、別途料金が発生します。

Heroku NewRelic APMについて、ご説明

NewRelic APMはアプリケーションパフォーマンス監視ツールであります。HerokuにはNewRelic APMがAdd-onsとして用意されています。 SaaSビジネスにおいて、顧客ごとにactivity, 品質保証(SLA), 業績評価(KPI)を監視したいというニーズがあります。

NewRelic 活用事例

使用した模擬的弊社のサービス実装、について説明します。

実装の経緯

模擬的にシステムを作り、データを再生して流し込み、 NewRelicでどんなことができそうか探索してみました。

模擬的実装

使用した模擬的Architectureです。 f:id:flect170:20191118150949p:plain Google BigQueryからデータをamazon Kinesisに送信

amazon KinesisからAmazon DynamoDBに時間ごとに送信

Amazon DynamoDBで受信したサブスクリプションIDやデバイスIDを保存

ClientはAmazon EC2を使用して、Amazon DynamoDBに保存されたデータを取得します

New Relicでそれぞれの経路のトランザクションを確認します

やりたいこと

顧客ごとの「システム健全度」をレポートします。 例えば、Google BigQueryに蓄積されたデータから、顧客毎のDynamoDBへの書き込み処理にどれくらいの所要時間を擁しているか? 全ての書き込み処理が正常に行われ終了しているか?を確認します。

実現方法

Custom Parameterを活用します。 NewRelicではカスタム属性を設定する事により、遅かったり失敗したりしたリクエストに関連するカスタム属性(顧客ID、デバイスID)を追跡することができます。 例えば、顧客ID毎に応答時間を計測できれば、顧客に対する品質保証を証明できたり、デバイスID毎に応答時間を計測できれば、雇用者の業績評価の指標に利用したりできます。

NewRelic APMの使用方法

ここでは、NewRelic APMのインストール アプリケーションの編集について、説明します。

NewRelic APMのインストール

NewRelic APMのインストール画面です。 f:id:flect170:20191118131842p:plain Heroku Add-onsより、NewRelicを追加すると、Install the agentページに移動します。(今回のプロジェクトはPython) 指示通り、Get your license keyで、ライセンスキーを取得します。 Install the NewRelic agentでnewrelicをインストールします。 Generate the configuration using license keyで、先ほど取得したライセンスキーに置き換えて、newrelic.iniファイルを生成します。

NewRelicのデータって?

NewRelicの世界では「トランザクション」が、送信データの1行に相当します。(以下NRTと表記) Webリクエストなどは自動的に一つのNewRelicトランザクションと認識してくれます。 バックグラウンドジョブでは、明示的にNewRelicトランザクションがどの単位になるのか、定めなければなりません。 background taskを明示的にコードで宣言する必要がある。

Custom Parameterとは

NewRelicトランザクションに任意につけられます 設定方法は 既存のアプリケーションコードに、NewRelicのライブラリをインポートします。

import newrelic.agent

エージェントの初期化で、先ほど作成したnewrelic.iniを読み込みます。

import newrelic.agent

あとは、監視したいところにCustom Parameterのキーと値を追加していくのみです。

    application = newrelic.agent.application()
    with newrelic.agent.BackgroundTask(application, name='put_item', group='Task') as tr:
        tr.start_time = starttime
        tr.add_custom_parameter('Subscriptionid', json_dict['Subscriptionid'])
        tr.add_custom_parameter('Deviceid', json_dict['Deviceid'])
        tr.add_custom_parameter('latitude', json_dict['latitude'])
        tr.add_custom_parameter('longitude', json_dict['longitude'])
        tr.add_custom_parameter('Process', 'DynamoDB')
        tr.add_custom_parameter('Error', json_dict['Error'])

Custom Parameterについて、詳しくはこちら

docs.newrelic.com

監視できない嵌りどころ

Main関数自体を監視対象とすることができません。 Local関数が一つしかない場合は、その関数が監視対象となります。 関数が複数存在する場合、監視対象関数を明示的に修飾しなければなりません。 デコレーションbackground_taskのname引数に関数名、groupはオプション、指定しているとAPMトランザクション画面で同じgroupに所属している関数名別のレスポンス時間を表示したりできます。

NewRelic APMを使用して、実際に計測してみる

ここでは、NewRelic INSIGHTS画面でのパフォーマンス監視 代表的なNRQL構文、について紹介します。

NewRelic INSIGHTS画面でのパフォーマンス監視

f:id:flect170:20191118150842p:plain SELECT文で、パフォーマンス監視対象をINSIGHTS画面に表示しています。

代表的なNewRelicクエリ構文

SELECT文、FROM句、WHERE句、AS句、LIMIT句、SINCE句、他サポートされていますが、 監視ツールなので、UPDATE文等の更新処理が入るクエリ構文はありません。 2つのTABLEをJOINしたくなったりしますが、JOIN句は用意されていません。

代表的な集約関数

Count(*)、average関数、latest関数、uniques関数、他にも、最大、最小、ユニークカウントなどが用意されています。

顧客ごと集計クエリの例です。

SELECT average(duration) FROM Transaction WHERE Process = 'DynamoDB' FACET sid LIMIT 30 SINCE 30 minutes ago TIMESERIES 1 minute

上記のクエリでは、NewRelicトランザクションから顧客ごと、最大30件まで、過去30分間の1分毎のDynamoDBへの書き込み時間の平均値をクエリしています。 これにより、当該顧客で影響が出たのかどうかを集計することができました。

どうでしたか?参考になりましたでしょうか?

Heroku NewRelic APMについて、ご紹介させていただきました。

最後まで、読んでいただき有難うございました。

NewRelicの公式サイトもご覧ください。

newrelic.co.jp