Thông báo ngân sách đạt ngưỡng#
Mục tiêu: DevOps hiểu cơ chế budget alert — ngưỡng, channel gửi, và troubleshoot.
Mục tiêu#
- Hiểu flow alert: budget campaign chạm ngưỡng → notify Finance + Admin.
- Biết các alert threshold mặc định.
- Debug khi alert không tới.
Điều kiện tiên quyết#
- DevOps role.
- Access backend logs.
Cơ chế alert#
Trigger#
Job budget_check chạy mỗi 15 phút:
- Query tất cả campaigns
active,isUnlimited=false. - Tính
used / limit * 100. - Nếu ≥
alertthreshold (config per-campaign) → trigger alert event. - Insert vào notification queue.
Levels#
Ngưỡng mặc định (có thể override per-campaign):
| Level | % | Channel | Audience |
|---|---|---|---|
| Warning | 70% | Slack + Email | Admin |
| Critical | 90% | Slack + Email + SMS | Finance + Admin |
| Exhausted | 100% | Slack + Email + SMS + PagerDuty | On-call |
Khi đạt 100%, job block_create_reward auto-trigger để pause cộng tiền.
Các kênh gửi#
Email#
- Template:
budget_alert.html. - Target: staff có role Finance/Admin, email nội bộ.
Slack#
- Channel:
#tcb-budget-alert(hoặc tùy config). - Webhook config trong env
SLACK_BUDGET_WEBHOOK.
SMS (via Twilio/provider)#
- Chỉ dùng cho Critical + Exhausted.
- Danh sách số điện thoại staff trong config.
PagerDuty#
- Chỉ Exhausted.
- Service key trong secret.
Cấu hình#
Per campaign#
Trong Admin Portal → Chi tiết thử thách → Ngân sách:
- Alert threshold — % (default 80 nếu không set).
Global (per partner)#
Config service level:
- Channels enabled.
- Threshold levels.
- Audience routing.
File config: config/budget-alert.yaml (ví dụ).
Cách debug#
1. Alert không tới — verify job#
# Check job log
kubectl logs -l app=tf-worker | grep "budget_check"
# Expected output mỗi 15 phút
Nếu không có log → job không chạy. Check cron scheduler.
2. Job chạy nhưng không trigger alert#
- Check
alertthreshold per campaign có set không. - Check % current:
used/limit * 100có thực sự ≥ threshold?
3. Alert triggered nhưng không tới Slack#
- Webhook URL đúng?
- Channel tồn tại?
- Test manual:
curlwebhook + message test.
4. Email không tới#
- SMTP config.
- Check spam.
- Email của staff có active?
5. SMS không tới#
- Số điện thoại format đúng (+84...).
- Twilio balance đủ?
- Rate limit?
Các bước thực hiện (ad-hoc)#
1. Test alert pipeline#
# Force trigger budget check với campaign test
kubectl exec -it worker -- \
go run cmd/admin/main.go trigger-budget-check --campaign=test123
2. Xem lịch sử alert đã gửi#
# Query DB
db.budget_alerts.find({
campaign_id: ObjectId("..."),
sent_at: {$gte: new Date("2026-04-01")}
})
3. Resend alert (sau fix bug)#
kubectl exec -it worker -- \
go run cmd/admin/main.go resend-alert --alert_id=<id>
Chi tiết từng bước#
De-duplication#
Hệ thống không gửi alert trùng:
- Mỗi campaign chỉ gửi 1 alert/level/ngày.
- Nếu đã alert Warning, không gửi lại Warning trong 24h.
- Upgrade level (Warning → Critical) thì gửi mới.
Alert fatigue prevention#
- Gộp multiple campaigns vào 1 email digest (hourly).
- Slack threading.
- SMS chỉ cho critical level.
Integration với Block Reward#
Khi level Exhausted:
- Auto set
blockCreateReward=truecho campaign. - Notify Admin "Budget exhausted, reward cộng tiền đã pause".
- Admin phải top-up + unblock manual.
Lỗi thường gặp#
1. Alert "chạm 100%" nhưng thực tế 90%#
- Budget calculation bug. Check code
calculate_budget_used. - Có reconciliation chạy không? Đã cộng tiền chưa?
2. Job budget_check lag (chạy > 15 phút 1 lần)#
- Queue backlog. Scale worker.
- DB query chậm. Index missing?
3. Staff complain "tôi không nhận được alert"#
- Check họ trong audience list?
- Email đúng không?
- Slack channel join chưa?
4. Alert spam (gửi cùng 1 alert nhiều lần)#
- De-dup logic fail. Check DB có record sent không.
- Có thể nhiều worker chạy parallel → race condition. Lock DB.
5. Alert chậm (budget 100% rồi mới alert 20 phút sau)#
- Job frequency thấp (15 phút). Acceptable hay cần tăng?
- Trade-off: tần suất cao = load DB cao.
Câu hỏi thường gặp (FAQ)#
Per-user budget alert có không?
Không. Hệ thống alert theo campaign, không theo Influencer. Khi user chạm budgetPerUser, backend block reward cá nhân, không gửi alert ra ngoài.
Influencer có biết budget sắp hết không?
Không direct. Nhưng khi budget hết, họ submit bài vẫn nhận (chờ duyệt) nhưng không được cộng tiền → sẽ thấy trên UI "Đang chờ duyệt" nhưng không cộng.
Custom channel (Zalo) cho alert?
Có thể setup — cần DevOps thêm integration. Hiện mặc định Slack/Email/SMS.
Xóa alert đã gửi có được không?
Không cần xóa. Để lại cho audit.
On-call rotation cho Exhausted level?
Setup qua PagerDuty với schedule rotation.
Liên kết liên quan#
Tham khảo SRS: admin-portal/08-thanh-toan