atlasbot: gate metric keys by token overlap

This commit is contained in:
Brad Stein 2026-02-03 23:58:54 -03:00
parent 692b059b52
commit ed038ebb8d

View File

@ -1431,6 +1431,8 @@ async def _select_metric_chunks(
selected = _parse_key_list(raw, available_keys, max_keys) selected = _parse_key_list(raw, available_keys, max_keys)
if candidate_keys: if candidate_keys:
selected = _merge_metric_keys(selected, candidate_keys, max_keys) selected = _merge_metric_keys(selected, candidate_keys, max_keys)
if selected and candidate_keys and not _metric_key_overlap(selected, token_set):
selected = candidate_keys[:max_keys]
if not selected and candidate_keys: if not selected and candidate_keys:
selected = candidate_keys[:max_keys] selected = candidate_keys[:max_keys]
if available_keys: if available_keys:
@ -1582,6 +1584,17 @@ def _filter_metric_keys(keys: list[str], tokens: set[str]) -> list[str]:
return [item[1] for item in ranked] return [item[1] for item in ranked]
def _metric_key_overlap(keys: list[str], tokens: set[str]) -> bool:
if not keys or not tokens:
return False
lowered_tokens = {token.lower() for token in tokens if token and len(token) >= TOKEN_MIN_LEN}
for key in keys:
parts = [part for part in re.split(r"[_\\W]+", key.lower()) if part]
if set(parts) & lowered_tokens:
return True
return False
def _lines_for_metric_keys(lines: list[str], keys: list[str], max_lines: int = 0) -> list[str]: def _lines_for_metric_keys(lines: list[str], keys: list[str], max_lines: int = 0) -> list[str]:
if not lines or not keys: if not lines or not keys:
return [] return []