เชเซเชกเชจเซ เชเซเชเชฒเซเช เชฒเชพเชเชจ เช เชจเซ เชคเชฎเชพเชฐเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชฎเซเชเซเชฐเชฟเชเซเชธ เชเชจเชฐเซเช เชเชฐเซ เชเซ, เชตเชพเชน!
เชชเซเชฐเซเชฎเชฟเชฅเชฟเชฏเชธ_ เชเซเชตเซ เชฐเซเชคเซ เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ เชคเซ เชธเชฎเชเชตเชพ เชฎเชพเชเซเชซเซเชฒเชพเชธเซเช_เชจเชฟเชเชพเชธเชเชพเชฐ เชฎเชพเชเซ เชจเซเชฏเซเชจเชคเชฎ เชเชฆเชพเชนเชฐเชฃ เชชเซเชฐเชคเซเช เชเซ:
from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics
app = Flask(__name__)
metrics = PrometheusMetrics(app)
@app.route('/')
def main():
return 'OK'
เชคเชฎเชพเชฐเซ เชชเซเชฐเชพเชฐเชเชญ เชเชฐเชตเชพ เชฎเชพเชเซ เชเชเชฒเซเช เช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ! เชเชฐเชเชญ เชฎเชพเชเซ เชเชฏเชพเชค เช
เชจเซ เชฒเชพเชเชจ เชเชฎเซเชฐเซเชจเซ เชชเซเชฐเซเชฎเชฟเชฅเชฟเชฏเชธเชฎเซเชเซเชฐเชฟเชเซเชธ, เชคเชฎเชจเซ เชฎเซเชเซเชฐเชฟเชเซเชธ เชฎเชณเชถเซ เชตเชฟเชจเชเชคเซ เชธเชฎเชฏเชเชพเชณเซ ะธ เชตเชฟเชจเชเชคเซ เชเชพเชเชจเซเชเชฐเซเชธ, เช
เชเชคเชฟเชฎ เชฌเชฟเชเชฆเซ เชชเชฐ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชฅเชพเชฏ เชเซ /เชฎเซเชเซเชฐเชฟเชเซเชธ เชซเซเชฒเชพเชธเซเช เชเชชเซเชฒเชฟเชเซเชถเชจ เชเซเชจเซ เชธเชพเชฅเซ เชคเซ เชฐเชเซเชธเซเชเชฐ เชฅเชฏเซเชฒ เชเซ, เชคเซเชฎเช เชคเชฎเชพเชฎ เชกเชฟเชซเซเชฒเซเช เชฎเซเชเซเชฐเชฟเชเซเชธ เชคเชฎเซ เชเชงเชพเชฐเชฎเชพเชเชฅเซ เชฎเซเชณเชตเซ เชเซ
เชคเชฎเซ เชถเซเชงเซ เชถเชเซ เชเซ
เชฎเชพเช เชคเชฎเชจเซ เชธเซเชเชเซเชจเซ เชธเซเชเชฟ เชชเชฃ เชฎเชณเชถเซ
เชเซเช เชตเชฃ
เชฒเชพเชเชฌเซเชฐเซเชฐเซเชฎเชพเช เชเชฃเชพ เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชตเชฟเชเชฒเซเชชเซ เชเซ, เชเซเช
เชฎเซเชณเชญเซเชค เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชเชชเชฐ เชฆเชฐเซเชถเชพเชตเซเชฒ เชเซ. เชซเชเซเชค เชเช เชฆเชพเชเชฒเซ เชฌเชจเชพเชตเซ เชชเซเชฐเซเชฎเชฟเชฅเชฟเชฏเชธเชฎเซเชเซเชฐเชฟเชเซเชธ, เชเชพเชฒเซ เชคเซเชจเซ เชเซเชฒ เชเชฐเซเช เชฎเซเชเซเชฐเชฟเชเซเชธ, เช เชจเซ เชชเชเซ เชคเชฎเซ เชเชพเชฐเซเชฏเซเชจเซ เชธเซเชถเซเชญเชฟเชค เชเชฐเซเชจเซ เชเชเชคเซเชฐเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเชเซ เชเซ เชคเซ เชตเชงเชพเชฐเชพเชจเชพ เชฎเซเชเซเชฐเชฟเชเซเชธเชจเซ เชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชคเซเชจเซ เชเชชเชฏเซเช เชเชฐเซ:
-
@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{เชธเชเชเซเชฐเชน = "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
เชชเชฐ เชธเชเชชเซเชฐเซเชฃ เชเชฆเชพเชนเชฐเชฃ เชเซเช
เชเซ เชฎเซเชเซเชฐเชฟเชเซเชธ เชเชจเซเชกเชชเซเชเชจเซเชเชจเซ เช เชฐเซเชคเซ เชเชเซเชธเชชเซเช เชเชฐเชตเซเช เชคเชฎเชจเซ เช เชจเซเชเซเชณ เชจ เชเชตเซ, เชคเซ เชเชฆเชพเช เชคเชฎเซ เชคเซเชจเซ เชเชเซเชธเชเชฐเซเชจเชฒ เชเชเซเชธเซเชธเชจเซ เชฎเชเชเซเชฐเซ เชเชชเชตเชพ เชฎเชพเชเชเชคเชพ เชจ เชนเซเชต, เชคเซ เชคเชฎเซ เชคเซเชจเซ เชธเชฐเชณเชคเชพเชฅเซ เชชเชธเชพเชฐ เชเชฐเซเชจเซ เช เชเซเชทเชฎ เชเชฐเซ เชถเชเซ เชเซ เชชเชพเชฅ=เชเซเช เชจเชนเซเช เชฆเชพเชเชฒเซ เชฌเชจเชพเชตเชคเซ เชตเชเชคเซ เชชเซเชฐเซเชฎเชฟเชฅเชฟเชฏเชธเชฎเซเชเซเชฐเชฟเชเซเชธ.
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-เชจเชฟเชเชพเชธเชเชพเชฐ README โ เชเชชเชฏเซเช, เชเชฆเชพเชนเชฐเชฃเซ เช เชจเซ เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชตเชฟเชเชฒเซเชชเซ -
เชชเซเชฐเซเชฎเชฟเชฅเชฟเชฏเชธ-เชซเซเชฒเชพเชธเซเช-เชจเชฟเชเชพเชธเชเชฐเซเชคเชพ เชเชฆเชพเชนเชฐเชฃเซ โ เชซเซเชฒเชพเชธเซเช เชเชชเซเชฒเชฟเชเซเชถเชจ เชฎเซเชจเชฟเชเชฐเชฟเชเชเชจเซ เช เชฒเช เช เชฒเช เชฐเซเชคเซ เชธเซเช เชเชฐเชตเชพเชจเชพ เชเชฆเชพเชนเชฐเชฃเซ -
PyPI เชชเชฐ prometheus-flask-exporter - เช เชชเซเชฐเซเชเซเชเซเช PyPI เชชเชฐ เชเซ -
prometheus/client_python - เชชเชพเชฏเชฅเซเชจ เชฎเชพเชเซ เชธเชคเซเชคเชพเชตเชพเชฐ เชชเซเชฐเซเชฎเชฟเชฅเชฟเชฏเชธ เชเซเชฒเชพเชฏเชเช เชฒเชพเชเชฌเซเชฐเซเชฐเซ
เชเซ เชคเชฎเซ เชคเซเชจเซ เช เชเชฎเชพเชตเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซ เชเซ, เชคเซ GitHub เชชเชฐ เชเซเช เชฎเซเชฆเซเชฆเซ เชเซเชฒเชตเชพ เชฎเชพเชเซ เชจเชฟเชเชธเชเชเซเช เช เชฅเชตเชพ เชคเชฎเชพเชฐเซ เชเชฟเชชเซเชชเชฃเซเช, เชชเซเชฐเชคเชฟเชธเชพเชฆ เช เชจเซ เชธเซเชเชจเซ เชฎเซเชเซ!
เชเชญเชพเชฐ!
เชธเซเชฐเซเชธ: www.habr.com