Herokuのアプリケーションログを統合してパフォーマンスやエラーの分析を効率化する

所要時間:約 7分

この記事は2020年12月12時点のものです。Herokuのログを直接New Relicに送る機能が2021年3月17日時点でサポートされていますのでそちらをご利用ください。


New Relicは、クラウド・オンプレ問わずデジタルサービスを観測可能ですが、PaaSであるHeroku上に構築されたアプリケーションももちろん対象であり、APMやBrowser、Mobileといった機能によってアプリケーションのパフォーマンスモニタリング、リアルユーザーモニタリング(RUM)が可能になっています。

ここではアプリケーションの実行基盤であるDynoに出力されるアプリケーションのログをNew Relicに統合する方法を説明します。ログをNew Relicに統合することによって、トラブルシュートに必要な情報を一元化できるだけでなく、APMによるアプリケーションのパフォーマンス分析やエラー分析の過程でシームレスにログを活用することが可能になり、運用効率を圧倒的に改善することが可能になります。

大まかな流れは以下画像の通りです。本投稿時点では、Heroku DynoのログをNew Relicに送る方法は、APIを利用するか、もしくはFluentDなどのログ収集ツールを活用する方法のいずれかになります。Dyno上のアプリが出力したログを、別のDyno上で動くFluentDに転送し、FluentDにインストールされたNew RelicのFluentDプラグインを介してNew Relicに登録されます。アプリケーションが動作するDynoからFluentDへのログ転送は、Herokuの機能であるHTTPS drainsを利用します。New RelicのFluentDプラグインについてはオンラインドキュメントを参照ください。

設定手順は以下です。

  1. New Relicにログを登録するためのInsert API Keyを取得する
  2. Heroku DynoにFluentDをデプロイする
  3. HTTPS drainsを設定し、アプリケーションが出力するログをFluentDに転送する
  4. New RelicのUI上でログが転送されていることを確認する

一つ一つ説明していきます。

 

1. New Relicにログを登録するためのInsert API Keyを取得する

Herokuに限らずFluentDを活用してNew Relicにログを転送する場合は、New RelicのInsert API Keyが必要となります。このAPI KeyをFluentDの設定ファイル(fluent.conf)に設定することで、FluentD用のNew RelicプラグインがそのAPI Keyを活用してNew Relicにログを登録します。

Insert API Keyの取得手順は、オンラインドキュメントを参照してください。

2. Heroku DynoにFluentDをデプロイする

Herou DynoにFluentDをデプロイします。ここでは簡単のため、GitHubにOSS公開されているコードを利用します。このサンプルを使ってデプロイされるアプリケーションは以下3つのパッケージを利用しています。

まず、上記リポジトリをクローンしておきます。手順はREADMEを参照ください。アプリケーションログのフォーマットなどに応じてFluentDの設定ファイル (fluent.conf) 変更します。

次に、以下のコマンドでHeroku上にFluentD用のアプリケーションを作成します。アプリケーション名は、newrelic-log-forwarderとします。

heroku apps:create newrelic-log-forwarder

Herokuの画面上でアプリケーションができたことが確認できました。

 

今回利用するリポジトリに登録されているfluent.confでは、API Keyは環境変数から取得するように設定されているので、冒頭で取得したAPI Keyを以下のコマンドでHerokuの環境変数として登録しておきます。

heroku config:set NR_API_KEY=<API Key> -a newrelic-log-forwarder

Herokuの画面上で環境変数が設定出来たことが確認できました。

最後に、Dynoにアプリケーションをデプロイします。

git push heroku master

無事にデプロイされました。

3. HTTPS drainsを設定し、アプリケーションが出力するログをFluentDに転送する

以下のコマンドを実行し、HTTPS Drainsを使ってメインのアプリケーションのログをFluentDに転送します。ここではメインのアプリケーションは、nrlabs-petclinic-herokuという名前で動作していると仮定します。

heroku drains:add https://newrelic-log-forwarder.herokuapp.com/newrelic.nrlabs-petclinic-heroku -a nrlabs-petclinic-heroku

HTTPS Drainsが正しく設定されたかは以下コマンドで確認します。

heroku drains -a nrlabs-petclinic-heroku

4. New RelicのUI上でログが転送されていることを確認する

New Relic LogsのUIでHeroku上のアプリケーションからログが転送されているかを確認します。hostnameなどを見るとHeroku上のアプリケーションから転送されていることが確認できました。

 

さらなるログ活用の効率化に向けて

今回はDyno上で稼働するアプリケーションのログをNew Relicに転送する方法を説明しました。さらに、Logs in Contextという機能を活用することによって、アプリケーションの性能分析やエラー分析の中で効率的にログを活用することが可能になります。Logs in Contextは、出力されるログにトランザクション情報を付与してトランザクションとログを関連付けることで、トレースやメトリクスとログをシームレスに分析することを可能にします。Logs in Contextの詳細については以下をご参照ください。

ブログ:Logs in Contextのセットアップ概要, オンラインドキュメント

 

New Relicを試してみたい方はこちらへ。

無料トライアル