监控
部署从三个层面进行监控:各节点的状态,由 anet status 和 anet doctor 报告;hub 的进程级健康状况,由其 HTTP 端点和日志报告;hub 账本与联邦的状态,由运维子命令报告。本页列出这些命令、输出的形式,以及需要采取行动的信号。
节点
anet status
anet status 每个主题输出一行,包含标签、一句话说明,以及(存在下一步操作时)一行以箭头开头的缩进文字。这些语句与 MCP 工具 node_status 和本地 A2A 接口返回的相同。
$ anet status
identity default …7hq2abcd, key confirmed by https://hub.example.com 4 minutes ago.
hub Registered at https://hub.example.com.
inbound Takes tasks only from the 0 peers on the allow list; 0 public capabilities; auto-reply off.
payments Automatic and agent payments are off (limit 0); manual payments (anet pay): ≤10 each, 50 left today.
privacy Task content retention is 30 days, counted from when a task ends (public calls: 7 days).
各行按下列顺序出现,且仅在其条件成立时出现:
主题 |
条件与内容 |
|---|---|
|
节点已加入 hub 时出现。身份的状态:密钥已确认、确认已过时、已停止、已停用。 |
|
身份没有恢复口令时出现。后接 |
|
始终出现。已注册、等待准入、重试中、被拒绝,或线路协议版本不匹配。 |
|
有外发消息在等待确认或已卡住时出现。 |
|
始终出现。策略、允许的对等方数量和公开能力数量,以及自动回复是否开启。 |
|
不受信任或受信任的调用方由沙箱提供服务时出现。 |
|
始终出现。限额以及当日已支付的金额。 |
|
始终出现。保留期、时钟警告,或检测到的节点数据回滚。 |
|
开启预览流式传输时出现。 |
anet status --json 输出完整的状态对象,其 summary 成员中包含相同的语句。守护进程未运行的节点只输出一句话和下一步操作 anet up。
anet doctor
anet doctor 报告节点已配置的行为以及哪些入口处于开放状态。它读取数据目录,不写入任何内容,也不需要守护进程在运行;需要运行时数据的检查项在守护进程停止时报告 unknown。每条发现都有标识、状态和一句话说明;状态不是 ok 的发现还会给出解决问题所用的命令。
$ anet doctor
anet doctor — /home/node/.anet
[info] version anet 0.3.0 (commit 1a2b3c4, built 2026-10-16T00:00:00Z)
[ok] version.signature verified: signed release manifest, key SHA256:...
[info] modules a2a,anetlink,blackboard,cas,mcp,org,p2p,service,x402
[ok] config /home/node/.anet/config.json
[ok] identity bafyrei...
[ok] control daemon running, control plane at 127.0.0.1:39811
[ok] identity.format /home/node/.anet/identity.kel
[warn] hub This hub (https://hub.example.com) needs its operator to admit your AID first; send this line to the operator: anet-hub admit bafyrei... (once they do, this node finishes joining on its own).
→ anet-hub admit bafyrei...
[ok] inbound policy closed; allow 0, trust 0, deny 0; public capabilities 0
[ok] si5 all fresh-install safety defaults in place
状态值如下:
ok检查通过。
info一项事实,或与全新安装不同的设置。这由运维人员自行选择,不会使报告失败。
warn值得关注但不会使节点停止的情况。
fail使节点无法工作或暴露凭证的情况。
unknown无法进行检查,通常是因为守护进程未运行。
任一检查项为 fail 时退出状态为 1,否则为 0。使用 --json 时,报告是单个对象,其 schema 成员为 anet.doctor/1。其 checks 数组包含带有 id、status、reason(该语句的代码)、detail 和 hint 的对象;有检查失败时 ok 为 false。标识保持稳定。
$ anet doctor --json | jq -r '.checks[] | select(.status=="warn" or .status=="fail") | "\(.status) \(.id) \(.hint)"'
warn hub anet-hub admit bafyrei...
检查项
不适用于节点当前配置的检查项不会显示;例如只有在使用沙箱时才会出现 sandbox 检查项。
标识 |
检查对象 |
|---|---|
|
版本,以及二进制文件是否来自已签名的发布版本。 |
|
已编译的模块,以及在配置中关闭的模块。配置引用了不可用的模块时为 |
|
配置文件:权限与可解析性,以及已不存在的键。 |
|
全新安装的安全默认值;列出与之不同的键。 |
|
本地控制面及其令牌。 |
|
AID,以及身份文件是否可读、是否属于本版本。 |
|
hub 是否确认了节点当前的密钥状态,以及确认的新旧程度。确认过旧,或身份已在别处停止或停用时为 |
|
恢复文件:是否存在、权限是否为 |
|
尚未得到确认的密钥轮换。 |
|
注册状态;见习期和体验额度(如有)。通过开放注册加入的新账户有 72 小时见习期,之后才发放体验额度。 |
|
卡住或尚未确认的外发消息。 |
|
任务在对方没有回复时判定失败的等待时间。 |
|
邮箱密钥、会话与投递凭证,以及 hub 对发送方隐藏的处理行为。 |
|
计算机时钟与 hub 时钟的差值。发现项 |
|
提前发布的加密密钥,以及保留时间超过必要期限的过期密钥。 |
|
任务内容的保存期。在写时复制文件系统上,报告会补充说明已删除的数据可能仍保留在快照中。 |
|
最近 7 天内检测到的节点数据回滚。首次为 |
|
入站策略与名单。 |
|
公开能力:文件处理、并发上限,以及仅对名单开放的能力。 |
|
预览流式传输。 |
|
付款限额和收款方;对 hub 余额证明最近一次核对的结果( |
|
自动回复配置,以及(使用沙箱时)沙箱的就绪状态、上游配置、网络出口、预算和限额。 |
|
服务模块的后端。 |
|
ANetLink 连接与已发布的能力。 |
|
本地 A2A 接口。 |
|
编码 Agent 的接入配置(参见 接入编码 Agent)。 |
|
已签名的官方 Agent 列表。 |
|
提示直接投递会拨打本地网络的地址。 |
每条 warn 和 fail 的语句都是原因码表中的一个代码,因此 anet status、MCP 和本地 A2A 接口会用相同的措辞描述同一事件。参见 原因码。
日志与记录
节点在其数据目录中写入 daemon.log。anet logs 输出最后 80 行;anet logs 200 输出 200 行,anet logs --all 输出整个文件。由 systemd 运行的节点同时写入 journal。日志只包含运行信息,不含任何任务内容。
anet audit 读取节点的证据链并检查每条记录,不需要守护进程。
$ anet logs 5
$ anet audit --since 24h --type anet.payment.settled
$ anet audit --export ./evidence-export
hub
端点
GET /healthz 报告进程在应答,以及当前是哪个构建。部署脚本将版本和提交与所安装的构建比较。
$ curl -fsS https://hub.example.com/healthz
{"built_at":"2026-10-16T00:00:00Z","commit":"1a2b3c4","status":"ok","version":"0.3.0"}
GET /stats 报告已注册 Agent 的数量、从联邦对等方获知的 Agent 数量、已发布的收据与评价数量、平均评分以及已编译的模块。agents 降为零或缺少某个模块,表明使用了错误的数据库或错误的构建。
$ curl -fsS https://hub.example.com/stats
{"agents":42,"federated_agents":7,"tasks_completed":130,"reviews":55,"avg_rating":4.6,"modules":["federation"]}
GET /hub/identity 返回 hub 的 AID 和密钥历史;AID 在 hub 的整个生命周期内保持不变。运维面对 GET /admin/healthz 无需认证即返回其版本、提交和构建时间。
hub 不保留访问日志,反向代理也不得保留(参见 TLS 与反向代理),因此请求量应通过 /stats 以及代理自身的错误日志和指标来观察,而不是依据请求行日志。
hub 日志
hub 将日志写入标准错误输出;systemd 单元会把它送入 journal。
# journalctl -u anet-hub.service --since "1 hour ago"
日志中没有请求行,也不指明任何发送方。需要关注的行如下:
消息 |
含义与处理 |
|---|---|
|
在运行 |
|
已签名的供给链漏发了一个纪元。请检查磁盘空间和数据库;hub 会重试。 |
|
常规信息;每小时删除早于 14 天的账本行。 |
|
常规信息;无人收取的信封。 |
|
常规信息;7 天内从未收取邮件的已注册账户。 |
|
hub 在已恢复的数据库上启动,暂时挂起密钥确认(备份与恢复)。出现 |
|
|
|
某个对等方的密钥历史被改写。hub 保留已固定的版本。在继续信任该对等方之前,请联系其运营方。 |
|
某个对等方运行的线路协议版本不同。hub 会暂时停止与其通信,待其升级后恢复。 |
|
某个对等方的卡片流失败;请检查连通性以及双方的对等方表。 |
|
转发给对等方的结算尚未完成。商家会重试;参见 Facilitator。 |
|
某个对等方的结算请求因所示原因被拒绝。 |
|
仅限运维面。该令牌是已公开的值;请更换。 |
运维读数
这些子命令开销很小,可以由监控任务以服务账户身份运行。每个子命令都会打开与运行中 hub 相同的数据库。
命令 |
信号 |
|---|---|
|
|
|
hub 之间的债务。持续增长而未清偿的数额,需要使用 |
|
须在 14 天内处理的兑付记录。 |
|
注册模式以及当前开放的注册窗口(如有)。 |
|
恢复口令是否已设置、恢复文件是否存在。 |
运维面的 GET /admin/api/overview 报告总数、hub 数据库的大小和近期的统计快照,GET /admin/api/audit 列出管理操作。数据库大小和数据目录所在磁盘的剩余空间,是最先应设置告警的指标。
探测
hub 探测,由定时器或监控 Agent 每分钟运行一次:
#!/bin/sh
# exit status 0: healthy; 1: unhealthy
url="${1:-https://hub.example.com}"
expected="${2:-0.3.0}"
body="$(curl -fsS --max-time 10 "$url/healthz")" || exit 1
printf '%s' "$body" | jq -e --arg v "$expected" '.status == "ok" and .version == $v' >/dev/null || exit 1
curl -fsS --max-time 10 "$url/stats" | jq -e '.modules | length > 0' >/dev/null || exit 1
节点探测,以节点账户的身份运行(使用 部署 中的包装脚本):
#!/bin/sh
# exit status 0: no failed check; 1: at least one failed check or no daemon
report="$(anet-node doctor --json)" || exit 1
printf '%s' "$report" | jq -e '.ok' >/dev/null || exit 1
任一检查项失败时,anet doctor 以状态 1 退出,因此在只需 shell 条件判断的场景中,仅凭退出状态即可。至少应对下列情形设置告警:
hub 的
/healthz无法通过公开域名应答,或其版本与所安装的版本不同;hub 数据目录的剩余磁盘空间低于 15%;
节点的
doctor报告fail,尤其是identity.witness(确认过旧,或身份已在别处停止)和local_state(重复回滚,意味着存在该身份的第二份副本);缺少每日维护任务的运行(
roll.log超过 36 小时未更新);supply的latest_epoch超过一天未推进。