25 KiB
ProbeDeck Go Probe(cfsm-agent)
cfsm-agent 是 ProbeDeck 的探针程序(Go Probe Agent),安装后会以 cf-probe 服务运行,定时采集服务器资源、网络流量和探测数据,并上报到面板后端。
快速安装
从面板或后台获取以下 3 个参数:
SERVER_ID:服务器 IDSECRET:服务器密钥WORKER_URL:面板上报地址,例如https://example.com/update
Linux、OpenWrt、Synology DSM、FreeBSD、macOS 可使用安装脚本自动下载当前系统对应的最新 release:
curl -fsSL https://raw.githubusercontent.com/gg949/cfsm-agent/main/install.sh | sh -s -- install -id=SERVER_ID -secret=SECRET -url=WORKER_URL
如果系统没有 curl,可使用 wget:
wget -O- https://raw.githubusercontent.com/gg949/cfsm-agent/main/install.sh | sh -s -- install -id=SERVER_ID -secret=SECRET -url=WORKER_URL
普通用户安装(非 root)
仅支持 systemd --user 的 Linux 可使用非 root 安装;执行安装时会使用当前用户,不会新建用户;二进制、配置和流量文件会写入 ~/.cf-probe/,自启动使用 systemd --user。Synology DSM、OpenWrt、Alpine/OpenRC 以及其他不支持 systemd --user 的系统请使用 root 权限安装。部分 Linux 系统从旧的 root Go 版切换到非 root 安装时,建议先在 root 下卸载旧版:
curl -fsSL https://raw.githubusercontent.com/gg949/cfsm-agent/main/install.sh | sh -s -- uninstall
macOS 固定使用当前普通用户安装,写入 ~/.cf-probe/,自启动使用 ~/Library/LaunchAgents/,不要使用 sudo/root 安装。macOS 如果检测到旧的 root/system 版本,会提示先执行 sudo /usr/local/bin/cf-probe uninstall 清理旧版,再以普通用户安装。
支持 systemd --user 的 Linux 如果已有非 root 用户,先直接登录该用户并开启 linger,以支持退出登录后后台运行和自启动:
loginctl enable-linger
如果当前用户执行无权限,再切回 root 为该用户开启:
loginctl enable-linger 用户名
如果没有非 root 用户,可先新建用户并设置密码或 SSH 密钥:
useradd -m -s /bin/bash cfsm
loginctl enable-linger cfsm
passwd cfsm
随后退出 root/su 会话,使用账户密码或 SSH 密钥登录该非 root 用户,再复制后台安装命令执行。不要在 root shell 中直接 su 后安装,否则当前会话可能无法连接 systemd --user 用户服务(例如 Failed to connect to bus: No medium found)。如果 Linux 环境不支持 systemd --user,请改用 root 安装;如果检测到 root/system 旧版本安装,当前版本会提示先清理旧版本,暂不自动迁移。
Windows 安装
请使用管理员权限打开 PowerShell,然后执行:
$script = "$env:TEMP\install-cf-probe.ps1"
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/gg949/cfsm-agent/main/install.ps1" -OutFile $script -UseBasicParsing
PowerShell -ExecutionPolicy Bypass -File $script install -id=SERVER_ID -secret=SECRET -url=WORKER_URL
Windows 上如果安装时开启 -auto_update=1,自动更新会下载并执行 C:\ProgramData\cf-probe\cf-probe-update.exe,部分杀毒软件或安全策略可能拦截。被拦截时请将 C:\Program Files\cf-probe\cf-probe.exe、C:\ProgramData\cf-probe\cf-probe-update.exe、C:\ProgramData\cf-probe\cf-probe.cmd 加入白名单;如环境不允许放行,建议保持 -auto_update=0,需要升级时手动指定版本安装。
指定版本或 GitHub 代理
默认安装最新 release。需要指定版本时:
curl -fsSL https://raw.githubusercontent.com/gg949/cfsm-agent/main/install.sh | sh -s -- install --install-version=v1.0.10 -id=SERVER_ID -secret=SECRET -url=WORKER_URL
GitHub 下载较慢时,可以配置代理前缀:
curl -fsSL https://raw.githubusercontent.com/gg949/cfsm-agent/main/install.sh | sh -s -- install --install-ghproxy=https://gh-proxy.example.com -id=SERVER_ID -secret=SECRET -url=WORKER_URL
常用安装参数
| 参数 | 说明 | 默认值 |
|---|---|---|
-id=SERVER_ID |
服务器 ID,首次安装必填 | 无 |
-secret=SECRET |
服务器密钥,首次安装必填 | 无 |
-url=WORKER_URL |
面板上报地址,首次安装必填 | 无 |
-interval=N |
上报间隔,单位秒 | 60 |
-collect_interval=N |
采样间隔,单位秒;WSS auto 开启时为 0 或大于 WSS_REPORT_INTERVAL 会按 WSS_REPORT_INTERVAL 采样 |
0 |
-ct=HOST |
电信测试节点,可写 host 或 host:port |
空 |
-cu=HOST |
联通测试节点,可写 host 或 host:port |
空 |
-cm=HOST |
移动测试节点,可写 host 或 host:port |
空 |
-bgp=HOST |
BGP 节点测试节点,可写 host 或 host:port |
空 |
-interface=IFACES |
指定统计网卡,多个用英文逗号分隔 | 自动汇总 |
-reset_day=N |
每月流量重置日,1-31;0 表示不重置 |
1 |
-connection_mode=auto|http |
连接模式;auto 优先 WSS 实时上报并在不可用时 POST 兜底,http 仅按上报间隔 POST |
auto |
-ping_mode=tcp|icmp |
Ping 探测模式;tcp 使用 TCP 连接探测,icmp 使用 ICMP 探测;两者均每 20 秒采样一次并按 2 分钟窗口聚合 |
tcp |
-auto_update=0|1 |
是否开启自动检查更新 | 0 |
-rx_correction=N |
下行流量校正,单位 GB | 空 |
-tx_correction=N |
上行流量校正,单位 GB | 空 |
-debug=0|1 |
是否开启调试日志 | 0 |
-no_start |
安装后不立即启动服务 | 不启用 |
再次执行 install 时,如果本机已有配置文件,程序会以已有配置为基础,只覆盖本次显式传入的参数,未传入的参数保留旧值(例如只传 -auto_update=1 就只修改自动更新开关)。首次安装(本机无已有配置)时 -id、-secret、-url 仍为必填。
自动更新默认关闭。安装时传入 -auto_update=1 后,Agent 启动时会检查 GitHub release,之后每 6 小时检查一次;稳定版按版本号更新,Snapshot- 版本会跟随最新可用 Snapshot prerelease。自动更新只由本地 AUTO_UPDATE 配置控制,不依赖面板返回 update=1。如果安装时配置了 --install-ghproxy,代理会写入本地配置并用于后续自动更新;该本地字段不参与远端配置 MD5 对比。自动更新的检查结果、调度结果和失败原因始终以 info 级日志输出,无需开启 debug;系统级 nohup 环境下安装过程的输出会追加到 /var/log/cf-probe.log,systemd 环境可通过 journalctl -u 'cf-probe-auto-update-*' 查看。
普通用户安装时,自动更新会在 ~/.cf-probe/ 内下载并替换当前用户的二进制,随后退出当前进程,由 systemd --user 或 macOS LaunchAgent 按服务重启策略拉起新版本;不会触碰 root 路径或系统级服务。
更新检查(api.github.com)、新二进制下载(github.com)、指标上报以及公网 IP 查询的 DNS 解析默认使用系统原生 DNS;仅在配置了 --install-ghproxy(通常为系统 DNS 被污染的国内服务器)或通过环境变量 CF_PROBE_UPDATE_DNS 显式指定 DNS 服务器时,才启用 Agent 内置的公共 DNS 轮询解析(阿里、DNSPod、114、Cloudflare、Google,UDP 53),此时不依赖系统 DNS,内置 DNS 全部不可用时回退系统 DNS。CF_PROBE_UPDATE_DNS 会自动补全 :53 端口(如 CF_PROBE_UPDATE_DNS=223.5.5.5)。root/system 模式更新时 Agent 会把新二进制下载到配置目录,再调度新二进制执行自身的 install 完成替换并重启服务;普通用户模式按上一段直接自替换。两种模式都不经过 install.sh 和 curl;下载或调度失败时旧版本不受影响,下次检查自动重试。如 github.com 完全不可达,可配置 --install-ghproxy 代理(仅用于二进制文件下载;api.github.com 的版本检查始终直连,gh-proxy 类服务不支持 API 转发)。
安装位置
| 系统 | 二进制默认位置 | 配置文件 | 日志 |
|---|---|---|---|
Linux non-root (systemd --user) |
~/.cf-probe/bin/cf-probe |
~/.cf-probe/config.conf |
journalctl --user -u cf-probe -f |
| Linux / Synology DSM | /usr/local/bin/cf-probe |
/etc/config/cf-probe/config.conf |
/var/log/cf-probe.log |
| OpenWrt | /usr/bin/cf-probe |
/etc/config/cf-probe/config.conf |
/var/log/cf-probe.log |
| FreeBSD | /usr/local/bin/cf-probe |
/etc/config/cf-probe/config.conf |
/var/log/cf-probe.log |
macOS (LaunchAgent) |
~/.cf-probe/bin/cf-probe |
~/.cf-probe/config.conf |
~/.cf-probe/cf-probe.log |
| Windows | C:\Program Files\cf-probe\cf-probe.exe |
C:\ProgramData\cf-probe\config.conf |
C:\ProgramData\cf-probe\cf-probe.log |
服务名固定为 cf-probe。服务会根据系统自动注册为 systemd、OpenRC、procd、launchd、Synology rc、Windows 计划任务,或在不支持服务管理器的环境中后台运行。
Linux 普通用户安装固定使用 systemd --user;root 安装仍使用系统级服务。macOS 固定使用当前用户 LaunchAgent,不再安装 root/system 版。普通用户安装会阻止与其他用户或 root 版实例重复运行,但允许覆盖安装当前用户自己的运行实例。
查看状态和日志
Linux non-root (systemd --user):
systemctl --user status cf-probe
journalctl --user -u cf-probe -f
systemd 系统:
sudo systemctl status cf-probe
sudo journalctl -u cf-probe -f
OpenRC(Alpine 等):
rc-service cf-probe status
tail -f /var/log/cf-probe.log
OpenWrt:
/etc/init.d/cf-probe status
logread -f
FreeBSD:
ps aux | grep cf-probe
tail -f /var/log/cf-probe.log
macOS:
launchctl print gui/$(id -u)/com.cfsm.cf-probe
tail -f ~/.cf-probe/cf-probe.log
Windows:
Get-ScheduledTask -TaskName cf-probe
Get-Content "C:\ProgramData\cf-probe\cf-probe.log" -Wait
卸载
推荐使用安装脚本触发卸载。脚本会下载临时 cf-probe 执行卸载,避免 Windows 下运行中的已安装程序无法删除自身。
Linux、OpenWrt、Synology DSM、FreeBSD、macOS:
curl -fsSL https://raw.githubusercontent.com/gg949/cfsm-agent/main/install.sh | sh -s -- uninstall
普通用户执行卸载只清理当前用户的 ~/.cf-probe/、支持 systemd --user 的 Linux 用户服务或 macOS LaunchAgent 自启动项;Synology DSM、OpenWrt、Alpine/OpenRC 以及其他系统级安装请使用 root 权限卸载。root 执行卸载清理系统级安装。macOS root 卸载会同时清理 sudo 调用者对应的用户版安装;旧 root/system 版请先执行 sudo /usr/local/bin/cf-probe uninstall 清理,再以普通用户安装。
Windows 请使用管理员权限打开 PowerShell:
$script = "$env:TEMP\install-cf-probe.ps1"
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/gg949/cfsm-agent/main/install.ps1" -OutFile $script -UseBasicParsing
PowerShell -ExecutionPolicy Bypass -File $script uninstall
卸载会清理当前 Go 版默认安装创建的固定位置和自启动项,不处理旧脚本或手动放置到其他路径的文件。
Docker 安装
适合 Unraid、群晖 Container Manager、Portainer 等 Docker 环境(不需要 systemd)。镜像:ghcr.io/gg949/cfsm-agent(支持 amd64 / arm64)。
docker run -d \
--name cf-probe \
--restart unless-stopped \
-e SERVER_ID=<服务器ID> \
-e SECRET=<服务器密钥> \
-e WORKER_URL=https://<面板地址>/update \
-v /opt/cf-probe:/etc/cf-probe \
ghcr.io/gg949/cfsm-agent:latest
三项环境变量必填(面板「服务器」页添加服务器后获取);可选变量、数据持久化、升级方式与 Unraid 模板要点见 docker.md。
容器图标(Unraid / 1Panel / Portainer)
Docker 管理面板里容器默认显示灰色问号,可手动指定 Icon URL 换成项目图标:
| 图标 | Icon URL |
|---|---|
| 🛡️ ProbeDeck 盾牌(默认) | https://raw.githubusercontent.com/gg949/cfsm-agent/main/docker/icon.png |
| 🐳 Docker 鲸鱼(备选) | https://raw.githubusercontent.com/gg949/cfsm-agent/main/docker/icon-docker.png |
Unraid:Docker 页 → 点 cf-probe 容器 → Icon URL 填上表地址 → Apply。
1Panel:容器 → 编辑 → 图标 URL。Portainer:容器编辑界面的图标字段。
图标只影响 Docker 管理面板里的容器列表显示,与面板网站的 favicon 无关。
上报数据说明
Agent 优先使用 WebSocket 上报,并保留旧版 POST fallback。配置中的 WORKER_URL 仍填写 HTTP(S) 上报地址,例如 https://example.com/update;Agent 会把 https:// 转为 wss://、把 http:// 转为 ws://,路径和查询参数保持不变。WebSocket 握手使用标准 GET + Upgrade。
WSS 建连成功后,Agent 会等待服务端 hello:
{ "type": "hello", "ts": 1720000000000, "protocol": "update" }
第一条有效 WSS 上报发送的就是旧 POST body,不改变 payload 结构;后续同一连接内也继续发送相同结构。旧版接收端仍可按 REPORT_INTERVAL 接收 POST fallback,Content-Type 为 application/json。为了兼容旧版接收端,metrics 内大多数基础指标仍以字符串上报;新增的 disk 磁盘 IO 对象使用数值类型。
WSS 可用且 CONNECTION_MODE=auto 时,Agent 使用服务端配置的 WSS_REPORT_INTERVAL 发送实时上报,默认 2 秒,可配置为 1-5 秒;当 COLLECT_INTERVAL=0 或大于该值时,实际采样间隔同步使用 WSS_REPORT_INTERVAL。服务端 ack 可通过 nextWssReportAfterMs 动态调整下一次 WSS 上报间隔,前端有实时订阅时使用该配置值;无前端访问时改用 REPORT_INTERVAL,但最低为 60 秒。CONNECTION_MODE=http 时不启动 WSS,只按 REPORT_INTERVAL 走 POST /update。服务端 /update WSS 使用 Durable Object 标准 WebSocket API 接收 Agent 上报,让高频业务帧按 WebSocket incoming messages 口径计量;代价是 Agent 长连接存在时 DO 会保持非休眠状态并产生 duration(GB-s)。Agent 不根据服务端 D1 写入节流丢弃实时样本,持久化频率由服务端按 server.report_interval 控制。WSS 高频发送只刷新 CPU、内存、网卡累计流量和网速这些轻量实时字段;磁盘容量、磁盘 IO、GPU、进程数、连接数、月流量文件统计等完整指标仍按 REPORT_INTERVAL 或原有探测周期刷新,并在 WSS 实时包中复用最近一次缓存值。WSS 不可用时才 fallback 到 POST;WSS 写失败会立即尝试一次 POST fallback,后续 POST 失败重试按 REPORT_INTERVAL 限流,避免弱网时打爆服务端。WSS 握手整体受 10 秒 deadline 约束,连接建立后如果超过当前 WSS 上报间隔加 15 秒仍未收到服务端帧,会主动关闭连接并触发兜底流程。普通 WSS 网络错误使用指数退避重连,最小 60 秒、最大 5 分钟;认证或配置类错误(HTTP 401/403/404、WebSocket close code 1008、服务端 error 帧)会同时暂停 WSS 和 POST fallback 120 秒,避免持续消耗服务端额度。WSS 时段关闭是例外:服务端会返回 409 和 wss_schedule_inactive,Agent 临时改用 POST,不写入本地 CONNECTION_MODE,并在后续正常 POST 响应提示 X-Agent-Wss-Mode: active 时立即恢复 WSS。该能力要求 Agent v1.0.10+。相关日志会明确使用 WSS connected、WSS ack、WSS error、WSS retry delayed、POST fallback delayed 等关键字区分状态。
服务端 ack 示例:
{ "type": "ack", "ts": 1720000000000, "persisted": false, "nextD1WriteAfterMs": 30000, "nextWssReportAfterMs": 60000 }
收到 ack 后 Agent 继续下一轮采集/发送;persisted=false 表示服务端未执行持久化写入,Agent 不会因此重试。服务端 error 示例:
{ "type": "error", "ts": 1720000000000, "error": "unauthorized", "code": 401 }
收到 error 后 Agent 会立即关闭当前 WSS,并暂停 WSS 和 POST fallback 120 秒后再重试。
WSS 也支持服务端下发动态配置,配置内容复用旧 POST 响应里的 query-string body;Agent 侧最短每 1 分钟处理一次 WSS 配置下发,服务端不需要在每个 ack 中都携带配置。configMd5 可选,带上时会按旧 X-Agent-Config-Md5 逻辑更新本地配置版本;不带时 Agent 会按配置字段是否变化决定是否写入本地配置。
{
"type": "config",
"body": "collect_interval=2&report_interval=60&reset_day=1&schema_version=6&interface=&connection_mode=auto&wss_report_interval=2&ping_mode=tcp"
}
也可以把配置放在 payload 对象中:
{
"type": "config",
"payload": {
"collect_interval": 2,
"report_interval": 60,
"reset_day": 1,
"schema_version": 6,
"interface": "",
"connection_mode": "auto",
"wss_report_interval": 2,
"ping_mode": "tcp"
}
}
完整上报结构如下:
{
"id": "SERVER_ID",
"secret": "SECRET",
"time": {
"local_ts": 1754300060123,
"accurate_ts": 1754300060000,
"offset_ms": -123,
"source": "date",
"round_trip_ms": 18,
"sample_age_ms": 29982
},
"metrics": {
"cpu": "0.00",
"ram_total": "0",
"ram_used": "0",
"swap_total": "0",
"swap_used": "0",
"disk_total": "0",
"disk_used": "0",
"disk": {
"read_bps": 0,
"write_bps": 0,
"read_iops": 0,
"write_iops": 0,
"await_ms": 0,
"util": 0
},
"load_avg": "0 0 0",
"boot_time": "0",
"net_rx": "0",
"net_tx": "0",
"net_rx_monthly": "0",
"net_tx_monthly": "0",
"net_in_speed": "0",
"net_out_speed": "0",
"os": "Linux",
"arch": "amd64",
"kernel_version": "",
"cpu_info": "",
"cpu_cores": "0",
"gpu_info": null,
"processes": "0",
"tcp_conn": "0",
"udp_conn": "0",
"ip_v4": "0",
"ip_v6": "0",
"ping_ct": false,
"ping_cu": false,
"ping_cm": false,
"ping_bd": false,
"loss_ct": false,
"loss_cu": false,
"loss_cm": false,
"loss_bd": false
},
"collect_interval": 0,
"report_interval": 60
}
当 COLLECT_INTERVAL > 0 时,上报体会额外包含 samples。samples 中只包含高频采样需要的轻量字段,不包含磁盘 IO:
{
"samples": [
{
"ts": 1720000000000,
"metrics": {
"cpu": "0.00",
"ram_total": "0",
"ram_used": "0",
"swap_total": "0",
"swap_used": "0",
"net_in_speed": "0",
"net_out_speed": "0"
}
}
]
}
顶层字段:
| 字段 | 类型 | 说明 |
|---|---|---|
id |
string | 服务器 ID,对应本地 SERVER_ID |
secret |
string | 服务器密钥,对应本地 SECRET |
time |
object | 本机墙钟与独立时间校准状态;字段见下表 |
metrics |
object | 当前上报周期的完整监控指标 |
samples |
array | 可选,仅 COLLECT_INTERVAL > 0 时存在 |
collect_interval |
number | 高频采样间隔,单位秒;0 表示不启用高频采样 |
report_interval |
number | 上报间隔,单位秒 |
config_schema |
string | 动态配置协议版本,当前为 6;WSS 建连 query、首次上报、约每 60 秒或 MD5 变化时携带 |
config_md5 |
string | 本地保存的远端配置 MD5;首次或为空时为 none,WSS 建连 query 与消息字段携带,POST 保留 X-Agent-Config-Md5 Header |
time 字段:
| 字段 | 类型 | 说明 |
|---|---|---|
local_ts |
number | 本次组包时的本机 Unix 毫秒墙钟 |
accurate_ts |
number/null | 根据最近一次 服务端响应头 Date 时间样本,以单调时钟推算的 Unix 毫秒时间;首次校准前为 null |
offset_ms |
number/null | accurate_ts - local_ts;正数表示本机慢,负数表示本机快 |
source |
string/null | 成功校准后为 date |
round_trip_ms |
number/null | 最近一次成功校准请求的往返耗时 |
sample_age_ms |
number/null | 最近校准样本到本次组包的单调时钟年龄 |
Agent 只使用 服务端成功 HTTP 响应里的 Date 头做时间校准,包括 POST 响应和 WSS 握手响应。响应头示例:Date: Thu, 13 Aug 2026 00:23:22 GMT。Agent 会按该格式解析为 Unix 毫秒时间戳,并结合本次请求 RTT 锚定到单调时钟。若新 Date 样本与当前已校准时间的差值在 20 秒内,则跳过更新;首次校准、校准过期或差值超过 20 秒时才覆盖。校准样本最长使用 24 小时。上报前会用同一锚点换算 samples[].ts,并校正 metrics.boot_time。Agent 不修改系统时间。
metrics 字段:
| 字段 | 类型 | 单位/取值 | 说明 |
|---|---|---|---|
cpu |
string | % |
CPU 使用率,保留 2 位小数 |
ram_total |
string | MiB | 物理内存总量 |
ram_used |
string | MiB | 物理内存已用量 |
swap_total |
string | MiB | Swap 总量;不支持的平台为 0 |
swap_used |
string | MiB | Swap 已用量;不支持的平台为 0 |
disk_total |
string | MiB | 过滤并去重后的本地磁盘总容量 |
disk_used |
string | MiB | 过滤并去重后的本地磁盘已用容量 |
disk |
object | 见下表 | 磁盘总 IO 信息,采样频率跟随 REPORT_INTERVAL |
load_avg |
string | 1m 5m 15m |
系统负载;Windows 为 0 0 0 |
boot_time |
string | ms | 系统启动时间,Unix 毫秒时间戳 |
net_rx |
string | bytes | 当前网卡累计接收字节数 |
net_tx |
string | bytes | 当前网卡累计发送字节数 |
net_rx_monthly |
string | bytes | 当前统计周期内累计下行流量 |
net_tx_monthly |
string | bytes | 当前统计周期内累计上行流量 |
net_in_speed |
string | bytes/s | 上报周期内平均下行速度 |
net_out_speed |
string | bytes/s | 上报周期内平均上行速度 |
os |
string | - | 操作系统名称 |
arch |
string | - | CPU 架构 |
kernel_version |
string | - | 内核或系统版本 |
cpu_info |
string | - | CPU 型号或架构兜底值 |
cpu_cores |
string | count | CPU 逻辑核心数 |
gpu_info |
array/null | - | GPU 信息数组;不可获取时为 null |
processes |
string | count | 进程数量 |
tcp_conn |
string | count | TCP 已建立连接数 |
udp_conn |
string | count | UDP 连接或端点数量 |
ip_v4 |
string | IP/0 |
Cloudflare trace 获取到的 IPv4 |
ip_v6 |
string | IP/0 |
Cloudflare trace 获取到的 IPv6 |
ping_ct / ping_cu / ping_cm / ping_bgp |
string/boolean | ms/false/"null" |
电信、联通、移动、BGP 节点探测 RTT;节点未配置为 false,探测失败为字符串 "null" |
loss_ct / loss_cu / loss_cm / loss_bd |
string/boolean | %/false |
对应探测丢包率;节点未配置为 false |
disk 字段:
| 字段 | 类型 | 单位 | 说明 |
|---|---|---|---|
read_bps |
number | bytes/s | 上报周期内平均读取速率 |
write_bps |
number | bytes/s | 上报周期内平均写入速率 |
read_iops |
number | ops/s | 上报周期内平均读 IOPS |
write_iops |
number | ops/s | 上报周期内平均写 IOPS |
await_ms |
number | ms | 读写请求平均等待时间 |
util |
number | % |
过滤后磁盘集合的平均繁忙度,范围 0-100 |
Linux 下磁盘 IO 使用 /proc/diskstats 计算,并复用磁盘容量统计的过滤和去重规则;Windows、macOS、FreeBSD 以及其他平台暂不上报复杂磁盘 IO,字段保留为 0。
gpu_info 数组元素结构如下:
| 字段 | 类型 | 说明 |
|---|---|---|
name |
string | GPU 名称 |
info |
number/null | GPU 使用率或平台兜底值 |
id |
string | GPU 序号或平台标识 |
POST fallback 会携带以下 HTTP 头:
| Header | 说明 |
|---|---|
Content-Type: application/json |
请求体格式 |
Accept: */* |
接收任意响应格式 |
User-Agent: cfsm |
Agent 标识 |
X-Agent-Config-Schema |
当前配置协议版本 |
X-Agent-Version |
当前 Agent 版本 |
X-Agent-Config-Md5 |
本地保存的远端配置 MD5;为空时为 none |
WSS 握手会携带标准 WebSocket Upgrade 头,并附带以下 Agent 头:
| Header | 说明 |
|---|---|
Accept: */* |
接收任意响应格式 |
User-Agent: cfsm |
Agent 标识 |
X-Agent-Config-Schema |
当前配置协议版本 |
X-Agent-Version |
当前 Agent 版本 |
X-Agent-Config-Md5 |
本地保存的远端配置 MD5;为空时为 none |
当服务端下发 rx_correction 或 tx_correction 后,Agent 会额外发送一次流量校正确认:
{
"id": "SERVER_ID",
"secret": "SECRET",
"rx_correction": 0,
"tx_correction": 0
}
其中 rx_correction 和 tx_correction 为 number,单位 GB。该确认请求只携带 Content-Type、Accept 和 User-Agent 头。
从源码构建
需要 Go 1.24 或更新版本。
git clone https://github.com/gg949/cfsm-agent.git
cd cfsm-agent
go build -trimpath -ldflags "-s -w -X main.version=$(git describe --tags --always --dirty)" -o cf-probe ./cmd/cf-probe
构建后可直接安装:
./cf-probe install -id=SERVER_ID -secret=SECRET -url=WORKER_URL
前台调试运行:
./cf-probe run -config ./config.conf -debug=1
查看帮助:
./cf-probe help
致谢
- komari-agent:本项目的部分监控指标统计口径参考了该项目的实现。