Saib xyuas Flask Microservices nrog Prometheus

Ob peb kab ntawm cov lej thiab koj daim ntawv thov tsim cov metrics, wow!

Yuav kom nkag siab tias prometheus_ ua haujlwm li cascawv_exporter ib qho piv txwv tsawg yog txaus:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

Nov yog txhua yam koj xav tau los pib! Los ntawm kev ntxiv ib qho ntshuam thiab kab rau kev pib PrometheusMetrics, koj yuav tau txais metrics thov ncua sijhawm ΠΈ thov cov txee, tso tawm rau ntawm qhov kawg / metrics Daim ntawv thov Flask nws tau sau npe nrog, nrog rau txhua qhov kev ntsuas kev ntsuas uas koj tau txais los ntawm lub hauv paus Prometheus Client Library.

koj tuaj yeem nrhiav yooj yim siv piv txwv hauv GitHub repository uas khiav qhov piv txwv Prometheus ΠΈ ua grafana nrog rau daim ntawv thov demo los tsim cov kev ntsuas uas yuav zoo li no:

Saib xyuas Flask Microservices nrog Prometheus

Koj tseem yuav pom cov npe ntawm cov ntsuas hauv NYEEM piv txwv uas tshwm hauv dashboard, nrog rau Prometheus queries uas populate dashboards.

hloov

Muaj ntau ntau txoj kev xaiv nyob rau hauv lub tsev qiv ntawv, saib NYEEM project piv txwv ntawm lawv nrog cov lus piav qhia luv luv.

Lub hauv paus configuration yog qhia saum toj no. Tsuas yog tsim ib qho piv txwv PrometheusMetrics, wb hu metrics, thiab tom qab ntawd siv nws los txheeb xyuas cov kev ntsuas ntxiv uas koj xav sau los ntawm kev dai cov haujlwm:

  • @metrics.counter(..)

  • @metrics.gauge(..)

  • @metrics.summary(..)

  • @metrics.histogram(..)

Cov suav suav suav hu, thiab lwm tus sau cov ntsuas raws li lub sijhawm hu. Koj tuaj yeem txhais cov ntawv sau rau txhua qhov no, muaj peev xwm siv cov lus thov lossis cov lus teb. Piv txwv li:

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

Hauv qhov piv txwv saum toj no, nyem rau ntawm qhov kawg /collection/10002/ khoom/76 yuav ua rau tus counter increment, piv txwv li cnt_collection{collection = "10002", xwm txheej = "200"}, ntxiv rau koj yuav tau txais cov metrics default (rau txhua qhov kawg hauv qhov piv txwv no) los ntawm lub tsev qiv ntawv default:

  • flask_http_request_duration_seconds - HTTP thov ncua sijhawm hauv vib nas this rau txhua qhov kev thov Flask los ntawm txoj kev, txoj hauv kev thiab xwm txheej

  • flask_http_request_total - Tag nrho cov naj npawb ntawm HTTP thov los ntawm txoj kev thiab cov xwm txheej

Muaj cov kev xaiv hla kev taug qab cov ntsiab lus tshwj xeeb, nkag mus ntxiv cov kev ntsuas kev ntsuas tam sim no lossis hla cov teev saum toj no, lossis siv tib qhov kev cai ntsuas rau ntau qhov kawg. Tshawb xyuas NYEEM qhov project kom pom dab tsi muaj.

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

Lub tsev qiv ntawv muaj qhov yooj yim txuas ntxiv rau ntau lub tsev qiv ntawv nrov xws li uWSGI thiab Gunicorn. Koj tuaj yeem pom cov piv txwv me me ntawm cov teeb meem siv, suav nrog kev ua haujlwm ntau.

metrics collection

Raws li tau hais los saum no, lub tsev qiv ntawv muab qhov kawg ntawm lub neej ntawd / metrics hauv ib daim ntawv thov Flask, uas tuaj yeem ua lub hom phiaj rau Prometheus builder.

Hauv qhov piv txwv dashboard saum toj no, koj tuaj yeem tsom koj Prometheus mus rau Flask daim ntawv thov nrog cov teeb tsa ua ntej nrog qhov teeb tsa no:

scrape_configs:
  - job_name: 'example'

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

Saib piv txwv tag nrho ntawm GitHub repositories. Qhov no xav tias Prometheus tuaj yeem pom koj cov ntawv thov Flask rau http://app:5000/metrics, qhov twg daim ntawv thov sau npe tuaj yeem daws tau ntau qhov chaw nyob IP, piv txwv li thaum khiav hauv Kubernetes los yog Docker swb.

Yog tias nthuav tawm cov kev ntsuas qhov kawg ntawm txoj kev no tsis haum rau koj, tej zaum vim tias koj tsis xav tso cai rau sab nraud rau nws, koj tuaj yeem yooj yim lov tes taw los ntawm kev hla. path = Tsis muaj thaum tsim ib qho piv txwv 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)

Tom qab ntawd koj tuaj yeem siv start_http_server(chaw nres nkoj)qhib qhov kawg ntawm qhov chaw nres nkoj HTTP sib txawv, 5099 hauv qhov piv txwv saum toj no. Xwb, yog tias koj zoo siab nrog qhov kawg nyob hauv tib daim ntawv thov Flask, tab sis koj yuav tsum hloov nws txoj hauv kev los ntawm / metrics, koj tuaj yeem hla lwm URI raws li txoj kev parameter, lossis siv register_endpoint (..)rau nruab nws tom qab.

ua tim khawv

Yog tias koj txiav txim siab muab nws sim, xav qhib qhov teeb meem ntawm GitHub lossis tawm koj cov lus, tawm tswv yim, thiab cov lus qhia!

Ua tsaug!

Tau qhov twg los: www.hab.com

Ntxiv ib saib