数据分析指南
本文档介绍如何使用 Vibany 的数据分析功能监控系统运营状况。
数据来源
Vibany 的数据主要来自:
- PostgreSQL 数据库:业务数据(用户、订单、历史记录等)
- Clerk:用户认证数据
- Vercel Analytics:访问统计(如果启用)
- Microsoft Clarity:用户行为分析(可选)
核心指标
用户指标
| 指标 | 说明 | 计算方式 |
|---|---|---|
| 总用户数 | 注册账号总数 | COUNT(*) FROM users |
| 日新增用户 | 当日注册用户 | COUNT(*) FROM users WHERE DATE(created_at) = TODAY |
| 活跃用户 | 最近 7 天有操作 | COUNT(DISTINCT user_id) FROM histories WHERE created_at > NOW() - 7 days |
| 付费用户 | 有过充值记录 | COUNT(DISTINCT user_id) FROM orders WHERE status = 'SUCCESS' |
收入指标
| 指标 | 说明 | 计算方式 |
|---|---|---|
| 日收入 | 当日充值积分 | SUM(amount) FROM orders WHERE status = 'SUCCESS' AND DATE(created_at) = TODAY |
| 月收入 | 当月充值积分 | SUM(amount) FROM orders WHERE status = 'SUCCESS' AND MONTH(created_at) = CURRENT_MONTH |
| ARPU | 用户平均收入 | 总收入 / 付费用户数 |
| 付费率 | 付费用户占比 | 付费用户数 / 总用户数 |
使用指标
| 指标 | 说明 | 计算方式 |
|---|---|---|
| 日生成量 | 当日生成图片数 | COUNT(*) FROM histories WHERE DATE(created_at) = TODAY |
| 总生成量 | 累计生成图片数 | COUNT(*) FROM histories |
| 平均耗时 | 图片生成平均时间 | AVG(generation_time) FROM histories |
| 成功率 | 生成成功比例 | 成功数 / 总数 |
SQL 查询示例
用户增长趋势
-- 每日新增用户
SELECT
DATE(created_at) as date,
COUNT(*) as new_users
FROM users
WHERE created_at > NOW() - INTERVAL '30 days'
GROUP BY DATE(created_at)
ORDER BY date DESC;
-- 累计用户数
SELECT
DATE(created_at) as date,
COUNT(*) OVER (ORDER BY DATE(created_at)) as cumulative_users
FROM users
GROUP BY DATE(created_at)
ORDER BY date;
收入分析
-- 每日收入统计
SELECT
DATE(o.created_at) as date,
COUNT(*) as order_count,
SUM(o.amount) as revenue_points,
COUNT(DISTINCT o.user_id) as paying_users
FROM orders o
WHERE o.status = 'SUCCESS'
AND o.created_at > NOW() - INTERVAL '30 days'
GROUP BY DATE(o.created_at)
ORDER BY date DESC;
-- 支付方式分布
SELECT
payment_method,
COUNT(*) as order_count,
SUM(amount) as total_points,
ROUND(AVG(amount), 2) as avg_points
FROM orders
WHERE status = 'SUCCESS'
GROUP BY payment_method
ORDER BY order_count DESC;
模型使用统计
-- 各模型使用频率
SELECT
(extra->>'model') as model,
COUNT(*) as usage_count,
AVG(points_used) as avg_points
FROM histories
WHERE created_at > NOW() - INTERVAL '30 days'
AND status = true
GROUP BY (extra->>'model')
ORDER BY usage_count DESC;
用户留存分析
-- 次日留存率
WITH first_login AS (
SELECT
user_id,
MIN(DATE(created_at)) as first_date
FROM histories
GROUP BY user_id
),
next_day_login AS (
SELECT DISTINCT
h.user_id,
DATE(h.created_at) as login_date
FROM histories h
JOIN first_login f ON h.user_id = f.user_id
WHERE DATE(h.created_at) = f.first_date + INTERVAL '1 day'
)
SELECT
ROUND(
COUNT(DISTINCT n.user_id) * 100.0 / COUNT(DISTINCT f.user_id),
2
) as retention_rate
FROM first_login f
LEFT JOIN next_day_login n ON f.user_id = n.user_id
WHERE f.first_date = CURRENT_DATE - INTERVAL '1 day';
邀请效果分析
-- 邀请码效果统计
SELECT
i.invite_code,
i.invite_type,
i.ref_ratio,
COUNT(iu.id) as usage_count,
SUM(iu.recharge_amount) as total_recharge
FROM invitations i
LEFT JOIN invitation_usages iu ON i.id = iu.invitation_id
GROUP BY i.id, i.invite_code, i.invite_type, i.ref_ratio
ORDER BY usage_count DESC;
可视化工具
Drizzle Studio
内置数据库 GUI 工具:
npm run db:studio
连接 BI 工具
可以使用以下工具连接 PostgreSQL 进行可视化分析:
| 工具 | 特点 | 适用场景 |
|---|---|---|
| Metabase | 开源,易用 | 自建分析平台 |
| Grafana | 专业监控 | 实时仪表板 |
| Tableau | 商业软件 | 高级分析 |
| Google Data Studio | 免费 | 简单报表 |
Metabase 配置示例
- 安装 Metabase(Docker):
docker run -d -p 3000:3000 --name metabase metabase/metabase
- 添加数据库连接:
- 数据库类型:PostgreSQL
- 主机:Neon 连接字符串中的主机
- 端口:5432
- 数据库名:数据库名
- 用户名/密码:连接字符串中的凭证
监控告警
关键指标告警
建议设置以下告警:
| 指标 | 阈值 | 告警方式 |
|---|---|---|
| 错误率 | > 5% | 邮件/短信 |
| 支付成功率 | < 90% | 邮件 |
| API 响应时间 | > 5s | 邮件 |
| 磁盘使用率 | > 80% | 邮件 |
Vercel 监控
如果使用 Vercel Pro,可以在 Dashboard 设置:
- 函数错误率告警
- 带宽使用告警
- 构建失败通知
数据导出
CSV 导出
-- 导出用户数据
\copy (SELECT * FROM users) TO '/tmp/users.csv' WITH CSV HEADER;
-- 导出订单数据
\copy (
SELECT
o.id,
u.email,
o.amount,
o.status,
o.created_at
FROM orders o
JOIN users u ON o.user_id = u.clerk_id
WHERE o.status = 'SUCCESS'
) TO '/tmp/orders.csv' WITH CSV HEADER;
定期报告
可以使用 node-cron 创建定期报告任务:
// 每日报告示例
import { cron } from 'node-cron';
cron.schedule('0 9 * * *', async () => {
// 生成昨日报告
const report = await generateDailyReport();
// 发送邮件
await sendEmail('admin@yourdomain.com', 'Daily Report', report);
});
A/B 测试
测试场景
- 定价测试:不同积分套餐的转化效果
- UI 测试:不同界面的用户体验
- 模型测试:不同 AI 模型的用户偏好
数据追踪
在代码中添加追踪:
// 记录 A/B 测试分组
await db.insert(experiments).values({
userId,
experimentId: 'pricing_v2',
variant: 'B',
createdAt: new Date()
});
隐私与合规
数据脱敏
分析时注意:
- 邮箱地址脱敏(
a***@example.com) - 不导出敏感字段(密码、API Key 等)
- 遵守数据保留政策
GDPR 合规
- 提供数据导出功能
- 支持数据删除请求
- 记录数据处理活动
最佳实践
- 定期备份:每日自动备份数据库
- 数据验证:定期检查数据一致性
- 性能优化:为常用查询添加索引
- 安全访问:限制数据库访问权限
- 文档记录:维护数据分析文档