上接文章
为什么要为boot4go-gateway搭建Grafana+Prometheus
有关注的朋友看到这个项目,非常关注gateway的并发压力测试的结果,boot4go-gateway的http服务没有使用go net/http的原生http服务,使用的fasthttp改造后的http服务,在单一请求访问的情况下,fasthttp的性能秒杀go net/http,当然虽然go net/http性能已经比springboot系列的 tomcat 优秀不少,但是和fasthttp还是相形见绌了, 研究过fasthttp的底层代码,其实对于go语言开发来说,fasthttp使用比较好的复用技术,进一步的提高了net/http的优化空间,将性能做到了警可能的压缩,今天先暂且把这个放一边。回归到咱们的boot4go-gateway的压力性能测试。
boot4go-gateway如何可以集成到Prometheus里
在boot4go-gateway里使用fasthttp作为http服务的底层, 在其中集成了prometheus的client,进行性能指标的采集, 把采集到的指标通过 export 的方式,让prometheus进行采集,然后grafana以prometheus作为数据源,prometheus也是个好东东,prometheus的TSDB,也是用的比较多的, 在物联网的项目中,对传感器以及iot终端的数据进行时间维度的分析,是非常好的东东,有兴趣的朋友可以看看相关的资料, TSDB以及influxDB, 我比较习惯用prometheus的TSDB, influxDB功能类似,现在influxdata已经打包了telegraph,也可以完成prometheus和grafana一样的功能,不过一个是push一个是pull,各有各的优势,看你节点结构和部署方式来进行选择吧,都非常的不错。
这里我在boot4go-gateway里进行性能测试的数据监控采集,使用的promethues+grafana的方案。在boot4go-gateway里在原有的boot4go-prometheus的基础上增加了3个采集器。
网关转发数量
TotalCounterVec = prometheus.NewCounterVec(
prometheus.CounterOpts{
Subsystem: "go",
Name: "forward_total",
Help: "Total number of host forward",
},
[]string{"host"},
进行网关转发中的并发请求数量
Concurrent request sGauge = prometheus.NewGauge(
prometheus.GaugeOpts{
Subsystem: "go",
Name: "request_handle_concurrent",
Help: "Number of incoming HTTP Requests handling concurrently now.",
},
)
网关转发的延迟响应时间
LatencyRequestsHistogram = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Subsystem: "go",
Name: "request_handle_latency",
Help: "Histogram statistics of http(s) requests latency second",
Buckets: []float64{0.01, 0.1, 0.2, 0.5, 1, 2, 5, 10, 30},
},
[]string{"code"},
)
通过boot4go-prometheus集成fasthttp
fasthttp目前不支持prometheus的集成,所以在做boot4go-gateway的过程中,把这块的东西单独拿出来,作为一个golang的独立包项目,该项目地址在
注册采集器
prometheus.MustRegister(Concurrent Request sGauge)
prometheus.MustRegister(LatencyRequestsHistogram)
prometheus.MustRegister(TotalCounterVec)
加入RequestHandler
return prometheusfasthttp.RequestCounterHandler(func(ctx *fasthttp.RequestCtx) {
host := string(ctx.Host())
if string(ctx.Path()) == "/metrics" {
prometheusfasthttp.PrometheusHandler(prometheusfasthttp.HandlerOpts{})(ctx)
return
} else {
if next != nil {
TotalCounterVec.WithLabelValues(host).Inc()
startTime := time.Now()
ConcurrentRequestsGauge.Inc()
defer ConcurrentRequestsGauge.Dec()
next(ctx)
finishTime := time.Now()
LatencyRequestsHistogram.WithLabelValues(
strconv.Itoa(ctx.Response.StatusCode())).Observe(float64(finishTime.Sub(startTime) / time.Second))
}
}
})
程序方面就差不多了,下面就到重头戏,Grafana+Prometheus了
作为开发人员的我,其实对这些 运维 工具是特别有兴趣的, 这些工具的集成和搭配以及选型,才是多元化的,才正在的有味道。
搭建Prometheus
当然的,直接上 docker ,本身就是为自己的压力测试做准备环境的,用最低的代价最快的速度即可。
prometheus的镜像是使用的自己的里prometheus的私有镜像,里面有些自己定制化的东东。
有兴趣的朋友, 可以在里搜索joinsunsoft; 里面有一些public出来的好东西,里面还有k8s的image, 这里大家可以直接拿官方镜像就行, 镜像名 prom/prometheus
启动后加入boot4go-gateway的exporter。 这个按照自己的喜好加就行, 例如 我的规范
- job_name: boot4 go -gateway-group01
static _configs:
- targets: ['192.168.56.1:9000']
labels:
type: gateway-server
group: default
如果嫌弃这个麻烦,可以通过push自动注册的方式进行prometheus里的endpoint注册。
访问 prometheus 看是否exporter生效
就仅仅这个prometheus的target list的页面里的数据,就深深的能够反映出fasthttp由于go net/http的性能。看上面的图, 图最上的是咱们用fasthttp开发的boot4go-gateway,其中Scrape Duration一栏就是http请求的请求时间,
比较一下底下的一个,是prometheus自己的exporter,prometheus是用golang写的,使用的是go原生的net/http包作为http服务, 在docker容器里自己pull自己的响应比处于不同机器的boot4go-gateway的响应时间要多了2倍多,
再看看数据包的大小
这个是prometheus exporter的包大小
这个是boot4go-gateway的metrics包的大小
fasthttp还是要快了不少
搭建Grafana
还是一样的哦,上docker,
grafana的镜像是使用的自己在里grafana的私有镜像,
官方镜像 grafana/grafana
启动grafana后,选择prometheus作为数据源, 然后定义boot4go-gateway的dashboard, 这里需要掌握有关prometheus的ql语法和使用, 以及grafana的相关指标panel的设置和参数提取, 为了方便大家开箱即用,我已经在grafana的官网里发布了boot4go-gateway的dashboard,大家直接import到自己的grafana里即可
boot4go-gateway
Dashboard ID: 16262
网址 Boot4GO-Gateway dashboard for Grafana | Grafana Labs
效果图
开始测试
赶紧试试gateway发送几个请求, 现在是用postman来进行测试
Gateway的反向代理配置,
gateway在本机上启动端口9000,启动 SSL 端口 9443,配置了2个 nginx 作为目标机器
转发配置
配置了映射路径为/nginx/**
目标机器映射为两个docker上的nginx分别是192.168.56.101的10081和10082端口,使用的负载均衡策略是 轮询 请求,映射的路径转换规则 将 的请求转换为 或者 映射规则测试用了个简单的,还可以使用场景化更复杂的规则进行转发
Let go,测试吧
使用postman进行测试(包大小为 45KB)
直接访问Nginx机器的效果
访问Nginx1
访问Nginx2
查看监控面板
这里可以看到,协程数,内存量,分配数,句柄数,都是稳定的,这也是fasthttp的池化的体现
尾声
监控系统的搭建,目的是为了在进行压力并发测试的时候,可以收集到机器的各种性能参考和分析指标,以便在性能测试的过程中比较好的了解机器的运行状况,进行性能测试的分析以及后期的优化。
下一集将进行压力并发测试
压力并发测试,将使用2种不同的方式进行,一种是使用golang来写客户端,进行测试。这种方法比较容易,但是模拟的场景比较简单。
另一种方式通过 jmeter ‘进行更多的压力和负载场景测试
我们将使用两个方法都进行测试。