ΠΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ΅Π΄Π° ΠΊΠΎΠ΄ ΠΈ Π²Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ, ΡΠ°Ρ!
ΠΠ° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ ΠΡΠΎΠΌΠ΅ΡΠ΅ΠΉ_ΠΊΠΎΠ»Π±Π°_ΠΈΠ·Π½ΠΎΡΠΈΡΠ΅Π» Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ΅Π½ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ:
from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics
app = Flask(__name__)
metrics = PrometheusMetrics(app)
@app.route('/')
def main():
return 'OK'Π’ΠΎΠ²Π° Π΅ Π²ΡΠΈΡΠΊΠΎ, ΠΎΡ ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΡΠ΅, Π·Π° Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅! Π§ΡΠ΅Π· Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΠΈΠΌΠΏΠΎΡΡ ΠΈ ΡΠ΅Π΄ Π·Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΠ΅ΡΡΠΈΠΊΠ° Π½Π° ΠΡΠΎΠΌΠ΅ΡΠ΅ΠΉ, ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎΡΡ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΠΈ Π±ΡΠΎΡΡΠΈ Π½Π° Π·Π°ΡΠ²ΠΊΠΈΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈ Π² ΠΊΡΠ°ΠΉΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ° /ΠΌΠ΅ΡΡΠΈΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Flask, Ρ ΠΊΠΎΠ΅ΡΠΎ Π΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½ΠΎ, ΠΏΠ»ΡΡ Π²ΡΠΈΡΠΊΠΈ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΡΠ΅ ΠΎΡ Π±Π°Π·Π°ΡΠ° .
ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° GitHub, ΠΊΠΎΠ΅ΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ° Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΈ Π·Π°Π΅Π΄Π½ΠΎ Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ, ΠΊΠΎΠ΅ΡΠΎ Π±ΠΈ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°Π»ΠΎ ΡΠ°ΠΊΠ°:

Π©Π΅ Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ ΠΈ ΡΠΏΠΈΡΡΠΊ Ρ ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡΠΈ Π² ΠΏΡΠΈΠΌΠ΅ΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΏΠΎΡΠ²ΡΠ²Π°Ρ Π² ΡΠ°Π±Π»ΠΎΡΠΎ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, Π·Π°Π΅Π΄Π½ΠΎ ΡΡΡ Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ Π½Π° Prometheus, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠΏΡΠ»Π²Π°Ρ ΡΠ°Π±Π»Π°ΡΠ° Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅.
ΡΠ΅Π³ΡΠ»ΠΈΡΠ°Π½Π΅
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΡΠΈΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΉΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°Ρ ΡΠ²ΠΎΠΈΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Ρ ΠΊΡΠ°ΡΠΊΠΎ ΠΎΠ±ΡΡΠ½Π΅Π½ΠΈΠ΅.
ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΏΠΎ-Π³ΠΎΡΠ΅. ΠΡΠΎΡΡΠΎ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠ°ΠΉΡΠ΅ ΠΠ΅ΡΡΠΈΠΊΠ° Π½Π° ΠΡΠΎΠΌΠ΅ΡΠ΅ΠΉ, Π΄Π° Π³ΠΎ Π½Π°ΡΠ΅ΡΠ΅ΠΌ ΠΌΠ΅ΡΡΠΈΠΊΠ°ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅, Π·Π° Π΄Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΡΠ΅ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΡΡΠ±Π΅ΡΠ΅ΡΠ΅ ΡΡΠ΅Π· Π΄Π΅ΠΊΠΎΡΠΈΡΠ°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ:
@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Π Π³ΠΎΡΠ½ΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠ°ΠΊΠ²Π°Π½Π΅ Π²ΡΡΡ Ρ ΠΊΡΠ°ΠΉΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ° /ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡ/10002/Ρ./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ΠΠΈΠΆΡΠ΅ ΠΏΡΠ»Π½ΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π° . Π’ΠΎΠ²Π° ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°, ΡΠ΅ Prometheus ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈ Π²Π°ΡΠΈΡΠ΅ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Flask Π½Π° http://app:5000/metrics, ΠΊΡΠ΄Π΅ΡΠΎ ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π΄ΠΎΠΌΠ΅ΠΉΠ½Π° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π·ΡΠ΅ΡΠΈ Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ IP Π°Π΄ΡΠ΅ΡΠΈ, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΠΈΠ»ΠΈ .
ΠΠΊΠΎ ΠΈΠ·Π»Π°Π³Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΡΠ°ΠΉΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ° Π½Π° ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈΡΠ΅ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π½Π΅ Π²ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠΆΠ΄Π°, ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π·Π°ΡΠΎΡΠΎ Π½Π΅ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΡΠ°Π·ΡΠ΅ΡΠΈΡΠ΅ Π²ΡΠ½ΡΠ΅Π½ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π½Π΅Ρ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π»Π΅ΡΠ½ΠΎ Π΄Π° Ρ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΡΠ΅, ΠΊΠ°ΡΠΎ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΡΠ΅ ΠΏΡΡ=ΠΡΠΌΠ° ΠΏΡΠΈ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠ°Π½Π΅ ΠΠ΅ΡΡΠΈΠΊΠ° Π½Π° ΠΡΠΎΠΌΠ΅ΡΠ΅ΠΉ.
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 Π² Π³ΠΎΡΠ½ΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ. ΠΠ°ΡΠΎ Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π°, Π°ΠΊΠΎ ΡΡΠ΅ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΈ ΠΎΡ ΡΠΎΠ²Π°, ΡΠ΅ ΠΊΡΠ°ΠΉΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ° Π΅ Π² ΡΡΡΠΎΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Flask, Π½ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΠΏΡΡΡ ΠΌΡ ΠΎΡ /ΠΌΠ΅ΡΡΠΈΠΊΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΠ΄Π°Π΄Π΅ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ URI ΠΊΠ°ΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π½Π° ΠΏΡΡΡ ΠΈΠ»ΠΈ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΡ_ΠΊΡΠ°ΠΉΠ½Π° ΡΠΎΡΠΊΠ°(..)Π·Π° Π΄Π° Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ.
ΠΠΎΠ·ΠΎΠ²Π°Π²Π°Π½Π΅ΡΠΎ
- Π’ΠΎΠ·ΠΈ ΠΈΠ·Π½ΠΎΡΠΈΡΠ΅Π» Π½Π° ΠΊΠΎΠ»Π±Π° Π·Π° ΠΡΠΎΠΌΠ΅ΡΠ΅ΠΉ
- ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅, ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΠΈ ΠΎΠΏΡΠΈΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
- ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π½Π° Flask ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½Π°ΡΠΈΠ½ΠΈ
β Π’ΠΎΠ·ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ Π΅ Π½Π° PyPI
- ΠΡΠΈΡΠΈΠ°Π»Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π½Π° Prometheus Π·Π° Python
ΠΠΊΠΎ ΡΠ΅ΡΠΈΡΠ΅ Π΄Π° ΠΎΠΏΠΈΡΠ°ΡΠ΅, Π½Π΅ ΡΠ΅ ΠΊΠΎΠ»Π΅Π±Π°ΠΉΡΠ΅ Π΄Π° ΠΎΡΠ²ΠΎΡΠΈΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π² GitHub ΠΈΠ»ΠΈ Π΄Π° ΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΡΠ²ΠΎΠΈΡΠ΅ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ, ΠΎΡΠ·ΠΈΠ²ΠΈ ΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ!
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π²ΠΈ!
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com
