使用Locust攻击API服务器并使用Prometheus + Grafana进行监控来进行[负荷测试]

负荷测试的基础知识 de
我得到了这两个,看了起来很不错!特别是书。
-
- 『Amazon Web Services負荷試験入門―クラウドの性能の引き出し方がわかる』 : AWS と書いてありますが、クラウド全般の負荷試験入門書として読めました。
Webアプリケーション負荷試験実践入門 : ↑ の著者による、サッと読めるスライド
这篇文章要做什么?
我会亲自在我手上进行攻击和监视测试!所有源代码已经上传到GitHub上「https://github.com/sensuikan1973/stress_test_sample」。
要做的事情
无论是哪种语言或中间件都可以,但是这次我们将使用 Go + MySQL 来搭建一个超简单的 API 服务器,并使用 Locust 对其进行攻击,使用 Prometheus + Grafana 对负载进行监控。
不做的事情
我不会为了监视而编写专门的查询。而且,次要的部分会随意地轻松实现。
1. 建立环境
使用Mac上的”Docker for Mac”安装了Docker,并使用docker-compose进行了构建。
我主要参考了以下两篇文章。
-
- Prometheus + Grafana を Mac 上で docker-compose で起動
- 今日から始めるDocker【docker-composeを使ってGo & Mysqlをよしなに起動しよう編】
目録結構

由于全部内容过长,请查看 https://github.com/sensuikan1973/stress_test_sample 获取更详细信息。
因此,我們省略了有關yml和Dockerfile的談話,直接啟動docker。
$ docker-compose build && docker-compose up

在Grafana中添加数据源。
使用admin:admin登录到http://localhost:3000并继续操作
普罗米修斯

MySQL是一种开源的关系型数据库管理系统。

在Grafana中添加Dashboard。

只需要一种选择来用中文改写以下句子:
添加以下三项,并为每项进行与环境相适应的设置。
-
- Mysql-Prometheus
-
- Go Processes
- Node Exporter Server Metrics

2. 蝗虫发起了攻击。
目标为 API 服务器的攻击
這是用Go語言寫的。
儘管非常簡單且隨意,但由於具有DB的讀寫功能,我認為這是一個不錯的負載監控的示例。
package main
import (
"database/sql"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"github.com/prometheus/client_golang/prometheus/promhttp"
_ "github.com/go-sql-driver/mysql"
)
// Greeting : record of greetings table
type Greeting struct {
ID int `json:"id"`
Text string `json:"text"`
}
func main() {
http.Handle("/metrics", promhttp.Handler())
http.HandleFunc("/greetings", func(w http.ResponseWriter, req *http.Request) {
db, err := sql.Open("mysql", "root:password@tcp(mysql:3306)/sample_for_qiita")
if err != nil {
panic(err.Error())
}
defer db.Close()
if req.Method == "GET" {
rows, err := db.Query("SELECT * FROM greetings ORDER BY RAND() LIMIT 1")
if err != nil {
panic(err.Error())
}
for rows.Next() {
greeting := Greeting{}
err := rows.Scan(&greeting.ID, &greeting.Text)
if err != nil {
panic(err.Error())
}
fmt.Fprintf(w, greeting.Text)
}
}
if req.Method == "POST" {
body, err := ioutil.ReadAll(req.Body)
if err != nil {
panic(err.Error())
}
var greeting Greeting
error := json.Unmarshal(body, &greeting)
if error != nil {
log.Fatal(error)
}
_, err = db.Exec("insert into greetings (text) values (?)", greeting.Text)
if err != nil {
panic(err.Error())
}
}
})
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal("ListenAndServe failed.", err)
}
}
- Prometheus の公式ドキュメント INSTRUMENTING A GO APPLICATION FOR PROMETHEUS にしたがって、github.com/prometheus/client_golang/prometheus/promhttp を使っています。
就攻击吧
写一个类似这样简单的剧本。
from locust import HttpLocust, TaskSet, task
import random
import string
class GreetingTaskSet(TaskSet):
def on_start(self):
self.client.headers = {'Content-Type': 'application/json; charset=utf-8'}
@task
def fetch_greeting(self):
self.client.get("/greetings")
@task
def create_greeting(self):
# 雑にランダム文字列で済ませちゃう。 (注: random.choices は 3.6 以降でしか使えません)
self.client.post("/greetings", json={"text": ''.join(random.choices(string.ascii_letters, k=10))})
class GreetingLocust(HttpLocust):
task_set = GreetingTaskSet
min_wait = 100
max_wait = 1000
逐渐增加负荷
# ローカルを発射台として攻撃する
$ locust -f locustfile.py --no-web -H http://localhost:8080
3. 使用 Prometheus 和 Grafana 进行监控
同时攻击并观察图表时,我能感受到压力的增加,感到非常高兴!!!!!!让我们继续寻找瓶颈。
结束
请参考
-
- Prometheus + Grafana を Mac 上で docker-compose で起動
-
- 今日から始めるDocker【docker-composeを使ってGo & Mysqlをよしなに起動しよう編】
-
- PrometheusとGrafanaを組み合わせて監視用ダッシュボードを作る
-
- ソーシャルゲームが高負荷に見舞われる原因と対策
-
- Locustの気持ち
-
- DockerでPrometheus, Grafana, Alertmanagerを動かす
- prometheus のデータを grafana でグラフ表示してみた