2018年10月8日月曜日

flasgger で作成したアプリに Prometheus のメトリック情報を取得できるようにする

概要

flask-prometheus を使うと簡単にできます
本記事ではやり方を紹介します

環境

  • macOS 10.14
  • Python 3.7.0
  • flask-prometheus 0.0.1

ライブラリインストール

  • vim Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
flasgger = "==0.9.0"
marshmallow = "*"
apispec = "==0.38.0"
flask-prometheus = "*"

[dev-packages]

[requires]
python_version = "3.6"

Pythone3.7 + flasgger の場合 flasgger を 0.9.0 にしないと AttributeError: 'NoneType' object has no attribute 'Str' になってしまいます

  • pipenv install

で OK です

flasgger アプリ作成

  • vim app.py
# coding: utf-8
from flask import Flask, jsonify, request
from flasgger import Schema, Swagger, SwaggerView, fields


class NameSchema(Schema):
    name = fields.Str()


class ConvertView(SwaggerView):
    summary = 'Show your name'
    description = 'Query string converts to json string'
    parameters = [
        {
            'name': 'name',
            'in': 'query',
            'description': 'Your name',
            'type': 'string'
        }
    ]
    responses = {
        200: {
            'description': 'Success jsonify',
            'schema': NameSchema
        }
    }

    def get(self):
        name = request.args['name']
        d = self.external_api(name)
        return jsonify(NameSchema().dump(d).data)

    def external_api(self, name):
        return {'name': name}


app = Flask(__name__)
app.add_url_rule(
    '/convert/',
    view_func=ConvertView.as_view('convert'),
    methods=['GET']
)
Swagger(app)


if __name__ == '__main__':
    app.run(debug=True)

これに flask-prometheus を追加します

flask-prometheus 追加後

  • vim app.py
# coding: utf-8
from flask import Flask, jsonify, request
from flasgger import Schema, Swagger, SwaggerView, fields
from flask_prometheus import monitor


class NameSchema(Schema):
    name = fields.Str()


class ConvertView(SwaggerView):
    summary = 'Show your name'
    description = 'Query string converts to json string'
    parameters = [
        {
            'name': 'name',
            'in': 'query',
            'description': 'Your name',
            'type': 'string'
        }
    ]
    responses = {
        200: {
            'description': 'Success jsonify',
            'schema': NameSchema
        }
    }

    def get(self):
        name = request.args['name']
        d = self.external_api(name)
        return jsonify(NameSchema().dump(d).data)

    def external_api(self, name):
        return {'name': name}


app = Flask(__name__)
app.add_url_rule(
    '/convert/',
    view_func=ConvertView.as_view('convert'),
    methods=['GET']
)
Swagger(app)


if __name__ == '__main__':
    monitor(app, port=8000, addr='0.0.0.0')
    app.run(debug=False)

追加しているのは以下の 3 行です

3a4
> from flask_prometheus import monitor
47c48,49
<     app.run(debug=True)
---
>     monitor(app, port=8000, addr='0.0.0.0')
>     app.run(debug=False)

ポイントはデバッグモードでは動かない点です
デバッグモードが True だと OSError: [Errno 48] Address already in use になってしまいます

動作確認

  • pipenv run python3 app.py

でアプリが動作します
localhost:5000 ではこれまで通り flask アプリにアクセスできます
localhost:8000/metrics にアクセスすると Prometheus 用のメトリックが取得できるようになります

最後に

flask-prometheus を使って flasgger で作成したアプリにメトリック情報を追加してみました
簡単なのでとりあえずアプリの状況を確認したい場合には良いかなと思います
ただ flask-prometheus のメンテナンスがほぼ行われていないのが心配かなと
p-r や issue は上がっているようですがほぼ対応されていません
flask-prometheus のコードはかなり簡単なので自分でメンテしてもいいかもしれませんが、できれば本体に取り込んでほしい気はします

0 件のコメント:

コメントを投稿