レポーティング、モニタリング、監視で使うストレージは何が良いんだろう

題記のようなことを考えていて、レポーティング、モニタリング、監視で使うストレージは全部統一されているほうが当然運用が楽だと思うのですが、現状だと統一できなくて用途ごとに分けてHadoop, Prometheus, Elasticsearchに格納するというのが僕の今のところの見解です。


僕は日頃の仕事はログ分析基盤を構築、運用をしつつデータ加工バッチを書いたりしています。

各サービスのPV, UUといったメトリクスを日々レポーティングするのであればアクセスログ、アプリケーションログ、各サービスのマスターデータ(例:ユーザ情報、商品マスタ)などをHadoopにぶっ込んでHiveでdailyで集計すればことたります。

Hadoopの良いところはSchema on readでとりあえずデータをぶっ込んでおいて後で解析できるところです。しかも容量やCPUパワーが足りなくなったら台数ふやぜば簡単にスケールアウトできる。これはNetezza(Pure Data)のような商用DWHではできないことです。


一方でバッチ処理でレイテンシはどうしても高くなるので、うちの環境ではPrestoを使っています。

バッチ以外の要件としてリアルタイム処理があります。

例えばサービスがどこでどれぐらい盛り上がっているかリアルタイムに知りたいっては要件として理解できます。

この場合でもNorikraで集計するという手段はあるのですが、高トラフィックになると厳しいです。例えば秒間1万メッセージとかだったら無理だと思います。

その場合は何使うかというと、Storm, Flink, Spark Streaming, PipelineDBあたりが候補になると思います。

Kibanaがダッシュボードツールとしては優れているのでKibanaを使いたい場合はNorikraで集計してElasticsearchに突っ込んでKibanaで見るという形になります。

Elasticsearchで集計するという手もありますが、その場合はElasticsearchで詰まらないように気をつける必要があります。

NorikraはSQL書いて登録すれば他は何も再起動しないで集計できるので便利なのですが、そのカジュアルさの反面、スケールしないのでモニタリング用途で使うのが良いのかなと思ってます。

例えばメルカリでのNorikraの活用、 Mackerelを添えてのように。


モニタリングの話が出たので見たいものを整理します。

  • サービスごとのビジネス的なメトリクス。主に企画者が見る。
    • 売り上げ, PV, UU, 新規UU, 離脱率, 継続率など
  • サービスごとの開発者的なメトリクス。主に開発者が見る。
    • JVM, キューのサイズ, APIのリクエスト数、レスポンスタイムなど
  • マシンごとのメトリクス。主にインフラエンジニアが見る。
    • HDD使用率、CPU使用率、メモリ使用量、ネットワークトラフィックなど

これらのすべてのメトリクスをFluentdを使って収集することは可能ですが、Jenkinsをジョブ管理ツールとして使うぐらい僕には違和感があります。便利なので本来のユースケース以外のものにも適用したくなるのはわかりますが。

同じ理由でKibanaをモニタリングツールとして使うのは正直微妙だなと思ってます。ただしミドルウェア(例:Apache, HBase)のログをFluentdを使って収集してElasticsearchに突っ込んでKibanaで検索するのはアリだと思います。

例えばOutOfMemoryとかERRORとかの文字列で検索するのは便利ですよね。Elasticsearchはモニタリングツールじゃなくて検索ツールだと思ってるのでKibanaでHDD使用率とかを見るのはどうなのかなあと思ってます。

僕は今のところ、開発者やインフラエンジニアが見るメトリクスはPrometheus+Grafanaで考えています。理由はGrafanaの見た目がかっこいいことと、Prometheusがクエリ機能を持っていてKibana的に使えるから。あとPull型なので出力で詰まらないから。

Prometheusを使う場合は、マシンごとのメトリクスならnode_exporter、JVM周りのメトリクスならjmx_exporter、でことたります。それ以外は必要に応じてexporter使えば良いです。例えばRedis使っているならredis_exporterなど。

なので、企画者が見るメトリクスはHadoopに入れて、開発者やインフラエンジニアが見るメトリクスはPrometheusに入れて、ログ検索したいなら生ログをElasticsearchに入れるのが良いかなと思ってます。

この時点で3つストレージが登場してくるのがアレなわけですが、現時点では統一するのが難しいかなと思ってます。


監視についてですが、本来モニタリングと監視はセットになっているべきです。だって例えばJava Heapサイズをモニタリングしつつ監視の閾値も柔軟に変えたいでしょ。GangliaでモニタリングしてNagiosで監視とかだと別々になってしまいます。

PrometheusはAltermangerという監視機能があって一応モニタリングとセットで監視できます。一応と書いたのはAltermangerはまだexperimentalな感じだからです。例えばアラートルールを追加するWeb UIやアラート履歴を確認するWeb UIがありません。というかアラートルールはバージョン管理すべきだからWeb UI要らないというような雰囲気を感じます。それにしたってアラート履歴ぐらい欲しいよなと思うのですが、そちらは http://alerta.io/ を使えということかも。

そんなこんなで最近はモニタリング、監視をどうやるか考えてますが、今のところはPrometheus+Grafanaで考えていて、かつ足りない部分、例えばprometheus.ymlを編集するようなWeb UIを自作しようと思ってます。