こんにちは。
Go に入門してからは Heroku に Go のアプリをデプロイするようになり、それをきっかけに Heroku について調べる機会が多くなりました。
今回は Heroku でログ収集+監視をする方法について調べてみました。
単にログを見るだけならheroku logs
コマンドで十分なのですが、特定のログが吐かれた時や、高負荷時などを検知して携帯に通知できるような仕組みを探してみたので備忘録を残します。
Papertrailを採用しました。
以下に調査の詳細を書いていきます。
趣味プロダクトなら、という目線で見ているので業務レベルでの選定はしてません。悪しからず。
調べるにあたってログ収集に求めていたものは以下でした。
基本無料を求めるのは、開発環境にお金を払いたくないから。
性能はしょぼくてもいいので動いてくれること。本番と開発用で違うプラグイン使ったり、環境判定のコードなどを混ぜたくないためです。
あわせて お手頃な有料プラン も求めているのは、本番環境ではお金を払うためです。
もちろん無料でも十分な性能ならぜひ利用したいですが、無料にこだわっているわけではないので。でも、有料プランの最低料金の障壁があまりに高いと、少し財布の紐が硬くなってしまいます。
要約すると 「小さく初めて必要性がでたらプランを上げる」 ことができるステップが存在することを求めています。
次に ソースコードに影響しない は、バグリスクの削減と、プログラムの動作速度を可能な限り早めるためです。
ソース内でどこぞのサーバと通信したりなんだり、ということをしてしまうと遅いってレベルじゃなくなってしまうので論外です。
アプリケーションサーバはあくまで標準(エラー)出力 or ログファイルに出力するだけ 。
それを受け取った Heroku のログを見てくれるものを探しています。
導入が簡単 なのは言うまでもなく面倒複雑さを減らし、ドハマりやエッジケースでにっちもさっちもいかなくなることを防いで丸く納めるためです。
通知機能 をログ収集サーバがすべきかについては諸説ありますが、今回の要件なら本格的なサーバの監視をするわけではないので、まぁログサーバ側で見ればいいよね、といった感じです。
「特定のログが吐かれたら**、なるべくリアルタイムで監視+通知の自由度が高い」 ものを求めています。
ここはちょっと欲が出ているので、最悪無くてもいいやと思って探しました。
調べて・試してみた情報と、その概要です。
1 つずつ詳細を書きたいと思います。
Heroku にはLog Drainsという機能があります。
Logplex のドレイン(外部への排出機能)は、Heroku のログを外部のシステムログ管理用サーバーへ長期間アーカイブするために、転送することを許可しています。Heroku のシステムログのパケットを取得可能とするためには、Logplex のドレイン、またはシステムログ管理用サーバー自体を設定する必要があります。この設定の後で、システムログの URL(ホスト名とポート番号を含む)をドレインとして追加する必要があります。
ドレインするログは、 RFC5424 に沿ってフォーマットされます。これらは RFC6587 で説明される TCP プロトコルと octet counting framing method を経由し伝達されます。
ログ監視系のサービスを見つけるには、Heroku アドオンを訪問して下さい。
— システムログを外部へドレイン(排出)する
邦訳記事に感謝します。
ということで、 ドレインの機能を使用してログをどこかしらのサーバへ垂れ流せばよいのでは? という過程で調査をすすめていきました。
ログサーバを自前でホスティングすれば Fluentd+Elasticsearch+Kibana だったり BigQuery だったりと何でもやれますが、Heroku にしたきっかけが自分でサーバを持ちたくないことなので、本末転倒になってしまうため選外としました。
Heroku アプリのログを fluentd で ElasticSearch に突っ込んで Kibana で監視する方法 – hakobera’s blog
ログの収集や解析を調べているとだいたいセットで出てくる「fluentd」、実際に使ったことが無いのでなんとなく概要しか分からないのですが、これを期に使ってみようかと思いました。
ということで「heroku fluentd」と調べてみたところ、fluentd を制作していらっしゃるTreasureData さんの記事が見つかりました。
だがしかし TreasureData のアカウントが必要。 しかも TreasureData のアカウントは 14 日間のフリートライアル。その後は、、、調べてもわからなかったので資料請求してみましたが、それでも料金プランなどの記載はありませんでした。
ものすごく高機能で高性能で高精度で、名だたる企業さんも導入していたりといい事尽くしですが、 これだけ色々できて有名なサービスで値段調べても出てこないなら toB 向けで、かつ安いわけない 。と勝手に推測し、残念ながら趣味プロダクトの身の丈には合わないと判断して断念しました。
こちらの記事も参考になりました。
TreasureData – 世界最速で Fluentd を立ち上げる on Heroku – Qiita
「Kibana hosting」と調べたら偶然出てきたサービスです。
Elasticsearch のクラスタリング、Kibana のホスティングあたりをまるっと提供してくれる粋なサービスです。
Heroku のアドオンもあったので見てみたところ、 残念ながら最低でも 10$/m 。
月千円くらいええやんケチ と自分に突っ込んでしまいましたが、まだ妥協するには早い。他に選択肢がなければ 1000 円払おう。と考えつつ、保留しました。
※結果としては後述のPapertrailを採用したので見送りになりました。
ドキュメントが丁寧に書かれていて大変申し訳無いのですが、設定手順長い。めんどくさい。と思ってしまいました。
Mackerel の料金的には無料でもある程度使えるし有料プランも月 2000 円と悪くないお手軽さなのですが、この高機能さが必要になったら求めてみようと思います。今回は断念。
採用しました。まさに条件ピッタリなサービスでした。
最初にログドレインについて調べていたので、Heroku のアドオン検索画面で「drain」と調べたら偶然ヒットしました。
Fluentd, Elasticsearch, Kibana などのナウい感じではないですが、 ちょうど趣味プロダクトのスケール感に合いそうでちょいど良い ともっとも感じたサービスです。
このサービス通知機能が協力で、ログをフィルタして、n
分間にm
行以上マッチするログが出現したら**
する、という設定ができます。
通知の方法も豊富で、Slack や HipChat、Zapier や Pushover、更にはメール通知や WebHook も使えるのでもはや何でもありです。
Heroku のアドオンも基本無料、次が 7$とお手軽感満載。
Heroku でよく出るログはあらかじめフィルタとして登録しておいてくれるし、なんだこの優しさは。初心者向けとはこういうことを言うんだと感動するちょうど良さでした。
ログが収集されるまでのラグも 3~10 秒くらいなので速くはないですが、余裕の許容範囲内です。
ログのアーカイブを S3 に転送できたり、サービスで保持できるログ容量の拡張も細かくできるので、いざとなれば札束で殴ることができそうです。
また、Heroku で自動的に吐かれてしまうログを収集しないこともできるので、ケチろうと思えばケチれるという幅の広さも魅力の一つだと思います。
導入も最初手間取りましたが必要な手順は少なく、通知の設定も簡単です。
導入にあたり下記の2記事が参考になりました。ありがとうございます。
— heroku のログ管理は Papertrail がいい感じ – Oh! My! Enter! ~バッチを起動しようと勢いよくキーを叩いたら、それはシフトキーだった~
— heroku に papertrail を導入して、アラートを hubot 経由で slack へ通知する
デフォルトでついてるデプロイのログと、Dyno のステータスが変わった時のログ、あとアプリケーションのログであるキーワードに引っかかるログが 1 時間に 1000 行以上出たら要警戒、それぞれを Slack に通知するように Alert を設定しました。
要警戒と言いつつ、特に何もやばくないんですが今後アプリケーションログを監視するなら事前に試しておきたいので設定してみた次第です。
Slack が私の携帯に入っているので、これでわざわざログを見に行かなくても、しかるべきタイミングでメッセージ(を通知する push 通知)が届きアラートとして使用できそうです。
Heroku もデフォルトでアクセスログも残してくれており、Papertrail もそれを収集・フィルタできるので、落ち着いたタイミングでアクセスログの解析などもできそうです。
色々と試してみましたが、ホットな話題には触れられない結果に終わりました。
代わりにバズ Word に惑わされず自分の要件に合うものを探し続けたら見つかったので、その点何かを探す時のモチベーションにしたいなと思いました。
もしこの記事を読んでいて同じような悩みを抱えてる方がいらっしゃいましたらPapertrailを使ってみると良いと思います。