如何监控多个 SaaS 软件项目的运营数据,统一给负责人发送运营日报。
如何监控运营数据?
常见做法
-
在业务层入侵式埋点、上报,定时任务程序读取后汇总发送。
-
在业务层非入侵式
- 埋点、上报,定时任务程序读取后汇总发送;
- 独立分析模块通过读存储数据副本、监控日志离线分析,存储分析结果,定时任务程序读取后汇总发送。
简单的解耦合、无状态和分布式发送日报设计和实现
发送日报常见问题
- 单个项目 vs 多个项目: 几乎每个项目都要发送, 没有必要重复实现类似逻辑;整个多个项目统一发送同时考虑解耦合
- 异构运行环境 serverless vs VM vs container: 不同运行环境下统一上报通用格式的数据,集中处理后再发送
- 统一语言框架 vs 多语言多框架: 和前者类似,实现独立于语言和独立于框架
解决方案架构:
┌─────────────────────────┐
│ Serverless Worker 1 + DB│──┐
└─────────────────────────┘ │ HTTP POST/RPC (API Key)
├──► ┌─────────────────────────┐ ┌─────────────────┐
┌─────────────────────────┐ │ │ Central Worker │─────►│ Notification │
│ Serverless Worker 2 + DB│──┤ │ (schedule job @ 10:00) │ │ (IM/Email) │
└─────────────────────────┘ │ └─────────────────────────┘ └─────────────────┘
│
┌─────────────────────────┐ │
│ Computing Nodes + DB │──┤
└─────────────────────────┘ │
│
.... ──┘
Central Worker 模块
- 接收 JSON 格式运营数据
- 发送日报到负责人
- project 管理
- 定义有什么项目和应用,运营发送日报发送格式
- 预定义通用的运营日报 section,如 用户总数、日/周/月增长、日/周/月活跃、日/周/月订阅付费
- 节假日按欧美还是按大中华区,节假日是否发送
- 上报接口使用的 API 验证 key
- project & contact 管理, 定义日报使用什么信道、发送给谁
定义通用接收上报数据 JSON 格式
project: string <project name>
data: array, `[{"key.name": <data point>},{"key.name": <data point>}, ...]`
timestamp: float64, <unix timestamp in Reporting interval granularity hours/days>
定义日报模板
# <hard-coded xxx project>
## <hard-coded section name>
- DAU: ${key.name}
- Installs: {{ `select sum(foo) from <project name as table name>` }}
- Uninstalls: {{ `select sum(bar) from <project name as table name>` }}
可按需实现一个简陋的带计算逻辑模板:
hard-coded ...部分的直接写死${key.name}的从存储按 project 和 key.name 组合查询{{ ... }}聚合计算后再填充模板
如何扩展
水平扩展
- Central Worker 支持几乎无限个 project 接入
- Central Worker 和相关存储过载时,可以部署多套,修改 project 上报 HTTP/RPC 入口即可
安全性
- Central Worker 改动频率低,设置单管理员用户或写死特定 SSO 用户统一管理即可
- 单个 project 泄漏对其他项目无影响
- 单个信道密钥泄漏,对其他项目无影响,重置即可
智能洞察
- month-to-month 环比 year-to-year 同比:保留日报每次发送历史,提供接口给大模型分析,在日报基础上实现历史分析,发送环比月报和同比年报
- be-better 让大模型根据 日月年报运营数据提供运营改进建议