Övervakning av Flask-mikrotjĂ€nster med Prometheus

Ett par kodrader och din applikation genererar mÀtvÀrden, wow!

För att förstÄ hur prometheus_ fungerarflask_exporter behövs ett enkelt exempel:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Det Àr allt som behövs för att komma igÄng! Genom att lÀgga till import och en rad för att initiera PrometheusMetrics, fÄr du mÀtvÀrden förfrÄgningarnas varaktighet och förfrÄgningsrÀknare, som visas i slutpunkten /metrics av Flask-applikationen dÀr det Àr registrerat, samt alla standardmÀtvÀrden som du fÄr frÄn den grundlÀggande klientbiblioteket Prometheus.

Du kan hitta ett enkelt exempel i GitHub-förvaret som kör en instans Prometheus och Grafana tillsammans med ett demonstrationsprogram för att generera mÀtvÀrden som skulle se ut ungefÀr sÄ hÀr:

Övervakning av Flask-mikrotjĂ€nster med Prometheus

Du kommer ocksÄ att hitta en lista över mÀtvÀrden i README exemplet som visas pÄ instrumentpanelen, tillsammans med Prometheus-förfrÄgningar som fyller panelerna.

InstÀllning

Biblioteket har mÄnga konfigurationsalternativ, kolla in README projektet för deras exempel med en kort förklaring.

Den grundlÀggande konfigurationen visas högst upp. Skapa bara en instans PrometheusMetrics, lÄt oss kalla den metrics, och anvÀnd sedan den för att definiera ytterligare mÀtvÀrden som du vill samla in genom att dekorera funktioner:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

RÀknare rÀknar anrop, medan de andra samlar in mÀtvÀrden beroende pÄ varaktigheten av dessa anrop. Du kan definiera etiketter för var och en av dem, potentiellt anvÀnda egenskaper frÄn förfrÄgan eller svaret. Till exempel:

from flask import Flask, request
from prometheus_flask_exporter import PrometheusMetrics

app = Flask(__name__)

# gruppera efter slutpunkt istÀllet för sökvÀg
metrics = PrometheusMetrics(app, group_by='endpoint')

@app.route(' / collection / :collection_id / item / :item_id')
@metrics.counter(
    'cnt_collection', 'Antal anrop per samling', labels={
        'collection': lambda: request.view_args['collection_id'],
        'status': lambda resp: resp.status_code
    })
def get_item_from_collection(collection_id, item_id):
    pass

I det ovanstÄende exemplet kommer ett tryck pÄ slutpunkten /collection/10002/item/76 att öka rÀknaren, till exempel cnt_collection{collection = "10002", status = "200"}, plus att du fÄr standardmÀtvÀrden (för varje slutpunkt i detta exempel) frÄn biblioteket som standard:

  • flask_http_request_duration_seconds — Varaktigheten av HTTP-förfrĂ„gan i sekunder för alla Flask-förfrĂ„gningar efter metod, sökvĂ€g och status

  • flask_http_request_total — Totalt antal HTTP-förfrĂ„gningar efter metoder och statusar

Det finns alternativ för att hoppa över att spÄra vissa slutpunkter, registrera ytterligare standardmetrik eller hoppa över de ovan angivna, eller tillÀmpa samma anpassade metrik pÄ flera slutpunkter. LÀs mer om README projektet för att ta reda pÄ vad som Àr tillgÀngligt.

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

Biblioteket har anvÀndarvÀnliga tillÀgg för populÀra flertrÄdiga bibliotek som uWSGI och Gunicorn. Du kan Àven hitta smÄ exempel pÄ praktiska anvÀndningsfall, inklusive flertrÄdiga.

Insamling av metrik

Som nÀmnts tidigare tillhandahÄller biblioteket som standard en slutpunkt /metrics i Flask-applikationen som kan fungera som mÄl för Prometheus-samlaren.

I det ovan nÀmnda exemplet med instrumentpanelen kan du rikta din Prometheus mot Flask-applikationen med standardinstÀllningar med följande konfiguration:

scrape_configs:
  - job_name: 'example'

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

Se hela exemplet i GitHub-repo. Detta förutsÀtter att Prometheus kan hitta dina instanser av Flask-applikationen pÄ http://app:5000/metrics, dÀr domÀnnamnet för applikationen potentiellt kan lösas till flera IP-adresser, exempelvis nÀr du kör i Kubernetes eller Docker Swarm.

Om sÄdan exponering av metrikens slutpunkt inte passar dig, kanske för att du inte vill tillÄta extern Ätkomst till den, kan du enkelt inaktivera den genom att skicka path=None nÀr du skapar instansen 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)

Du kan sedan anvÀnda start_http_server(port), för att öppna denna slutpunkt pÄ en annan HTTP-port, 5099 i det ovan nÀmnda exemplet. Alternativt, om du Àr okej med att slutpunkten Àr i samma Flask-applikation, men behöver Àndra dess vÀg frÄn /metrics, du kan antingen ange en annan URI som en sökvÀgsparameter eller anvÀnda register_endpoint(..), för att stÀlla in detta senare.

LĂ€nkar

Om du bestÀmmer dig för att prova, tveka inte att öppna en issue pÄ GitHub eller lÀmna dina kommentarer, recensioner och förslag!

Tack!

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster