最近 Prometheus を使って各種メトリクスを取っていて,ふと resque の queue のステータス,つまり各 queue に 積まれている job の数を集計・可視化したくなったので,そのための exporter を書きました *1.
実装としては,resque は <namespace>:queues
という SET に全ての queue の名前を持っているので,SMEMBER
を使って全 queue 名を取得してきて,
更にその各 queue 名に対応する <namespace>:queue:<queue_name>
という LIST が queue そのものを表しているので,その LIST の長さを LLEN
により取得することで各 queue の job 数を集計するという仕組みになっています (ここらへんがその実装).
なお,この exporter は resque 互換の job queue であれば問題なく動作するようになっていると思います (実際に我々は resque の java 実装である jesque でこれを使っています).
ところで golang で Prometheus の exporter を書くのは至って簡単で,
- prometheus/client_golang の Collector interface を実装する
prometheus.MustRegister(exporter)
と言う感じで Collector interface の実装を登録するhttp.Handle("/metrics", prometheus.Handler())
という感じで http 経由で export する口を作って serve
という感じでめいめい exporter を提供することが出来ます.シンプル!
なお補足ですが,色々な exporter の実装を見ていると scrapeFailures
という counter を用意してあげて,そこに metrics 取得に失敗した回数を突っ込んでやるのがマナーっぽい感じでしたので,当 exporter でもそのようにしております.
*1:今までは fluentd + kibana という構成で似たようなことをやっていた