在执行机、构建机或测试机集群中,机器状态不可见是运维的典型痛点。Pulse 是一个由两个 Go 单文件二进制文件构成的轻量级监控方案,它能帮助你在 5 分钟内实现集群状态的实时可见,无需引入重型监控栈。本文将介绍 Pulse 的核心特性、工程细节和部署步骤。
一、执行机集群的“可观测真空”
传统的执行机集群排查依赖 SSH 登录,手动运行 top、free、df -h、iostat 等命令。这种方式存在明显的滞后性、低效性,且难以发现“假死”状态。而常见的监控方案(如 Prometheus + Grafana)虽然功能强大,但对于内网、无外网或机器量大的执行机场景,部署和维护成本往往过高。
Pulse 的思路是:用尽可能小的资源消耗,解决“看得见”这一核心问题。
二、Pulse 的架构:Agent + Server
Pulse 由两个独立的 Go 单文件二进制构成:
- Agent:运行在每台执行机上,负责采集指标并上报。
- Server:运行在中心节点,接收上报数据并提供 Dashboard。
数据流是单向的(执行机 → Server),Server 不主动采集,也不反向控制机器。
Agent 特性
- Go 交叉编译的单文件二进制,体积仅几 MB,无任何运行时依赖。
- 每 10 秒采集一次指标,通过 HTTP POST 上报。
- 上报地址由
PULSE_SERVER环境变量指定。 - 以 systemd 托管,实现开机自启和崩溃自动重启。
Server 特性
- 纯 Go 标准库实现,零外部依赖。
- 内存态维护
hostname:ip到最近一次指标的映射。 - 提供四个接口:
/:Web 监控面板(Dashboard 通过go:embed编入二进制)/report:Agent 上报入口/status:全量状态 JSON(供面板轮询)/health:健康检查
端口说明:Dashboard 默认运行在 8080 端口;安装脚本与 Agent 上报地址的示例中使用 8123 端口。实际部署时请以你自己的配置为准。
三、覆盖全面的指标采集
Pulse 采集的指标覆盖执行机日常巡检的关键维度:
| 类别 | 指标 | 说明 |
|---|---|---|
| CPU | 使用率 | 判断任务是否跑满机器 |
| 内存 | 总量 / 已用 / 使用率 | 预防 OOM |
| Swap | 总量 / 已用 / 使用率 | 长期偏高说明物理内存不足 |
| 磁盘 | 根分区总量 / 已用 / 使用率 | 防止构建产物撑满磁盘 |
| 负载 | 1/5/15 分钟 Load | 关注趋势而非瞬时值 |
| 运行时长 | Uptime | 骤降可能意味着机器重启过 |
| 网络 | 累计流量 + 实时速率 | 发现异常拉包行为 |
| 磁盘 I/O | 累计量 + 实时速率 | 定位磁盘瓶颈 |
| 在途 IO | 未完成的 I/O 请求数 | 磁盘“堵不堵”的直接指标 |
| 进程数 | 进程总数 | 异常突增可能是 fork 炸弹 |
采集的健壮性
任何单个指标采集失败时,Agent 只记录日志并保留零值,其余指标照常上报。这意味着某台机器即使缺少某个数据源(如 /proc/loadavg),也不会导致整台机器“失联”。
对于网络和磁盘 I/O 速率,Agent 保存上一轮采样的累计值和时间戳,通过差值除以间隔计算 bytes/s。首轮采样或计数器归零回绕时,速率记为 0,避免出现负值或异常大的数值。
四、智能告警:只在状态跳变时通知
离线判定
超过 30 秒未收到上报,即标记该主机为 offline。
阈值告警
默认阈值如下,所有阈值均可通过环境变量覆盖:
- CPU 使用率:90%
- 内存使用率:90%
- 磁盘使用率:85%
- Swap 使用率:50%
- 进程数:2000
告警去重(状态机)
Pulse 维护一个以「主机 + 告警类型」为键的状态机。只有状态发生跳变时(例如从正常变为异常,或从异常恢复为正常),才会输出 ALERT 或 RECOVER 日志。这避免了传统方案中“超阈值后每轮都刷日志”的噪音问题。
五、关键工程细节
- 上报 IP 以 TCP 来源为准:Server 从
r.RemoteAddr解析真实来源地址,不采信 Agent 自报的 IP。这在网络地址转换(NAT)或容器环境下尤为准确,也更安全。 - 失败重试指数退避:上报失败时,Agent 按 1s → 2s → 4s 的间隔重试,最多 3 恡,避免瞬时网络抖动导致数据丢失。
- 阈值判定单一实现:
/status查询和告警协程共用同一个阈值判定函数,杜绝“面板显示正常、告警却在疯狂刷”的不一致现象。 - 单请求 panic 隔离:Server 的每个 handler 都包装了 recover,单个请求的 panic 不会拖垮整个服务。
六、部署步骤
前置条件
- Server 端需要安装 Go 语言环境,用于编译 Server 和 Agent。
- 执行机端无需安装任何运行时,直接使用预编译的二进制文件。
1. 编译并启动 Server
在 Server 所在机器上执行:
bash
安装 Go 环境(如尚未安装)
例如在 Ubuntu 上:sudo apt install golang-go
克隆或下载源码后,编译 Server
go build -ldflags "-s -w" -o pulse-server ./server
编译 Agent(可选,用于交叉编译)
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" -o pulse-agent ./agent
启动 Server
./pulse-server
Server 默认监听在 8080 端口,提供 Dashboard 和 API。安装脚本与 Agent 上报地址的示例中使用 8123 端口,实际部署时请以你的配置为准。
2. 安装 Agent(每台执行机)
在每台执行机上,使用一行命令即可完成安装、配置和启动:
bash curl -fsSL http://<server-ip>:8123/resources/install-pulse.sh | bash -s -- "http://<server-ip>:8123/report"
该脚本会自动完成以下操作:
- 下载 Pulse Agent 二进制文件。
- 写入 systemd 服务文件,设置开机自启和崩溃自动重启(5 秒自愈)。
- 启动服务并验证运行状态。
安装完成后,Agent 会每 10 秒向 Server 上报一次指标。
3. 访问 Dashboard
在浏览器中打开 http://<server-ip>:8080/,即可看到集群总览面板。面板支持按主机名或 IP 实时搜索、表头排序、分页,点击任意主机可查看详细指标卡片。
七、适用场景与边界
适合的场景
- 执行机、构建机、测试机集群的日常健康巡检。
- 内网、无外网,或无法引入重型监控栈的环境。
- 只需解决机器状态可见性,不想背负监控运维负担的团队。
不适合的场景
- 需要长期指标存储和复杂查询(Pulse 为内存态,重启即清空)。
- 需要多租户、RBAC 等权限体系。
- 需要业务指标(如 QPS、延迟分布、错误率)——Pulse 只管机器,不管业务。
如果你的需求属于上述“不适合”的范畴,Prometheus + Grafana 仍然是更全面的选择。
八、总结
Pulse 用两个 Go 单文件、10 秒上报、智能告警去重和内嵌 Dashboard,为执行机集群提供了一种轻量、零依赖的监控方案。它不追求大而全,而是专注于“机器状态可见”这一核心问题,让运维团队能够从 SSH 人肉排查中解放出来。
你可以通过访问 Dashboard 验证部署是否成功:如果看到所有主机的状态正常上报,即说明系统运行良好。如果遇到问题,可以检查 Agent 的 systemd 日志(journalctl -u pulse-agent)或 Server 的控制台输出。