Kula da Microservices na Flask tare da Prometheus

Layukan lamba biyu da aikace-aikacenku suna haifar da awo, wow!

Don fahimtar yadda prometheus_ ke aikiflask_mai fitarwa ƙaramin misali ya isa:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Wannan shine abin da kuke buƙata don farawa! Ta ƙara shigo da layi don farawa PrometheusMetrics, za ku sami ma'auni lokacin nema и buƙatun ƙira, wanda aka nuna a ƙarshen ƙarshen / awo aikace-aikacen Flask ɗin da aka yi rajista da shi, da kuma duk tsoffin ma'auni da kuke samu daga tushe Laburaren abokin ciniki na Prometheus.

zaku iya samu mai sauƙin amfani misali a cikin ma'ajin GitHub wanda ke gudanar da misalin Prometheus и Grafana tare da aikace-aikacen demo don samar da ma'auni waɗanda zasu yi kama da wani abu kamar haka:

Kula da Microservices na Flask tare da Prometheus

Hakanan zaka sami jerin alamomi a ciki README misalan da suka bayyana a cikin dashboard, tare da tambayoyin Prometheus waɗanda ke cika dashboards.

gyara

Akwai zaɓuɓɓukan daidaitawa da yawa a cikin ɗakin karatu, duba README aiwatar da misalan su tare da taƙaitaccen bayani.

Ana nuna ainihin tsari a sama. Kawai ƙirƙirar misali PrometheusMetrics, mu kira shi matakan, sannan yi amfani da shi don ayyana ƙarin awo da kuke son tattarawa ta hanyar ƙawata ayyukan:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Masu kirga kira, wasu kuma suna tattara awo dangane da tsawon waɗancan kiran. Kuna iya ayyana alamun kowane ɗayan waɗannan, mai yuwuwar yin amfani da buƙatu ko kaddarorin amsawa. Misali:

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

A cikin misalin da ke sama, danna kan ƙarshen ƙarshen /tarin/10002/item/76 zai sa counter ya karu, misali cnt_collection{tarin = "10002", matsayi = "200"}, da za ku sami ma'auni na asali (na kowane maƙasudin ƙarshen wannan misalin) daga tsoffin ɗakin karatu:

  • flask_http_request_duration_seconds - Tsawon lokacin buƙatar HTTP a cikin daƙiƙa don duk buƙatun Flask ta hanya, hanya da matsayi

  • flask_http_request_total - Jimlar adadin buƙatun HTTP ta hanyoyi da matsayi

Akwai zaɓuɓɓuka don tsallake bin diddigin takamaiman wuraren ƙarewa, shigar da ƙarin ma'auni na tsoho ko tsallake waɗanda aka jera a sama, ko amfani da awo na al'ada iri ɗaya zuwa wuraren ƙarewa da yawa. Duba README aikin don ganin abin da ke akwai.

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

Laburaren yana da fa'idodi masu dacewa don shahararrun ɗakunan karatu masu sarrafa abubuwa kamar uWSGI da Gunicorn. Hakanan zaka iya nemo ƙananan misalan abubuwan amfani da aka yi niyya, gami da sarrafawa da yawa.

Tarin awo

Kamar yadda aka ambata a sama, ɗakin karatu yana ba da ƙarshen ƙarshen ta tsohuwa / awo a cikin aikace-aikacen Flask, wanda zai iya zama manufa don Prometheus magini.

A cikin misalin dashboard ɗin da ke sama, zaku iya ƙaddamar da Prometheus ɗin ku zuwa aikace-aikacen Flask tare da saitunan tsoho tare da wannan tsarin:

scrape_configs:
  - job_name: 'example'

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

Dubi cikakken misali a Ma'ajiyar GitHub. Wannan yana ɗauka cewa Prometheus na iya samun misalan aikace-aikacen Flask ɗin ku http://app:5000/metrics, inda sunan yankin aikace-aikacen zai iya yuwuwar warwarewa zuwa adiresoshin IP da yawa, misali lokacin shiga ciki Kubernetes ko Ckerungiyar Docker.

Idan fallasa ma'aunin ƙarshen wannan hanyar bai dace da ku ba, wataƙila saboda ba ku son ba da izinin shiga waje, kuna iya kashe shi cikin sauƙi ta wucewa. hanya=Babu lokacin ƙirƙirar misali 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)

Sa'an nan za ku iya amfani start_http_server(tashar ruwa)don buɗe wannan ƙarshen ƙarshen akan tashar HTTP daban-daban, 5099 a cikin misalin da ke sama. A madadin, idan kuna farin ciki da ƙarshen kasancewa a cikin aikace-aikacen Flask iri ɗaya, amma kuna buƙatar canza hanyarsa daga. / awo, za ka iya ko dai wuce wani URI a matsayin hanyar siga, ko amfani register_endpoint(..)don shigar da shi daga baya.

nassoshi

Idan kun yanke shawarar gwada shi, jin daɗin buɗe wani batu akan GitHub ko barin tsokaci, ra'ayoyin ku, da shawarwarinku!

Na gode!

source: www.habr.com

Add a comment