重新定義 Locust 的測試報告_效能監控平臺

bugVanisher發表於2020-07-23

這是三篇有關Locust文章的最後一篇,前兩篇請看:
深入淺出 Locust 實現
如何提高 Locust 的壓測效能

背景

當我們使用Locust做效能壓測的時候,壓測的過程和展示如下:

其中波動圖是非持久化儲存的,也就是重新整理後,波動圖就清空了。儘管Statistics中顯示的資訊比較完整,但是都是瞬時值,並不能體現出時序上的變化。像Failures、Exceptions、Slaves分在不同的tag檢視起來也比較麻煩。Locust的測試報告也只有簡單的csv檔案,需要下載。

從上面我們可以看到Locust雖然提供了跨平臺的web模式的效能監控和展示,但是有以下明顯缺陷:

  • rps、平均響應時間波動圖沒有持久化儲存,重新整理後便丟失
  • 整體統計資訊只是表格的形式,不能體現波動時序
  • 測試報告過於簡陋且只有文字版,只能下載存檔

方案

方案其實很多,但為了減少投入成本和最大化利用現用的開源工具,選擇以下方案:

Locust + Prometheus + Grafana

簡單總結起來就是:

實現一個Locustprometheusexporter,將資料匯入prometheus,然後使用grafana進行資料展示。

不難發現Jmeter在網上有許多類似方案的介紹,但很遺憾的是我沒有找到很好實現Locust監控平臺的方案。

搜尋了一圈後發現boomer專案下有一個年久失修的exporter實現——prometheus_exporter.py, 而且作者並沒有提供grafana之類的Dashboard設定,因此決定基於他的基礎上,繼續完成整個流程,我將在下面講述。

Docker環境

Docker環境不是必須的,但是用過都說好。我們這次實戰是在docker中完成的,因為它實在是太方便了,如果你也想快速嘗試一下本文的監控平臺方案,建議先準備好docker環境。

編寫exporter

如Locust的官方文件所介紹的 Extending Locust 我們可以擴充套件web端的介面,比如新增一個 /export/prometheus 介面,這樣Prometheus根據配置定時來拉取Metric資訊就可以為Grafana所用了。這裡需要使用Prometheus官方提供的client庫,prometheus_client,來生成符合Prometheus規範的metrics資訊。

在boomer原檔案的基礎上我做了一些修改和優化,在Readme中新增了Exporter的說明,並提交Pull Request。由於篇幅原因這裡不展示程式碼了,完整程式碼(基於Locust 1.x版本)可以檢視這裡prometheus_exporter

為了方便演示,下面編寫一個基於Python的locustfile作為施壓端,命名為demo.py:

#!/usr/bin/env python
# coding: utf-8


"""
Created by bugVanisher on 2020-03-21
"""
from locust import HttpLocust, TaskSet, task, between

class NoSlowQTaskSet(TaskSet):

def on_start(self):
# 登入
data = {"username": "admin", "password": "admin"}
self.client.post("/user/login", json=data)

@task(50)
def getTables(self):
r = self.client.get("/newsql/api/getTablesByAppId?appId=1")

@task(50)
def get_apps(self):
r = self.client.get("/user/api/getApps")


class MyLocust(HttpUser):
task_set = NoSlowQTaskSet
host = "http://localhost:9528"

我們把master跑起來,啟動兩個worker。

# 啟動master
locust --master -f prometheus_exporter.py

# 啟動worker
locust --slave -f demo.py

在沒有啟動壓測前,我們瀏覽器訪問一下

http://127.0.0.1:8089/export/prometheus

返回結果如下:

這是使用prometheus_client庫預設產生的資訊,對我們資料採集沒有影響,如果想關注master程式可以在grafana上建立相應的監控大盤。

接著我們啟動10個併發使用者開始壓測,繼續訪問下上面的地址:

可以看到,locust_stats_avg_content_length、locust_stats_current_rps等資訊都採集到了。

Prometheus部署

exporter已經ready了,接下來就是把prometheus部署起來,拉取metric資料了。

1) 準備好了docker環境,我們直接把prometheus映象拉下來:

docker pull prom/prometheus

2) 接下來我們建立一個yml配置檔案,準備覆蓋到容器中的/etc/prometheus/prometheus.yml

global:
scrape_interval: 10s
evaluation_interval: 10s

scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
labels:
instance: prometheus

- job_name: locust

metrics_path: '/export/prometheus'
static_configs:
- targets: ['192.168.1.2:8089'] # 地址修改為實際地址
labels:
instance: locust

3) 啟動prometheus,將9090埠對映出來,執行命令如下:

docker run -itd -p 9090:9090 -v ~/opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

接下來我們訪問Prometheus的graph頁面,查詢下是否有資料了。

http://127.0.0.1:9090/graph

Grafana部署和配置

1)首先我們需要下載grafana的映象:

docker pull grafana/grafana

2) 啟動一個grafana容器,將3000埠對映出來:

docker run -d -p 3000:3000 grafana/grafana

3)網頁端訪問localhost:3000驗證部署成功

4) 選擇新增prometheus資料來源


5) 匯入模板

匯入模板有幾種方式,選擇一種方式將dashboard模板匯入。

效果展示

經過一系列『折騰』之後,是時候看看效果了。使用 Docker + Locust + Prometheus + Grafana 到底可以搭建怎樣的效能監控平臺呢?相比 Locust 自帶的Web UI,這樣搭建的效能監控平臺究竟有什麼優勢呢?接下來就是展示成果的時候啦!

這個監控方案不僅提供了炫酷好看的圖表,還能持久化儲存所有壓測資料,可以使用Share Dashboard功能儲存測試結果並分享,相比Locust自帶的Web UI,簡直太方便!如果結合boomer,壓測效能和壓測報告應該也能讓老闆滿意了!

寫在最後

關於Locust的三篇系列文章,我結合自己的認知和實踐終於寫完了,對Locust的玩法也只是拋磚引玉,但我覺得也足夠了,因為有些人已經通過我的分享做了一些東西,比如這篇文章

以前我不習慣分享交流,喜歡閉門造車,但是從去年開始,我逼著自己去寫GitHub Pages部落格—— bugvanisher,逼著自己除了輸入還要輸出,去總結,去分享,我明白這才是能夠更快成長的方式,共勉~

相關文章