refactor: simplify earth bgp fallback and geography helpers
This commit is contained in:
@@ -19,7 +19,6 @@ from app.models.bgp_anomaly import BGPAnomaly
|
||||
from app.models.bgp_incident import BGPIncident
|
||||
from app.models.collected_data import CollectedData
|
||||
from app.services.bgp_collectors import build_bgp_collector_coverage
|
||||
from app.services.bgp_enrichment import _lookup_prefix_geography
|
||||
from app.services.cable_graph import build_graph_from_data, CableGraph, haversine_distance
|
||||
from app.services.collectors.bgp_common import RIPE_RIS_COLLECTOR_COORDS
|
||||
|
||||
@@ -437,44 +436,9 @@ async def build_anomaly_geography_hints(
|
||||
) -> Dict[str, Dict[str, Any]]:
|
||||
hints: Dict[str, Dict[str, Any]] = {}
|
||||
for record in records:
|
||||
evidence = record.evidence or {}
|
||||
key = str(record.entity_key or record.id)
|
||||
|
||||
prefix_geo_regions = []
|
||||
prefix_regions = []
|
||||
asn_regions = []
|
||||
evidence_prefix_geography = evidence.get("prefix_geography") or {}
|
||||
prefix_geo_regions.extend(
|
||||
_normalize_geo_regions(evidence_prefix_geography.get("regions") or [])
|
||||
)
|
||||
|
||||
prefix_scope = evidence.get("prefix_scope") or {}
|
||||
prefix_regions.extend(_normalize_geo_regions(prefix_scope.get("regions") or []))
|
||||
|
||||
for profile_key in ("origin_asn_profile", "new_origin_asn_profile"):
|
||||
profile = evidence.get(profile_key) or {}
|
||||
latitude = profile.get("latitude")
|
||||
longitude = profile.get("longitude")
|
||||
if isinstance(latitude, (int, float)) and isinstance(longitude, (int, float)):
|
||||
asn_regions.append(
|
||||
{
|
||||
"country": profile.get("country"),
|
||||
"city": profile.get("city"),
|
||||
"latitude": float(latitude),
|
||||
"longitude": float(longitude),
|
||||
}
|
||||
)
|
||||
|
||||
prefix_geo_regions = _normalize_geo_regions(prefix_geo_regions)
|
||||
prefix_regions = _normalize_geo_regions(prefix_regions)
|
||||
asn_regions = _normalize_geo_regions(asn_regions)
|
||||
|
||||
if prefix_geo_regions:
|
||||
hints[key] = {"regions": prefix_geo_regions, "geography_mode": "prefix_geography"}
|
||||
elif prefix_regions:
|
||||
hints[key] = {"regions": prefix_regions, "geography_mode": "prefix_scope"}
|
||||
elif asn_regions:
|
||||
hints[key] = {"regions": asn_regions, "geography_mode": "asn_region"}
|
||||
hint = _extract_evidence_geography_hint(record.evidence or {})
|
||||
if hint:
|
||||
hints[str(record.entity_key or record.id)] = hint
|
||||
|
||||
return hints
|
||||
|
||||
@@ -597,6 +561,46 @@ def _normalize_geo_regions(regions: List[Dict[str, Any]]) -> List[Dict[str, Any]
|
||||
return normalized
|
||||
|
||||
|
||||
def _extract_evidence_geography_hint(evidence: Dict[str, Any]) -> Dict[str, Any] | None:
|
||||
prefix_geo_regions = []
|
||||
prefix_regions = []
|
||||
asn_regions = []
|
||||
|
||||
evidence_prefix_geography = evidence.get("prefix_geography") or {}
|
||||
prefix_geo_regions.extend(
|
||||
_normalize_geo_regions(evidence_prefix_geography.get("regions") or [])
|
||||
)
|
||||
|
||||
prefix_scope = evidence.get("prefix_scope") or {}
|
||||
prefix_regions.extend(_normalize_geo_regions(prefix_scope.get("regions") or []))
|
||||
|
||||
for profile_key in ("origin_asn_profile", "new_origin_asn_profile"):
|
||||
profile = evidence.get(profile_key) or {}
|
||||
latitude = profile.get("latitude")
|
||||
longitude = profile.get("longitude")
|
||||
if isinstance(latitude, (int, float)) and isinstance(longitude, (int, float)):
|
||||
asn_regions.append(
|
||||
{
|
||||
"country": profile.get("country"),
|
||||
"city": profile.get("city"),
|
||||
"latitude": float(latitude),
|
||||
"longitude": float(longitude),
|
||||
}
|
||||
)
|
||||
|
||||
prefix_geo_regions = _normalize_geo_regions(prefix_geo_regions)
|
||||
prefix_regions = _normalize_geo_regions(prefix_regions)
|
||||
asn_regions = _normalize_geo_regions(asn_regions)
|
||||
|
||||
if prefix_geo_regions:
|
||||
return {"regions": prefix_geo_regions, "geography_mode": "prefix_geography"}
|
||||
if prefix_regions:
|
||||
return {"regions": prefix_regions, "geography_mode": "prefix_scope"}
|
||||
if asn_regions:
|
||||
return {"regions": asn_regions, "geography_mode": "asn_region"}
|
||||
return None
|
||||
|
||||
|
||||
async def build_incident_geography_hints(
|
||||
db: AsyncSession,
|
||||
records: List[BGPIncident],
|
||||
@@ -624,53 +628,33 @@ async def build_incident_geography_hints(
|
||||
|
||||
hints: Dict[str, Dict[str, Any]] = {}
|
||||
for record in records:
|
||||
prefix_geo_regions: list[dict[str, Any]] = []
|
||||
prefix_regions: list[dict[str, Any]] = []
|
||||
asn_regions: list[dict[str, Any]] = []
|
||||
merged_hint: Dict[str, Any] | None = None
|
||||
priority = {"prefix_geography": 3, "prefix_scope": 2, "asn_region": 1}
|
||||
|
||||
for ref in record.evidence_refs or []:
|
||||
anomaly = anomaly_by_key.get(str(ref))
|
||||
if anomaly is None:
|
||||
continue
|
||||
evidence = anomaly.evidence or {}
|
||||
if not prefix_geo_regions:
|
||||
prefix_geography = evidence.get("prefix_geography") or {}
|
||||
prefix_geo_regions.extend(_normalize_geo_regions(prefix_geography.get("regions") or []))
|
||||
prefix_scope = evidence.get("prefix_scope") or {}
|
||||
prefix_regions.extend(_normalize_geo_regions(prefix_scope.get("regions") or []))
|
||||
hint = _extract_evidence_geography_hint(anomaly.evidence or {})
|
||||
if hint is None:
|
||||
continue
|
||||
if merged_hint is None:
|
||||
merged_hint = {
|
||||
"regions": list(hint["regions"]),
|
||||
"geography_mode": hint["geography_mode"],
|
||||
}
|
||||
continue
|
||||
if priority[hint["geography_mode"]] > priority[merged_hint["geography_mode"]]:
|
||||
merged_hint = {
|
||||
"regions": list(hint["regions"]),
|
||||
"geography_mode": hint["geography_mode"],
|
||||
}
|
||||
elif priority[hint["geography_mode"]] == priority[merged_hint["geography_mode"]]:
|
||||
merged_hint["regions"].extend(hint["regions"])
|
||||
|
||||
for key in ("origin_asn_profile", "new_origin_asn_profile"):
|
||||
profile = evidence.get(key) or {}
|
||||
latitude = profile.get("latitude")
|
||||
longitude = profile.get("longitude")
|
||||
if isinstance(latitude, (int, float)) and isinstance(longitude, (int, float)):
|
||||
asn_regions.append(
|
||||
{
|
||||
"country": profile.get("country"),
|
||||
"city": profile.get("city"),
|
||||
"latitude": float(latitude),
|
||||
"longitude": float(longitude),
|
||||
}
|
||||
)
|
||||
|
||||
prefix_geo_regions = _normalize_geo_regions(prefix_geo_regions)
|
||||
prefix_regions = _normalize_geo_regions(prefix_regions)
|
||||
asn_regions = _normalize_geo_regions(asn_regions)
|
||||
if prefix_geo_regions:
|
||||
hints[record.incident_key] = {
|
||||
"regions": prefix_geo_regions,
|
||||
"geography_mode": "prefix_geography",
|
||||
}
|
||||
elif prefix_regions:
|
||||
hints[record.incident_key] = {
|
||||
"regions": prefix_regions,
|
||||
"geography_mode": "prefix_scope",
|
||||
}
|
||||
elif asn_regions:
|
||||
hints[record.incident_key] = {
|
||||
"regions": asn_regions,
|
||||
"geography_mode": "asn_region",
|
||||
}
|
||||
if merged_hint:
|
||||
merged_hint["regions"] = _normalize_geo_regions(merged_hint["regions"])
|
||||
hints[record.incident_key] = merged_hint
|
||||
|
||||
return hints
|
||||
|
||||
|
||||
Reference in New Issue
Block a user