Python Client收集gauge metric

本节介绍如何在python应用中集成prometheus client,收集web应用当前的请求量最后一次的请求时间 。主要流程如下:

  1. 安装prometheus client.
  2. 代码里创建Gauge metric:用户访问页面时将当前请求数加1,用户访问完成后将当前请求数减1;并记录最后一次的请求时间
  3. 在web页面或api接口查看指标数据

步骤

安装依赖:

pip3 install prometheus_client
pip3 install web.py

创建python文件:

mkdir example_app & cd example_app
touch variable.py  
touch main.py

variable.py代码:

import prometheus_client

REQUESTS_IN_PROGRESS = prometheus_client.Gauge('app_requests_in_progress', 'number of application requests in progress')
REQUEST_LAST_SERVED = prometheus_client.Gauge('app_last_served', 'Time the application was last served.')

main.py:

import prometheus_client
import web
import variable  # 引用
import time

urls = (
    '/hello', 'Hello',
)


class Hello:

    def GET(self):
        variable.REQUESTS_IN_PROGRESS.inc()  # 统计当前有多少用户正在访问/hello页面
        time.sleep(5)  # 模拟页面执行时间,防止程序瞬间执行完成
        web.header('Access-Control-Allow-Origin', '*')
        web.header('Content-Type', 'text/json; charset=utf-8', unique=True)
        web.header('Access-Control-Allow-Credentials', 'true')
        variable.REQUESTS_IN_PROGRESS.dec()  # 访问完成后,REQUESTS_IN_PROGRESS要减1
        variable.REQUEST_LAST_SERVED.set(time.time())  # 统计最后一次执行时间
        return "hello"


if __name__ == "__main__":
    client = prometheus_client.start_http_server(5001)
    app = web.application(urls, globals())
    app.run()

运行程序:

python3 main.py  # 默认运行在8080端口

访问web页面:

image-20210511220155298 由于web页面加载要5秒钟,此时打开metrics页面,如果页面加载未完成,则app_requests_in_progress的值为1:

image-20210511215712918 当页面加载完成后,这个值为0,同时记录了用户最后一次的访问时间:

image-20210511215802703

上面的代码需要在函数里执行inc和dec操作,可以使用装饰器来实现同样的逻辑:

import prometheus_client
import web
import variable  # 引用
import time

urls = (
    '/hello', 'Hello',
)


class Hello:
    
    # 使用装饰器实现计数功能
    @variable.REQUESTS_IN_PROGRESS.track_inprogress
    def GET(self):
        time.sleep(5)  # 模拟页面执行时间,防止程序瞬间执行完成
        web.header('Access-Control-Allow-Origin', '*')
        web.header('Content-Type', 'text/json; charset=utf-8', unique=True)
        web.header('Access-Control-Allow-Credentials', 'true')
        variable.REQUEST_LAST_SERVED.set(time.time())  # 统计最后一次执行时间
        return "hello"


if __name__ == "__main__":
    client = prometheus_client.start_http_server(5001)
    app = web.application(urls, globals())
    app.run()