ืืื ืฉืืจืืช ืงืื ืืืืคืืืงืฆืื ืฉืื ืืืืฆืจืช ืืืืื, ืืืื!
ืขื ืื ืช ืืืืื ืืื ืคืจืืืชืืืก_ ืขืืืืืงืืืง_ืืืฆืืื ืืกืคืืงื ืืืืื ืืื ืืืืืช:
from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics
app = Flask(__name__)
metrics = PrometheusMetrics(app)
@app.route('/')
def main():
return 'OK'
ืื ืื ืื ืฉืืชื ืฆืจืื ืืื ืืืชืืื! ืขื ืืื ืืืกืคืช ืืืืื โโืืฉืืจื ืืืชืืื PrometheusMetrics, ืชืงืื ืืืืื ืืฉื ืืืงืฉื ะธ ืืืคืงื ืืงืฉื, ืืืฆื ืื ืงืืืช ืืงืฆื /ืืืจืื ืืคืืืงืฆืืืช Flask ืฉืื ืืื ืจืฉืืื, ืืื ืื ืื ืืืื ืืจืืจืช ืืืืื ืฉืืชื ืืงืื ืืืืกืืก
ืืชื ืืืื ืืืฆืื
ืชืืฆื ืื ืจืฉืืื ืฉื ืืื ืืืงืืืจืื ื
ืืชืืื
ืืฉื ื ืืคืฉืจืืืืช ืชืฆืืจื ืจืืืช ืืกืคืจืื, ืชืจืื
ืืชืฆืืจื ืืืกืืกืืช ืืืฆืืช ืืืขืื. ืคืฉืื ืฆืืจ ืืืคืข 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", status = "200"}, ืื ืืกืฃ ืชืงืื ืืช ืืืื ืืจืืจืช ืืืืื (ืขืืืจ ืื ื ืงืืืช ืงืฆื ืืืืืื ืื) ืืกืคืจืืืช ืืจืืจืช ืืืืื:
-
flask_http_request_duration_seconds
- ืืฉื ืืงืฉืช HTTP ืืฉื ืืืช ืขืืืจ ืื ืืงืฉืืช Flask ืืคื ืฉืืื, ื ืชืื ืืืฆื -
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. ืืชื ืืืื ืื ืืืฆืื ืืืืืืืช ืงืื ืืช ืืืงืจื ืฉืืืืฉ ืืืืงืืื, ืืืื ืจืืืื ืขืืืืืื.
ืืืกืฃ ืืืืื
ืืคื ืฉืืืืืจ ืืขืื, ืืกืคืจืืื ืืกืคืงืช ื ืงืืืช ืงืฆื ืืืจืืจืช ืืืื /ืืืจืื ืืืืฉืื Flask, ืฉืืืื ืืฉืืฉ ืืืจื ืขืืืจ
ืืืืืื ืฉื ืืื ืืืืืื ืื ืืขืื, ืชืืื ืืืงื ืืช ื-Prometheus ืฉืื ืืืคืืืงืฆืืืช Flask ืขื ืืืืจืืช ืืจืืจืช ืืืื ืขื ืืชืฆืืจื ืืื:
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(port)ืืื ืืคืชืื ืืช ื ืงืืืช ืืงืฆื ืืื ืืืฆืืืช HTTP ืืืจืช, 5099 ืืืืืื ืืขืื. ืืืืืคืื, ืื ืืชื ืืจืืฆื ืืื ืฉื ืงืืืช ืืงืฆื ื ืืฆืืช ืืืืชื ืืืฉืื Flask, ืื ืขืืื ืืฉื ืืช ืืช ืื ืชืื ืฉืื ื /ืืืจืื, ืืชื ืืืื ืืืขืืืจ URI ืืืจ ืืคืจืืืจ ืื ืชืื, ืื ืืืฉืชืืฉ register_endpoint(..)ืืืชืงืื ืืืชื ืืืืืจ ืืืชืจ.
ืชืืืืจ
-
rycus86/prometheus_flask_exporter - ืืฆืืื ืืืงืืืงืื ืืื ืขืืืจ ืคืจืืืชืืืก -
prometheus-flask-exporter README - ืฉืืืืฉ, ืืืืืืืช ืืืคืฉืจืืืืช ืชืฆืืจื -
ืืืืืืืช ืฉื prometheus-flask-exporter - ืืืืืืืช ืืืืืจืช ื ืืืืจ ืืืฉืืื Flask ืืืจืืื ืฉืื ืืช -
prometheus-flask-exporter ืขื PyPI - ืืคืจืืืงื ืืื ื ืืฆื ื- PyPI -
prometheus/client_python - ืกืคืจืืืช ืืงืืืืช ืจืฉืืืช ืฉื Prometheus ืขืืืจ Python
ืื ืชืืืื ืื ืกืืช ืืช ืื, ืื ืชืืกืก ืืคืชืื ืืขืื ื-GitHub ืื ืืืฉืืืจ ืืช ืืืขืจืืช, ืืืฉืื ืืืืฆืขืืช ืฉืื!
ืชืืื ืื!
ืืงืืจ: www.habr.com