def schedule_window(report_type: str, start_at: datetime, stop_at: datetime, resolution: int) -> None: """ Find all active schedules and schedule celery tasks for each of them with a specific ETA (determined by parsing the cron schedule for the schedule) """ model_cls = get_scheduler_model(report_type) if not model_cls: return None dbsession = db.create_scoped_session() schedules = dbsession.query(model_cls).filter(model_cls.active.is_(True)) for schedule in schedules: logging.info("Processing schedule %s", schedule) args = (report_type, schedule.id) schedule_start_at = start_at if (hasattr(schedule, "last_eval_dttm") and schedule.last_eval_dttm and schedule.last_eval_dttm > start_at): schedule_start_at = schedule.last_eval_dttm + timedelta(seconds=1) # Schedule the job for the specified time window for eta in next_schedules(schedule.crontab, schedule_start_at, stop_at, resolution=resolution): get_scheduler_action(report_type).apply_async( args, eta=eta) # type: ignore break return None
def schedule_alert_query( # pylint: disable=unused-argument task: Task, report_type: ScheduleType, schedule_id: int, recipients: Optional[str] = None, slack_channel: Optional[str] = None, ) -> None: model_cls = get_scheduler_model(report_type) try: schedule = db.session.query(model_cls).get(schedule_id) # The user may have disabled the schedule. If so, ignore this if not schedule or not schedule.active: logger.info("Ignoring deactivated alert") return if report_type == ScheduleType.alert: evaluate_alert(schedule.id, schedule.label, recipients, slack_channel) else: raise RuntimeError("Unknown report type") except NoSuchColumnError as column_error: stats_logger.incr("run_alert_task.error.nosuchcolumnerror") raise column_error except ResourceClosedError as resource_error: stats_logger.incr("run_alert_task.error.resourceclosederror") raise resource_error
def schedule_window(report_type: ScheduleType, start_at: datetime, stop_at: datetime, resolution: int) -> None: """ Find all active schedules and schedule celery tasks for each of them with a specific ETA (determined by parsing the cron schedule for the schedule) """ model_cls = get_scheduler_model(report_type) if not model_cls: return None dbsession = db.create_scoped_session() schedules = dbsession.query(model_cls).filter(model_cls.active.is_(True)) for schedule in schedules: args = (report_type, schedule.id) # Schedule the job for the specified time window for eta in next_schedules(schedule.crontab, start_at, stop_at, resolution=resolution): schedule_email_report.apply_async(args, eta=eta) return None
def schedule_email_report( # pylint: disable=unused-argument task: Task, report_type: ScheduleType, schedule_id: int, recipients: Optional[str] = None, ) -> None: model_cls = get_scheduler_model(report_type) schedule = db.create_scoped_session().query(model_cls).get(schedule_id) # The user may have disabled the schedule. If so, ignore this if not schedule or not schedule.active: logger.info("Ignoring deactivated schedule") return # TODO: Detach the schedule object from the db session if recipients is not None: schedule.id = schedule_id schedule.recipients = recipients if report_type == ScheduleType.dashboard: deliver_dashboard(schedule) elif report_type == ScheduleType.slice: deliver_slice(schedule) else: raise RuntimeError("Unknown report type")
def schedule_email_report(task, report_type, schedule_id): model_cls = get_scheduler_model(report_type) dbsession = db.create_scoped_session() schedule = dbsession.query(model_cls).get(schedule_id) # The user may have disabled the schedule. If so, ignore this if not schedule.active: logging.info('Ignoring deactivated schedule') return if report_type == ScheduleType.dashboard.value: deliver_dashboard(schedule) elif report_type == ScheduleType.slice.value: deliver_slice(schedule) else: raise RuntimeError('Unknown report type')
def schedule_email_report( _task: Task, report_type: ScheduleType, schedule_id: int, recipients: Optional[str] = None, slack_channel: Optional[str] = None, ) -> None: model_cls = get_scheduler_model(report_type) with session_scope(nullpool=True) as session: schedule = session.query(model_cls).get(schedule_id) # The user may have disabled the schedule. If so, ignore this if not schedule or not schedule.active: logger.info("Ignoring deactivated schedule") return recipients = recipients or schedule.recipients slack_channel = slack_channel or schedule.slack_channel logger.info( "Starting report for slack: %s and recipients: %s.", slack_channel, recipients, ) if report_type == ScheduleType.dashboard: deliver_dashboard( schedule.dashboard_id, recipients, slack_channel, schedule.delivery_type, schedule.deliver_as_group, ) elif report_type == ScheduleType.slice: deliver_slice( schedule.slice_id, recipients, slack_channel, schedule.delivery_type, schedule.email_format, schedule.deliver_as_group, session, ) else: raise RuntimeError("Unknown report type")
def schedule_email_report(task, report_type, schedule_id, recipients=None): model_cls = get_scheduler_model(report_type) schedule = db.create_scoped_session().query(model_cls).get(schedule_id) # The user may have disabled the schedule. If so, ignore this if not schedule or not schedule.active: logging.info('Ignoring deactivated schedule') return # TODO: Detach the schedule object from the db session if recipients is not None: schedule.id = schedule_id schedule.recipients = recipients if report_type == ScheduleType.dashboard.value: deliver_dashboard(schedule) elif report_type == ScheduleType.slice.value: deliver_slice(schedule) else: raise RuntimeError('Unknown report type')
def schedule_alert_query( _task: Task, report_type: ScheduleType, schedule_id: int, recipients: Optional[str] = None, slack_channel: Optional[str] = None, ) -> None: model_cls = get_scheduler_model(report_type) with session_scope(nullpool=True) as session: schedule = session.query(model_cls).get(schedule_id) # The user may have disabled the schedule. If so, ignore this if not schedule or not schedule.active: logger.info("Ignoring deactivated alert") return if report_type == ScheduleType.alert: evaluate_alert(schedule.id, schedule.label, session, recipients, slack_channel) else: raise RuntimeError("Unknown report type")
def schedule_alert_query( # pylint: disable=unused-argument task: Task, report_type: ScheduleType, schedule_id: int, recipients: Optional[str] = None, ) -> None: model_cls = get_scheduler_model(report_type) dbsession = db.create_scoped_session() schedule = dbsession.query(model_cls).get(schedule_id) # The user may have disabled the schedule. If so, ignore this if not schedule or not schedule.active: logger.info("Ignoring deactivated alert") return if report_type == ScheduleType.alert: if run_alert_query(schedule, dbsession): # deliver_dashboard OR deliver_slice return else: raise RuntimeError("Unknown report type")
def schedule_window(report_type, start_at, stop_at, resolution): """ Find all active schedules and schedule celery tasks for each of them with a specific ETA (determined by parsing the cron schedule for the schedule) """ model_cls = get_scheduler_model(report_type) dbsession = db.create_scoped_session() schedules = dbsession.query(model_cls).filter(model_cls.active.is_(True)) for schedule in schedules: args = ( report_type, schedule.id, ) # Schedule the job for the specified time window for eta in next_schedules(schedule.crontab, start_at, stop_at, resolution=resolution): schedule_email_report.apply_async(args, eta=eta)