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

如何编写Python脚本终止超过阈值时长的Mongo查询?

如何编写Python脚本终止运行时长超过阈值的Mongo查询

要终止运行时间超过设定阈值的MongoDB查询,核心是利用MongoDB的currentOp()获取当前运行操作,筛选出超时的用户查询后调用killOp()终止。以下是实现该功能的Python函数:

from pymongo import MongoClient

def terminate_long_running_queries(threshold_minutes=15):
    # 连接MongoDB(根据实际部署调整连接参数,比如添加认证、集群地址)
    client = MongoClient("mongodb://localhost:27017/")
    admin_db = client.admin

    # 获取当前所有运行中的操作
    current_ops = admin_db.command("currentOp")["inprog"]
    threshold_microsecs = threshold_minutes * 60 * 1000000  # 转换为微秒

    for op in current_ops:
        # 过滤出符合条件的超时查询:
        # 1. 属于用户查询类操作(query/find/aggregate)
        # 2. 运行时长超过阈值
        # 3. 排除系统内部操作与admin库的系统任务
        if (
            op.get("op") in ["query", "find", "aggregate"]
            and op.get("microsecs_running", 0) > threshold_microsecs
            and not op.get("ns", "").startswith("admin.")
            and not op.get("desc", "").startswith("rsSync")  # 排除副本集同步操作
        ):
            op_id = op["opid"]
            run_time = op["microsecs_running"] / (1000000 * 60)
            print(f"终止超时查询:OPID {op_id},运行时长 {run_time:.2f} 分钟")
            # 执行终止操作
            admin_db.command("killOp", opid=op_id)

if __name__ == "__main__":
    terminate_long_running_queries(threshold_minutes=15)

关键说明

  • 权限要求:执行脚本的MongoDB账号必须拥有clusterAdmin或hostManager角色权限,否则无法调用killOp命令。
  • 过滤规则:示例中的条件可根据业务调整,比如通过ns字段指定监控特定数据库/集合,或通过client字段定位特定客户端的查询。
  • 时间转换:MongoDB返回的microsecs_running是操作已运行的微秒数,需转换为分钟与阈值对比。
  • 安全验证:测试阶段建议先注释killOp调用,仅打印符合条件的操作,确认无误后再执行终止。

扩展建议

可以将该脚本配置为定时任务(如Linux cron),定期自动检查并终止超时查询,无需手动执行。

内容的提问来源于stack exchange,提问作者Marcus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:40:32