āĻĒā§āĻ°āĻŽāĻŋāĻĨāĻŋāĻ‰āĻ¸ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĢā§āĻ˛āĻžāĻ¸ā§āĻ• āĻŽāĻžāĻ‡āĻ•ā§āĻ°ā§‹āĻ¸āĻžāĻ°ā§āĻ­āĻŋāĻ¸ āĻ¨āĻŋāĻ°ā§€āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻž

āĻ•ā§‹āĻĄā§‡āĻ° āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻ˛āĻžāĻ‡āĻ¨ āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•ā§āĻ¸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡, āĻŦāĻžāĻš!

āĻĒā§āĻ°āĻŽāĻŋāĻĨāĻŋāĻ‰āĻ¸_ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡ āĻ¤āĻž āĻŦā§‹āĻāĻžāĻ° āĻœāĻ¨ā§āĻ¯āĻĢā§āĻ˛āĻžāĻ¸ā§āĻ•_āĻ°āĻĒā§āĻ¤āĻžāĻ¨āĻŋāĻ•āĻžāĻ°āĻ• āĻāĻ•āĻŸāĻŋ āĻ¨ā§āĻ¯ā§‚āĻ¨āĻ¤āĻŽ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ¯āĻĨā§‡āĻˇā§āĻŸ:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

āĻ¯ā§‡ āĻ¸āĻŦ āĻ†āĻĒāĻ¨āĻŋ āĻļā§āĻ°ā§ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡! āĻ†āĻ°āĻŽā§āĻ­ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ†āĻŽāĻĻāĻžāĻ¨āĻŋ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ˛āĻžāĻ‡āĻ¨ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§‡ āĻĒā§āĻ°āĻŽāĻŋāĻĨāĻŋāĻ‰āĻ¸āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•ā§āĻ¸, āĻ†āĻĒāĻ¨āĻŋ āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•ā§āĻ¸ āĻĒāĻžāĻŦā§‡āĻ¨ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧāĻ•āĻžāĻ˛ и āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ•āĻžāĻ‰āĻ¨ā§āĻŸāĻžāĻ°, āĻļā§‡āĻˇ āĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸā§‡ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻŋāĻ¤ āĻšāĻ¯āĻŧ /āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•ā§āĻ¸ āĻĢā§āĻ˛āĻžāĻ¸ā§āĻ• āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻŸāĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻŸāĻŋ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŋāĻ¤, āĻ¸ā§‡āĻ‡āĻ¸āĻžāĻĨā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻŦā§‡āĻ¸ āĻĨā§‡āĻ•ā§‡ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•ā§āĻ¸ āĻĒā§āĻ°āĻŽāĻŋāĻĨāĻŋāĻ‰āĻ¸ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ.

āĻ¤ā§āĻŽāĻŋ āĻ–ā§āĻœā§‡āĻ āĻĒāĻžāĻŦā§‡ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¸āĻšāĻœ GitHub āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛ā§‡ āĻ¯āĻž āĻĻā§ƒāĻˇā§āĻŸāĻžāĻ¨ā§āĻ¤ āĻšāĻžāĻ˛āĻžāĻ¯āĻŧ āĻĒā§āĻ°āĻŽāĻŋāĻĨāĻŋāĻ‰āĻ¸ и āĻ—ā§āĻ°āĻžāĻĢāĻžāĻ¨āĻž āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•ā§āĻ¸ āĻœā§‡āĻ¨āĻžāĻ°ā§‡āĻŸ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĄā§‡āĻŽā§‹ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ¸āĻš āĻ¯āĻž āĻĻā§‡āĻ–āĻ¤ā§‡ āĻāĻ°āĻ•āĻŽ āĻ•āĻŋāĻ›ā§ āĻšāĻŦā§‡:

āĻĒā§āĻ°āĻŽāĻŋāĻĨāĻŋāĻ‰āĻ¸ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĢā§āĻ˛āĻžāĻ¸ā§āĻ• āĻŽāĻžāĻ‡āĻ•ā§āĻ°ā§‹āĻ¸āĻžāĻ°ā§āĻ­āĻŋāĻ¸ āĻ¨āĻŋāĻ°ā§€āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻž

āĻ†āĻĒāĻ¨āĻŋ āĻ¸ā§‚āĻšāĻ•āĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ“ āĻĒāĻžāĻŦā§‡āĻ¨ README āĻĄā§āĻ¯āĻžāĻļāĻŦā§‹āĻ°ā§āĻĄā§‡ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻŋāĻ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ, āĻĒā§āĻ°āĻŽāĻŋāĻĨāĻŋāĻ‰āĻ¸ā§‡āĻ° āĻĒā§āĻ°āĻļā§āĻ¨ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§‡āĻ—ā§āĻ˛āĻŋ āĻĄā§āĻ¯āĻžāĻļāĻŦā§‹āĻ°ā§āĻĄāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻĒāĻĒā§āĻ˛ā§‡āĻŸ āĻ•āĻ°ā§‡āĨ¤

āĻ¸āĻŽāĻ¨ā§āĻŦāĻ¯āĻŧ

āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋāĻ¤ā§‡ āĻ…āĻ¨ā§‡āĻ• āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻ…āĻĒāĻļāĻ¨ āĻ†āĻ›ā§‡, āĻĻā§‡āĻ–ā§āĻ¨ README āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ•ā§āĻˇāĻŋāĻĒā§āĻ¤ āĻŦā§āĻ¯āĻžāĻ–ā§āĻ¯āĻž āĻ¸āĻ™ā§āĻ—ā§‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ.

āĻŽā§ŒāĻ˛āĻŋāĻ• āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻ‰āĻĒāĻ°ā§‡ āĻĻā§‡āĻ–āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡. āĻļā§āĻ§ā§ āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨ āĻĒā§āĻ°āĻŽāĻŋāĻĨāĻŋāĻ‰āĻ¸āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•ā§āĻ¸, āĻāĻ° āĻ•āĻ˛ āĻ•āĻ°āĻž āĻ¯āĻžāĻ• āĻ›āĻ¨ā§āĻĻā§‹āĻŦāĻŋāĻœā§āĻžāĻžāĻ¨, āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻĒāĻ° āĻĢāĻžāĻ‚āĻļāĻ¨āĻ—ā§āĻ˛āĻŋ āĻ¸āĻžāĻœāĻŋāĻ¯āĻŧā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ¯ā§‡ āĻ…āĻ¤āĻŋāĻ°āĻŋāĻ•ā§āĻ¤ āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•āĻ—ā§āĻ˛āĻŋ āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨ āĻ¤āĻž āĻ¸āĻ‚āĻœā§āĻžāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨:

  • @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 āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ā§‡āĻ° āĻŽā§‹āĻŸ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž

āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻāĻ¨ā§āĻĄāĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ āĻāĻĄāĻŧāĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ“āĻ¯āĻŧāĻžāĻ°, āĻ…āĻ¤āĻŋāĻ°āĻŋāĻ•ā§āĻ¤ āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•ā§āĻ¸ āĻ˛āĻ— āĻ•āĻ°āĻžāĻ° āĻŦāĻž āĻ‰āĻĒāĻ°ā§‡ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ­ā§āĻ•ā§āĻ¤ āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋ āĻāĻĄāĻŧāĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ“āĻ¯āĻŧāĻžāĻ° āĻŦāĻž āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻāĻ¨ā§āĻĄāĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸā§‡ āĻāĻ•āĻ‡ āĻ•āĻžāĻ¸ā§āĻŸāĻŽ āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ• āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°āĻžāĻ° āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ā§ˇ āĻšā§‡āĻ• āĻ†āĻ‰āĻŸ 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 āĻ āĻŋāĻ•āĻžāĻ¨āĻžāĻ° āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ āĻ¯āĻ–āĻ¨ āĻšāĻ˛āĻŽāĻžāĻ¨ Kubernetes āĻŦāĻž āĻĄāĻ•āĻžāĻ° āĻ¸ā§‹āĻ°ā§āĻŽ.

āĻ¯āĻĻāĻŋ āĻāĻ‡āĻ­āĻžāĻŦā§‡ āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•ā§āĻ¸ āĻāĻ¨ā§āĻĄāĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ•āĻ°āĻž āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒāĻ•ā§āĻˇā§‡ āĻ‰āĻĒāĻ¯ā§āĻ•ā§āĻ¤ āĻ¨āĻž āĻšāĻ¯āĻŧ, āĻ¸āĻŽā§āĻ­āĻŦāĻ¤ āĻ†āĻĒāĻ¨āĻŋ āĻāĻŸāĻŋāĻ¤ā§‡ āĻŦāĻžāĻšā§āĻ¯āĻŋāĻ• āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ā§‡āĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻāĻŋāĻ¤ā§‡ āĻšāĻžāĻ¨ āĻ¨āĻž, āĻ†āĻĒāĻ¨āĻŋ āĻĒāĻžāĻ¸ āĻ•āĻ°ā§‡ āĻ¸āĻšāĻœā§‡āĻ‡ āĻāĻŸāĻŋ āĻ…āĻ•ā§āĻˇāĻŽ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻĒāĻĨ=āĻ•ā§‹āĻ¨āĻŸāĻŋ āĻ¨āĻ¯āĻŧ āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻĒā§āĻ°āĻŽāĻŋāĻĨāĻŋāĻ‰āĻ¸āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•ā§āĻ¸.

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 āĻĒāĻžāĻ¸ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨, āĻ…āĻĨāĻŦāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻ°ā§‡āĻœāĻŋāĻ¸ā§āĻŸāĻžāĻ°_āĻāĻ¨ā§āĻĄāĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ(..)āĻĒāĻ°ā§‡ āĻ‡āĻ¨ā§āĻ¸āĻŸāĻ˛ āĻ•āĻ°āĻ¤ā§‡āĨ¤

āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸

āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻŸāĻŋ āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°āĻžāĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨ā§‡āĻ¨, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ¨āĻŋāĻ°ā§āĻĻā§āĻŦāĻŋāĻ§āĻžāĻ¯āĻŧ āĻ—āĻŋāĻŸāĻšāĻžāĻŦā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ–ā§āĻ˛ā§āĻ¨ āĻŦāĻž āĻ†āĻĒāĻ¨āĻžāĻ° āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯, āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻŦāĻ‚ āĻĒāĻ°āĻžāĻŽāĻ°ā§āĻļ āĻĻāĻŋāĻ¨!

āĻ§āĻ¨ā§āĻ¯āĻŦāĻžāĻĻ!

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨