使用 Prometheus 監控 Flask 微服務

只需幾行程式碼,您的應用程式就會產生指標,哇!

為了理解 prometheus_ 是如何運作的燒瓶_出口商一個最小的例子就夠了:

from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics

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

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

這就是您開始所需的全部內容! 透過新增導入和初始化行 PrometheusMetrics,你會得到指標 請求持續時間 и 請求計數器,顯示在端點處 /指標 它註冊的 Flask 應用程序,以及您從基礎獲取的所有預設指標 普羅米修斯客戶端庫.

你可以找到 易於使用的範例 在運行實例的 GitHub 儲存庫中 普羅米修斯 и 格拉法納 以及一個演示應用程式來產生如下所示的指標:

使用 Prometheus 監控 Flask 微服務

您也可以在以下位置找到指標清單: 自述 儀表板中顯示的範例,以及填充儀表板的 Prometheus 查詢。

調整

庫中有很多配置選項,看一下 自述 項目範例並附有簡要說明。

基本配置如上所示。 只需建立一個實例 PrometheusMetrics,我們稱之為 度量,然後使用它透過裝飾函數來定義您想要收集的其他指標:

  • @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{集合=“10002”,狀態=“200”},此外,您還將從預設庫中取得預設指標(對於本例中的每個端點):

  • flask_http_request_duration_seconds — 依方法、路徑和狀態列出的所有 Flask 請求的 HTTP 請求持續時間(以秒為單位)

  • 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

完整範例請參見 GitHub 儲存庫。 這假設 Prometheus 可以在以下位置找到您的 Flask 應用程式實例 http://app:5000/metrics,其中應用程式網域名稱可能會解析為多個 IP 位址,例如在運行時 Kubernetes碼頭工人.

如果以這種方式公開指標端點不適合您,也許是因為您不想允許外部存取它,您可以透過傳遞輕鬆停用它 路徑=無 建立實例時 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)

然後你可以使用 start_http_server(連接埠)若要在不同的 HTTP 連接埠上開啟此端點, 5099 在上面的例子中。 或者,如果您對同一 Flask 應用程式中的端點感到滿意,但需要將其路徑從 /指標,您可以傳遞另一個 URI 作為路徑參數,或使用 註冊端點(..)以便稍後安裝。

引用

如果您決定嘗試一下,請隨時在 GitHub 上提出問題或留下您的評論、回饋和建議!

謝謝!

來源: www.habr.com

添加評論