跳至内容

Dashboard 与日志

AICR 内置管理后台 dashboard(可观测性统计与配置管理)和 Prometheus metrics 端点。 dashboard 的可观测性部分覆盖基础统计;有外部时序系统时两者可以互补。本页在快速上手的健康检查基础上,介绍如何启用管理员登录、导航 dashboard、读取 /metrics,以及定位 run 日志和快照。

dashboard 有独立于 webhook HMAC 和 trigger API key 的超级管理员登录。设置管理员环境变量即可启用:

.env
AICR_ADMIN_USERNAME=admin
AICR_ADMIN_PASSWORD=<强密码>
# 或改用哈希(优先级更高):
# AICR_ADMIN_PASSWORD_HASH=sha256:<hex>

对应 config(默认值已显示):

admin:
username_env: AICR_ADMIN_USERNAME
password_env: AICR_ADMIN_PASSWORD
password_hash_env: AICR_ADMIN_PASSWORD_HASH # 可选,优先级更高
session_ttl_seconds: 86400 # 字段单位是秒,不要用 minutes

配置管理员认证后,AICR 按 storage.database.kind 初始化统计库:SQLite 使用 storage.database.sqlite.path(默认 /app/data/aicr.sqlite),PostgreSQL 使用 storage.database.postgres.url_env 指定的环境变量中的 URL。统计库初始化失败时, 只要独立配置库可用,Config API 仍可提供配置管理。

浏览器标题和页面标题为 AICodeReviewer Admin。配置编辑器只显示在当前页面。 切换 Config 子页面会关闭未修改或只读面板;有未保存修改时,可放弃修改或取消切换。 切换顶层标签会隐藏编辑器并保留草稿。明文凭据使用密码输入框:不编辑即保留,输入 新值即替换,点击 Clear stored value 清除。搜索凭据条目可选择环境变量或明文值。

访问 http://<aicr-host>:8080/dashboard(或 /)。即使尚未配置管理员环境变量,该路由也会返回 dashboard 外壳并显示 setup-required 提示而不是 404;如果设置了 path_prefix,根路径会重定向到带前缀的入口。

登录后,dashboard 默认落在 Overview 标签,共七个标签:

  • Overview——落地标签:总评审次数、成功/失败/跳过次数、发现问题的 run 次数、problem 总数、创建 issue 数、分析代码量、LLM 请求数、输入/输出/总 token、prompt 缓存命中率(含命中/未命中 token 拆分)、估算成本、平均 duration。时间窗口选择器切换 today / this week / this month / all(均按 UTC)。Recent activity 表格与 Runs 标签一样展示每条 run 的总 token、缓存命中/未命中拆分与命中率,外加分支、缩写 revision 与提交时间。

  • Live——当前服务进程中正在执行的分析。卡片随屏幕宽度排列,展示 worker 槽位、run ID、任务标题、attempt、workspace/trigger/repo、分支和 revision(git 短 sha、SVN r<N>、P4 CL <N>,悬停显示完整 revision)、提交时间、model 与 agent、phase(preparing → analyzing → publishing)、开始时间及耗时。指标包括输入/输出 token、缓存命中/未命中/写入量、命中率、LLM 请求数、重试/fallback 次数、估算成本及用量更新时间;usage 缺失时单独显示 ~N est. prompt。worker 编号代表本进程的活动分析槽位,任务结束后可复用。Kilo/OpenCode 和 pi/oh-my-pi 每完成一个模型回合便更新用量,其他 agent 和直连 LLM 在调用结束时更新。执行结束或服务重启后条目消失。Refresh 手动刷新;自动刷新默认 Off (manual),可选前次请求结束后每 5/15/30/60 秒刷新。离开 Live 或隐藏浏览器页面时暂停,退出登录恢复手动模式;刷新失败时保留的快照标为过期。

  • Projects——按 project 聚合(workspaceId + triggerName + repoRef):评审/成功/失败/跳过次数、problem 总数、创建 issue 数、变更文件数、增删行数、LLM 请求数、token、缓存命中 token 与命中率、成本、平均 duration。软删除的 project 在宽限期内仍可见,并用 isActive 标记。

  • Providers——按 provider+model 聚合:请求数、输入/输出 token、缓存命中 token 与命中率、成本、重试/fallback/失败次数、平均延迟。

  • Runs——保留范围内的运行记录,每页从服务端取 20 条,用 Prev/Next 翻页。每行展示真实 token 用量:总 token、命中/未命中输入拆分与命中率;run 未上报可解析 usage 时显示 —。Revision 列展示分支、缩写 revision,以及 VCS adapter 解析成功时的提交时间。

  • Events——保留范围内的 webhook/trigger 事件,每页从服务端取 20 条。每行展示接收时刻的处理决定:executed(已接受执行)、queued/duplicate(auto-commit 回执)、deferred(执行窗口延期,含计划恢复时刻)、deduplicated(合并进待重审)、ignored(label 忽略、不支持的事件、仓库未配置)或 rejected(签名无效、payload 非法、触发器未配置),以及原因和细节(命中的 label、回执 id 等)。

  • Config——数据库配置、字段来源、路由预览与版本历史。启用 config_sources.database.enabled 后可使用配置管理。

Events 将 queued 显示为 queued at receipt(接收时已入队),executed 显示为 execution accepted(已接受执行),deferred 显示为 deferred at receipt (接收时延期),均使用中性色徽标。API 保留原始决定值;批次完成后,接收记录仍可能是 queued,执行过程不会更新这项接收决定。Queue 展示当前批次状态,Live 展示活动分析快照。 管理端批次 API 在发布待完成时提供逐渠道 publications 回执。有效载荷恢复会跳过分析与已确认 渠道,保留原模型用量与费用;部分或结果不确定的写入在重试时可能重复。旧版无载荷或超限 检查点会整体重放,损坏的恢复数据会停止执行。回执 attempts 统计执行器尝试次数,不是 HTTP 请求数;完成后的检查点只保留本地记账结果。 比较当前任务数量前,先刷新 Live 或开启自动刷新。 评审结果写入后才会出现在 Recent Runs。若长期没有新记录,应检查所配置 auto-commit 存储中的 receipt 成员、batch 和 stream 状态,包括执行时段和重试时间。无法读取的固定 配置快照可能阻止 receipt 展开。健康检查或旧的接收决定本身不能证明队列正在推进。

用量按完整 review run 聚合,包括首次模型调用、上下文/格式修复调用以及最终直连 LLM 兜底。 对 Kilo 而言,每个 step_finish 模型回合计为一次请求。本地 prompt 大小估算单独保存,只有拿不到 真实 usage 时才作为参考显示,绝不会混入 provider token 总数。

缓存命中 token 已含在输入总量内:命中率 = 命中 token / 输入 token,未命中输入 = 输入 - 命中 - 缓存写入 token。provider 尚未上报非零输入的 usage 时命中率显示 —。

Projects 和 Providers 标签各自调用带时间窗口的 API (GET /api/admin/stats/projects?since= 和 .../providers?since=)。Runs 标签通过 GET /api/admin/runs?limit=20&page=1 服务端分页,Events 和 Queue 使用相同分页规则。 Recent Runs / Events 默认各保留最近 2000 条,Queue 保留最近 1000 条终态批次, 最长均为 6 个日历月。数量和时长分别通过 storage.retention 配置; 清理保留汇总统计,并保护 Queue 中的活动和待重试任务。Live 标签轮询 GET /api/admin/runs/live,读取当前进程的内存注册表。已结束的 run 可在 Recent Runs 的保留范围内查询。dashboard 以实时聚合为真源。

分支随 webhook 事件携带,实际分析的 head revision 和 VCS 类型来自 adapter 解析的范围和类型。 提交时间由 VCS adapter 在 scoped fetch 后尽力解析(git log / svn log / p4 describe): Git 取 committer date,SVN 取 svn:date,P4 仅对 submitted changelist 展示提交时间。 时间按浏览器本地时区显示。无法解析的提交时间显示 —;旧记录或未知 VCS 类型保留完整 revision,不按字符串形状猜测 hash 格式。

Config 编辑器的 JavaScript 在首次打开时加载,各配置页分别请求自己的记录、字段值与 引用选项。供应商预设、内置模板、内置 Prompt 和周计划模块在对应页面需要时加载;通用 表单模块与导航 schema 共享。整页读取的 revision 与文件摘要一致后才更新缓存,遇到 修订变化自动整页重试一次。加载失败可点击 Retry,切页后忽略上一页的迟到响应。 新修订清理未修改的表单会话,未保存草稿保留原始冲突基线。

在 Config 中编辑 provider、模型组、trigger、channel、路由、workspace 和全局设置。 文件值只读,Copy as new database config 需要填写不同的名称。数据库配置补充文件的 显式配置。同名 shadowed 数据库记录可以删除;要改变有效值需修改其文件来源。 agent、review、queue.workers|rate_limit|retry|dead_letter 前缀例外:数据库值 优先于文件值,对应页面(Agent、Review、Queue)保持可编辑,并可用 Reset database overrides 清除数据库覆盖、回落到文件或默认值。 Queue 的预留字段(workers.lock_ttl_seconds、dead_letter.*)没有运行时消费者, 仍保持只读。重置也会丢弃当前页未保存的编辑;revision 冲突时展示最新数据库值再重试。 Queue 的预留字段(workers.lock_ttl_seconds、dead_letter.*)没有运行时消费者, 仍保持只读。重置也会丢弃当前页未保存的编辑;revision 冲突时展示最新数据库值再重试。 凭据控件只接受已授权的环境变量名。历史值被脱敏时,保存前需要替换或清除占位符。

Templates 和 Prompts 页管理命名模板(outputs.templates)与 system prompt (prompts.system)文档:markdown 正文即运行时内容,可选 frontmatter 仅作界面元数据。 页面下方列出只读的内置资产(各 channel kind 的内置 problem/summary 模板与内置基底 prompt),点击 Copy as new database config 以正文为草稿新建数据库配置。 channel 的 templates.{problem,summary} 和 workspace 的 prompt.system_prompt/prompt.extra_system_prompt 通过下拉引用这些名称。 文档文本原样保存和读取,包括 URL 片段、凭据格式示例及以 _env 结尾的名称。 预览和版本历史包含这些实体。删除或禁用被引用的文档前需清除引用, 也可把引用清理和文档删除放入同一次暂存发布。 文档文本原样保存和读取,包括 URL 片段、凭据格式示例及以 _env 结尾的名称。 预览和版本历史包含这些实体。删除或禁用被引用的文档前需清除引用, 也可把引用清理和文档删除放入同一次暂存发布。

新建 provider 时可从 Platform preset 选择国内常见平台(Kimi For Coding、Kimi 开放平台、智谱、Z.AI、阿里云百炼、腾讯云、DeepSeek),一键预填端点、协议 (OpenAI 兼容或 Anthropic 兼容)和目录映射;预设只预填草稿,保存前仍可修改。 各平台端点与套餐注意事项见 LLM 提供方与模型。

单条记录使用 Save,全局设置使用 Save page changes。关联修改可在各页面分别 点击 Stage changes 或 Stage page changes,最后点击 Publish staged changes。 例如先暂存 provider,再在新模型组中选择它,一次发布两者。暂存修改共享同一 revision, 只保存在浏览器内存,刷新页面会丢弃。

重新打开已暂存的记录或页面可继续编辑草稿。再次暂存会保留前面的修改;把字段恢复为 已发布值会撤回该字段的修改。Discard staged changes 同时清除对应编辑器草稿。

Routing 的 Preview 包含已暂存修改且不发布;打开的编辑需先暂存。 Workspace 路径补全以 {{ 开始,插入 segment 表达式,为可空变量添加 default; 发布前请选择适合的兜底值。周计划可设置多个星期和时间窗口。

保存成功后显示 revision。冲突保留草稿,提供差异比较后再决定是否重试。 响应丢失时先检查操作状态,Resubmit 重试原请求。 Stored, activation pending 表示已持久化但尚未激活,确认该状态后再提交其他编辑。 Versions → Restore 创建新 revision,继续执行文件锁与引用校验。 新接收的任务使用已发布版本,已接收的任务保留原配置。

提交事件的 not before 表示首次接收延迟和执行窗口共同决定的最早可执行时间, 已有任务仍可能让实际开始时间更晚。

除 /login 外所有端点都需要 Authorization: Bearer <token>。

端点 用途
POST /api/admin/login 校验用户名/密码,返回 session token + 过期时间
POST /api/admin/logout 撤销 session token
GET /api/admin/stats overview + today/this-week/this-month 窗口、projects、providers、最近 run
GET /api/admin/stats/projects?since= 按 project 聚合
GET /api/admin/stats/providers?since= 按 provider+model 聚合
GET /api/admin/runs?limit=&page= 保留的 run 列表(limit 1..100、page 从 1 开始),含 token 用量、缓存拆分与 VCS stamp;带 page 返回 {items,page,hasMore},否则返回数组
GET /api/admin/runs/live 进程内注册表中正在执行的分析:phase、开始时间、累计 token/请求数/成本
GET /api/admin/events?limit=&page= 相同分页规则的事件日志,含接收时刻的处理决定与原因
GET /api/admin/config 配置外壳:head、fileDigest、来源信息与各集合记录数
GET /api/admin/config/collections/:kind 单集合记录,按 limit/offset 分页
GET /api/admin/config/fields、/globals 按页面/前缀的字段值与 globals 子树;脱敏保留完整路径的规则
GET /api/admin/config/builtin-assets?kind=templates|prompts、/provider-presets 单页内置文档或供应商预设
GET /api/admin/config/schema、/options/:source 表单描述和动态选项
POST /api/admin/config/changesets 携带 baseRevision、fileDigest、operationId、operations 原子发布
POST /api/admin/config/preview-route 只读事件预览;可选 draft 携带 baseRevision、fileDigest、operations
POST /api/admin/config/validate 无副作用的 changeset 校验;返回脱敏后的预览报告,不写入
GET /api/admin/config/revisions/:revision 单个 revision 的文档及其审计条目
POST /api/admin/config/revisions/:revision/restore 以旧版本为准发布新 revision;需要 fileDigest,保留文件锁与引用校验
GET /api/admin/config/operations/:id、/revisions、/status 操作恢复、版本历史和激活状态

/metrics 暴露低基数、进程生命周期的 Prometheus 计数器和直方图,覆盖同步和异步 review run。高基数查询(按 project、按 provider)属于 dashboard 背后的 SQLite store,不属于 /metrics。直方图 bucket、sum、count 按进程生命周期累计;仅原始 duration 样本做滑动窗口裁剪。

dashboard 只保存运行和用量元数据——绝不保存 prompt、完整 diff、secret 或未脱敏输出。

按 run 的产物位于 workspace 目录下:

workspaces/<workspace_id>/runs/<run_id>/run.json

run.json 是某次 run 的审计快照:target/workspace、provider/model、triggerName、产出与错误摘要、解析到的 model-catalog 来源、token 估算和分派计数。该 run 物化的 agent 运行时 bundle 位于 workspaces/<workspace_id>/agent/(instructions、技能、MCP 配置、manifest.json、.aicr-output-state.json)。

服务级日志进入 aicr-logs 卷(容器内 /app/logs);用 docker compose logs -f 或你的容器运行时日志驱动查看。