fix: 合并应用子版相反命中时按 apmPriority 例外优先裁决

getHybridDefaultOrigin 原先对合并应用子版采用「spark 先于 apm」短路返回,
当 sparkApp 命中 sparkPriority 且 apmApp 命中 apmPriority(方向相反)时,
会错误返回 spark,违反 priority-config.json 中 apmPriority「例外优先」语义。
改为先收集两子版命中结果,方向相反时让 apm 胜出;仅单子版命中或同向时
维持原行为。已用 Node 复现验证(相反命中返回 apm、对照旧逻辑返回 spark)。
This commit is contained in:
xiyidaiwa
2026-08-10 08:27:18 +08:00
parent 7ac1b2f0b6
commit 9247fe8e63
+12 -14
View File
@@ -180,6 +180,7 @@ function matchPriority(app: App): "apm" | "spark" | null {
* 获取混合模式下应用的默认优先来源(即「应用配置优先级」)。
* 对合并应用,依次用顶层标识、sparkApp、apmApp 去匹配优先级配置,
* 任一来源命中即生效(避免顶层 pkgname 取自某一子版而漏掉另一子版的规则)。
* 若两子版方向相反命中,遵从 apmPriority「例外优先」语义让 apm 胜出。
* 均不命中时回退到 HYBRID_DEFAULT_PRIORITY(默认优先 APM)。
* @param app 应用信息
* @returns "apm" 或 "spark"
@@ -193,20 +194,17 @@ export function getHybridDefaultOrigin(app: App): "apm" | "spark" {
// 回退使用顶层 app.category 参与分类规则匹配,避免漏匹配。
if (app.isMerged) {
const fallbackCategory = app.category;
if (app.sparkApp) {
const sparkCandidate: App = app.sparkApp.category
? app.sparkApp
: { ...app.sparkApp, category: fallbackCategory };
const r = matchPriority(sparkCandidate);
if (r) return r;
}
if (app.apmApp) {
const apmCandidate: App = app.apmApp.category
? app.apmApp
: { ...app.apmApp, category: fallbackCategory };
const r = matchPriority(apmCandidate);
if (r) return r;
}
// 构造 category 回退顶层的候选项,避免子版 category 为空时分类规则漏匹配
const toCandidate = (sub: App): App =>
sub.category ? sub : { ...sub, category: fallbackCategory };
const sparkHit = app.sparkApp ? matchPriority(toCandidate(app.sparkApp)) : null;
const apmHit = app.apmApp ? matchPriority(toCandidate(app.apmApp)) : null;
// apmPriority 是「例外优先于 sparkPriority」:当两子版方向相反命中
//sparkApp 命中 spark 且 apmApp 命中 apm)时,按配置语义让 apm 胜出。
if (sparkHit === "spark" && apmHit === "apm") return "apm";
if (sparkHit) return sparkHit;
if (apmHit) return apmHit;
}
// 默认行为:与 HYBRID_DEFAULT_PRIORITY 保持一致(默认优先 APM)