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

undefined

负荷测试的基础知识 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をよしなに起動しよう編】

目録結構

image.png

由于全部内容过长,请查看 https://github.com/sensuikan1973/stress_test_sample 获取更详细信息。

因此,我們省略了有關yml和Dockerfile的談話,直接啟動docker。

$ docker-compose build && docker-compose up
image.png

在Grafana中添加数据源。

使用admin:admin登录到http://localhost:3000并继续操作

普罗米修斯

image.png

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

image.png

在Grafana中添加Dashboard。

image.png

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

    • Mysql-Prometheus

 

    • Go Processes

 

    Node Exporter Server Metrics
image.png

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 でグラフ表示してみた
广告
将在 10 秒后关闭
bannerAds