引言
前面一篇文章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回車可以看到有哪些命令,如下主要命令:

啟動命令:
nssm start grafana
重啟命令:
nssm restart grafana
停止命令
nssm stop grafana
測試一下啟動:

打開瀏覽器,輸入localhost:3000,賬號和密碼都是admin,如圖:

單機模式場景
項目結構:

主要代碼
讀取日志程序read_pressureData.py文件:
#!/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來提取。
拿到日志后需要寫入到數據庫,代碼如下:
'''
# @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模式啟動程序,單機模式啟動方式如下:
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分開存,可以這樣:
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分鍾,所以執行完后的圖表是這樣:

