Herokuでのログ収集と監視について調べてみた

LINEで送る
Pocket

こんにちは。
Goに入門してからはHerokuにGoのアプリをデプロイするようになり、それをきっかけにHerokuについて調べる機会が多くなりました。

今回はHerokuでログ収集+監視をする方法について調べてみました。
単にログを見るだけならheroku logsコマンドで十分なのですが、特定のログが吐かれた時や、高負荷時などを検知して携帯に通知できるような仕組みを探してみたので備忘録を残します。

結論

Papertrailを採用しました。
以下に調査の詳細を書いていきます。

作っているものの要件

  • 1000~10000リクエスト/日 程度の小さなAPIサーバ
  • 言語はGo、WAFはginで実装
  • 趣味プロダクト でサーバの管理したくないのでHerokuにデプロイ

趣味プロダクトなら、という目線で見ているので業務レベルでの選定はしてません。悪しからず。

ログ収集+監視に求めるもの

調べるにあたってログ収集に求めていたものは以下でした。

  • 基本無料 + お手頃な有料プランが有ること
  • ソースコードに影響しない
  • 導入が簡単
  • 通知機能

基本無料を求めるのは、開発環境にお金を払いたくないから。
性能はしょぼくてもいいので動いてくれること。本番と開発用で違うプラグイン使ったり、環境判定のコードなどを混ぜたくないためです。
あわせて お手頃な有料プラン も求めているのは、本番環境ではお金を払うためです。
もちろん無料でも十分な性能ならぜひ利用したいですが、無料にこだわっているわけではないので。でも、有料プランの最低料金の障壁があまりに高いと、少し財布の紐が硬くなってしまいます。
要約すると 「小さく初めて必要性がでたらプランを上げる」 ことができるステップが存在することを求めています。

次に ソースコードに影響しない は、バグリスクの削減と、プログラムの動作速度を可能な限り早めるためです。
ソース内でどこぞのサーバと通信したりなんだり、ということをしてしまうと遅いってレベルじゃなくなってしまうので論外です。
アプリケーションサーバはあくまで標準(エラー)出力 or ログファイルに出力するだけ
それを受け取ったHerokuのログを見てくれるものを探しています。

導入が簡単 なのは言うまでもなく面倒複雑さを減らし、ドハマりやエッジケースでにっちもさっちもいかなくなることを防いで丸く納めるためです。

通知機能 をログ収集サーバがすべきかについては諸説ありますが、今回の要件なら本格的なサーバの監視をするわけではないので、まぁログサーバ側で見ればいいよね、といった感じです。
「特定のログが吐かれたら**、なるべくリアルタイムで監視+通知の自由度が高い」 ものを求めています。
ここはちょっと欲が出ているので、最悪無くてもいいやと思って探しました。

調べたものと概要

調べて・試してみた情報と、その概要です。

断念: Log drain + ホスティング

  • Herokuのログを他サーバに垂れ流せる機能
  • Heroku使ってんのにログサーバを自前で管理しなきゃいけない
  • いいホスティングサービスが見つからなかった

断念: TreasureData + fluentd

  • 14日の無料体験アカウント+その後有料

断念: Bonsai.io + Elasticsearch + Kibana

  • 最低でも有料

断念: Mackerel

  • ドキュメントが丁寧にかかれているのですが、めんどくせと思ってしまい断念

採用: Papertrail

  • いい感じ

1つずつ詳細を書きたいと思います。

断念: Log drain + ホスティング

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

断念: TreasureData + fluentd

ログの収集や解析を調べているとだいたいセットで出てくる「fluentd」、実際に使ったことが無いのでなんとなく概要しか知らないのですが、これを期に使ってみようかと思いました。

ということで「heroku fluentd」と調べてみたところ、fluentdを制作していらっしゃるTreasureDataさんの記事が見つかりました。

だがしかしTreasureDataのアカウントが必要。 しかもTreasureDataのアカウントは14日間のフリートライアル。その後は、、、調べてもわからなかったので資料請求してみましたが、それでも料金プランなどの記載はありませんでした。

ものすごく高機能で高性能で高精度で、名だたる企業さんも導入していたりといい事尽くしですが、 これだけ色々できて有名なサービスで値段調べても出てこないならtoB向けで、かつ安いわけない 。と勝手に推測し、残念ながら趣味プロダクトの身の丈には合わないと判断して断念しました。

こちらの記事も参考になりました。
TreasureData – 世界最速でFluentdを立ち上げる on Heroku – Qiita

断念: Bonsai.io + Elasticsearch + Kibana

「Kibana hosting」と調べたら偶然出てきたサービスです。
Elasticsearchのクラスタリング、Kibanaのホスティングあたりをまるっと提供してくれる粋なサービスです。
Herokuのアドオンもあったので見てみたところ、 残念ながら最低でも10$/m
月千円くらいええやんケチ と自分に突っ込んでしまいましたが、まだ妥協するには早い。他に選択肢がなければ1000円払おう。と考えつつ、保留しました。

※結果としては後述のPapertrailを採用したので見送りになりました。

断念: Mackerel

ドキュメントが丁寧に書かれていて大変申し訳無いのですが、設定手順長い。めんどくさい。と思ってしまいました。

Mackerelの料金的には無料でもある程度使えるし有料プランも月2000円と悪くないお手軽さなのですが、この高機能さが必要になったら求めてみようと思います。今回は断念。

採用: Papertrail

採用しました。まさに条件ピッタリなサービスでした。
最初にログドレインについて調べていたので、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もそれを収集・フィルタできるので、落ち着いたタイミングでアクセスログの解析などもできそうです。

まとめ

色々と試してみましたが、ホットな話題には触れられない結果に終わりました。
代わりにバズワードに惑わされず自分の要件に合うものを探し続けたら見つかったので、その点何かを探す時のモチベーションにしたいなと思いました。

もしこの記事を読んでいて同じような悩みを抱えてる方がいらっしゃいましたらPapertrailを使ってみると良いと思います。

LINEで送る
Pocket