You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:33:08