前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >goreplay output-http-stats(HTTP请求统计) 源码分析

goreplay output-http-stats(HTTP请求统计) 源码分析

作者头像
高楼Zee
发布2021-10-27 11:16:19
5850
发布2021-10-27 11:16:19
举报
文章被收录于专栏:7DGroup7DGroup
前言

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

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

代码语言:javascript
复制
 -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)

控制台输出是这样的:

image.png

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

output_http.go

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

代码语言:javascript
复制
 if o.config.Stats {
  o.queueStats = NewGorStat("output_http", o.config.StatsMs)
 }

统计信息收集:

代码语言:javascript
复制
// 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 统计类:

代码语言:javascript
复制
// 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
}

image.png

写入时做统计:

代码语言:javascript
复制
//写入时做统计
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:

代码语言:javascript
复制
//打印输出,简单的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)
 }

字符串类型强转:

代码语言:javascript
复制
//字符串类型转换
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():返回当前存在的协程的数量。

核心调用逻辑图

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 7DGroup 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • output_http.go
  • gor_stat.go
  • 核心调用逻辑图
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档