概要
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 件のコメント:
コメントを投稿