āĻā§āĻĄā§āĻ° āĻāĻ¯āĻŧā§āĻāĻāĻŋ āĻ˛āĻžāĻāĻ¨ āĻāĻŦāĻ āĻāĻĒāĻ¨āĻžāĻ° āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻŽā§āĻā§āĻ°āĻŋāĻā§āĻ¸ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§, āĻŦāĻžāĻš!
āĻĒā§āĻ°āĻŽāĻŋāĻĨāĻŋāĻāĻ¸_ āĻā§āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāĻ°ā§ āĻ¤āĻž āĻŦā§āĻāĻžāĻ° āĻāĻ¨ā§āĻ¯āĻĢā§āĻ˛āĻžāĻ¸ā§āĻ_āĻ°āĻĒā§āĻ¤āĻžāĻ¨āĻŋāĻāĻžāĻ°āĻ āĻāĻāĻāĻŋ āĻ¨ā§āĻ¯ā§āĻ¨āĻ¤āĻŽ āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻ¯āĻĨā§āĻˇā§āĻ:
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{collection="10002", status = "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 â āĻĒā§āĻ°āĻŽāĻŋāĻĨāĻŋāĻāĻ¸ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻ āĻŦā§āĻ¤āĻ˛ āĻ°āĻĒā§āĻ¤āĻžāĻ¨āĻŋāĻāĻžāĻ°āĻ -
āĻĒā§āĻ°āĻŽāĻŋāĻĨāĻŋāĻāĻ¸-āĻĢā§āĻ˛āĻžāĻ¸ā§āĻ-āĻ°āĻĒā§āĻ¤āĻžāĻ¨āĻŋāĻāĻžāĻ°āĻ README â āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°, āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻāĻŦāĻ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ°ā§āĻļāĻ¨ āĻŦāĻŋāĻāĻ˛ā§āĻĒ -
āĻĒā§āĻ°āĻŽāĻŋāĻĨāĻŋāĻāĻ¸-āĻĢā§āĻ˛āĻžāĻ¸ā§āĻ-āĻ°āĻĒā§āĻ¤āĻžāĻ¨āĻŋāĻāĻžāĻ°āĻ āĻāĻĻāĻžāĻšāĻ°āĻŖ â āĻŦāĻŋāĻāĻŋāĻ¨ā§āĻ¨ āĻāĻĒāĻžāĻ¯āĻŧā§ āĻĢā§āĻ˛āĻžāĻ¸ā§āĻ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻŽāĻ¨āĻŋāĻāĻ°āĻŋāĻ āĻ¸ā§āĻ āĻāĻĒ āĻāĻ°āĻžāĻ° āĻāĻĻāĻžāĻšāĻ°āĻŖ -
PyPI-āĻ¤ā§ prometheus-flask-āĻ°āĻĒā§āĻ¤āĻžāĻ¨āĻŋāĻāĻžāĻ°āĻ â āĻāĻ āĻĒā§āĻ°āĻāĻ˛ā§āĻĒāĻāĻŋ PyPI-āĻ¤ā§ āĻ°āĻ¯āĻŧā§āĻā§ -
prometheus/client_python â āĻĒāĻžāĻāĻĨāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ āĻĢāĻŋāĻ¸āĻŋāĻ¯āĻŧāĻžāĻ˛ āĻĒā§āĻ°āĻŽāĻŋāĻĨāĻŋāĻāĻ¸ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻ˛āĻžāĻāĻŦā§āĻ°ā§āĻ°āĻŋ
āĻāĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻāĻŋ āĻā§āĻˇā§āĻāĻž āĻāĻ°āĻžāĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨ā§āĻ¨, āĻ¤āĻžāĻšāĻ˛ā§ āĻ¨āĻŋāĻ°ā§āĻĻā§āĻŦāĻŋāĻ§āĻžāĻ¯āĻŧ āĻāĻŋāĻāĻšāĻžāĻŦā§ āĻāĻāĻāĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻā§āĻ˛ā§āĻ¨ āĻŦāĻž āĻāĻĒāĻ¨āĻžāĻ° āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯, āĻĒā§āĻ°āĻ¤āĻŋāĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻŦāĻ āĻĒāĻ°āĻžāĻŽāĻ°ā§āĻļ āĻĻāĻŋāĻ¨!
āĻ§āĻ¨ā§āĻ¯āĻŦāĻžāĻĻ!
āĻāĻ¤ā§āĻ¸: www.habr.com