监控Go协程池需采集Running、Queued、Completed、Failed和AvgDuration等核心指标;2. 使用expvar注册统计字段并通过HTTP暴露JSON接口;3. 前端用原生JS定时拉取/debug/vars更新DOM并绘制任务趋势图;4. 集成pprof链接实现堆栈分析,结合runtime.Stack记录异常。
实现 Go 协程池监控面板,核心在于采集运行时指标 + 可视化暴露 + 轻量实时更新。不需要引入重型 APM,用标准库 + 简单 Web 服务就能做出实用、低侵入的可视化监控页。
不是所有 goroutine 都该被监控,重点是业务自建的协程池(如 worker pool)。需在池结构中嵌入可原子更新的统计字段:
atomic.Int64)expvar 或自定义环形缓冲)Go 标准库 expvar 天然支持 JSON 输出,零依赖暴露指标:
expvar.Map,例如:expvar.NewMap("worker_pool")
pool.stats.Add("running", 1) 或 -1
http.ListenAndServe(":6060", nil),默认路径 /debug/vars 就能返回全部指标http://localhost:6060/debug/vars 即可看到实时 JSON 数据不依赖 React/Vue,用原生 JS 定时拉取 /debug/vars,动态渲染 DOM:
,分别绑定 running、queued 等字段
- 用
setInterval 每 2 秒 fetch 一次,解析 JSON 后更新 innerText
- 对
running 做简单阈值着色:>80% 最大容量时标红,<20% 标灰
- 加一个折线图区域(可用 Chart.js 的轻量 CDN 版),只画
com
pleted/sec 的 60 秒滚动趋势
4. 进阶:集成 pprof 实时 goroutine 分析
当发现 running 持续高位,可一键跳转分析卡点:
- 在监控页加个按钮:“查看 goroutine stack”
- 链接指向
/debug/pprof/goroutine?debug=2(完整堆栈)或 ?debug=1(摘要)
- 配合
runtime.Stack 在 panic 时自动采样,存入 ring buffer,供面板“最近异常”栏展示
基本上就这些。不复杂但容易忽略的是:指标采集要无锁、低开销;前端轮询别太密(>1s);所有数字必须用原子操作更新。做好这三点,你的协程池就有了看得见、摸得着的健康仪表盘。