前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Locust + Influxdb + Grafana性能测试——单机模式(Windows篇)

Locust + Influxdb + Grafana性能测试——单机模式(Windows篇)

作者头像
全栈测试开发日记
发布于 2023-02-02 08:17:50
发布于 2023-02-02 08:17:50
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

  引言

  前面一篇文章Grafana + Prometheus监控篇之Windows监控Linux服务器资源 ,我已经讲过了在windows系统上如何使用Grafana监控Linux服务器资源。这边讲的是如何使用Grafana展示Locust性能测试数据。

  背景

  在使用Locust压测的时候,如果使用Web则可以查看到QPS压测过程的曲线图。而如果使用no web模式启动,Locust版本更新后,现在使用的是--headless模式启动,则只有一些打印的日志可以查看。

  如果是在Linux服务器上进行压测,无界面模式的话,我们根本无法实时的看到压测数据。正好有一款强大的工具Grafana可以将Locust压测数据图表实时展示在界面上。

  设计思路

  要想在Grafana平台上展示数据,最关键的就是对数据的处理,也就是对压测日志的处理。

  Locust命令行模式启动,会输出两种信息,一种是压测数据,一种是Locust执行数据。

  处理步骤大致分为:

  1、首先将locust执行过程的日志写入文件中   2、通过读取执行文件的日志信息,再将其转化存储到influxdb数据库   3、最后根据influxdb数据库的数据,展示图表

  画一个简单的草图,如下:

   环境准备

  1、python3.6.5

  2、locust1.2.3

  3、Grafana7.1.5

  4、Influxdb1.8.2

  如何搭建之前讲过,这里就再复述下载地址:

  grafana 安装

https://grafana.com/grafana/download?platform=windows

  influxdata 安装

https://portal.influxdata.com/downloads/

  influxdata 连接工具

https://github.com/CymaticLabs/InfluxDBStudio/releases

  另外,windows使用命令启动grafana的方法如下:

  windows命令启动是通过nssm.exe程序,所以需要在环境变量path里配置它。否则只能运行grafana-server.exe程序来启动。

  首先配置环境变量:

  以管理员方式打开cmd,输入nssm回车可以看到有哪些命令,如下主要命令:

   启动命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nssm start grafana

  重启命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nssm restart grafana

  停止命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nssm stop grafana

  测试一下启动:

  打开浏览器,输入localhost:3000,账号和密码都是admin,如图:

  单机模式场景

  项目结构:

  主要代码

  读取日志程序read_pressureData.py文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
# @Time    : 2020/10/3 0003 12:13
# @Author  : liudinglong
# @File    : read_pressureData.py
# @Description: 
# @Question: 
'''



import io
import platform
import os,sys
from db_init.conn_influxdb import ConnectInfluxDB

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # 项目目录
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)


pattern = '/' if platform.system() != 'Windows' else '\\'

influxdb = ConnectInfluxDB()

def pressureData_test():
    """

    :param kwargs:
    """
    performance_path = os.path.join(BASE_DIR ,'log'+ pattern + "run.log")
    with io.open(performance_path) as f:
        data_list = f.readlines()

        locust_list = []
        for data in data_list:

            splits = data.split()
            # print("splits :%s" % splits)
            temp = []
            for s in splits:
                if s.replace(" ", "").strip('\n').strip('|').__len__() != 0:
                    temp.append(s)
            if len(temp) > 1 and temp[0] == 'POST':
                print("进入res")
                print(temp)
                method = temp[0]
                api = temp[1]
                reqs = temp[2]
                fails = temp[3]
                Avg = temp[4]
                Min = temp[5]
                Max = temp[6]
                Median = temp[7]
                qps = temp[8]
                failures = temp[9]

                locust_dict = {'Method': method, 'Name': api, 'Requests': reqs, 'Fails': fails, 'Average_ms': Avg,
                               'Min_ms': Min, 'Max_ms': Max, 'Median_ms': Median, 'Current_RPS': qps,
                               'Failures_s': failures}
                locust_list.append(locust_dict)

            if len(temp) > 1 and temp[0] == 'Aggregated':
                print("进入Aggregated")
                print("Aggregated:%s"%temp)
                # method = temp[0]
                api = temp[0]
                reqs = temp[1]
                fails = temp[2]
                Avg = temp[3]
                Min = temp[4]
                Max = temp[5]
                Median = temp[6]
                qps = temp[7]
                failures = temp[8]

                locust_dict = {'Method': "", 'Name': api, 'Requests': reqs, 'Fails': fails, 'Average_ms': Avg,
                               'Min_ms': Min, 'Max_ms': Max, 'Median_ms': Median, 'Current_RPS': qps,
                               'Failures_s': failures}
                locust_list.append(locust_dict)

        influxdb.post_dump_data(locust_list, "locust")

  这种方法比较简单粗暴的序列化日志,当然也可以使用正则re.match来提取。

  拿到日志后需要写入到数据库,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'''
# @Time    : 2020/10/3 0003 11:21
# @Author  : liudinglong
# @File    : conn_influxdb.py
# @Description: 
# @Question: 
'''

from influxdb import InfluxDBClient

class ConnectInfluxDB:
    """
    连接influxdb数据库
    """

    def __init__(self):
        self.influx_client = InfluxDBClient('localhost', 8086, '', '', 'testdb')
        self.make = False
        for database in self.influx_client.get_list_database():
            if "testdb" not in database["name"]:
                self.make = True
            else:
                # 写入前删除数据
                self.influx_client.drop_measurement("locust")
                self.make = False
        if self.make:
            self.influx_client.create_database("testdb")

    def post_dump_data(self, data, measurement):
        """

        @param data:
        @param measurement:
        """
        if isinstance(data, list):
            for key in data:
                json_body = [
                    {
                        "measurement": measurement,
                        "fields": key,
                    }
                ]
                self.influx_client.write_points(json_body)


if __name__ == '__main__':
    pass

  运行压测程序

  这里使用非GUI模式启动程序,单机模式启动方式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
locust -f grafana_test.py  -u 10 -r 3 -t 1m  -H https://api.apiopen.top/  --csv C:\Users\Administrator\PycharmProjects\Locust_grafana_demo\data_csv\ --logfile=C:\Users\Administrator\PycharmProjects\Locust_grafana_demo\log\locust.log --loglevel=INFO 1>C:\Users\Administrator\PycharmProjects\Locust_grafana_demo\log\run.log 2>&1 --headless

  版本更新后,locust1.2.3无界面启动的参数是:--headless,而非--no-web。

  如果想将locust的压测日志和程序print分开存,可以这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
locust -f locustfile.py --headless -u 10 -r 3 -t 1m  -H https://api.apiopen.top/ --logfile=D:\locust_test_20190228\log\locust.log --loglevel=INFO 1>D:\locust_test_20190228\log\stdout.log 2>D:\locust_test_20190228\log\run.log

  运行后可以手动执行以下写入的程序,然后再查看数据库:

  可以用工具查一下:

  Grafana图标展示

  首先配置好influxdb数据库数据源,如下:

  配置完数据源后,再配置数据展示方式,图 + 表方式展示数据,如下:

   效果如下:      

   因为上面命令是执行1分钟,所以执行完后的图表是这样:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-10-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【CSS ——功能实现】电影院排座位(蓝桥杯真题-5133)【合集】
Rossy Yan
2025/02/16
1190
【CSS ——功能实现】电影院排座位(蓝桥杯真题-5133)【合集】
SQL 预定座位
假设是 3 个朋友一起坐高铁出去玩,希望能预定到相邻的座位。现在这趟车某个车厢里每排的座位的编号是 A、B、C、D、F,其中,A 和 F 是靠窗位置,C 和 D 之间是过道。即使隔着过道,C 和 D 仍是可以看作是相邻的座位。
白日梦想家
2020/12/14
6870
亲自上手,用原生 JavaScript 打造简易电影选座系统
首先,我们需要一个基础的HTML结构来展示电影列表和座位布局。这一步主要是定义页面的基本框架,让用户能够看到选择电影和座位的界面。
前端达人
2024/06/14
6380
亲自上手,用原生 JavaScript 打造简易电影选座系统
js逐步教你实现原生电影院系统
css逻辑; 第一步body;清除系统默认的样式. 第二步h1:body里面的flex布局,主轴x居中,侧轴y垂直居中.高度为height: 100vh;,为什么,因为系统默认宽为100%,高为0,要垂直居中得100vh高度才行啊. 第三步:
贵哥的编程之路
2020/10/28
8750
js逐步教你实现原生电影院系统
【SQL 周周练】一千条数据需要做一天,怎么用 SQL 处理电表数据(如何动态构造自然月)
大家好,我是“蒋点数分”,多年以来一直从事数据分析工作。从今天开始,与大家持续分享关于数据分析的学习内容。
蒋点数分
2025/05/12
930
【SQL 周周练】一千条数据需要做一天,怎么用 SQL 处理电表数据(如何动态构造自然月)
【SQL周周练】给你无酸纸、变色油墨,你能伪造多少美金?
大家好,我是“蒋点数分”,多年以来一直从事数据分析工作。从今天开始,与大家持续分享关于数据分析的学习内容。
蒋点数分
2025/04/27
620
【SQL周周练】给你无酸纸、变色油墨,你能伪造多少美金?
【SQL周周练】:利用行车轨迹分析犯罪分子作案地点
大家好,我是“蒋点数分”,多年以来一直从事数据分析工作。从今天开始,与大家持续分享关于数据分析的学习内容。
蒋点数分
2025/05/17
320
【SQL周周练】:利用行车轨迹分析犯罪分子作案地点
【SQL 周周练】爬取短视频发现数据缺失,如何用 SQL 填充
大家好,我是“蒋点数分”,多年以来一直从事数据分析工作。从今天开始,与大家持续分享关于数据分析的学习内容。
蒋点数分
2025/05/07
1671
【SQL 周周练】爬取短视频发现数据缺失,如何用 SQL 填充
【Uber 面试真题】SQL :每个星期连续5星评价最多的司机
大家好,我是“蒋点数分”,多年以来一直从事数据分析工作。从今天开始,与大家持续分享关于数据分析的学习内容。
蒋点数分
2025/04/26
2120
【Uber 面试真题】SQL :每个星期连续5星评价最多的司机
MySQL题集
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
看、未来
2020/09/30
1.8K0
MySQL题集
头歌MySQL数据库实训答案 有目录[通俗易懂]
数据库部分一条一条的写,可鼠标手动粘贴,除特定命令外未分大小写。 第1关:创建数据库
全栈程序员站长
2022/09/13
8.8K0
LeetCode数据库题目集合
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
MiChong
2021/02/24
9640
LeetCode数据库题目集合
LeetCode 数据库专题
写一段SQL查询来展示每位用户的 唯一标识码(unique ID );如果某位员工没有唯一标识码,使用 null 填充即可。你可以以 任意 顺序返回结果表。查询结果的格式如下例所示:
wywwzjj
2023/05/09
1.5K0
LeetCode 数据库专题
SqlAlchemy 2.0 中文文档(四十七)
SQLAlchemy 包括一个事件 API,它发布了一系列钩子,可以进入 SQLAlchemy 核心和 ORM 的内部。
ApacheCN_飞龙
2024/08/21
4090
16 . PythonWeb框架之Django
项目运行起来,访问IP:PORT/admin即可访问登录页面,但是需要先创建一个超级用户
iginkgo18
2020/09/27
2.7K0
16 . PythonWeb框架之Django
Python 数据分析与可视化:开启数据洞察之旅(5/10)
在当今数字化时代,数据就像一座蕴藏无限价值的宝藏,等待着我们去挖掘和探索。而 Python,作为数据科学领域的明星语言,凭借其丰富的库和强大的功能,成为了开启这座宝藏的关键钥匙,在数据分析和可视化领域占据着举足轻重的地位。
正在走向自律
2025/05/10
5660
Python 数据分析与可视化:开启数据洞察之旅(5/10)
Oracle 错误总结及问题解决 ORA「建议收藏」
英文解析:resource busy and acquire with NOWAIT specified
全栈程序员站长
2022/09/03
23.5K0
Oracle 错误总结及问题解决 ORA「建议收藏」
JavaScript 权威指南第七版(GPT 重译)(六)
JavaScript 语言是在 1994 年创建的,旨在使 Web 浏览器显示的文档具有动态行为。自那时以来,该语言已经发生了显著的演变,与此同时,Web 平台的范围和功能也迅速增长。今天,JavaScript 程序员可以将 Web 视为一个功能齐全的应用程序开发平台。Web 浏览器专门用于显示格式化文本和图像,但是,像本机操作系统一样,浏览器还提供其他服务,包括图形、视频、音频、网络、存储和线程。JavaScript 是一种使 Web 应用程序能够使用 Web 平台提供的服务的语言,本章演示了您如何使用这些最重要的服务。
ApacheCN_飞龙
2024/03/23
1K0
JavaScript 权威指南第七版(GPT 重译)(六)
pyntho经典面试题
 (1)与java相比:在很多方面,Python比Java要简单,比如java中所有变量必须声明才能使用,而Python不需要声明,用少量的代码构建出很多功能;(高效的高级数据结构)
py3study
2020/01/17
3.2K0
Python面试题之Python面试题汇总
(1)与java相比:在很多方面,Python比Java要简单,比如java中所有变量必须声明才能使用,而Python不需要声明,用少量的代码构建出很多功能;(高效的高级数据结构)
Jetpropelledsnake21
2018/08/01
11.7K0
Python面试题之Python面试题汇总
推荐阅读
相关推荐
【CSS ——功能实现】电影院排座位(蓝桥杯真题-5133)【合集】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档