塩焼きブログ

塩焼きに関しての研究内容を公開しています

Java(Kotlin)でPrometheusに対するMetricsをテキストで生成する

io.prometheusのライブラリを使います

dependencies {
    compile 'io.prometheus:simpleclient:0.6.0'
    compile 'io.prometheus:simpleclient_hotspot:0.6.0'
    compile 'io.prometheus:simpleclient_httpserver:0.6.0'
    compile 'io.prometheus:simpleclient_pushgateway:0.6.0'
}

Metricsの定義

Counterは下記のように定義して、posts.inc()みたいに加算できます。また、この値をMetricsとしてではなく、JSONで出力したいケースにも対応したい時はposts.get()などを使うと内部の値を取得することができる。

val posts = Counter.build().name("posts_total").help("Total posts.").register()
val puts = Counter.build().name("puts_total").help("Total puts.").register()

registerをコールした段階でCllectorRegistryに登録されるので、Metrics出力時このオブジェクトに問い合わせる必要はないのでprivateにしても良い。

MetricsのExport

肝心のMetricsの出力については、MetricsServletを使ってServletから出すか、や専用のHTTPServerを立ち上げて行う。ただServletではなくNettyなんですよとか、Undertowなんですよとか、独自のサーバーなんですよ、Dockerだからポート80しか立ち上げたくないのですよといった場合にこれでは対応できない。

PHPの lazyshot/prometheus-php などはテキストで出力できるのが用意だったが、Javaについては、調査不足かもしれないがテキストで出力する方法はマニュアルにも内部にもなかった。

したがって内部を解体して似たようなコードを書く。

val byteArrayOutputStream = ByteArrayOutputStream()
val writer = BufferedWriter(OutputStreamWriter(byteArrayOutputStream, StandardCharsets.UTF_8))
TextFormat.write004(writer, CollectorRegistry.defaultRegistry.metricFamilySamples())
writer.flush()
println(byteArrayOutputStream.toString())

OutputStreamであればいいので、FileOutputStreamを使ってFileに書き出してもいいし好きなようにしたら良い。

参考

https://kazuhira-r.hatenablog.com/entry/2019/02/03/013330