flask-profiler:统计flask应用接口请求数和耗时情况

一、背景

我们基于Flask开发了一些测试工具和应用,有一天老板问我,说这个有多少人用啊?请求数目大概是怎样的?我支支吾吾一脸懵逼……

下来想了下,准备基于Python的装饰器和消息中间件(MQ)来做统计,即每个接口都加上这个装饰器,而这个装饰器的作用就是解析各个请求的相关信息,然后异步发送给一个消息中间件(MQ),最后写个消费者来处理这些消息并存储….

虽然思路有了,但是感觉实现成本还是挺大的,幸运的是找到了一个库:flask-profiler ,实践了下,这个基本可以满足我们的需求。

二、flask-profiler的使用

Github地址:https://github.com/muatik/flask-profiler

使用 profiler测量在你的Flask 应用程序中定义的端点;并通过web界面提供细粒度的报告。它给出了下面这些问题的答案:

  • 应用程序中的瓶颈在哪里?
  • 应用程序中最慢的终结点?
  • 哪些是最常被调用的终结点?
  • 什么导致我的慢速端点? 在哪个上下文中,什么是 ARGS 和 kwargs?
  • 特定请求花费了多少时间?

简而言之,如果你想对端点正在做什么和接收的请求信息,请尝试flask-profiler。

通过使用flask-profiler分析器接口,你可以监视所有端点的性能,并通过向下钻取过滤器来调查端点和接收的请求。

废话不多说,实践才是王道。

1.安装 flask_profiler

pip3 install flask_profiler

2.Flask应用示例

说明:所有接口的请求记录是需要数据库存储的,这里我们使用的mongodb,你也可以使用SQLite、SQLAchemy等,详情可以查Github。

flask_profiler_demo.py

-*- coding: UTF-8 -*-
"""
rs
"""
import flask_profiler
from flask import Flask
from flask import jsonify
from flask import make_response

app = Flask(__name__)
app.config["DEBUG"] = True

You need to declare necessary configuration to initialize
flask-profiler as follows:
flask-profiler的配置, 下面是以mongo作为存储,其它存储请参考官网
app.config["flask_profiler"] = {
    "enabled": app.config["DEBUG"],
    "storage": {
        "engine": "mongodb",
        "MONGO_URL": "mongodb://{user}:{password}@{address}",
        "DATABASE": "{database}",
        "COLLECTION": "{collection}"
    },
    "basicAuth": {
        "enabled": True,
        "username": "admin",
        "password": "admin"
    },
    "ignore": [
        "^/static/.*"
    ]
}

@app.route('/product/', methods=['GET'])
def getProduct(id):
    return "product id is " + str(id)

@app.route('/product/', methods=['PUT'])
def updateProduct(id):
    return "product {} is being updated".format(id)

@app.route('/products', methods=['GET'])
def listProducts():
    return "suppose I send you product list..."

@app.route('/static/something/', methods=['GET'])
def staticSomething():
    return "this should not be tracked..."

In order to active flask-profiler, you have to pass flask
app as an argument to flask-profiler.

All the endpoints declared so far will be tracked by flask-profiler.

意思就是在这之前的都会被统计度量
flask_profiler.init_app(app)

endpoint declarations after flask_profiler.init_app() will be
hidden to flask_profiler.

不会会统计度量
@app.route('/doSomething', methods=['GET'])
def doSomething():
    return "flask-profiler will not measure this."

But in case you want an endpoint to be measured by flask-profiler,
you can specify this explicitly by using profile() decorator
如果手动加上装饰器: @flask_profiler.profile(), 也可以被统计到
@app.route('/doSomethingImportant', methods=['GET'])
@flask_profiler.profile()
def doSomethingImportant():
    return "flask-profiler will measure this request."

@app.route('/health', methods=["GET"])
@flask_profiler.profile()
def health():
"""
    # 健康检查
    :return:
"""
    result = {
        "code": "200",
        "message": "success",
        "data": "green"
    }
    return make_response(jsonify(result))

if __name__ == '__main__':
    app.run(host="127.0.0.1", port=5000)

3.测试验证

首先,启动服务:

python3 flask_profiler_demo.py

启动日志
 * Serving Flask app 'flask_demo' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.

   Use a production WSGI server instead.

 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with watchdog (fsevents)
 * Debugger is active!

 * Debugger PIN: 721-605-328

访问可视化服务:http://127.0.0.1:5000/flask-profiler/

Ps:默认密码就是配置文件中的basicAuth设置的admin/admin

flask-profiler:统计flask应用接口请求数和耗时情况

可以看到目前还没有数据,我们来发送几个请求给服务看看,如下:

curl http://127.0.0.1:5000/health
curl http://127.0.0.1:5000/products
curl http://127.0.0.1:5000/product/123
curl -X PUT -d arg1=val1 http://127.0.0.1:5000/product/123

再看看统计的情况,可以发现刚才发的一些请求已经被统计到了,可以各个请求的次数、耗时情况。

flask-profiler:统计flask应用接口请求数和耗时情况

点击请求名称还可以看到具体的请求参数信息。

flask-profiler:统计flask应用接口请求数和耗时情况

flask-profiler:统计flask应用接口请求数和耗时情况

除了在页面上面可视化查看之外,其实mongo数据库里面都存储了对应的数据,还可以通过这个接口查看所有的请求信息:http://127.0.0.1:5000/flask-profiler/api/measurements/?sort=elapsed,desc

flask-profiler:统计flask应用接口请求数和耗时情况

4、问题记录

1、dashboard没有数据显示

有时候按照上面的配置设置了后,发现dashboard并没有展示数据,原因可能是没有设置app.config[“DEBUG”] = True,或者说位置不对,我发现貌似把32行的内容放到31行前面去就不行。

flask-profiler:统计flask应用接口请求数和耗时情况

Original: https://blog.csdn.net/sinat_33718563/article/details/124637858
Author: rs勿忘初心
Title: flask-profiler:统计flask应用接口请求数和耗时情况

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/745159/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Qt扫盲-QTextBrowser理论总结

    QTextBrowser理论总结 * – 1. 简述 – 2. 文档来源和内容 – 3. 导航 – 4. 用途 1. 简述 QTex…

    Python 2023年9月30日
    029
  • python基于OCR深度学习实现商品配料表识别

    1、概述 当前人民和国家对食品安全十分重视,但商家为了保证食品长时间储存,味道鲜美,在食品中添加超量或对人有严重危害得食品添加剂,严重危害到人民的安全,我们以方便面为例,一包方便面…

    Python 2023年8月15日
    052
  • Vue3 JS 与 SCSS 变量相互使用

    在开发中会遇到如下需求: JS 中使用 SCSS 变量。如在 scss 中定义了一个颜色, el-menu 组件使用该颜色作为背景色,此时需要获取 scss 变量,通过 backg…

    Python 2023年10月18日
    090
  • Python:用NetworkX生成并绘制(带权)无向图

    NetworkX是一个非常强大的网络科学工具,它封装了图的数据结构和许多经典图算法,也内置了许多可视化函数可供调用。 1. 随机图生成 G = nx.erdos_renyi_gra…

    Python 2023年10月28日
    034
  • 为什么你的static_assert不能按预期的工作?

    static_assert是c++11添加的新语法,它可以使我们在编译期间检测一些断言条件是否为真,如果不满足条件将会产生一条编译错误信息。 使用静态断言可以提前暴露许多问题到编译…

    Python 2023年10月14日
    065
  • 基于BP神经网络的PID智能控制

    基于BP神经网络的PID智能控制 基于BP神经网络的PID整定原理 经典的增量式数字PID控制算法为: BP神经网络结构: 学习算法 仿真模型 Matlab代码 仿真效果图 结论 …

    Python 2023年9月27日
    053
  • Pycharm 配置 Conda,国内使用正确的镜像源地址

    开始使用 Pycharm,搭配Conda做包管理,按照网上教程使用过程中发现镜像源不管是阿里的还是清华的都会有404异常,花了点时间找到正确的配置方式。记录一下备忘。 参考链接: …

    Python 2023年9月8日
    043
  • SCRUM官方权威指南

    posted @2022-04-18 21:32 HammerZe 阅读(25 ) 评论() 编辑 Original: https://www.cnblogs.com/48xz/p…

    Python 2023年6月10日
    066
  • Flask框架(下)

    Flask框架(下) 一、Flask-Script扩展命令使用 安装pip install Flask-Script导入Managerfrom flask_script impor…

    Python 2023年8月11日
    046
  • Python从入门到精通(第2版)——pyuic5: error: no such option: -m的问题解决

    前言 在学习《Python从入门到精通(第2版)》的第15章 GUI界面编程——15.2.4 将.ui文件转换为.py文件时,按照书中步骤出错时的问题解决,希望对同样学习本书的同学…

    Python 2023年10月30日
    043
  • 《与孩子一起学编程》python自测题

    测试题一、 1、 程序可以响应的两种事件分别是键盘事件和鼠标事件。 2、 处理事件的代码称为事件处理器 3、 Pygame使用KEYDOWN事件来检测按键是否按下。 4、 Pos属…

    Python 2023年9月25日
    028
  • Python Pandas操作Excel 03

    3.1 Pandas操作Excel 03 3.1.1 连接查询 Merge ① inner join(取交集,数据交叉的部分,取出来。) ② left join (以左表为主,合并…

    Python 2023年8月8日
    036
  • 【每天五分钟大数据-第一期】 伪分布式+Hadoopstreaming

    说在前面 之前一段时间想着把 LeetCode 每个专题完结之后,就开始着手大数据和算法的内容。 [TencentCloudSDKException] code:FailedOpe…

    Python 2023年6月3日
    093
  • 机器学习之逻辑回归Logistic Regression(python代码实现)

    逻辑回归(Logistic Regression) 逻辑回归是一个非常经典的算法,用于解决分类问题的机器学习方法,用于估计某种事物的可能性,其有着简单、可并行化、可解释强的特点。逻…

    Python 2023年8月1日
    049
  • Python基础学习四

    在 python 里,元组和列表几乎没什么不同,主要是元组不能改变(这叫没有什么区别?),就是说,不能添加、修改或删除元组里的元素。元组使用小括号 ( ),列表使用方括号 [ ]。…

    Python 2023年11月6日
    033
  • 机器学习Pandas 库

    目录 💥个人简介💖 作者简介:⭐️heart_6662,还在学习(卷)当中,欢迎交流指正~😜📝 个人主页heart的博客🔥📧如果文章知识点有错误的地方,请指正留言📝!和大家一起学习…

    Python 2023年8月20日
    064
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球