Prometheusを使用したFlaskマイクロサービスの監視

数行のコードとアプリケーションがメトリックを生成します。

prometheus_方法を理解するためにはflask_輸出は動作しますが、最低限の例は十分です。

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)
metrics = PrometheusMetrics(app)

@app.route('/')
def main():
    return 'OK'

始めるために必要なのはそれだけです!インポートとPrometheusMetricsを初期化する行を追加することにより、登録されているFlaskアプリケーションの/メトリックエンドポイントに表示される要求期間メトリック要求カウンター、および基盤となるPrometheusクライアントライブラリから取得するデフォルトメトリックを取得します

PrometheusGrafanaのインスタンスをデモアプリケーションとともに起動して次のようなメトリックを生成するGitHubリポジトリに使いやすい例があります

README , , Prometheus, .

, README .

. PrometheusMetrics, metrics, , , :

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

, . , . :

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)

# group by endpoint rather than path
metrics = PrometheusMetrics(app, group_by='endpoint')

@app.route('/collection/:collection_id/item/:item_id')
@metrics.counter(
    'cnt_collection', 'Number of invocations per collection', labels={
        'collection': lambda: request.view_args['collection_id'],
        'status': lambda resp: resp.status_code
    })
def get_item_from_collection(collection_id, item_id):
    pass

/collection/10002/item/76 , cnt_collection{collection = "10002", status = "200"}, ( ) :

  • flask_http_request_duration_seconds - HTTP- Flask ,

  • flask_http_request_total - HTTP-

, , , . README , , .

app = Flask(__name__)
metrics = PrometheusMetrics(app)

@app.route('/')
def main():
    pass  # requests tracked by default

@app.route('/skip')
@metrics.do_not_track()
def skip():
    pass  # default metrics are not collected

# custom metric to be applied to multiple endpoints
common_counter = metrics.counter(
    'by_endpoint_counter', 'Request count by endpoints',
    labels={'endpoint': lambda: request.endpoint}
)

@app.route('/common/one')
@common_counter
def endpoint_one():
    pass  # tracked by the custom and the default metrics

@app.route('/common/two')
@common_counter
def endpoint_two():
    pass  # also tracked by the custom and the default metrics

# register additional default metrics
metrics.register_default(
    metrics.counter(
        'by_path_counter', 'Request count by request paths',
        labels={'path': lambda: request.path}
    )
)

, uWSGI Gunicorn. , .

, /metrics Flask, Prometheus.

Prometheus Flask :

scrape_configs:
  - job_name: 'example'

    dns_sd_configs:
      - names: ['app']
        port: 5000
        type: A
        refresh_interval: 5s

GitHub. , Prometheus Flask http://app:5000/metrics, IP-, , Kubernetes Docker Swarm.

, , , , path=None PrometheusMetrics.

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)
metrics = PrometheusMetrics(app, path=None)

...

metrics.start_http_server(5099)

start_http_server(port), HTTP-, 5099 . , , Flask, /metrics, URI , register_endpoint(..), .

試してみることにした場合は、GitHubで問題を開くか、コメント、フィードバック、提案を残してください。

ありがとう!




All Articles