用普罗米修斯·维克多·亚当的博客监控Python烧瓶微服务

2020-05-13 17:16:38

只需几行额外代码就可以很容易地洞察Python Web服务是如何工作的。

这就是真正的开始!通过添加一个导入和一行来初始化PrometheusMetrics,您将获得在其注册的Flask应用程序的/metrics端点上公开的请求持续时间度量和请求计数器,以及从底层Prometheus客户端库获得的所有默认度量。

您可以在GitHub存储库中找到一个易于运行的示例,该示例生成一个Prometheus和Grafana实例以及一个演示应用程序来生成一些指标,如下所示:

您还可以在示例的自述文件中找到仪表板上显示的指标列表,以及填充面板的Prometheus查询。

该库有很多配置选项,请查看项目自述文件中的示例并进行简要说明。

基本配置如顶部所示。只需创建一个PrometheusMetrics实例,让我们将其命名为Metrics,然后使用它来定义您希望通过以下方式装饰函数来收集的其他指标:

计数器对调用进行计数,而其余计数器根据这些调用的持续时间收集度量。您可以为其中的每一个定义标签,可能使用请求或响应的属性。例如:

从烧瓶导入烧瓶,从prometheus_flask_exporter导入prometheusMetricsapp=flask(__Name__)#按端点分组,而不是按路径度量=prometheusMetrics(app,group_by=';endpoint';)@app.route(';/collection/:collection_id/item/:item_id';)@metrics.counter(';cnt_Collection';,';每个集合的调用次数';,Labels={';集合';:lambda:request.view_args[';Collection_id';],';status';:lambda resp:res.status_code})def get_item_from_Collection(Collection_id,item_id):pass

在上面的示例中,点击端点/Collection/10002/Item/76将增加一个计数器,如cnt_Collection{Collect=";10002";},另外您将从库中获取默认指标(在本例中为每个端点),默认情况下:

flask_http_Request_Duration_Second-按方法、路径和状态列出的所有Flask请求的HTTP请求持续时间(以秒为单位。

可以选择跳过跟踪某些端点、注册更多默认指标、跳过上述指标或将相同的自定义指标应用于多个端点。请查看项目自述文件,了解可用的内容。

APP=Flask(__NAME__)指标=PrometheusMetrics(app)@app.route(';/';)def Main():[email protected](';/skip';)@metrics.do_not_track()def SKIP()跟踪的PASS#请求数:PASS#不收集默认指标#要应用于多个端点的自定义指标COMMON_COUNTER=metrics.count(';BY_ENDPOINT_COUNTER';,';请求计数(';按端点';,标签={';Endpoint';:lambda:request.endpoint})@app.route(';/common/one';)@common_counterdef Endpoint_One():自定义跟踪的路径#和默认的[email protected](';/common/two';)@common_counterdef Endpoint_Two():路径#也由自定义和默认度量跟踪#注册其他默认度量。register_Default(metrics.count(';by_path_count';,';按请求路径的请求计数';,标签={';path';:lambda:request.path})。

该库为流行的多处理库提供了一些方便的扩展,如uWSGI和Gunicorn。您还可以找到目标用例的小示例,包括这些多处理用例。

如上所述,默认情况下,库在Flask应用程序上公开一个/metrics端点,该端点可以作为普罗米修斯抓取的目标。

从上面仪表板的示例中,您可以将普罗米修斯指向具有默认设置的Flask应用程序,配置如下:

请参阅GitHub存储库中的完整示例。这里假设,Prometheus可以将您的Flask应用程序实例定位在http://app:5000/metrics,上,在那里,应用程序域名可以潜在地解析为多个IP地址,比如在Kubernetes或Docker Sarm中运行时。

如果这样公开Metrics端点不适合您,可能是因为您不想允许外部访问它,那么您可以在创建PrometheusMetrics实例时通过传递path=None轻松地禁用它。

然后,您可以使用start_http_server(Port)在不同的HTTP端口(在上例中为5099)上公开此端点。或者,如果您对端点位于相同的Flask应用程序感到满意,但需要更改其路径,而不是/metrics,则可以传入不同的URI作为path参数,或者使用register_end(..)。以后再安排。

如果你试试看,打开一个GitHub问题或者在这里留下你的反馈和建议的评论!谢谢!