valid,invalid

関心を持てる事柄について

New Relic APMを使って、一定時間アクセスが無くても Dyno をスリープさせないようにする

先日公開した Haiku Matcher で使っている Heroku の Dyno(プロセス) は一定時間(1時間?)アクセスが無いとスリープしてしまう。(IDLE状態になってしまう)

New Relic APM を使って叩き起こし続けることにした。

Heroku のスリープについて

会社の元同期に「Dyno寝てるっぽいよ」と教えてもらって、「あ、眠るんだ…」と知りました。

知っておきたい!Herokuを使う上では当たり前?の16の常識 | mah365 - 

確かに、暫く放置した後のアクセスにはレスポンスが急激に遅くなっていた。
また、Heroku の Personal Apps ページで対象のアプリケーションの六角形アイコンを見てみると、六角形の中に"zzz" が表示されていた。

Dynoとは
Dynoはアプリケーションサーバの1プロセスで、アプリケーションサーバThin(http://code.macournoyer.com/thin/)をベースにしているもののようです。Dynoは追加購入すれば、ユーザは柔軟に増やすことができ、2秒で起動するとのことです。
フレクトのクラウドBlog: Herokuについて調べたことのまとめ - 
スリープさせないためには。
  1. Dyno を増設する
  2. シェルなどで定期的に ping 打つ
  3. Heroku Addon の New Relic APM を使う
1.は課金することになってしまうので今回はパス。
2.は実行用の環境を用意するのが面倒なので今回はパス。

今回は無料プランがあり、Addon ということで簡単に導入できそうな3.を採用。

New Relic APM の導入

検索するといろんな言語での導入方法が出てくるが、今回は Java, かつ Play Framework を利用していたので下記を参考に実践した。
adding new relic addon to heroku play framework 2.2.1 java app - Stack Overflow - 

Amit Sharma 氏の answered Jan 28 '14 at 6:07 の投稿通りに実行した結果、1時間後でもスリープしていないことが確認できた。

上記内容で導入できたと思っていたら、できていなかった。
New Relic のページ見たらアプリケーション情報が表示されず、newrelic agent がそもそも起動してなかったと判明した…。

Java - Play2.2をherokuで動かした時にはまったポイント - Qiita - を参考にやり直したらうまくいったので、方法をきちんとまとめておく。

1) 決済情報を登録する。Heroku ダッシュボードから [Manage Account] → [Billing] で登録しておく。完了していればスキップする。登録していないと 2) で下記エラーが出る。
Adding newrelic:stark on your-app-name... failed
 !    Please verify your account to install this add-on plan (please enter a credit card)
 !    For more information, see https://devcenter.heroku.com/categories/billing

2) アドオンを入れる。
$ heroku addons:add newrelic:stark

3) 依存ライブラリを追加する。build.sbt に下記を追記する。
"com.newrelic.agent.java" % "newrelic-agent" % "3.12.1"
※newrelic-api は不要だった。
※最初にてきとうに 3.1.0 を選んだらエラー出て、Java8に対応してなかった。今回はJava8を使っているので、対応しているバージョンを選択した。

4) New Relic 関連のファイルを配置する。
ファイル群は New Relic の管理ページ → Application タブのページから取得できるはず。(自分のアプリが正常に連携されてからそのページが開けなくなった…)
・newrelic.yml のみルートディレクトリに配置する。
・それ以外(jarなど)は lib/ に配置する。

5) Procfile にVM引数を追加する。
-J-javaagent:lib/newrelic.jar
※Play2.2から JAVA_OPTS に設定してもダメとのこと。

6) ここまでの変更をコミット、Heroku へデプロイする。
$ git add .
$ git commit -m "optional message"
$ git push heroku master
数分後、New Relic の管理ページ →アプリケーションタブのページに自分のアプリ名が表示される。

7) New Relic の Monitoring 対象に自分のサイトを加える。
New Relic の管理ページ → Applications タブ → [自分のアプリ名] → Availability Monitoring → URL Monitor に自分のサイトのURLを入力する。
(参考)1DynoなHerokuをNew Relicでアイドルを回避 - PILOG - 




感想

簡単だと思ったら色々とハマった。Heroku Scheduler の方が簡単だったかも。

(参考)Heroku Scheduler

【環境 】

・Java8
・Play Framework 2.2.6