НадглСдањС Ѐласк микросСрвиса са ΠŸΡ€ΠΎΠΌΠ΅Ρ‚Ρ…Π΅ΡƒΡΠΎΠΌ

НСколико линија ΠΊΠΎΠ΄Π° ΠΈ ваша Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π³Π΅Π½Π΅Ρ€ΠΈΡˆΠ΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΡƒ, Π²Π°Ρƒ!

Π”Π° бисмо Ρ€Π°Π·ΡƒΠΌΠ΅Π»ΠΈ ΠΊΠ°ΠΊΠΎ ΠΏΡ€ΠΎΠΌΠ΅Ρ‚Π΅Ρ˜_ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡˆΠ΅Ρ„Π»Π°ΡΠΊ_ΠΈΠ·Π²ΠΎΠ·Π½ΠΈΠΊ Π΄ΠΎΠ²ΠΎΡ™Π°Π½ јС ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

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

Π£ Π³ΠΎΡ€ΡšΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΊΠ»ΠΈΠΊΠΎΠΌ Π½Π° ΠΊΡ€Π°Ρ˜ΡšΡƒ Ρ‚Π°Ρ‡ΠΊΡƒ /Ρ†ΠΎΠ»Π»Π΅Ρ†Ρ‚ΠΈΠΎΠ½/10002/ΠΈΡ‚Π΅ΠΌ/76 Ρ›Π΅ ΡƒΠ·Ρ€ΠΎΠΊΠΎΠ²Π°Ρ‚ΠΈ ΠΏΠΎΠ²Π΅Ρ›Π°ΡšΠ΅ Π±Ρ€ΠΎΡ˜Π°Ρ‡Π°, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ†Π½Ρ‚_Ρ†ΠΎΠ»Π»Π΅Ρ†Ρ‚ΠΈΠΎΠ½{Ρ†ΠΎΠ»Π»Π΅Ρ†Ρ‚ΠΈΠΎΠ½ = "10002", статус = "200"}, плус Π΄ΠΎΠ±ΠΈΡ›Π΅Ρ‚Π΅ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π½Ρƒ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΡƒ (Π·Π° сваку ΠΊΡ€Π°Ρ˜ΡšΡƒ Ρ‚Π°Ρ‡ΠΊΡƒ Ρƒ ΠΎΠ²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ) ΠΈΠ· ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π½Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅:

  • flask_http_request_duration_seconds β€” Π’Ρ€Π°Ρ˜Π°ΡšΠ΅ Π₯ВВП Π·Π°Ρ…Ρ‚Π΅Π²Π° Ρƒ сСкундама Π·Π° свС Ѐласк Π·Π°Ρ…Ρ‚Π΅Π²Π΅ ΠΏΡ€Π΅ΠΌΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ, ΠΏΡƒΡ‚Π°ΡšΠΈ ΠΈ статусу

  • flask_http_request_total β€” Π£ΠΊΡƒΠΏΠ°Π½ Π±Ρ€ΠΎΡ˜ Π₯ВВП Π·Π°Ρ…Ρ‚Π΅Π²Π° ΠΏΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠ° ΠΈ статусима

ΠŸΠΎΡΡ‚ΠΎΡ˜Π΅ ΠΎΠΏΡ†ΠΈΡ˜Π΅ Π΄Π° прСскочитС ΠΏΡ€Π°Ρ›Π΅ΡšΠ΅ ΠΎΠ΄Ρ€Π΅Ρ’Π΅Π½ΠΈΡ… ΠΊΡ€Π°Ρ˜ΡšΠΈΡ… Ρ‚Π°Ρ‡Π°ΠΊΠ°, Π΅Π²ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ€Π°Ρ‚Π΅ Π΄ΠΎΠ΄Π°Ρ‚Π½Π΅ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π½Π΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ΅ ΠΈΠ»ΠΈ прСскочитС ΠΎΠ½Π΅ Π³ΠΎΡ€Π΅ Π½Π°Π²Π΅Π΄Π΅Π½Π΅ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ исту ΠΏΡ€ΠΈΠ»Π°Π³ΠΎΡ’Π΅Π½Ρƒ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΡƒ Π½Π° вишС ΠΊΡ€Π°Ρ˜ΡšΠΈΡ… Ρ‚Π°Ρ‡Π°ΠΊΠ°. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈ Π Π•ΠΠ”ΠœΠ• ΠΏΡ€ΠΎΡ˜Π΅ΠΊΠ°Ρ‚ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΡˆΡ‚Π° јС доступно.

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}
    )
)

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈΠΌΠ° ΠΏΠΎΠ³ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΡˆΠΈΡ€Π΅ΡšΠ° Π·Π° ΠΏΠΎΠΏΡƒΠ»Π°Ρ€Π½Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π·Π° вишС процСса ΠΊΠ°ΠΎ ΡˆΡ‚ΠΎ су ΡƒΠ’Π‘Π“Π˜ ΠΈ Π“ΡƒΠ½ΠΈΡ†ΠΎΡ€Π½. Π’Π°ΠΊΠΎΡ’Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ½Π°Ρ›ΠΈ ΠΌΠ°Π»Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ†ΠΈΡ™Π°Π½ΠΈΡ… ΡΠ»ΡƒΡ‡Π°Ρ˜Π΅Π²Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π΅, ΡƒΠΊΡ™ΡƒΡ‡ΡƒΡ˜ΡƒΡ›ΠΈ Π²ΠΈΡˆΠ΅ΠΏΡ€ΠΎΡ†Π΅ΡΠ½Ρƒ ΠΎΠ±Ρ€Π°Π΄Ρƒ.

ΠšΠΎΠ»Π΅ΠΊΡ†ΠΈΡ˜Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°

Као ΡˆΡ‚ΠΎ јС Π³ΠΎΡ€Π΅ ΠΏΠΎΠΌΠ΅Π½ΡƒΡ‚ΠΎ, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π½ΠΎ ΠΎΠ±Π΅Π·Π±Π΅Ρ’ΡƒΡ˜Π΅ ΠΊΡ€Π°Ρ˜ΡšΡƒ Ρ‚Π°Ρ‡ΠΊΡƒ /мСтрицс Ρƒ Ѐласк Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜ΠΈ, која ΠΌΠΎΠΆΠ΅ послуТити ΠΊΠ°ΠΎ ΠΌΠ΅Ρ‚Π° Π·Π° ΠŸΡ€ΠΎΠΌΠ΅Ρ‚Π΅Ρ˜ Π³Ρ€Π°Π΄ΠΈΡ‚Π΅Ρ™.

Π£ Π³ΠΎΡ€ΡšΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½Π΅ Ρ‚Π°Π±Π»Π΅, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ†ΠΈΡ™Π°Ρ‚ΠΈ свој ΠŸΡ€ΠΎΠΌΠ΅Ρ‚Ρ…Π΅ΡƒΡ Π½Π° Ѐласк Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Ρƒ са ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π½ΠΈΠΌ подСшавањима са ΠΎΠ²ΠΎΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜ΠΎΠΌ:

scrape_configs:
  - job_name: 'example'

    dns_sd_configs:
      - names: ['app']
        port: 5000
        type: A
        refresh_interval: 5s

ΠŸΠΎΠ³Π»Π΅Π΄Π°Ρ˜Ρ‚Π΅ Ρ†Π΅ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° Π“ΠΈΡ‚Π₯ΡƒΠ± ΡΠΏΡ€Π΅ΠΌΠΈΡˆΡ‚Π°. Ово прСтпоставља Π΄Π° ΠŸΡ€ΠΎΠΌΠ΅Ρ‚Ρ…Π΅ΡƒΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€ΠΎΠ½Π°Ρ’Π΅ инстанцС вашС Ѐласк Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ http://app:5000/metrics, Π³Π΄Π΅ Π±ΠΈ ΠΈΠΌΠ΅ Π΄ΠΎΠΌΠ΅Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΡ˜Π°Π»Π½ΠΎ ΠΌΠΎΠ³Π»ΠΎ Π΄Π° сС Ρ€Π°Π·Ρ€Π΅ΡˆΠΈ Π½Π° вишС ИП адрСса, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ°Π΄Π° сС ΠΏΠΎΠΊΡ€Π΅Ρ›Π΅ ΠšΡƒΠ±Π΅Ρ€Π½Π΅Ρ‚Π΅Ρ ΠΈΠ»ΠΈ Π”ΠΎΡ†ΠΊΠ΅Ρ€ Π‘Π²Π°Ρ€ΠΌ.

Ако Π²Π°ΠΌ излагањС ΠΊΡ€Π°Ρ˜ΡšΠ΅ Ρ‚Π°Ρ‡ΠΊΠ΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ΅ Π½Π° овај Π½Π°Ρ‡ΠΈΠ½ Π½Π΅ ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π°, ΠΌΠΎΠΆΠ΄Π° Π·Π°Ρ‚ΠΎ ΡˆΡ‚ΠΎ Π½Π΅ ΠΆΠ΅Π»ΠΈΡ‚Π΅ Π΄Π° јој Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚Π΅ спољни приступ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ јС Π»Π°ΠΊΠΎ ΠΎΠ½Π΅ΠΌΠΎΠ³ΡƒΡ›ΠΈΡ‚ΠΈ Ρ‚Π°ΠΊΠΎ ΡˆΡ‚ΠΎ Ρ›Π΅Ρ‚Π΅ ΠΏΡ€Π΅Π½Π΅Ρ‚ΠΈ ΠΏΠ°Ρ‚Ρ…=ΠΠΈΡˆΡ‚Π° ΠΏΡ€ΠΈΠ»ΠΈΠΊΠΎΠΌ ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ° инстанцС ΠŸΡ€ΠΎΠΌΠ΅Ρ‚Ρ…Π΅ΡƒΡΠœΠ΅Ρ‚Ρ€ΠΈΡ†Ρ.

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)
metrics = PrometheusMetrics(app, path=None)

...

metrics.start_http_server(5099)

Онда ΠΌΠΎΠΆΠ΅Ρ‚Π΅ користити старт_Ρ…Ρ‚Ρ‚ΠΏ_сСрвСр(ΠΏΠΎΡ€Ρ‚)Π΄Π° ΠΎΡ‚Π²ΠΎΡ€ΠΈΡ‚Π΅ ΠΎΠ²Ρƒ ΠΊΡ€Π°Ρ˜ΡšΡƒ Ρ‚Π°Ρ‡ΠΊΡƒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π₯ВВП ΠΏΠΎΡ€Ρ‚Ρƒ, 5099 Ρƒ Π³ΠΎΡ€ΡšΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ. АлтСрнативно, Π°ΠΊΠΎ стС Π·Π°Π΄ΠΎΠ²ΠΎΡ™Π½ΠΈ ΡˆΡ‚ΠΎ јС ΠΊΡ€Π°Ρ˜ΡšΠ° Ρ‚Π°Ρ‡ΠΊΠ° Ρƒ ΠΈΡΡ‚ΠΎΡ˜ Ѐласк Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜ΠΈ, Π°Π»ΠΈ ΠΌΠΎΡ€Π°Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΡšΠ΅Π½Ρƒ ΠΏΡƒΡ‚Π°ΡšΡƒ са /мСтрицс, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ прослСдити Π΄Ρ€ΡƒΠ³ΠΈ УРИ ΠΊΠ°ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Π°Ρ€ ΠΏΡƒΡ‚Π°ΡšΠ΅ ΠΈΠ»ΠΈ користити рСгистСр_Π΅Π½Π΄ΠΏΠΎΠΈΠ½Ρ‚(..)Π΄Π° бистС Π³Π° каснијС инсталирали.

Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†Π΅

Ако ΠΎΠ΄Π»ΡƒΡ‡ΠΈΡ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΠ±Π°Ρ‚Π΅, слободно ΠΎΡ‚Π²ΠΎΡ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π° Π“ΠΈΡ‚Π₯ΡƒΠ±-Ρƒ ΠΈΠ»ΠΈ оставитС својС ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€Π΅, ΠΏΠΎΠ²Ρ€Π°Ρ‚Π½Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ˜Π΅ ΠΈ ΡΡƒΠ³Π΅ΡΡ‚ΠΈΡ˜Π΅!

Π₯Π²Π°Π»Π°!

Π˜Π·Π²ΠΎΡ€: Π²Π²Π².Ρ…Π°Π±Ρ€.Ρ†ΠΎΠΌ

Π”ΠΎΠ΄Π°Ρ˜ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€