server(alarms): honor ExcludeAttributes GR-only contract; warn on empty config-only watch-list

This commit is contained in:
Joseph Doherty
2026-06-13 10:12:58 -04:00
parent f7ccfd678e
commit 3ccf0b5f9e
2 changed files with 88 additions and 8 deletions
@@ -87,12 +87,19 @@ public sealed class AlarmWatchListResolver : IAlarmWatchListResolver
ordered.Add((include, DeriveSourceObject(include)));
}
// Remove excluded references (case-insensitive). Excludes are rare, so a
// per-entry lookup against a small set is fine.
HashSet<string> excluded = new(discovery.ExcludeAttributes, StringComparer.OrdinalIgnoreCase);
if (excluded.Count > 0)
// Remove excluded references (case-insensitive), but only when GR discovery
// is active. ExcludeAttributes is documented as "Ignored when
// UseGalaxyRepository is false" (AlarmDiscoveryOptions.ExcludeAttributes).
// Whitespace-only entries are skipped, consistent with the include guard above.
if (discovery.UseGalaxyRepository)
{
ordered.RemoveAll(e => excluded.Contains(e.Reference));
HashSet<string> excluded = new(
discovery.ExcludeAttributes.Where(e => !string.IsNullOrWhiteSpace(e)),
StringComparer.OrdinalIgnoreCase);
if (excluded.Count > 0)
{
ordered.RemoveAll(e => excluded.Contains(e.Reference));
}
}
// 2. Resolve subtag names with safe fallbacks.
@@ -123,13 +130,16 @@ public sealed class AlarmWatchListResolver : IAlarmWatchListResolver
});
}
// 5. Report the resolved count; warn if subtag mode would cover nothing.
if (targets.Count == 0 && discovery.UseGalaxyRepository)
// 5. Report the resolved count; warn when subtag mode was expected to cover
// something (GR enabled, or explicit includes were configured) but resolved
// to nothing. Only emit the Debug line when there is at least one target,
// to avoid a confusing "0 target(s)" noise line.
if (targets.Count == 0 && (discovery.UseGalaxyRepository || discovery.IncludeAttributes.Length > 0))
{
_logger.LogWarning(
"Alarm subtag watch-list resolved to zero targets; subtag-polling fallback will cover no alarms.");
}
else
else if (targets.Count > 0)
{
_logger.LogDebug("Resolved alarm subtag watch-list with {TargetCount} target(s).", targets.Count);
}