Sep 4 - Add link relavant issues function
This commit is contained in:
+31
-4
@@ -110,11 +110,38 @@ def send_sla_alerts():
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# yield_per streams rows in batches of 100 rather than loading all open
|
||||
# issues into memory at once. At current scale this is a no-op difference,
|
||||
# but it prevents a memory spike if the issue count grows large.
|
||||
# Narrow to actual CANDIDATES in SQL rather than reading every open issue
|
||||
# and deciding in Python. This runs every 30 minutes forever, so the old
|
||||
# form's cost grew with the whole open-issue backlog even on a quiet night
|
||||
# where nothing was due. Three filters, each mirroring a `continue` below:
|
||||
#
|
||||
# 1. reported_at IS NOT NULL — the column is nullable, and sla_status()
|
||||
# raises TypeError on a NULL (datetime + timedelta). One such row
|
||||
# would abort the entire cron run, so exclude it in SQL.
|
||||
# 2. sla_notified <> 'breached' — the highest level is already sent; the
|
||||
# loop skips these unconditionally.
|
||||
# 3. old enough to be at least at-risk for its OWN severity, i.e.
|
||||
# reported_at <= now - (window * 0.75). A critical issue qualifies
|
||||
# after 3h, a low one after 90h.
|
||||
#
|
||||
# Anything this excludes would have hit a `continue` anyway, so the set of
|
||||
# notifications sent is unchanged — only the rows read are.
|
||||
now = now_eastern()
|
||||
age_clauses = [
|
||||
db.and_(
|
||||
Issue.severity == severity,
|
||||
Issue.reported_at <= now - timedelta(hours=hours * AT_RISK_THRESHOLD),
|
||||
)
|
||||
for severity, hours in SLA_HOURS.items()
|
||||
]
|
||||
|
||||
# yield_per streams the survivors in batches rather than materialising them
|
||||
# all at once.
|
||||
open_issues = Issue.query.filter(
|
||||
Issue.status.in_(['open', 'in_progress', 'pending_verification'])
|
||||
Issue.status.in_(['open', 'in_progress', 'pending_verification']),
|
||||
Issue.reported_at.isnot(None),
|
||||
db.or_(Issue.sla_notified.is_(None), Issue.sla_notified != 'breached'),
|
||||
db.or_(*age_clauses),
|
||||
).yield_per(100)
|
||||
|
||||
total_sent = 0
|
||||
|
||||
Reference in New Issue
Block a user