本节介绍如何在python应用中集成prometheus client,收集web应用当前的请求量 及最后一次的请求时间 。主要流程如下:
安装依赖:
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页面:
由于web页面加载要5秒钟,此时打开metrics页面,如果页面加载未完成,则app_requests_in_progress的值为1:
当页面加载完成后,这个值为0,同时记录了用户最后一次的访问时间:
上面的代码需要在函数里执行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()