DEV Community

drake
drake

Posted on

python爬虫的监控告警实现(装饰器形式)

import traceback
import os
from utils.lark_bot import sender
from config import env

def ErrorMonitor(spider_name, user=None):
    """
    捕获异常并且发送消息的装饰器,用于加在各个爬虫的解析方法上
    :param spider_name:爬虫名
    :param user: 用户名
    24个小时内单个爬虫的故障只告警一次
    """
    pod_name = os.getenv("POD_NAME")
    webhook = 'https://open.larksuite.com/open-apis/bot/v2/hook/dc183d37-05f8-436d-bbde-cfa7b163a79b'
    title = f'{spider_name}\n POD_NAME: {pod_name}\n @{user}'
    key_base = 'process:failed:filter:{}'

    # 捕获异常
    def catch_exception(func):
        def inner(*args, **kwargs):
            try:
                return func(*args, **kwargs)
            # 捕获异常,发送告警
            except Exception as e:
                from utils.redisdb import redis_cli
                redis_c = redis_cli()   
                err_info = traceback.format_exc()
                print(err_info)
                key = key_base.format(spider_name)
                filter_status = redis_c.get(key)
                if filter_status:
                    print('过滤该告警')
                    return
                # 只有线上环境才告警
                if env == 'prod':
                    sender(err_info, url=webhook, title=title)
                    # 24个小时内单个爬虫的故障只告警一次
                    redis_c.setex(key, 24*60*60, 1)
                raise e
        return inner
    return catch_exception

Enter fullscreen mode Exit fullscreen mode

Top comments (0)