deeper log model

This commit is contained in:
Jake Kasper
2026-04-27 13:42:49 -04:00
parent 9ac96cee9a
commit e62f46b68c
17 changed files with 670 additions and 47 deletions

View File

@@ -41,7 +41,7 @@ async def _get_alertmanager_alerts(cluster: dict) -> list:
name = labels.get("alertname", "Unknown")
summary = annotations.get("summary", annotations.get("description", ""))
nf_name = _infer_nf(name, summary, labels.get("instance", ""))
nodes = cluster_inventory.find_nf_nodes(cluster, nf_name) if nf_name else []
nodes = _resolve_nodes(cluster, labels, name, summary, nf_name)
alerts.append({
"name": name,
"severity": labels.get("severity", "warning"),
@@ -107,7 +107,70 @@ def _severity_rank(severity: str | None) -> int:
def _infer_nf(name: str, summary: str, instance: str) -> str:
text = f"{name} {summary} {instance}".upper()
for nf_name in ["AMF", "SMF", "UPF", "UDM", "UDR", "NRF", "AUSF", "PCF", "MME", "SGWC", "DRA", "DSM"]:
for nf_name in ["AMF", "SMF", "UPF", "UDM", "UDR", "NRF", "AUSF", "PCF", "MME", "SGWC", "DRA", "DSM", "AAA", "BMSC", "CHF", "SMSF", "EIR"]:
if nf_name in text:
return nf_name
return ""
def _resolve_nodes(cluster: dict, labels: dict, name: str, summary: str, nf_name: str) -> list:
nodes = cluster.get("nodes", [])
if not nodes:
return []
search_parts = [name, summary]
for key in ("instance", "job", "service", "container", "hostname", "node", "pod"):
value = labels.get(key)
if value:
search_parts.append(value)
search_text = " ".join(search_parts).upper()
explicit = []
for node in nodes:
hostname = str(node.get("hostname", ""))
address = str(node.get("address", ""))
node_name = str(node.get("name", ""))
if any(token and token.upper() in search_text for token in (hostname, address, node_name)):
explicit.append(_node_ref(node))
if explicit:
return _dedupe_nodes(explicit)
if nf_name:
nf_nodes = cluster_inventory.find_nf_nodes(cluster, nf_name)
if nf_nodes:
return nf_nodes
service_matches = []
for node in nodes:
started = {str(service).upper() for service in node.get("started_services", [])}
if any(service and service in search_text for service in started):
service_matches.append(_node_ref(node))
if service_matches:
return _dedupe_nodes(service_matches)
current = next((node for node in nodes if node.get("current")), None)
if current and labels.get("instance", "").startswith(("127.0.0.1", "localhost")):
return [_node_ref(current)]
return []
def _node_ref(node: dict) -> dict:
return {
"hostname": node.get("hostname", ""),
"address": node.get("address", ""),
"role": node.get("role", "AP"),
"current": node.get("current", False),
}
def _dedupe_nodes(nodes: list[dict]) -> list[dict]:
seen = set()
result = []
for node in nodes:
key = (node.get("hostname"), node.get("address"))
if key in seen:
continue
seen.add(key)
result.append(node)
return result