Merge branch 'feat/m42-gatewayhygiene-admin-memory-tier-log' into dev
CI / Backend (build / vet / test / cross-compile) (push) Has been cancelled
CI / Frontend (tsc + vite build) (push) Has been cancelled

This commit is contained in:
AskaEth committed 2026-10-26 14:08:57 +08:00
commit 6be76f1665
9 files changed
+831 -13

No files matched your search

+21 -1
View File
@@ -62,7 +62,27 @@ func IsSecretKey(key string) bool {
// to maxSummaryRunes, so a published string can never carry a secret or an
// unbounded blob.
func RedactText(s string) string {
return truncate(redactSecrets(s), maxSummaryRunes)
return RedactTextLimited(s, maxSummaryRunes)
}
// RedactTextLimited 是 RedactText 的**带上限**形态:同一套凭据形状清洗,截断长度
// 由调用方给。它存在的理由是两个读面要的不是同一种东西 ——
//
// - **出图 / 摘要面**(span props、事件正文、工具结果摘要)要的是摘要 ⇒
// `maxSummaryRunes`(80)足够,且保证一屏可读。这些调用方继续用 `RedactText`;
// - **日志面**(`GET /admin/observability/logs` 的一行)要的是**可排障的全文** ⇒
// 80 会把长错误行拦腰截断,等于丢掉诊断信息。
//
// 但它绝不接受「无上限散用」:一条日志可能是 `%v` 出来的 MiB 级对象,原样塞进
// JSON 响应会撑爆面板的帧与响应体。因此上限**必须由调用方显式给出**并写清理由
// (网关侧见 `maxLogMsgRunes`)。
//
// limit <= 0 表示**不截断**(只打码),留给「体积已由自己界定」的调用方。
//
// 🔴 清洗逻辑仍然只有一份(redactSecrets):上限是参数,不是第二条脱敏路径 ——
// 另写一套必然漂移,而漂移的方向总是「其中一面开始原样吐凭据」。
func RedactTextLimited(s string, limit int) string {
return truncate(redactSecrets(s), limit)
}
// RedactEvent returns ev with every string value — including those nested in maps