[Python] Tornadoでメトリクスを外部に公開する

概要

Tornadoで作ったWebアプリケーションでPrometheusクライアントを使ってメトリクスを外部に公開する方法を紹介します。

環境

この記事では、Python 3.9.1 で以下のパッケージを使って動作確認をしました。

tornado==6.1
prometheus_client==0.8.0

実装

メトリクス公開用のRequestHandlerを実装しました。

import tornado.ioloop
import tornado.web
from prometheus_client.registry import REGISTRY
from prometheus_client.exposition import choose_encoder


class MetricsHandler(tornado.web.RequestHandler):
    def get(self):
        encoder, content_type = choose_encoder(
            self.request.headers.get('Accept'))
        self.set_header('Content-Type', content_type)
        self.write(encoder(REGISTRY))


def main():
    app = tornado.web.Application([
        (r'/metrics', MetricsHandler),
    ])
    app.listen(8080)
    tornado.ioloop.IOLoop.current().start()


if __name__ == '__main__':
    main()

動作確認

サーバを起動して、http://localhost:8080/metrics にアクセスして動作を確認します。

$ curl http://localhost:8080/metrics 
# HELP python_gc_objects_collected_total Objects collected during gc
# TYPE python_gc_objects_collected_total counter
python_gc_objects_collected_total{generation="0"} 41.0
python_gc_objects_collected_total{generation="1"} 344.0
python_gc_objects_collected_total{generation="2"} 0.0
# HELP python_gc_objects_uncollectable_total Uncollectable object found during GC
# TYPE python_gc_objects_uncollectable_total counter
python_gc_objects_uncollectable_total{generation="0"} 0.0
python_gc_objects_uncollectable_total{generation="1"} 0.0
python_gc_objects_uncollectable_total{generation="2"} 0.0
# HELP python_gc_collections_total Number of times this generation was collected
# TYPE python_gc_collections_total counter
python_gc_collections_total{generation="0"} 55.0
python_gc_collections_total{generation="1"} 5.0
python_gc_collections_total{generation="2"} 0.0
# HELP python_info Python platform information
# TYPE python_info gauge python_info{implementation="CPython",major="3",minor="9",patchlevel="1",version="3.9.1"} 1.0

コメントする