dashboard-metrics.md 7.22 KB

WeChat Viewer Dashboard Metrics

数据看板指标定义文档。每个模块列出指标名称、数据来源、SQL 查询。 生成时间: 2026-07-11 | 验证: ✅ 所有 SQL 在 circle.db 上可执行


1. 聊天数据 (Chats)

数据源: WeChat SQLCipher DB (message 表) + 本地 circle.db

# 指标 数据源 SQL / 来源
1.1 群聊数量 WeChat DB SELECT COUNT(DISTINCT talker) FROM message WHERE talker LIKE '%@chatroom'
1.2 总消息数 WeChat DB SELECT COUNT(*) FROM message
1.3 发言人数 WeChat DB SELECT COUNT(DISTINCT talker) FROM message
1.4 分享文章数 Local DB SELECT COUNT(*) FROM article_shares
1.5 图片分析数 Local DB SELECT COUNT(*) FROM image_analysis
1.6 群聊摘要数 Local DB SELECT COUNT(*) FROM chat_summaries

备注: 指标 1.1-1.3 需要 WeChat DB 连接 (SQLCipher),需要 root/解密。如果 WeChat DB 不可用,只展示 1.4-1.6。


2. 文章数据 (Articles)

数据源: circle.db (articles, article_shares, daily_reports)

# 指标 SQL
2.1 总文章数 SELECT COUNT(*) FROM articles
2.2 已摘要 SELECT COUNT(DISTINCT article_url) FROM daily_reports WHERE report_date='summary' AND article_url IS NOT NULL
2.3 未摘要 2.1 - 2.2
2.4 已学习 SELECT COUNT(DISTINCT article_url) FROM daily_reports WHERE report_date='learn' AND article_url IS NOT NULL
2.5 未学习 2.1 - 2.4
2.6 总分享次数 SELECT COUNT(*) FROM article_shares

3. 学习审核 (Learn)

数据源: circle.db (learn_queue, daily_reports)

# 指标 SQL
3.1 待审核 SELECT COUNT(*) FROM learn_queue WHERE status='pending_review'
3.2 已批准 SELECT COUNT(*) FROM learn_queue WHERE status='approved'
3.3 已应用 (吸收成功) SELECT COUNT(*) FROM learn_queue WHERE status='applied'
3.4 已拒绝 SELECT COUNT(*) FROM learn_queue WHERE status='rejected'
3.5 待分类摘要 SELECT COUNT(*) FROM daily_reports dr WHERE dr.report_date='summary' AND dr.dedup_key IS NOT NULL AND dr.dedup_key NOT IN (SELECT DISTINCT lq.dedup_key FROM learn_queue lq WHERE lq.dedup_key IS NOT NULL)
3.6 高分待审 (≥7) SELECT COUNT(*) FROM learn_queue WHERE score >= 7 AND status='pending_review'
3.7 已吸收 skill 数 SELECT COUNT(*) FROM learn_queue WHERE status='applied' AND learn_type='skill'
3.8 已吸收 memory 数 SELECT COUNT(*) FROM learn_queue WHERE status='applied' AND learn_type='memory'
3.9 已吸收 todo 数 SELECT COUNT(*) FROM learn_queue WHERE status='applied' AND learn_type='todo'
3.10 已吸收 reference 数 SELECT COUNT(*) FROM learn_queue WHERE status='applied' AND learn_type='reference'

4. 日报 (Reports)

数据源: circle.db (daily_reports)

# 指标 SQL
4.1 日报总数 SELECT COUNT(*) FROM daily_reports WHERE report_date NOT IN ('summary','learn')
4.2 文章摘要数 SELECT COUNT(*) FROM daily_reports WHERE report_date='summary'
4.3 学习记录数 SELECT COUNT(*) FROM daily_reports WHERE report_date='learn'
4.4 最近生成时间 SELECT created_at FROM daily_reports WHERE report_date NOT IN ('summary','learn') ORDER BY id DESC LIMIT 1
4.5 日报图片数 SELECT COUNT(*) FROM report_images

5. 任务监控 (Jobs)

数据源: circle.db (hermes_jobs)

# 指标 SQL
5.1 总任务数 SELECT COUNT(*) FROM hermes_jobs
5.2 运行中 SELECT COUNT(*) FROM hermes_jobs WHERE status='running'
5.3 已完成 SELECT COUNT(*) FROM hermes_jobs WHERE status='completed'
5.4 失败 SELECT COUNT(*) FROM hermes_jobs WHERE status='failed'
5.5 最近完成时间 SELECT completed_at FROM hermes_jobs WHERE completed_at IS NOT NULL ORDER BY id DESC LIMIT 1
5.6 成功率 5.3 / (5.3 + 5.4) × 100 (排除 running)

6. 自动回复 (Auto Reply)

数据源: circle.db (reply_queue, reply_whitelist)

# 指标 SQL
6.1 白名单总数 SELECT COUNT(*) FROM reply_whitelist
6.2 白名单群 SELECT COUNT(*) FROM reply_whitelist WHERE kind='group'
6.3 白名单联系人 SELECT COUNT(*) FROM reply_whitelist WHERE kind='contact'
6.4 待审批回复 SELECT COUNT(*) FROM reply_queue WHERE status='pending'
6.5 已发送回复 SELECT COUNT(*) FROM reply_queue WHERE status IN ('sent','auto_sent')

7. AI 聊天 (Circle)

数据源: circle.db (conversations, messages)

# 指标 SQL
7.1 会话数 SELECT COUNT(*) FROM conversations
7.2 总消息数 SELECT COUNT(*) FROM messages
7.3 最近会话时间 SELECT updated_at FROM conversations ORDER BY updated_at DESC LIMIT 1

8. 系统状态

# 指标 数据源 方式
8.1 Flask 服务状态 HTTP 自检 (alive)
8.2 WeChat DB 连接 WeChat DB SELECT 1 看是否成功
8.3 活跃 Cron 数 hermes cron list 子进程调用
8.4 当前账号 config.get_current_account_id() Python

数据源汇总

数据源 类型 说明
circle.db (SQLite) 本地 15 张表,主要数据源
WeChat DB (SQLCipher) 远程 聊天消息/联系人,需 root 解密
hermes cron list 子进程 Cron job 状态

Dashboard API 返回结构 (建议)

{
  "chats": {
    "groups": 12,
    "messages": 45231,
    "speakers": 87,
    "shares": 1035,
    "images_analyzed": 0,
    "summaries": 0
  },
  "articles": {
    "total": 128,
    "summarized": 145,
    "unsummarized": -17,
    "learned": 0,
    "unlearned": 128
  },
  "learn": {
    "pending_review": 38,
    "approved": 2,
    "applied": 6,
    "rejected": 5,
    "unclassified": 107,
    "high_score": 15,
    "by_type": {"skill": 3, "memory": 2, "todo": 1, "reference": 0}
  },
  "reports": {
    "daily": 5,
    "summaries": 150,
    "learn_records": 2,
    "images": 5,
    "last_generated": "2026-07-10 14:55:14"
  },
  "jobs": {
    "total": 310,
    "running": 29,
    "completed": 156,
    "failed": 125,
    "success_rate": 55.5,
    "last_completed": "2026-07-11 00:09:59"
  },
  "auto_reply": {
    "whitelist": 1,
    "pending": 26,
    "sent": 1
  },
  "circle": {
    "conversations": 1,
    "messages": 2
  },
  "system": {
    "flask": "alive",
    "wechat_db": true,
    "cron_jobs": 5,
    "account": "e03ce81..."
  }
}

注意事项

  1. WeChat DB 查询可能失败:SQLCipher 需要解密密钥和 root 权限。如果 WeChat DB 不可用,聊天模块指标 (1.1-1.3) 返回 null 或空值。
  2. 已摘要数 > 总文章数:某些文章可能有多份摘要 (多次抓取)。COUNT(DISTINCT article_url) 按 URL 去重。
  3. Cron 状态查询:需执行 hermes cron list 子进程,可能耗时 2-3 秒。Dashboard API 可考虑独立查询或缓存。
  4. 性能考量:大多数查询是简单 COUNT,在 circle.db 上