流量回放工具之 GoReplay output-http-stats(HTTP请求统计) 源码分析

前言

GoReplay 可以报告 stats 请求队列的统计信息。通过结合使用--output-http-stats和选项,默认统计信息每 5 秒输出到给控制台。

参数:–stats --output-http-stats

 -output-http-stats  //每5秒钟输出一次输出队列的状态
        Report http output queue stats to console every N milliseconds. See output-http-stats-ms
  -output-http-stats-ms int
        Report http output queue stats to console every N milliseconds. default: 5000 (default 5000)

控制台输出是这样的:

在这里插入图片描述

其中倒数第二列等同于当前的TPS;

output_http.go

HTTPOutputConfig 统计信息收集
是否收集统计信息,统计输出间隔是多少

	if o.config.Stats {
		o.queueStats = NewGorStat("output_http", o.config.StatsMs)
	}

在这里插入图片描述

统计信息收集:

// PluginWrite writes message to this plugin
// 统计信息收集
func (o *HTTPOutput) PluginWrite(msg *Message) (n int, err error) {
	if !isRequestPayload(msg.Meta) {
		return len(msg.Data), nil
	}

	select {
	case <-o.stop:
		return 0, ErrorStopped
	case o.queue <- msg:
	}

	if o.config.Stats {
		o.queueStats.Write(len(o.queue))
	}
	if len(o.queue) > 0 {
		// try to start a new worker to serve
		if atomic.LoadInt32(&o.activeWorkers) < int32(o.config.WorkersMax) {
			go o.startWorker()
			atomic.AddInt32(&o.activeWorkers, 1)
		}
	}
	return len(msg.Data) + len(msg.Meta), nil
}

在这里插入图片描述

gor_stat.go

NewGorStat 统计类:

// NewGorStat统计类
func NewGorStat(statName string, rateMs int) (s *GorStat) {
	s = new(GorStat)
	s.statName = statName
	s.rateMs = rateMs
	s.latest = 0
	s.mean = 0
	s.max = 0
	s.count = 0

	if Settings.Stats {
		go s.reportStats()
	}
	return
}

在这里插入图片描述

写入时做统计:

//写入时做统计
func (s *GorStat) Write(latest int) {
	if Settings.Stats {
		if latest > s.max {
			s.max = latest
		}
		if latest != 0 {
			s.mean = ((s.mean * s.count) + latest) / (s.count + 1)
		}
		s.latest = latest
		s.count = s.count + 1
	}
}

在这里插入图片描述

打印输出,简单的sleep:

//打印输出,简单的sleep
func (s *GorStat) reportStats() {
	Debug(0, "\n", s.statName+":latest,mean,max,count,count/second,gcount")
	for {
		Debug(0, "\n", s)
		s.Reset()
		time.Sleep(time.Duration(s.rateMs) * time.Millisecond)
	}

在这里插入图片描述

字符串类型强转:

//字符串类型转换
func (s *GorStat) String() string {
	return s.statName + ":" + strconv.Itoa(s.latest) + "," + strconv.Itoa(s.mean) + "," + strconv.Itoa(s.max) + "," + strconv.Itoa(s.count) + "," + strconv.Itoa(s.count/(s.rateMs/1000.0)) + "," + strconv.Itoa(runtime.NumGoroutine())
}

runtime.NumGoroutine():返回当前存在的协程的数量。

在这里插入图片描述

核心调用逻辑图

在这里插入图片描述

相关系列:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
流量回放工具goreplay是一个开源的工具,它可以用来记录和回放HTTP/HTTPS流量。如果你想要进行压测并统计结果,可以对goreplay进行一些改造。 首先,你需要安装goreplay并启动它来进行流量录制和回放。然后,你可以使用一个脚本来发送请求并记录响应时间。以下是一个示例脚本: ```bash #!/bin/bash while read line; do url=$(echo $line | cut -d ' ' -f 2) time=$(curl -o /dev/null -s -w %{time_total} $url) echo $time >> response_times.log done < urls.txt ``` 这个脚本从一个名为urls.txt的文件中读取URL,并使用curl发送请求并记录响应时间。响应时间被写入response_times.log文件中。 一旦你有了响应时间的记录,你可以使用其他工具来进行统计分析。例如,你可以使用awk命令来计算平均响应时间: ```bash awk '{sum+=$1} END {print "Average response time: " sum/NR "s"}' response_times.log ``` 这个命令将response_times.log文件中的所有响应时间相加,然后除以记录数来计算平均响应时间。 你也可以使用其他工具,如Grafana、Prometheus和InfluxDB等来可视化和分析数据。例如,你可以使用Grafana来创建一个响应时间的实时监控面板。 改造goreplay支持压测统计是可行的,但需要一定的技术水平和时间投入。你需要了解golangHTTP/HTTPS协议,并对goreplay的代码进行修改。如果你需要更加专业的支持,可以考虑向goreplay的开发团队寻求帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zuozewei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值