📈

Scala + Play on HerokuなWebアプリにNew Relicを導入

2021/05/14に公開

はじめに

Herokuの無料(Hobby)範囲内でNew Relicを無料で利用することができる。New Relicはアプリケーションのモニタリングツールであり、メモリ量やGCのことや外部APIアクセスのレスポンスタイムなど様々なデータをモニターすることができる。下記のようにグラフィカルな表示もしてくれる。

New Relicの公式のドキュメントにはJARファイルをいったんZIP展開したうえで、そこにYAMLファイルを設置して再びJARに戻すといった手順が紹介されているが、実はそのようなことをしなくてもbuild.sbtなどへの記述 + 環境変数の追加だけで導入することができる。この記事ではHerokuを前提にNew Relicをどのように導入するかについて解説する。
この記事で紹介したコードを利用したプログラムが下記のリポジトリーに設置されている。

1. New Relicの情報を入手

New Relicのコンソールにある+ Add more dataボタンをクリックして、いくつかある種類の中からとりあえずApp monitoringにあるJavaを選んでおく。

そのあと色々入力していくと、下記のようにNew Relicのライセンス情報をダウンロードできるようになる。この内容を後の設定で利用するためnewrelic.ymlをダウンロードしておく。

2. build.sbtproject/plugins.sbtの設定

まずproject/plugins.sbtに下記のようにsbt-javaagentのプラグインを追加する[1]

project/plugins.sbt
addSbtPlugin("com.heroku" % "sbt-heroku" % "2.1.4")

addSbtPlugin("com.lightbend.sbt" % "sbt-javaagent" % "0.1.6")

そのうえで、build.sbtにNew Relicのエージェントを起動する設定を追加する[2]

build.sbt
lazy val root = project
  .in(file("."))
  .settings(
    javaAgents += "com.newrelic.agent.java" % "newrelic-agent" % "6.5.0"
  )
  .enablePlugins(PlayScala, JavaAgent, JavaAppPackaging)

このようにsettingsnewrelic-agentを追加を追加すればOKである。

3. Herokuの環境変数を追加

これですでにScala + PlayのWebアプリケーションはNew Relicエージェントが起動する状態ではあるが、ライセンス情報などが設定されていないため、起動させると必要な情報がないとなって即落ちてしまう。そこで手順(1)で入手したnewrelic.ymlの冒頭は次のようになっている。

newrelic.yml
common: &default_settings

  # ============================== LICENSE KEY ===============================
  # You must specify the license key associated with your New Relic
  # account. For example, if your license key is 12345 use this:
  # license_key: '12345'
  # The key binds your Agent's data to your account in the New Relic service.
  license_key: XXXXXXXXXXXXXXXXXXXXXXXXXX

  # Agent Enabled
  # Use this setting to disable the agent instead of removing it from the startup command.
  # Default is true.
  agent_enabled: true

  # Set the name of your application as you'd like it show up in New Relic.
  # If enable_auto_app_naming is false, the agent reports all data to this application.
  # Otherwise, the agent reports only background tasks (transactions for non-web applications)
  # to this application. To report data to more than one application
  # (useful for rollup reporting), separate the application names with ";".
  # For example, to report data to "My Application" and "My Application 2" use this:
  # app_name: My Application;My Application 2
  # This setting is required. Up to 3 different application names can be specified.
  # The first application name must be unique.
  app_name: kindle-clock

重要なのはこの中のcommon.license_keycommon.app_nameの2つである。この2つを次のようにHerokuの環境変数に設定する。

  • NEW_RELIC_APP_NAME …… common.app_name
  • NEW_RELIC_LICENSE_KEY …… common.license_key

ちなみにこれらの環境変数を読み込む設定はNew Relicエージェントに元々搭載されているので、こちらで何か実装する必要はない。

4. Herokuへのデプロイ

ここまで行えばあとはsbt-herokuを利用していれば簡単である。下記のコマンドを実行すればよい。

$ sbt stage deployHeroku

まとめ

このようにsbt-javaagentを利用すればJAR(ZIPファイル)を展開してYAMLファイルを注入するといった、ややダーティーな方法を回避しつつScala + PlayなWebアプリでNew Relicを利用することができる。この方法であれば、たとえばScala Stewardによる自動ライブラリーアップデートPull Request作成機能の恩恵を受けやすいと考えられる。

脚注
  1. この記事がHerokuを前提としているため、デプロイにはsbt-herokuを利用しているということで進めている。筆者はこのようにしたが、おそらく必ずしもsbt-herokuを利用する必要はないと思われる。 ↩︎

  2. ここでも記事の前提としてPlayframeworkを利用しているので、enablePluginsでこれをONにしている。 ↩︎

Discussion