autocannon进度跟踪功能:实时监控性能测试过程中的指标

【免费下载链接】autocannon fast HTTP/1.1 benchmarking tool written in Node.js 【免费下载链接】autocannon 项目地址: https://gitcode.com/gh_mirrors/au/autocannon

你是否在进行性能测试时,只能等待测试结束才能看到结果?是否想实时了解请求成功率、响应时间等关键指标?autocannon的进度跟踪功能通过直观的视觉反馈和实时数据更新,让你在测试过程中即可掌握系统性能状态。本文将详解如何使用该功能及背后的实现原理。

核心实现:progressTracker模块

进度跟踪功能的核心代码位于lib/progressTracker.js,该模块通过监听测试实例的生命周期事件,实现实时进度展示。主要功能包括:

  • 基于测试类型(时长/请求数量)显示进度条
  • 处理多工作线程模式下的进度展示
  • 实时打印测试结果统计信息

模块使用progress库创建进度条,chalk库提供终端颜色支持,通过以下关键函数实现核心逻辑:

  • track(): 主入口函数,绑定事件监听器
  • trackDuration()/trackAmount(): 根据测试类型创建进度条
  • logToStream(): 处理终端输出流

进度展示的两种模式

autocannon支持两种进度跟踪模式,可通过测试配置自动切换:

1. 时长模式进度条

当指定测试持续时间(duration参数)时,进度条会根据时间流逝更新:

const instance = autocannon({
  url: 'http://localhost:3000',
  duration: 10 // 测试10秒
})
autocannon.track(instance)

实现代码位于lib/progressTracker.js#L137-L152,通过监听'tick'事件每秒更新进度条。

2. 请求数量模式进度条

当指定总请求数量(amount参数)时,进度条根据已完成请求数更新:

const instance = autocannon({
  url: 'http://localhost:3000',
  amount: 1000 // 测试1000个请求
})
autocannon.track(instance)

实现代码位于lib/progressTracker.js#L154-L169,通过监听'response'和'reqError'事件更新进度。

多工作线程模式的特殊处理

在启用多工作线程(workers参数)时,进度跟踪会切换为Spinner动画,避免多线程环境下的进度条混乱。核心处理逻辑见lib/progressTracker.js#L105-L112

if (iOpts.workers) {
  // 使用Spinner代替进度条
  instance.prependOnceListener('done', hideSpinner)
  return
}

完整使用示例

samples目录下提供了进度跟踪的完整示例track-run.js,代码结构如下:

const http = require('http')
const autocannon = require('../autocannon')

// 创建测试服务器
const server = http.createServer((req, res) => {
  res.end('hello world')
})

server.listen(0, startBench)

function startBench () {
  const instance = autocannon({
    url: 'http://localhost:' + server.address().port,
    duration: 5,
    connections: 10
  }, finishedBench)

  // 启用进度跟踪
  autocannon.track(instance)

  // 处理Ctrl+C中断
  process.once('SIGINT', () => {
    instance.stop()
  })

  function finishedBench (err, res) {
    console.log('测试完成', err, res)
    server.close()
  }
}

运行此示例将看到类似以下的实时进度输出:

Running 5s test @ http://localhost:3000
10 connections

running [:-------------------] 0%

自定义进度跟踪行为

lib/progressTracker.js支持通过选项参数自定义进度展示行为:

autocannon.track(instance, {
  renderProgressBar: true,    // 是否显示进度条
  renderResultsTable: true,   // 是否显示结果表格
  renderLatencyTable: false,  // 是否显示延迟分布表格
  outputStream: process.stdout // 输出流
})

主要配置项在默认参数对象中定义:

const defaults = {
  outputStream: process.stderr,
  renderProgressBar: true,
  renderResultsTable: true,
  renderLatencyTable: false
}

测试验证

进度跟踪功能的测试用例位于test/progressTracker.test.js,主要验证:

  • 多工作线程模式下无警告输出
  • 进度条正确处理不同测试类型
  • 事件监听器无内存泄漏

测试使用sinon库模拟事件和流输出,确保进度跟踪在各种场景下的稳定性。

总结与最佳实践

使用进度跟踪功能时,建议:

  1. 对于长时间运行的测试(>30秒)启用进度跟踪,提升用户体验
  2. 在CI环境中可禁用进度条(renderProgressBar: false),避免输出混乱
  3. 结合workers参数使用时,注意进度展示会自动切换为Spinner模式
  4. 通过捕获'SIGINT'事件,确保测试中断时进度条正确完成

通过lib/progressTracker.js实现的进度跟踪功能,autocannon为开发者提供了直观的测试过程反馈,帮助及时发现性能问题。结合lib/printResult.js提供的结果展示,形成了完整的性能测试体验。

要了解更多使用示例,可参考samples目录下的track-run-workers.js(多工作线程模式)和track-run.js(基本用法)。

【免费下载链接】autocannon fast HTTP/1.1 benchmarking tool written in Node.js 【免费下载链接】autocannon 项目地址: https://gitcode.com/gh_mirrors/au/autocannon

Logo

华为鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐