Skip to content

Commit 210abdc

Browse files
authored
Merge pull request #97 from GabrielSalla/fix-monitors-stuck-procedure-query
Fix monitors stuck procedure query
2 parents 4b84b2a + 68169e3 commit 210abdc

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

src/components/controller/procedures/sql_files/monitors_stuck.sql

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ with monitors as (
44
extract(epoch from current_timestamp - last_heartbeat) :: int as time_since_last_heartbeat
55
from "Monitors"
66
where
7-
enabled and (queued or running)
7+
enabled and
8+
(queued or running) and
9+
coalesce(queued_at < current_timestamp - ($1 :: int) * interval '1 second', true) and
10+
coalesce(running_at < current_timestamp - ($1 :: int) * interval '1 second', true)
811
)
912
select id
1013
from monitors

tests/components/controller/procedures/test_monitors_stuck.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ def get_time(reference: str) -> datetime | None:
1616
values = {
1717
"now": now(),
1818
"ten_seconds_ago": now() - timedelta(seconds=11),
19-
"five_minutes_ago": now() - timedelta(seconds=301),
2019
}
2120
return values.get(reference)
2221

@@ -28,19 +27,25 @@ async def test_configuration():
2827
@pytest.mark.parametrize("enabled", [False, True])
2928
@pytest.mark.parametrize("queued", [False, True])
3029
@pytest.mark.parametrize("running", [False, True])
30+
@pytest.mark.parametrize("queued_at", [None, "now", "ten_seconds_ago"])
31+
@pytest.mark.parametrize("running_at", [None, "now", "ten_seconds_ago"])
3132
@pytest.mark.parametrize("last_heartbeat", [None, "now", "ten_seconds_ago"])
3233
async def test_monitors_stuck(
3334
caplog,
3435
sample_monitor: Monitor,
3536
enabled,
3637
queued,
3738
running,
39+
queued_at,
40+
running_at,
3841
last_heartbeat,
3942
):
4043
"""'monitors_stuck' should fix monitors that are stuck"""
4144
sample_monitor.enabled = enabled
4245
sample_monitor.queued = queued
4346
sample_monitor.running = running
47+
sample_monitor.queued_at = get_time(queued_at) # type:ignore[assignment]
48+
sample_monitor.running_at = get_time(running_at) # type:ignore[assignment]
4449
sample_monitor.last_heartbeat = get_time(last_heartbeat) # type:ignore[assignment]
4550
await sample_monitor.save()
4651

@@ -52,6 +57,10 @@ async def test_monitors_stuck(
5257
triggered = False
5358
elif last_heartbeat is None:
5459
triggered = False
60+
elif queued_at == "now":
61+
triggered = False
62+
elif running_at == "now":
63+
triggered = False
5564
elif last_heartbeat == "now":
5665
triggered = False
5766
else:

0 commit comments

Comments
 (0)