Azure CosmosDB(DocumentDB)同步本地库:新增错误邮件通知需求
DocumentDB 同步任务新增错误/停滞告警邮件方案
针对你提到的需求,结合你已完成的同步任务基础,我整理了一套可落地的告警实现方案:
先明确当前任务现状
- 已经完成DocumentDB数据同步至本地数据库的核心开发
- 已经通过系统任务计划程序配置为每5分钟自动执行一次
- 同步完成后会自动删除DocumentDB中的对应任务记录
- 当前任务运行稳定,但仅做了错误日志记录,缺乏主动告警机制,没法及时发现任务停滞或异常
实现告警邮件的具体步骤
1. 先确定告警触发的场景
我们需要覆盖两种核心情况:
- 同步任务执行时抛出异常(明确的错误场景)
- 任务未按计划执行(停滞,比如连续两次以上没触发、进程挂起等)
2. 集成邮件告警功能
a. 封装一个通用的邮件发送工具
先写一个可复用的邮件发送函数,支持传入错误详情和收件人,示例伪代码(以Python为例,你可以根据自身开发语言调整):
import smtplib from email.mime.text import MIMEText import datetime def send_sync_alert_email(error_details, recipient_list): # 配置发件邮箱信息 sender_email = "sync-alert@yourdomain.com" sender_password = "your-email-auth-code" # 建议用邮箱授权码,别用明文密码 smtp_server = "smtp.yourdomain.com" smtp_port = 465 # 构造邮件内容 subject = "[紧急] DocumentDB同步任务告警" email_body = f"您好,DocumentDB同步任务出现异常或停滞,详情如下:\n\n{error_details}\n\n告警时间:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" msg = MIMEText(email_body, 'plain', 'utf-8') msg['Subject'] = subject msg['From'] = sender_email msg['To'] = ','.join(recipient_list) # 发送邮件 try: with smtplib.SMTP_SSL(smtp_server, smtp_port) as server: server.login(sender_email, sender_password) server.send_message(msg) except Exception as e: print(f"告警邮件发送失败:{str(e)}")
提示:不同邮箱的SMTP配置不一样,比如QQ邮箱是smtp.qq.com,端口465,记得提前开启邮箱的SMTP服务并获取授权码
b. 在同步任务中添加错误捕获与告警
在你现有的同步任务核心逻辑里,加上异常捕获块,一旦出错就触发邮件,同时保留原有的日志记录:
def sync_documentdb_to_local(): try: # --- 这里是你已有的同步逻辑代码 --- # 1. 从DocumentDB拉取待同步数据 # 2. 写入本地数据库 # 3. 删除DocumentDB中的对应任务记录 # --- 同步逻辑结束 --- # 记录成功时间,方便后续检测停滞 log_sync_success_time(datetime.datetime.now()) except Exception as e: # 组装错误详情 error_info = f"同步任务执行错误:{str(e)}\n执行时间:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" # 保留原有的错误日志记录 write_error_log(error_info) # 发送告警邮件,支持多个收件人 send_sync_alert_email(error_info, ["user1@yourdomain.com", "user2@yourdomain.com"])
c. 新增任务停滞检测逻辑
针对任务停滞的情况(比如任务计划程序没触发、进程挂起),我们可以单独加一个监控任务:
- 这个监控任务每10分钟执行一次(比同步周期长一点,避免误判)
- 读取最近一次同步成功的时间,如果距离当前时间超过12分钟(也就是超过2个同步周期),就判定为停滞,触发告警
示例检测代码:
def check_sync_stagnation(): # 从日志或本地数据库读取最后一次同步成功的时间 last_success_time = get_last_sync_success_time() if not last_success_time: # 如果没有成功记录,直接触发告警 error_info = "同步任务从未成功执行过,请检查任务配置!" write_error_log(error_info) send_sync_alert_email(error_info, ["user1@yourdomain.com"]) return current_time = datetime.datetime.now() time_diff = (current_time - last_success_time).total_seconds() # 超过12分钟(720秒)没同步成功,判定为停滞 if time_diff > 720: error_info = f"同步任务已停滞!\n最后成功执行时间:{last_success_time.strftime('%Y-%m-%d %H:%M:%S')}\n当前时间:{current_time.strftime('%Y-%m-%d %H:%M:%S')}" write_error_log(error_info) send_sync_alert_email(error_info, ["user1@yourdomain.com"])
然后把这个检测任务也加入任务计划程序,设置为每10分钟执行一次。
3. 测试验证
别忘做测试确保功能正常:
- 手动模拟同步错误(比如断开本地数据库连接),检查邮件是否正常发送,内容是否包含完整错误信息
- 暂停同步任务,等12分钟以上,验证停滞告警邮件是否触发
- 确认所有收件人都能收到告警邮件
一些额外的优化建议
- 可以给告警邮件加上优先级标记,让收件人能快速识别紧急程度
- 如果是脚本任务,可以在邮件里加上任务重启的快捷命令(比如远程执行脚本的命令)
- 可以加个去重逻辑,避免短时间内重复发送相同告警(比如1小时内同一错误只发一次)
内容的提问来源于stack exchange,提问作者XamDev
相关产品推荐
相关产品推荐

