เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจฆเฉ‡ เจจเจพเจฒ เจซเจฒเจพเจธเจ• เจฎเจพเจˆเจ•เฉเจฐเฉ‹ เจธเจฐเจตเจฟเจธเจฟเจœเจผ เจฆเฉ€ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจ•เจฐเจจเจพ

เจ•เฉ‹เจก เจฆเฉ€เจ†เจ‚ เจ•เฉเจ เจฒเจพเจˆเจจเจพเจ‚ เจ…เจคเฉ‡ เจคเฉเจนเจพเจกเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจคเจฟเจ†เจฐ เจ•เจฐเจฆเฉ€ เจนเฉˆ, เจตเจพเจน!

เจ‡เจน เจธเจฎเจเจฃ เจฒเจˆ เจ•เจฟ prometheus_ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเจซเจฒเจพเจธเจ•_เจจเจฟเจฐเจฏเจพเจค เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจ‰เจฆเจพเจนเจฐเจฃ เจ•เจพเจซเจผเฉ€ เจนเฉˆ:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจผเฉเจฐเฉ‚เจ†เจค เจ•เจฐเจจ เจฒเจˆ เจฌเฉฑเจธ เจ‡เฉฐเจจเจพ เจนเฉ€ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ! เจธเจผเฉเจฐเฉ‚เจ†เจค เจฒเจˆ เจ‡เฉฑเจ• เจ†เจฏเจพเจค เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจฒเจพเจˆเจจ เจœเฉ‹เฉœ เจ•เฉ‡ PrometheusMetrics, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจชเฉเจฐเจพเจชเจค เจนเฉ‹เจฃเจ—เฉ‡ เจฌเฉ‡เจจเจคเฉ€ เจฆเฉ€ เจฎเจฟเจ†เจฆ ะธ เจ•เจพเจŠเจ‚เจŸเจฐเจพเจ‚ เจฆเฉ€ เจฌเฉ‡เจจเจคเฉ€ เจ•เจฐเฉ‹, เจ…เฉฐเจคเจฎ เจฌเจฟเฉฐเจฆเฉ‚ 'เจคเฉ‡ เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ /เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจซเจฒเจพเจธเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจœเจฟเจธ เจจเจพเจฒ เจ‡เจน เจฐเจœเจฟเจธเจŸเจฐเจก เจนเฉˆ, เจจเจพเจฒ เจนเฉ€ เจธเจพเจฐเฉ‡ เจกเจฟเจซเฉŒเจฒเจŸ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจœเฉ‹ เจคเฉเจธเฉ€เจ‚ เจ…เจงเจพเจฐ เจคเฉ‹เจ‚ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจฆเฉ‡ เจนเฉ‹ เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจ•เจฒเจพเจ‡เฉฐเจŸ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€.

เจคเฉเจธเฉ€เจ‚ เจฒเฉฑเจญ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจตเจฐเจคเจฃ เจฒเจˆ เจ†เจธเจพเจจ เจ‰เจฆเจพเจนเจฐเจจ GitHub เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจœเฉ‹ เจ•เจฟ เจ‰เจฆเจพเจนเจฐเจฃ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ Prometheus ะธ เจ—เฉเจฐเจพเจซเจจเจพ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจคเจฟเจ†เจฐ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจกเฉˆเจฎเฉ‹ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ‡ เจจเจพเจฒ เจœเฉ‹ เจ•เฉเจ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡เจตเฉ‡เจ—เจพ:

เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจฆเฉ‡ เจจเจพเจฒ เจซเจฒเจพเจธเจ• เจฎเจพเจˆเจ•เฉเจฐเฉ‹ เจธเจฐเจตเจฟเจธเจฟเจœเจผ เจฆเฉ€ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจ•เจฐเจจเจพ

เจตเจฟเฉฑเจš เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเฉ‚เจšเจ•เจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉ‚เจšเฉ€ เจตเฉ€ เจฎเจฟเจฒเฉ‡เจ—เฉ€ README เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจœเฉ‹ เจกเฉˆเจธเจผเจฌเฉ‹เจฐเจก เจตเจฟเฉฑเจš เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจ, เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจธเจตเจพเจฒเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจœเฉ‹ เจกเฉˆเจธเจผเจฌเฉ‹เจฐเจกเจพเจ‚ เจจเฉ‚เฉฐ เจญเจฐเจฆเฉ€เจ†เจ‚ เจนเจจเฅค

เจตเจฟเจตเจธเจฅเจพ

เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจตเจฟเฉฑเจš เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจธเฉฐเจฐเจšเจจเจพ เจตเจฟเจ•เจฒเจช เจนเจจ, เจตเฉ‡เจ–เฉ‹ README เจ‡เฉฑเจ• เจธเฉฐเจ–เฉ‡เจช เจตเจฟเจ†เจ–เจฟเจ† เจฆเฉ‡ เจจเจพเจฒ เจ‰เจนเจจเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚เฅค

เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจธเฉฐเจฐเจšเจจเจพ เจ‰เฉฑเจชเจฐ เจฆเจฟเจ–เจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆ. เจฌเจธ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ เจฌเจฃเจพเจ“ PrometheusMetrics, เจ†เจ“ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเฉ€เจ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ, เจ…เจคเฉ‡ เจซเจฟเจฐ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจธเจœเจพเจ‰เจฃ เจฆเฉเจ†เจฐเจพ เจคเฉเจธเฉ€เจ‚ เจตเจพเจงเฉ‚ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจจเฉ‚เฉฐ เจชเฉเจฐเจญเจพเจธเจผเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹:

  • @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", เจธเจฅเจฟเจคเฉ€ = "200"}, เจจเจพเจฒ เจนเฉ€ เจคเฉเจธเฉ€เจ‚ เจกเจฟเจซเฉŒเจฒเจŸ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจคเฉ‹เจ‚ เจกเจฟเจซเฉŒเจฒเจŸ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ (เจ‡เจธ เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš เจนเจฐเฉ‡เจ• เจ…เฉฐเจค เจฌเจฟเฉฐเจฆเฉ‚ เจฒเจˆ) เจชเฉเจฐเจพเจชเจค เจ•เจฐเฉ‹เจ—เฉ‡:

  • flask_http_request_duration_seconds โ€” เจตเจฟเจงเฉ€, เจฎเจพเจฐเจ— เจ…เจคเฉ‡ เจธเจฅเจฟเจคเฉ€ เจฆเฉเจ†เจฐเจพ เจธเจพเจฐเฉ€เจ†เจ‚ เจซเจฒเจพเจธเจ• เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฒเจˆ เจธเจ•เจฟเฉฐเจŸเจพเจ‚ เจตเจฟเฉฑเจš HTTP เจฌเฉ‡เจจเจคเฉ€ เจฆเฉ€ เจฎเจฟเจ†เจฆ

  • 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 เจฒเจˆ เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจเจ•เจธเจŸเฉˆเจ‚เจธเจผเจจ เจนเจจเฅค เจคเฉเจธเฉ€เจ‚ เจฎเจฒเจŸเฉ€เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ— เจธเจฎเฉ‡เจค, เจจเจฟเจธเจผเจพเจจเจพ เจตเจฐเจคเฉ‹เจ‚ เจฆเฉ‡ เจฎเจพเจฎเจฒเจฟเจ†เจ‚ เจฆเฉ€เจ†เจ‚ เจ›เฉ‹เจŸเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจตเฉ€ เจฒเฉฑเจญ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจธเฉฐเจ—เฉเจฐเจนเจฟ

เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ‰เฉฑเจชเจฐ เจฆเฉฑเจธเจฟเจ† เจ—เจฟเจ† เจนเฉˆ, เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ…เฉฐเจคเจฎ เจฌเจฟเฉฐเจฆเฉ‚ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเฉ€ เจนเฉˆ /เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจ‡เฉฑเจ• เจซเจฒเจพเจธเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš, เจœเฉ‹ เจ•เจฟ เจ‡เฉฑเจ• เจŸเฉ€เจšเฉ‡ เจตเจœเฉ‹เจ‚ เจ•เฉฐเจฎ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจฌเจฟเจฒเจกเจฐ.

เจ‰เจชเจฐเฉ‹เจ•เจค เจกเฉˆเจธเจผเจฌเฉ‹เจฐเจก เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš, เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจธเฉฐเจฐเจšเจจเจพ เจจเจพเจฒ เจกเจฟเจซเฉŒเจฒเจŸ เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจซเจฒเจพเจธเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฒเจˆ เจ†เจชเจฃเฉ‡ เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจจเฉ‚เฉฐ เจจเจฟเจธเจผเจพเจจเจพ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹:

scrape_configs:
  - job_name: 'example'

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

'เจคเฉ‡ เจชเฉ‚เจฐเฉ€ เจ‰เจฆเจพเจนเจฐเจจ เจตเฉ‡เจ–เฉ‹ GitHub เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€เจ†เจ‚. เจ‡เจน เจฎเฉฐเจจเจฆเจพ เจนเฉˆ เจ•เจฟ เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจคเฉเจนเจพเจกเฉ€ เจซเจฒเจพเจธเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฒเฉฑเจญ เจธเจ•เจฆเจพ เจนเฉˆ http://app:5000/metrics, เจœเจฟเฉฑเจฅเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจกเฉ‹เจฎเฉ‡เจจ เจจเจพเจฎ เจธเฉฐเจญเจพเจตเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เจˆ IP เจชเจคเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ เจœเจฆเฉ‹เจ‚ เจšเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉ‹เจตเฉ‡ เจ•เจฌเจฐเจจเฉ‡เจŸเจฟเจธ เจœ เจกเฉŒเจ•เจฐ เจธเจตเจฐเจฎ.

เจœเฉ‡เจ•เจฐ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจเจ‚เจกเจชเฉเจ†เจ‡เฉฐเจŸ เจจเฉ‚เฉฐ เจ‡เจธ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจ‰เจœเจพเจ—เจฐ เจ•เจฐเจจเจพ เจคเฉเจนเจพเจกเฉ‡ เจฒเจˆ เจ…เจจเฉเจ•เฉ‚เจฒ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจธเจผเจพเจ‡เจฆ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจคเฉฑเจ• เจฌเจพเจนเจฐเฉ€ เจชเจนเฉเฉฐเจš เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจจเจนเฉ€เจ‚ เจฆเฉ‡เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹, เจคเฉเจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจชเจพเจธ เจ•เจฐเจ•เฉ‡ เจ…เจธเจฎเจฐเฉฑเจฅ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจฎเจพเจฐเจ— = เจ•เฉ‹เจˆ เจจเจนเฉ€เจ‚ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ เจฌเจฃเจพเจ‰เจฃ เจตเฉ‡เจฒเฉ‡ 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(เจชเฉ‹เจฐเจŸ)เจ‡เจธ เจ…เฉฐเจค เจฌเจฟเฉฐเจฆเฉ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเฉ‡ HTTP เจชเฉ‹เจฐเจŸ เจคเฉ‡ เจ–เฉ‹เจฒเฉเจนเจฃ เจฒเจˆ, 5099 เจ‰เจชเจฐเฉ‹เจ•เจค เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš. เจตเจฟเจ•เจฒเจชเจ• เจคเฉŒเจฐ 'เจคเฉ‡, เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจ‰เจธเฉ‡ เจซเจฒเจพเจธเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจ…เฉฐเจคเจฎ เจฌเจฟเฉฐเจฆเฉ‚ เจนเฉ‹เจฃ เจคเฉ‹เจ‚ เจ–เฉเจธเจผ เจนเฉ‹, เจชเจฐ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจธเจฆเฉ‡ เจฎเจพเจฐเจ— เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ /เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ, เจคเฉเจธเฉ€เจ‚ เจœเจพเจ‚ เจคเจพเจ‚ เจชเจพเจฅ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจตเจœเฉ‹เจ‚ เจ‡เฉฑเจ• เจนเฉ‹เจฐ URI เจชเจพเจธ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจœเจพเจ‚ เจตเจฐเจค เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจฐเจœเจฟเจธเจŸเจฐ_เจเจ‚เจกเจชเฉเจ†เจ‡เฉฐเจŸ(..)เจ‡เจธ เจจเฉ‚เฉฐ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเจจ เจฒเจˆ.

เจนเจตเจพเจฒเฉ‡

  • rycus86/prometheus_flask_exporter - เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจฒเจˆ เจ‡เจน เจฌเฉ‹เจคเจฒ เจจเจฟเจฐเจฏเจพเจคเจ•

  • prometheus-flask-exporter README โ€” เจตเจฐเจคเฉ‹เจ‚, เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจ…เจคเฉ‡ เจธเฉฐเจฐเจšเจจเจพ เจšเฉ‹เจฃเจพเจ‚

  • prometheus-flask-exporter เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ โ€” เจตเฉฑเจ–-เจตเฉฑเจ– เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจจเจพเจฒ เจซเจฒเจพเจธเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚

  • PyPI 'เจคเฉ‡ prometheus-flask-exporter - เจ‡เจน เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ PyPI 'เจคเฉ‡ เจนเฉˆ

  • prometheus/client_python - เจชเจพเจˆเจฅเจจ เจฒเจˆ เจ…เจงเจฟเจ•เจพเจฐเจค เจชเฉเจฐเฉ‹เจฎเฉ€เจฅเฉ€เจ…เจธ เจ•เจฒเจพเจ‡เฉฐเจŸ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€

เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ…เจœเจผเจฎเจพเจ‰เจฃ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ GitHub 'เจคเฉ‡ เจ•เฉ‹เจˆ เจฎเฉเฉฑเจฆเจพ เจ–เฉ‹เจฒเฉเจนเจฃ เจฒเจˆ เจฌเฉ‡เจเจฟเจœเจ• เจฎเจนเจฟเจธเฉ‚เจธ เจ•เจฐเฉ‹ เจœเจพเจ‚ เจ†เจชเจฃเฉ€เจ†เจ‚ เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚, เจซเฉ€เจกเจฌเฉˆเจ• เจ…เจคเฉ‡ เจธเฉเจเจพเจ… เจ›เฉฑเจกเฉ‹!

เจคเฉเจนเจพเจกเจพ เจงเฉฐเจจเจตเจพเจฆ!

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹