mirror of
https://github.com/suyiiyii/nonebot-bison.git
synced 2025-06-02 09:26:12 +08:00
✨ 支持上报超时的任务
This commit is contained in:
parent
96573ec86e
commit
75bbbb68e8
@ -1,8 +1,10 @@
|
|||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
from collections.abc import Callable
|
||||||
|
|
||||||
from nonebot.log import logger
|
from nonebot.log import logger
|
||||||
from nonebot_plugin_apscheduler import scheduler
|
from nonebot_plugin_apscheduler import scheduler
|
||||||
|
from apscheduler.events import EVENT_JOB_MAX_INSTANCES
|
||||||
from nonebot_plugin_saa.utils.exceptions import NoBotFound
|
from nonebot_plugin_saa.utils.exceptions import NoBotFound
|
||||||
|
|
||||||
from nonebot_bison.utils import ClientManager
|
from nonebot_bison.utils import ClientManager
|
||||||
@ -24,6 +26,15 @@ class Schedulable:
|
|||||||
use_batch: bool = False
|
use_batch: bool = False
|
||||||
|
|
||||||
|
|
||||||
|
def handle_time_exceeded(event):
|
||||||
|
# event.job_id 是该任务在 apscheduler 的 id, 进而可以获得该任务的函数,再获取该函数绑定的对象
|
||||||
|
logger.warning(f"{scheduler.get_job(event.job_id).func.__self__.name} 抓取执行超时")
|
||||||
|
scheduler.get_job(event.job_id).func.__self__.metrics_report(False)
|
||||||
|
|
||||||
|
|
||||||
|
scheduler.add_listener(handle_time_exceeded, EVENT_JOB_MAX_INSTANCES)
|
||||||
|
|
||||||
|
|
||||||
class Scheduler:
|
class Scheduler:
|
||||||
schedulable_list: list[Schedulable] # for load weigth from db
|
schedulable_list: list[Schedulable] # for load weigth from db
|
||||||
batch_api_target_cache: dict[str, dict[Target, list[Target]]] # platform_name -> (target -> [target])
|
batch_api_target_cache: dict[str, dict[Target, list[Target]]] # platform_name -> (target -> [target])
|
||||||
@ -56,6 +67,7 @@ class Scheduler:
|
|||||||
|
|
||||||
self.platform_name_list = platform_name_list
|
self.platform_name_list = platform_name_list
|
||||||
self.pre_weight_val = 0 # 轮调度中“本轮”增加权重和的初值
|
self.pre_weight_val = 0 # 轮调度中“本轮”增加权重和的初值
|
||||||
|
self.metrics_report: Callable[[bool], None] | None = None # 作为函数变量,允许外部调用来上报此次抓取是否成功
|
||||||
logger.info(
|
logger.info(
|
||||||
f"register scheduler for {self.name} with "
|
f"register scheduler for {self.name} with "
|
||||||
f"{self.scheduler_config.schedule_type} {self.scheduler_config.schedule_setting}"
|
f"{self.scheduler_config.schedule_type} {self.scheduler_config.schedule_setting}"
|
||||||
@ -97,6 +109,13 @@ class Scheduler:
|
|||||||
|
|
||||||
success_flag = False
|
success_flag = False
|
||||||
platform_obj = platform_manager[schedulable.platform_name](context)
|
platform_obj = platform_manager[schedulable.platform_name](context)
|
||||||
|
# 通过闭包的形式,将此次抓取任务的信息保存为函数变量,允许在该任务无法正常结束时由外部上报
|
||||||
|
self.metrics_report = lambda x: request_counter.labels(
|
||||||
|
platform_name=schedulable.platform_name,
|
||||||
|
site_name=platform_obj.site.name,
|
||||||
|
target=schedulable.target,
|
||||||
|
success=x,
|
||||||
|
).inc()
|
||||||
try:
|
try:
|
||||||
with request_histogram.labels(
|
with request_histogram.labels(
|
||||||
platform_name=schedulable.platform_name, site_name=platform_obj.site.name
|
platform_name=schedulable.platform_name, site_name=platform_obj.site.name
|
||||||
@ -123,12 +142,7 @@ class Scheduler:
|
|||||||
err.args += (records,)
|
err.args += (records,)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
request_counter.labels(
|
self.metrics_report(success_flag)
|
||||||
platform_name=schedulable.platform_name,
|
|
||||||
site_name=platform_obj.site.name,
|
|
||||||
target=schedulable.target,
|
|
||||||
success=success_flag,
|
|
||||||
).inc()
|
|
||||||
if not to_send:
|
if not to_send:
|
||||||
return
|
return
|
||||||
sent_counter.labels(
|
sent_counter.labels(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user