04 · Observability

数据与监控体系

Vivi 怎么知道自己活得好不好:北极星 = 日消息量;三层告警(基础设施 / 应用异常 / 业务指标);DailyLoop 每天自动跑一轮分析推 Lark + 写 Bitable。这一页讲清楚每个工具的分工,PM 看完就能直接用 dashboard。

北极星指标

North Star Metric

日消息量(message_sent)

消息量直接反映用户真实粘性 · DAU 只说明用户打开了 App,不代表互动 · 已并入 daily_monitor,每日 Lark 卡片同步

判断指标价值的口诀:讨论"加埋点"前先问 "DB 能不能直接查"。多数情况答案是可以 —— Telegram Mini App 平台归因链断裂,前端埋点解决不了归因,能从 conversations / transactions 表查的就别加新事件。

三层告警架构

不同性质的故障走不同通道,避免单点失效:

P0 · 基础设施

Better Stack

HTTP monitor 拨测 /health(间隔 1 min),失败立即推 Lark Vivi-Bot 红色卡片 + @野荞。Heartbeat 监 DailyLoop 是否如期跑完。

webhook: /api/webhooks/betterstack
P0 · 应用异常

Sentry

SDK 捕获 unhandled exception,issue alert 配 webhook → Lark 红色卡片 + @野荞。SDK 条件初始化(SENTRY_DSN 存在才激活)。

webhook: /api/webhooks/sentry
P1 · 业务指标

DailyLoop

每天 09:00 + 10:00 自动跑两条 GHA workflow,写 Bitable 五张表,向多个 Lark 群推卡片。这是 PM 最常看的产出。

workflow: .github/workflows/daily_monitor.yml

另外还有 UptimeRobot(独立冗余)每 5 分钟邮件告警,和 Microsoft Clarity(前端录屏 + 热图,无告警,按需查)。

/health 深探探针

Better Stack 拉的 /health 不是简单 200,而是依次探四个依赖:

每探 2s 单超时,5s 总硬上限。任一失败 → 503 + errors[]。Better Stack 只要看到 503 就 fire 告警。

DailyLoop 自动化管线

DailyLoop 是 Vivi 的"每日自动化产品 Office"。每天两条 GHA workflow 串行触发:

09:00 UTC  clarity_report.yml   → Clarity Dashboard API → Bitable 表二(用户行为)
10:00 UTC  daily_monitor.yml    → 四阶段分析 → Bitable 五表 + Lark 卡片 + Remote Trigger 开 PR

四阶段分析(合并优化后)

PHASE 1

数据采集

并行拉 Adsgram + Clarity MCP + PostHog 三个数据源

PHASE 2

需求点生成

generate_product_requirements() 交叉分析 → 触发 REQ-XX 列表

PHASE 3

代码 prompt 生成

generate_code_prompts() → 含文件路径的 Claude Code 可执行 prompt

PHASE 4

写表 + 推送

Bitable 五表写入 + Lark 卡片 + Remote Trigger 开 PR

需求体系 REQ ID 清单(自动触发)

REQ ID触发条件类型含 code prompt
REQ-FUNNEL-01转化率 < 50%前端优化
REQ-UX-01Dead click > 5% 或 Rage click > 2%前端优化
REQ-PAY-01付费转化率 < 30%前端优化
REQ-PAY-020 次付费点击 且 用户 > 10前端优化
REQ-MOBILE-01Mobile 占比 < 50%前端优化
REQ-PERF-01Script Error > 1%前端优化
REQ-PERF-02活跃时间比 < 50%前端优化
REQ-ADS-01Adsgram 余额 ≤ 0 或 < 5运营动作
REQ-ADS-02CTR < 0.8%运营动作
REQ-CHAR-01Top 角色占 > 50% 流量运营动作
REQ-GROWTH-01日活 < 10运营动作

Bitable 五张表

Base 名"Vivi 产品自动化",已开放组织内可编辑,bot 可读写。每张表都按日期降序默认视图:

序号表名数据源用途
广告投放Adsgram每日投放数据 / CTR / 余额
用户行为Clarity Dashboard API设备 / 国家 / dead click / rage click
付费漏斗PostHog TrendsQuery各档转化率 / 付费用户数
产品需求点AI 交叉分析触发的 REQ-XX 列表 + 数据依据
代码提示词需求 → Claude Code prompt含文件路径的可执行 prompt

访问入口(Lark 内):Vivi 产品自动化 Base

Lark Bot 矩阵

不同性质的消息推不同 Bot,避免噪音淹没重要告警:

Vivi-PM
PM / 产品通知
DailyLoop 卡片、需求点更新、产品里程碑
Vivi-Bot
技术推送 · CI/CD
部署成功 / 失败、CI 状态、Better Stack / Sentry 告警
Vivi-Ads
广告监控
Adsgram 余额 / CTR / 投放群专用
Vivi-Auto
自动化 / 架构
DailyLoop 自动化体系本身的状态
推送规范:所有 Lark 推送必须用 交互式卡片msg_type: "interactive"),不要用纯文本或 post 格式。@提醒只 @野荞(open_id 239e82d1),不要 @all。表格信息要么用 column_set 多列布局,要么不展示 —— Lark 不渲染 Markdown 表格。

PostHog 关键事件埋点

前端埋点事件名 与 监控脚本查询名 必须 100% 对齐,否则永久返回 0:

事件名触发位置关键属性
plan_subscribe订阅页档位点击tier, package_id
gems_purchase_clickGems 商店档位点击package_id, gems
invoice_callbacktg.openInvoice 回调status (paid / cancelled / failed)
energy_exhausted能量耗尽 popup 弹出messages_in_session
image_request📷 按钮点击char_name, story_id
image_complete生图完成duration_ms, char_name
image_error生图失败error_type, char_name
locked_character_click付费锁角色点击char_name
paywall_shown付费墙曝光messages_in_session
session_end会话关闭(含 sendBeacon)duration, messages

埋点合规注意

反广告拦截:三层兜底

用户在 Telegram WebView 里大量装广告拦截器,PostHog 直连容易丢事件。Vivi 做了三层兜底:

  1. 反向代理:前端 api_host = vividreams.fly.dev/phog,后端 app/api/posthog_proxy.py 转发到真实 PostHog。绕过 ISP/DNS 拦截。
  2. 服务端转发:前端 Analytics.track() 双发到后端 /api/events,后端用 posthog-python SDK 转发。事件带 $source: "server" 标记。
  3. sendBeacon + pagehide:Telegram WebView 关闭时不丢事件。

LLM 可观测性

没用 Langfuse —— 因为 NSFW 数据流经第三方有合规风险,且 Prompt 架构稳定不需要 trace 调试。当前实现:

Microsoft Clarity

录屏 + 热图 + Dashboard API:

常用 dashboard 速查

看什么去哪
北极星 / 日消息量Daily Lark 卡片 (Vivi-PM 群)
付费漏斗 / 转化率PostHog Project 377981 → Funnel Insight
角色流量 Top NPostHog → Trends 按 char_name 分组
生图失败率PostHog → image_error 事件率
用户行为录屏Microsoft Clarity Dashboard
异常报错Sentry → vividreams 项目
服务可用性Better Stack 拨测页
每日营收Admin Dashboard / Daily Lark 卡片
需求列表 / 代码 promptBitable 五表(Vivi 产品自动化)
← 上一篇
03 · 商业化体系