使用 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'

这就是您开始所需的全部内容! 通过添加导入和初始化行 普罗米修斯指标,你会得到指标 请求持续时间 и 请求计数器,显示在端点处 /指标 它注册的 Flask 应用程序,以及您从基础获取的所有默认指标 普罗米修斯客户端库.

你可以找到 易于使用的示例 在运行实例的 GitHub 存储库中 普罗米修斯 и 格拉法纳 以及一个演示应用程序来生成如下所示的指标:

使用 Prometheus 监控 Flask 微服务

您还可以在以下位置找到指标列表: 读我 仪表板中显示的示例,以及填充仪表板的 Prometheus 查询。

调整

库中有很多配置选项,看一下 读我 项目示例并附有简要说明。

基本配置如上所示。 只需创建一个实例 普罗米修斯指标,我们称之为 度量,然后使用它通过装饰函数来定义您想要收集的其他指标:

  • @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 или 码头工人.

如果以这种方式公开指标端点不适合您,也许是因为您不想允许外部访问它,您可以通过传递轻松禁用它 路径=无 创建实例时 普罗米修斯指标.

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 上提出问题或留下您的评论、反馈和建议!

谢谢大家!

来源: habr.com

添加评论