ここしばらくは空いてる時間でキツネという分散型SNSを開発している。分散型SNSは一台のサーバーで完結せず、ActivityPubやOStatusといったプロトコルでいろんなサービス(Mastodon, Pleromaなど)とのサーバー間の通信も重要。

本番に上がって使ってもらう時はもちろん、現状の開発中でもログは不可欠。バグがもしあった時に、いちいちデバグ文をあちこちに入れて何とか原因を突き詰める作業をできるだけ減らしたい。俺に考えつくのは、例えばリクエストや処理が失敗したとしても、初段の調査に最低限必要な情報は既にログにあるようにしたい。

二分割

可視化で最初に出てくる疑問は、「何を」可視化したいかということ。よくみるのは、計量とログの2本軸があって、ライブラリなどは片方しか対応しない。俺のイメージでは計量(metrics)はアプリのロジックに関係ない数値の計測:CPU使用率やロード平均、量的に測るもの。ログはもっと質的な、アプリの動作に関係するものが多い。あと、ログは検索したい。

この分割は、金も時間もあまりかけたくない段階では特につらい。一ヶ所で両面の情報を把握したい。大きめのプロジェクトだと、New RelicとELK両方入れてなんとかするのはできるかもしれないけど、個人的にそれでも見る場所がわかれるのは辛い。

選択肢

何が一番なのかはわからないし、自分で監視体制を整えたこともないので、選択肢を調べることから始めた。まずは「自分で書く」余裕がないから除外。重視するところ:一ヶ所に全部見れるかと、Clojureとの相性と、見た目。見た目に関しては先にGrafanaが一番好きと言っておく。見せることを専門にするから、今回の選定には入り辛いところはあるけど。

Honeycomb.io

カタカナにするとハニカムになるかな?どっかのSREよりのメルマガで紹介動画が流れてきて知った。魅力的だったのは、マーケ発言だとしても、上記の量と質の分割をなくすというところ。実際にどうなのかは正直今のところいえないが、使いやすいっちゃ使いやすい。

エージェント入れて、俺の場合はflat log file(単純ログ)から正規表現でサービスにログを流す形になる。Alpineのコンテナの中でlibcがないとバイナリは動いてくれない。libc-compatを入れるのか、ホストの方にdebからインストールする必要がある。

見た目はいまいち。ちゃんとグラフはグラフになってるが、GrafanaやKibanaの鮮やかさにほど遠い。

New Relic

定番。キツネはJVM上でClojureで動いているので、JVMのオプションさえ入れればNew Relicへデータが流れて行く。ただそのオプションはあくまでもJava用の分析しかやってないので、Clojureが抽象化してくれたことは何も知らない。

キツネは裏でNettyを使っているが、Clojureのライブラリの裏に隠れてるので直接呼ぶことはない。一方New Relicにはすべてのリクエストが /NettyDispatch として現れてしまう。それようのClojureのライブラリ入れたらそれぞれのルートがちゃんとわかるようにはなったが、 /NettyDispatchが消えないから実質全部2重に数えられてしまう。

また、New Relicが見ているのはログじゃなくアプリ自体なので、何かを明示的に流したい場合はアプリにわざわざ監視のためのライブラリを意識してコード書かないといけない。裏や非同期の処理の必要時間や負荷を測るのはめんどそう。

それでも見た目と使い方は慣れているので、考慮しないといけない候補。

ELK

またも定番。Elasticsearch+Logstash+Kibanaと同じくElastic製のBeatsの組み合わせでいろんな情報を可視化する。可能性はすごいが、その分「手軽」とはまったくいえない。それだけじゃなく、食欲も相当ある。Beatsは置いといてELKのコアはそれぞれJavaのアプリで、LogstashはそれにRubyも加わる。リソースがけっこう課題になる。高負荷とはまったくいえないローカルの開発環境でも平気で3-4GBのメモリー消費する。

そこへ情報を流すに使うBeatsは逆にすごく軽量で邪魔にもならない。システム監視に使うMetricsbeatは一瞬で設定もできるし、Logstashすら通す必要なくElasticsearchに直でシステム情報流せる。

ただログを消化するFilebeatsは、おもしろいことしようとするとなかなか設定がきつい。まずはElasticにいわゆるテンプレートを入れさせて、そのあとLogstashに向けて流し始めるが、Logstash側でもまたログ一行の分析を行わないと一行まるごと送られるので意味をなさない。

最初に設定しないといけないテンプレートって、そもそも何ぞやから始まるし、Logstashの設定も決して単純とはいえないから辛い。

その他の候補

上記以外でも何件か考えてみた選択肢はあった。一つはLoggly:理論上ごく単純にログをクラウドの集計サービスへ流す仕組みだけど、ログがどこかの標準形式じゃないと単体としては成り立たないから入れる前から断念した。もう一つはDatadog:New Relic並に強力そうではあるが、Alpineの上で動いてるコンテナに入れるエージェントはどうなるのか、何をどうすればいいのか分からず入れるの諦めた。

あとなんかGrafanaに流す方法はないかも考えてるが、手軽にという条件下ではなかなか厳しい。どうしても「表示だけ」のものなので、その下を例えばKなしのELKにしたって手間がELKと大して変わらないから費用対効果が悪い。(でもやっぱきれいやな。)

結局

いろいろ試しておそらくELKに落ち着くと思っている。Logstashの設定さえ乗り越えられたら後は苦労せずに済む。また、GrafanaにElasticsearchを情報源にできるので、将来的にKibanaをGrafanaで置き換えるという手も考えている。手軽さを重視するのならHoneycombはダントツ1位だけど、見た目はな…

最終的にどういう形で何をどう準備する(した)かはまた追っての記事で紹介しますね!