mirror of
https://github.com/apache/superset.git
synced 2026-04-26 19:44:58 +00:00
fix: add retry to SQL-based alerting celery task (#10542)
* added retry and minimized sqlalchemy object lives * pylint * added try catch * adjusted naming * added scoped session * update tests for dbsession * added requested changes * nit todo Co-authored-by: Jason Davis <@dropbox.com>
This commit is contained in:
@@ -38,41 +38,42 @@ def setup_database():
|
||||
slice_id = db.session.query(Slice).all()[0].id
|
||||
database_id = utils.get_example_database().id
|
||||
|
||||
alert1 = Alert(
|
||||
id=1,
|
||||
label="alert_1",
|
||||
active=True,
|
||||
crontab="*/1 * * * *",
|
||||
sql="SELECT 0",
|
||||
alert_type="email",
|
||||
slice_id=slice_id,
|
||||
database_id=database_id,
|
||||
)
|
||||
alert2 = Alert(
|
||||
id=2,
|
||||
label="alert_2",
|
||||
active=True,
|
||||
crontab="*/1 * * * *",
|
||||
sql="SELECT 55",
|
||||
alert_type="email",
|
||||
slice_id=slice_id,
|
||||
database_id=database_id,
|
||||
)
|
||||
alert3 = Alert(
|
||||
id=3,
|
||||
label="alert_3",
|
||||
active=False,
|
||||
crontab="*/1 * * * *",
|
||||
sql="UPDATE 55",
|
||||
alert_type="email",
|
||||
slice_id=slice_id,
|
||||
database_id=database_id,
|
||||
)
|
||||
alert4 = Alert(id=4, active=False, label="alert_4", database_id=-1)
|
||||
alert5 = Alert(id=5, active=False, label="alert_5", database_id=database_id)
|
||||
alerts = [
|
||||
Alert(
|
||||
id=1,
|
||||
label="alert_1",
|
||||
active=True,
|
||||
crontab="*/1 * * * *",
|
||||
sql="SELECT 0",
|
||||
alert_type="email",
|
||||
slice_id=slice_id,
|
||||
database_id=database_id,
|
||||
),
|
||||
Alert(
|
||||
id=2,
|
||||
label="alert_2",
|
||||
active=True,
|
||||
crontab="*/1 * * * *",
|
||||
sql="SELECT 55",
|
||||
alert_type="email",
|
||||
slice_id=slice_id,
|
||||
database_id=database_id,
|
||||
),
|
||||
Alert(
|
||||
id=3,
|
||||
label="alert_3",
|
||||
active=False,
|
||||
crontab="*/1 * * * *",
|
||||
sql="UPDATE 55",
|
||||
alert_type="email",
|
||||
slice_id=slice_id,
|
||||
database_id=database_id,
|
||||
),
|
||||
Alert(id=4, active=False, label="alert_4", database_id=-1),
|
||||
Alert(id=5, active=False, label="alert_5", database_id=database_id),
|
||||
]
|
||||
|
||||
for num in range(1, 6):
|
||||
eval(f"db.session.add(alert{num})")
|
||||
db.session.bulk_save_objects(alerts)
|
||||
db.session.commit()
|
||||
yield db.session
|
||||
|
||||
@@ -82,45 +83,46 @@ def setup_database():
|
||||
|
||||
@patch("superset.tasks.schedules.deliver_alert")
|
||||
@patch("superset.tasks.schedules.logging.Logger.error")
|
||||
def test_run_alert_query(mock_error, mock_deliver, setup_database):
|
||||
database = setup_database
|
||||
run_alert_query(database.query(Alert).filter_by(id=1).one().id, database)
|
||||
alert1 = database.query(Alert).filter_by(id=1).one()
|
||||
assert mock_deliver.call_count == 0
|
||||
assert len(alert1.logs) == 1
|
||||
assert alert1.logs[0].alert_id == 1
|
||||
assert alert1.logs[0].state == "pass"
|
||||
def test_run_alert_query(mock_error, mock_deliver_alert, setup_database):
|
||||
dbsession = setup_database
|
||||
|
||||
run_alert_query(database.query(Alert).filter_by(id=2).one().id, database)
|
||||
alert2 = database.query(Alert).filter_by(id=2).one()
|
||||
assert mock_deliver.call_count == 1
|
||||
assert len(alert2.logs) == 1
|
||||
assert alert2.logs[0].alert_id == 2
|
||||
assert alert2.logs[0].state == "trigger"
|
||||
# Test passing alert with null SQL result
|
||||
alert1 = dbsession.query(Alert).filter_by(id=1).one()
|
||||
run_alert_query(alert1.id, alert1.database_id, alert1.sql, alert1.label)
|
||||
assert mock_deliver_alert.call_count == 0
|
||||
assert mock_error.call_count == 0
|
||||
|
||||
run_alert_query(database.query(Alert).filter_by(id=3).one().id, database)
|
||||
alert3 = database.query(Alert).filter_by(id=3).one()
|
||||
assert mock_deliver.call_count == 1
|
||||
# Test passing alert with True SQL result
|
||||
alert2 = dbsession.query(Alert).filter_by(id=2).one()
|
||||
run_alert_query(alert2.id, alert2.database_id, alert2.sql, alert2.label)
|
||||
assert mock_deliver_alert.call_count == 1
|
||||
assert mock_error.call_count == 0
|
||||
|
||||
# Test passing alert with error in SQL query
|
||||
alert3 = dbsession.query(Alert).filter_by(id=3).one()
|
||||
run_alert_query(alert3.id, alert3.database_id, alert3.sql, alert3.label)
|
||||
assert mock_deliver_alert.call_count == 1
|
||||
assert mock_error.call_count == 2
|
||||
assert len(alert3.logs) == 1
|
||||
assert alert3.logs[0].alert_id == 3
|
||||
assert alert3.logs[0].state == "error"
|
||||
|
||||
run_alert_query(database.query(Alert).filter_by(id=4).one().id, database)
|
||||
assert mock_deliver.call_count == 1
|
||||
# Test passing alert with invalid database
|
||||
alert4 = dbsession.query(Alert).filter_by(id=4).one()
|
||||
run_alert_query(alert4.id, alert4.database_id, alert4.sql, alert4.label)
|
||||
assert mock_deliver_alert.call_count == 1
|
||||
assert mock_error.call_count == 3
|
||||
|
||||
run_alert_query(database.query(Alert).filter_by(id=5).one().id, database)
|
||||
assert mock_deliver.call_count == 1
|
||||
# Test passing alert with no SQL statement
|
||||
alert5 = dbsession.query(Alert).filter_by(id=5).one()
|
||||
run_alert_query(alert5.id, alert5.database_id, alert5.sql, alert5.label)
|
||||
assert mock_deliver_alert.call_count == 1
|
||||
assert mock_error.call_count == 4
|
||||
|
||||
|
||||
@patch("superset.tasks.schedules.deliver_alert")
|
||||
@patch("superset.tasks.schedules.run_alert_query")
|
||||
def test_schedule_alert_query(mock_run_alert, mock_deliver_alert, setup_database):
|
||||
database = setup_database
|
||||
active_alert = database.query(Alert).filter_by(id=1).one()
|
||||
inactive_alert = database.query(Alert).filter_by(id=3).one()
|
||||
dbsession = setup_database
|
||||
active_alert = dbsession.query(Alert).filter_by(id=1).one()
|
||||
inactive_alert = dbsession.query(Alert).filter_by(id=3).one()
|
||||
|
||||
# Test that inactive alerts are no processed
|
||||
schedule_alert_query(report_type=ScheduleType.alert, schedule_id=inactive_alert.id)
|
||||
|
||||
Reference in New Issue
Block a user