From d324dd7aedbee7fb03411e4c651a27b1a77a42bf Mon Sep 17 00:00:00 2001 From: OG T Date: Thu, 9 Apr 2026 23:32:51 +0800 Subject: [PATCH] =?UTF-8?q?fix(telegram):=20=E7=A7=BB=E9=99=A4=E6=89=80?= =?UTF-8?q?=E6=9C=89=E5=91=8A=E8=AD=A6=E8=A8=8A=E6=81=AF=E6=AC=84=E4=BD=8D?= =?UTF-8?q?=E6=88=AA=E6=96=B7=E9=99=90=E5=88=B6=EF=BC=8C=E6=94=BE=E5=AF=AC?= =?UTF-8?q?=E8=87=B3=20Telegram=204096=20=E5=AD=97=E5=85=83=E7=A1=AC?= =?UTF-8?q?=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 問題:root_cause[:50/100]、suggested_action[:80]、suggestion[:50]、 note[:150]、fix_action[:100]、impact[:150]、hypothesis[:200] 以及 message[:900]/[:1000] 導致告警內容顯示不完整。 修復:移除欄位截斷,整體上限改為 4096(Telegram API 硬限制)。 Co-Authored-By: Claude Sonnet 4.6 --- apps/api/src/services/telegram_gateway.py | 28 +++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/apps/api/src/services/telegram_gateway.py b/apps/api/src/services/telegram_gateway.py index 6d71fde1..a55e035b 100644 --- a/apps/api/src/services/telegram_gateway.py +++ b/apps/api/src/services/telegram_gateway.py @@ -221,9 +221,9 @@ class TelegramMessage: signoz_block = f"━━━━━━━━━━━━━━━━━━━\n{self.signoz_metrics.format()}\n" # HTML 轉義用戶輸入內容,防止 "Can't parse entities" 錯誤 - safe_resource = html.escape(self.resource_name[:35]) - safe_root_cause = html.escape(self.root_cause[:100]) - safe_action = html.escape(self.suggested_action[:80]) + safe_resource = html.escape(self.resource_name) + safe_root_cause = html.escape(self.root_cause) + safe_action = html.escape(self.suggested_action) safe_downtime = html.escape(self.estimated_downtime) # 2026-03-29 ogt: AI Token/Cost 顯示 @@ -315,7 +315,7 @@ class TelegramMessage: f"🔍 SignOz Trace" ) - return message[:900] # 900 字元上限 (nemotron 版用 1000,因有額外 tool 區塊) + return message[:4096] # Telegram 硬限制 def format_with_nemotron(self) -> str: """ @@ -372,9 +372,9 @@ class TelegramMessage: incident_id = f"INC-{self.approval_id[:8].upper()}" # HTML 轉義 - safe_resource = html.escape(self.resource_name[:35]) - safe_root_cause = html.escape(self.root_cause[:100]) - safe_action = html.escape(self.suggested_action[:80]) + safe_resource = html.escape(self.resource_name) + safe_root_cause = html.escape(self.root_cause) + safe_action = html.escape(self.suggested_action) safe_downtime = html.escape(self.estimated_downtime) # AI Provider 顯示 @@ -451,7 +451,7 @@ class TelegramMessage: f"⏱️ 停機: {safe_downtime}" ) - return message[:1000] + return message[:4096] # Telegram 硬限制 # ============================================================================= @@ -561,7 +561,7 @@ class ResourceWarnMessage: suggestion_block = "" if self.suggestion: - suggestion_block = f"💡 建議: {html.escape(self.suggestion[:50])}\n" + suggestion_block = f"💡 建議: {html.escape(self.suggestion)}\n" message = ( f"═══════════════════════════\n" @@ -1072,17 +1072,17 @@ class InfraAlertMessage: """格式化為 Telegram HTML""" # 有 note 表示「資訊性提示」,不顯示修復區塊 if self.note: - footer = f"━━━━━━━━━━━━━━━━━━━\n💡 {html.escape(self.note[:150])}\n" + footer = f"━━━━━━━━━━━━━━━━━━━\n💡 {html.escape(self.note)}\n" elif self.auto_fixed: - footer = f"━━━━━━━━━━━━━━━━━━━\n✅ 已自動修復\n└ {html.escape(self.fix_action[:100])}\n" + footer = f"━━━━━━━━━━━━━━━━━━━\n✅ 已自動修復\n└ {html.escape(self.fix_action)}\n" else: - footer = f"━━━━━━━━━━━━━━━━━━━\n⚠️ 需要關注\n└ {html.escape(self.fix_action[:100] or '請確認元件狀態')}\n" + footer = f"━━━━━━━━━━━━━━━━━━━\n⚠️ 需要關注\n└ {html.escape(self.fix_action or '請確認元件狀態')}\n" return ( f"🚨 基礎設施異常\n" f"━━━━━━━━━━━━━━━━━━━\n" f"⚙️ {html.escape(self.component)}: {html.escape(self.status)}\n" - f"📛 影響: {html.escape(self.impact[:150])}\n" + f"📛 影響: {html.escape(self.impact)}\n" f"{footer}" )[:900] @@ -2627,7 +2627,7 @@ class TelegramGateway: lines += [ f"", f"🤖 AI 分析 ({html.escape(dc.model_used)})", - f"💡 {html.escape(dc.hypothesis[:200])}{'...' if len(dc.hypothesis) > 200 else ''}", + f"💡 {html.escape(dc.hypothesis)}", f"📈 信心: [{confidence_bar}] {dc.confidence:.0%}", ] if dc.probable_root_causes: