流量回放工具之 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

目录
相关文章
|
15天前
|
运维 监控 Serverless
函数计算产品使用问题之HTTP触发器被恶意刷流量,该怎么办
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
1天前
|
JSON 网络协议 数据格式
网络协议基础:HTTP请求与响应详解
【7月更文挑战第11天】HTTP协议作为Web通信的核心,其请求与响应机制是理解网络通信的关键。本文详细介绍了HTTP请求与响应的格式、过程以及常用的请求方法,帮助读者更好地理解HTTP协议的工作原理和应用场景。在实际应用中,HTTP协议的可定制性和灵活性使其能够适应多种
|
5天前
深入理解HTTP请求的五个要点
状态码:每个HTTP响应都包含一个状态码,它表示请求的结果。例如,200表示请求成功,404表示请求的资源未找到,500表示服务器内部错误等。
13 3
|
11天前
|
XML 前端开发 JavaScript
JavaEE:http请求 | 过滤器 | 同步与异步请求 | 跨域问题 | axios框架 有这一篇就够!
JavaEE:http请求 | 过滤器 | 同步与异步请求 | 跨域问题 | axios框架 有这一篇就够!
|
14天前
|
缓存 负载均衡 NoSQL
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
30 1
|
10天前
|
缓存 安全 搜索推荐
HTTP 请求方法:你需要知道的一切
在 Web 开发领域,HTTP 方法在定义客户端如何与 Web 服务器交互以及对资源执行不同操作方面起着至关重要的作用。HTTP(Hypertext Transfer Protocol,超文本传输协议)是现代网络应用的栋梁,它定义了客户端与服务器之间的通信方式。
|
14天前
|
安全 Java API
深入探索 org.springframework.http.server.reactive.ServerHttpRequest:Reactive世界中的HTTP请求处理
深入探索 org.springframework.http.server.reactive.ServerHttpRequest:Reactive世界中的HTTP请求处理
15 0
|
14天前
|
Java API Spring
Spring Boot中使用Feign进行HTTP请求
Spring Boot中使用Feign进行HTTP请求
|
14天前
|
运维 Serverless 数据处理
函数计算产品使用问题之如何通过HTTP请求进行调用
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
16天前
|
数据采集 Java API
Java HTTP客户端工具的演变之路
Java HTTP客户端工具的演变之路