7891984cd1
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
51 lines
1.8 KiB
Python
51 lines
1.8 KiB
Python
"""AlertHit[] → 飞书群机器人消息文本。
|
|
|
|
按触发类型分组,每类给计数 + 明细(trace/版本/原因)。两级截断防报警风暴:单类型超
|
|
max_detail_per_type 只列前 N + 「另有 M 条」;本期总量超 max_total 只给各类型计数、提示去分析库查。
|
|
标题含关键词「比价失败报警」——飞书自定义机器人用关键词验证,消息文本必须含它,否则被拒收。
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from app.services.compare_alert import ALERT_TYPE_LABELS, AlertHit
|
|
|
|
ALERT_KEYWORD = "比价失败报警"
|
|
|
|
_TYPE_ORDER = ("T1", "T6", "T2", "T5")
|
|
|
|
|
|
def _detail_line(h: AlertHit) -> str:
|
|
ver = h.app_version or "?"
|
|
return f" - trace {h.trace_id} | {ver} | {h.reason}"
|
|
|
|
|
|
def format_alert_message(
|
|
hits: list[AlertHit],
|
|
*,
|
|
window_label: str,
|
|
max_detail_per_type: int,
|
|
max_total: int,
|
|
) -> str:
|
|
total = len(hits)
|
|
header = f"🚨 {ALERT_KEYWORD} · {window_label} · 本期触发 {total} 条"
|
|
|
|
grouped: dict[str, list[AlertHit]] = {t: [] for t in _TYPE_ORDER}
|
|
for h in hits:
|
|
grouped.setdefault(h.alert_type, []).append(h)
|
|
|
|
lines = [header]
|
|
counts_only = total > max_total
|
|
for t in _TYPE_ORDER:
|
|
bucket = grouped.get(t) or []
|
|
if not bucket:
|
|
continue
|
|
lines.append(f"• {ALERT_TYPE_LABELS[t]} {len(bucket)} 条")
|
|
if counts_only:
|
|
continue
|
|
shown = bucket[:max_detail_per_type]
|
|
lines.extend(_detail_line(h) for h in shown)
|
|
if len(bucket) > max_detail_per_type:
|
|
lines.append(f" …另有 {len(bucket) - max_detail_per_type} 条")
|
|
if counts_only:
|
|
lines.append(f"(本期命中超 {max_total} 条,仅列计数,明细见分析库 comparison_record)")
|
|
return "\n".join(lines)
|