deeper log model
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user