เจเฉเจก เจฆเฉเจเจ เจเฉเจ เจฒเจพเจเจจเจพเจ เจ เจคเฉ เจคเฉเจนเจพเจกเฉ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจฎเฉเจเฉเจฐเจฟเจเจธ เจคเจฟเจเจฐ เจเจฐเจฆเฉ เจนเฉ, เจตเจพเจน!
เจเจน เจธเจฎเจเจฃ เจฒเจ เจเจฟ prometheus_ เจเจฟเจตเฉเจ เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉเจซเจฒเจพเจธเจ_เจจเจฟเจฐเจฏเจพเจค เจเจฐเจจ เจฒเจ เจเฉฑเจ เจเฉฑเจเฉ-เจเฉฑเจ เจเจฆเจพเจนเจฐเจฃ เจเจพเจซเจผเฉ เจนเฉ:
from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics
app = Flask(__name__)
metrics = PrometheusMetrics(app)
@app.route('/')
def main():
return 'OK'
เจคเฉเจนเจพเจจเฉเฉฐ เจธเจผเฉเจฐเฉเจเจค เจเจฐเจจ เจฒเจ เจฌเฉฑเจธ เจเฉฐเจจเจพ เจนเฉ เจเจพเจนเฉเจฆเจพ เจนเฉ! เจธเจผเฉเจฐเฉเจเจค เจฒเจ เจเฉฑเจ เจเจฏเจพเจค เจ
เจคเฉ เจเฉฑเจ เจฒเจพเจเจจ เจเฉเฉ เจเฉ PrometheusMetrics, เจคเฉเจนเจพเจจเฉเฉฐ เจฎเฉเจเฉเจฐเจฟเจเจธ เจชเฉเจฐเจพเจชเจค เจนเฉเจฃเจเฉ เจฌเฉเจจเจคเฉ เจฆเฉ เจฎเจฟเจเจฆ ะธ เจเจพเจเจเจเจฐเจพเจ เจฆเฉ เจฌเฉเจจเจคเฉ เจเจฐเฉ, เจ
เฉฐเจคเจฎ เจฌเจฟเฉฐเจฆเฉ 'เจคเฉ เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจเฉเจคเจพ เจเจฟเจ เจนเฉ /เจฎเฉเจเฉเจฐเจฟเจเจธ เจซเจฒเจพเจธเจ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจเจฟเจธ เจจเจพเจฒ เจเจน เจฐเจเจฟเจธเจเจฐเจก เจนเฉ, เจจเจพเจฒ เจนเฉ เจธเจพเจฐเฉ เจกเจฟเจซเฉเจฒเจ เจฎเฉเจเฉเจฐเจฟเจเจธ เจเฉ เจคเฉเจธเฉเจ เจ
เจงเจพเจฐ เจคเฉเจ เจชเฉเจฐเจพเจชเจค เจเจฐเจฆเฉ เจนเฉ
เจคเฉเจธเฉเจ เจฒเฉฑเจญ เจธเจเจฆเฉ เจนเฉ
เจตเจฟเฉฑเจ เจคเฉเจนเจพเจจเฉเฉฐ เจธเฉเจเจเจพเจ เจฆเฉ เจเฉฑเจ เจธเฉเจเฉ เจตเฉ เจฎเจฟเจฒเฉเจเฉ
เจตเจฟเจตเจธเจฅเจพ
เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉ เจตเจฟเฉฑเจ เจฌเจนเฉเจค เจธเจพเจฐเฉ เจธเฉฐเจฐเจเจจเจพ เจตเจฟเจเจฒเจช เจนเจจ, เจตเฉเจเฉ
เจฌเฉเจจเจฟเจเจฆเฉ เจธเฉฐเจฐเจเจจเจพ เจเฉฑเจชเจฐ เจฆเจฟเจเจพเจเจ เจเจฟเจ เจนเฉ. เจฌเจธ เจเฉฑเจ เจเจฆเจพเจนเจฐเจจ เจฌเจฃเจพเจ 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 เจฌเฉเจจเจคเฉเจเจ เจฆเฉ เจเฉเฉฑเจฒ เจธเฉฐเจเจฟเจ
เจเจพเจธ เจ
เฉฐเจคเจฎ เจฌเจฟเฉฐเจฆเฉเจเจ เจฆเฉ เจเจฐเฉเจเจฟเฉฐเจ เจจเฉเฉฐ เจเฉฑเจกเจฃ, เจตเจพเจงเฉ เจกเจฟเจซเฉเจฒเจ เจฎเฉเจเฉเจฐเจฟเจเจธ เจจเฉเฉฐ เจฒเฉเจ เจเจฐเจจ เจเจพเจ เจเฉฑเจชเจฐ เจธเฉเจเฉเจฌเฉฑเจง เจเจนเจจเจพเจ เจจเฉเฉฐ เจเฉฑเจกเจฃ, เจเจพเจ เจเฉฑเจ เจคเฉเจ เจตเฉฑเจง เจ
เฉฐเจค เจฌเจฟเฉฐเจฆเฉเจเจ 'เจคเฉ เจเฉฑเจเฉ เจเจธเจเจฎ เจฎเฉเจเฉเจฐเจฟเจ เจฒเจพเจเฉ เจเจฐเจจ เจฆเฉ เจตเจฟเจเจฒเจช เจนเจจเฅค เจเจฎเจฐเจพ เจเฉฑเจก เจฆเจฟเจ
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
'เจคเฉ เจชเฉเจฐเฉ เจเจฆเจพเจนเจฐเจจ เจตเฉเจเฉ
เจเฉเจเจฐ เจฎเฉเจเฉเจฐเจฟเจเจธ เจเจเจกเจชเฉเจเจเฉฐเจ เจจเฉเฉฐ เจเจธ เจคเจฐเฉเจเฉ เจจเจพเจฒ เจเจเจพเจเจฐ เจเจฐเจจเจพ เจคเฉเจนเจพเจกเฉ เจฒเจ เจ เจจเฉเจเฉเจฒ เจจเจนเฉเจ เจนเฉ, เจธเจผเจพเจเจฆ เจเจฟเจเจเจเจฟ เจคเฉเจธเฉเจ เจเจธ เจคเฉฑเจ เจฌเจพเจนเจฐเฉ เจชเจนเฉเฉฐเจ เจฆเฉ เจเจเจพเจเจผเจค เจจเจนเฉเจ เจฆเฉเจฃเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจนเฉ, เจคเฉเจธเฉเจ เจเจธเจจเฉเฉฐ เจเจธเจพเจจเฉ เจจเจพเจฒ เจชเจพเจธ เจเจฐเจเฉ เจ เจธเจฎเจฐเฉฑเจฅ เจเจฐ เจธเจเจฆเฉ เจนเฉ เจฎเจพเจฐเจ = เจเฉเจ เจจเจนเฉเจ เจเฉฑเจ เจเจฆเจพเจนเจฐเจฃ เจฌเจฃเจพเจเจฃ เจตเฉเจฒเฉ 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