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

简介: 【6月更文挑战4天】流量回放工具之 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)

控制台输出是这样的:

image.png

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

output_http.go

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

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

image.png

统计信息收集:

// 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
}

image.png

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
}

image.png

写入时做统计:

//写入时做统计
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
    }
}

image.png

打印输出,简单的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)
    }

image.png

字符串类型强转:

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

image.png

核心调用逻辑图

image.png

目录
相关文章
|
19天前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
71 25
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
|
18天前
|
Web App开发 大数据 应用服务中间件
什么是 HTTP Range请求(范围请求)
HTTP Range 请求是一种非常有用的 HTTP 功能,允许客户端请求资源的特定部分,从而提高传输效率和用户体验。通过合理使用 Range 请求,可以实现断点续传、视频流播放和按需加载等功能。了解并掌握 HTTP Range 请求的工作原理和应用场景,对开发高效的网络应用至关重要。
55 15
|
1月前
|
开发者
HTTP 协议请求方法的发展历程
【10月更文挑战第21天】
|
21天前
|
数据采集 JSON 测试技术
Grequests,非常 Nice 的 Python 异步 HTTP 请求神器
在Python开发中,处理HTTP请求至关重要。`grequests`库基于`requests`,支持异步请求,通过`gevent`实现并发,提高性能。本文介绍了`grequests`的安装、基本与高级功能,如GET/POST请求、并发控制等,并探讨其在实际项目中的应用。
31 3
|
27天前
|
前端开发 UED 开发者
CSS Sprites和图标字体在网页图标加载优化中的应用。CSS Sprites通过合并多图标减少HTTP请求,提升加载速度
本文探讨了CSS Sprites和图标字体在网页图标加载优化中的应用。CSS Sprites通过合并多图标减少HTTP请求,提升加载速度;图标字体则以字体形式呈现图标,便于调整样式。文章分析了两者的优缺点及应用场景,并提供了应用技巧和注意事项,旨在帮助开发者提升页面性能,改善用户体验。
24 5
|
1月前
|
JSON API 数据格式
Python中获取HTTP请求响应体的详解
本文介绍了如何使用Python的`requests`和`urllib`库发送HTTP请求并处理响应体。`requests`库简化了HTTP请求过程,适合快速开发;`urllib`库则更为底层,适用于性能要求较高的场景。文章详细演示了发送GET请求、处理JSON响应等常见操作。
49 3
|
18天前
|
Web App开发 网络安全 数据安全/隐私保护
Lua中实现HTTP请求的User-Agent自定义
Lua中实现HTTP请求的User-Agent自定义
|
1月前
|
前端开发 JavaScript Java
如何捕获和处理HTTP GET请求的异常
如何捕获和处理HTTP GET请求的异常
|
1月前
|
安全
HTTP 协议的请求方法
【10月更文挑战第21天】
|
1月前
|
缓存 安全 前端开发
HTTP 协议的请求方法在实际应用中有哪些注意事项?
【10月更文挑战第29天】HTTP协议的请求方法在实际应用中需要根据具体的业务场景和需求,合理选择和使用,并注意各种方法的特点和限制,以确保网络通信的安全、高效和数据的一致性。