From e5fec8ba3d497de4575930980d8d934185fa6b0e Mon Sep 17 00:00:00 2001 From: linkong Date: Thu, 2 Apr 2026 15:36:20 +0800 Subject: [PATCH] fix: stabilize earth bgp geography and rendering --- TODO.md | 16 +- VERSION | 2 +- backend/app/api/v1/visualization.py | 284 ++++++++++++-- backend/app/core/countries.py | 31 ++ backend/app/core/data_sources.py | 1 + backend/app/core/data_sources.yaml | 3 + backend/app/core/datasource_defaults.py | 7 + backend/app/services/bgp_collectors.py | 11 + backend/app/services/bgp_detectors.py | 185 ++++++++- backend/app/services/bgp_enrichment.py | 95 ++++- backend/app/services/bgp_incidents.py | 33 +- backend/app/services/collectors/__init__.py | 2 + backend/app/services/collectors/bgp_common.py | 31 +- backend/app/services/collectors/iptoasn.py | 111 ++++++ backend/tests/test_bgp.py | 371 +++++++++++++++++- docs/CHANGELOG.md | 43 ++ docs/bgp-context.md | 126 +++++- docs/prefix-geography-plan.md | 216 ++++++++++ frontend/index.html | 2 +- frontend/package-lock.json | 18 +- frontend/package.json | 2 +- .../public/earth/assets/earth_clouds_1024.png | Bin 0 -> 260222 bytes frontend/public/earth/js/bgp.js | 327 ++++++++++++--- frontend/public/earth/js/constants.js | 4 + frontend/public/earth/js/earth.js | 2 +- pyproject.toml | 2 +- 26 files changed, 1788 insertions(+), 137 deletions(-) create mode 100644 backend/app/services/collectors/iptoasn.py create mode 100644 docs/prefix-geography-plan.md create mode 100644 frontend/public/earth/assets/earth_clouds_1024.png diff --git a/TODO.md b/TODO.md index 30196ef1..207754a2 100644 --- a/TODO.md +++ b/TODO.md @@ -1,4 +1,16 @@ # TODO -- [ ] 把 BGP 观测站和异常点的 `hover/click` 手感再磨细一点 -- [ ] 开始做 BGP 异常和海缆/区域的关联展示 +- [x] 把 BGP 观测站和异常点的 `hover/click` 手感再磨细一点 +- [x] 开始做 BGP 异常和海缆/区域的关联展示 +- [x] 做 Earth 侧的 `BGP activity layer`,让低 incident 密度时地图仍然有持续可感知的观测存在感 +- [x] 给 Earth BGP 补三层状态表达:`平稳观测态 / 局部波动态 / 事件活跃态` +- [x] 把“当前无活跃事件”改造成“观测网络仍在运行、当前未发现聚合级事件”的状态表达 +- [x] 做 collector / region 近 15 分钟 activity score 聚合接口或动态聚合逻辑 +- [x] 把 Earth 的 BGP incident 改成 `紧凑事件核 + 向外扩张环形 pulse`,替换当前大面积 glow +- [x] 为 BGP incident 建立符号系统:按事件类型用不同 marker,而不是都用同一种亮点 +- [x] 把 incident 地理定位从 `collector-centric` 改成 `prefix-centric`,优先使用 `prefix_geography`,其次 `prefix_scope`,再次 ASN 区域,最后才回退到观测区域质心 +- [x] 新增 `prefix_geography` 数据层,不再把 `prefix_scope` 当成 prefix 地理归属本身 +- [x] 接入 `IPtoASN / IPtoCountry` 作为 prefix-centric geography 的主数据源 +- [ ] 接入 `OpenGeoFeed` 作为 prefix geography 的高质量覆盖/override 数据源 +- [ ] 把 RIR delegated / `inetnum` / `inet6num` whois 设计成 prefix geography 的 fallback,而不是主来源 +- [x] 在 activity layer 之后继续补 `route leak` 和 `path instability / flap` detector diff --git a/VERSION b/VERSION index 6b9f278d..0eda0deb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.22.9 +0.22.10 diff --git a/backend/app/api/v1/visualization.py b/backend/app/api/v1/visualization.py index e0370657..bda38dec 100644 --- a/backend/app/api/v1/visualization.py +++ b/backend/app/api/v1/visualization.py @@ -5,6 +5,7 @@ Returns GeoJSON format compatible with Three.js, CesiumJS, and Unreal Cesium. """ from datetime import UTC, datetime +import math from fastapi import APIRouter, HTTPException, Depends, Query from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select, func @@ -18,7 +19,8 @@ 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.cable_graph import build_graph_from_data, CableGraph +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 router = APIRouter() @@ -316,11 +318,16 @@ def convert_gpu_cluster_to_geojson(records: List[CollectedData]) -> Dict[str, An return {"type": "FeatureCollection", "features": features} -def convert_bgp_anomalies_to_geojson(records: List[BGPAnomaly]) -> Dict[str, Any]: +def convert_bgp_anomalies_to_geojson( + records: List[BGPAnomaly], + geography_hints: Optional[Dict[str, Dict[str, Any]]] = None, +) -> Dict[str, Any]: features = [] + geography_hints = geography_hints or {} for record in records: evidence = record.evidence or {} + hint = geography_hints.get(str(record.entity_key or record.id), {}) collectors = evidence.get("collectors") or record.peer_scope or [] if not collectors: nested = evidence.get("events") or [] @@ -334,23 +341,6 @@ def convert_bgp_anomalies_to_geojson(records: List[BGPAnomaly]) -> Dict[str, Any if not collectors: collectors = [] - collector = collectors[0] if collectors else None - location = None - if collector: - location = RIPE_RIS_COLLECTOR_COORDS.get(str(collector)) - - if location is None: - nested = evidence.get("events") or [] - for item in nested: - collector_name = (item or {}).get("collector") - if collector_name and collector_name in RIPE_RIS_COLLECTOR_COORDS: - location = RIPE_RIS_COLLECTOR_COORDS[collector_name] - collector = collector_name - break - - if location is None: - continue - as_path = [] if isinstance(evidence.get("as_path"), list): as_path = evidence.get("as_path") or [] @@ -385,6 +375,28 @@ def convert_bgp_anomalies_to_geojson(records: List[BGPAnomaly]) -> Dict[str, Any } ) + geography_regions = _normalize_geo_regions(hint.get("regions") or []) + geography_mode = hint.get("geography_mode") or "collector_centroid" + + collector = collectors[0] if collectors else None + location = geography_regions[0] if geography_regions else None + + if location is None and collector: + location = RIPE_RIS_COLLECTOR_COORDS.get(str(collector)) + + if location is None: + nested = evidence.get("events") or [] + for item in nested: + collector_name = (item or {}).get("collector") + if collector_name and collector_name in RIPE_RIS_COLLECTOR_COORDS: + location = RIPE_RIS_COLLECTOR_COORDS[collector_name] + collector = collector_name + geography_mode = "collector_centroid" + break + + if location is None: + continue + features.append( { "type": "Feature", @@ -408,6 +420,7 @@ def convert_bgp_anomalies_to_geojson(records: List[BGPAnomaly]) -> Dict[str, Any "collector_count": len(collectors) or 1, "as_path": as_path, "impacted_regions": impacted_regions, + "geography_mode": geography_mode, "confidence": record.confidence, "summary": record.summary, "created_at": to_iso8601_utc(record.created_at), @@ -418,6 +431,54 @@ def convert_bgp_anomalies_to_geojson(records: List[BGPAnomaly]) -> Dict[str, Any return {"type": "FeatureCollection", "features": features} +async def build_anomaly_geography_hints( + db: AsyncSession, + records: List[BGPAnomaly], +) -> 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"} + + return hints + + def convert_bgp_collectors_to_geojson( coverage_by_collector: Dict[str, Dict[str, Any]] | None = None, ) -> Dict[str, Any]: @@ -442,8 +503,10 @@ def convert_bgp_collectors_to_geojson( "prefix_count": coverage.get("prefix_count", 0), "origin_asn_count": coverage.get("origin_asn_count", 0), "peer_asn_count": coverage.get("peer_asn_count", 0), + "recent_15m_observation_count": coverage.get("recent_15m_observation_count", 0), "recent_24h_observation_count": coverage.get("recent_24h_observation_count", 0), "recent_7d_observation_count": coverage.get("recent_7d_observation_count", 0), + "recent_15m_prefix_count": coverage.get("recent_15m_prefix_count", 0), "recent_24h_prefix_count": coverage.get("recent_24h_prefix_count", 0), "recent_7d_prefix_count": coverage.get("recent_7d_prefix_count", 0), "top_event_types": coverage.get("top_event_types", []), @@ -463,33 +526,183 @@ def convert_bgp_collectors_to_geojson( return {"type": "FeatureCollection", "features": features} -def convert_bgp_incidents_to_geojson(records: List[BGPIncident]) -> Dict[str, Any]: +def _incident_estimated_center(valid_regions: List[Dict[str, Any]]) -> Dict[str, float]: + x = 0.0 + y = 0.0 + z = 0.0 + for region in valid_regions: + lat_rad = math.radians(float(region["latitude"])) + lon_rad = math.radians(float(region["longitude"])) + x += math.cos(lat_rad) * math.cos(lon_rad) + y += math.cos(lat_rad) * math.sin(lon_rad) + z += math.sin(lat_rad) + + total = float(len(valid_regions)) + if total <= 0: + return {"latitude": 0.0, "longitude": 0.0} + + x /= total + y /= total + z /= total + hyp = math.sqrt((x * x) + (y * y)) + if hyp == 0: + return {"latitude": 0.0, "longitude": 0.0} + + return { + "latitude": math.degrees(math.atan2(z, hyp)), + "longitude": math.degrees(math.atan2(y, x)), + } + + +def _incident_estimated_radius_km(center: Dict[str, float], valid_regions: List[Dict[str, Any]]) -> float: + center_coords = (float(center["longitude"]), float(center["latitude"])) + distances = [ + haversine_distance( + center_coords, + (float(region["longitude"]), float(region["latitude"])), + ) + for region in valid_regions + ] + return round(max(distances) if distances else 0.0, 1) + + +def _normalize_geo_regions(regions: List[Dict[str, Any]]) -> List[Dict[str, Any]]: + normalized: list[dict[str, Any]] = [] + seen: set[tuple[Any, ...]] = set() + for region in regions: + if not isinstance(region, dict): + continue + latitude = region.get("latitude") + longitude = region.get("longitude") + if not isinstance(latitude, (int, float)) or not isinstance(longitude, (int, float)): + continue + item = { + "collector": region.get("collector"), + "country": region.get("country"), + "city": region.get("city"), + "latitude": float(latitude), + "longitude": float(longitude), + } + key = ( + item["collector"], + item["country"], + item["city"], + item["latitude"], + item["longitude"], + ) + if key in seen: + continue + seen.add(key) + normalized.append(item) + return normalized + + +async def build_incident_geography_hints( + db: AsyncSession, + records: List[BGPIncident], +) -> Dict[str, Dict[str, Any]]: + evidence_refs = sorted( + { + str(ref) + for record in records + for ref in (record.evidence_refs or []) + if ref + } + ) + + anomalies = [] + if evidence_refs: + result = await db.execute( + select(BGPAnomaly).where(BGPAnomaly.entity_key.in_(evidence_refs)) + ) + anomalies = result.scalars().all() + anomaly_by_key = { + str(anomaly.entity_key): anomaly + for anomaly in anomalies + if anomaly.entity_key + } + + 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]] = [] + + 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 [])) + + 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", + } + + return hints + + +def convert_bgp_incidents_to_geojson( + records: List[BGPIncident], + geography_hints: Optional[Dict[str, Dict[str, Any]]] = None, +) -> Dict[str, Any]: features = [] for record in records: - regions = record.affected_regions or [] + hint = (geography_hints or {}).get(record.incident_key, {}) + regions = hint.get("regions") or (record.affected_regions or []) if not regions: continue - valid_regions = [ - region - for region in regions - if isinstance(region, dict) - and isinstance(region.get("latitude"), (int, float)) - and isinstance(region.get("longitude"), (int, float)) - ] + valid_regions = _normalize_geo_regions(regions) if not valid_regions: continue - avg_lat = sum(float(region["latitude"]) for region in valid_regions) / len(valid_regions) - avg_lon = sum(float(region["longitude"]) for region in valid_regions) / len(valid_regions) + estimated_center = _incident_estimated_center(valid_regions) + estimated_radius_km = _incident_estimated_radius_km(estimated_center, valid_regions) features.append( { "type": "Feature", "geometry": { "type": "Point", - "coordinates": [avg_lon, avg_lat], + "coordinates": [ + estimated_center["longitude"], + estimated_center["latitude"], + ], }, "properties": { "id": record.id, @@ -504,6 +717,9 @@ def convert_bgp_incidents_to_geojson(records: List[BGPIncident]) -> Dict[str, An "affected_asns": record.affected_asns or [], "affected_collectors": record.affected_collectors or [], "affected_regions": valid_regions, + "estimated_center": estimated_center, + "estimated_radius_km": estimated_radius_km, + "geography_mode": hint.get("geography_mode") or "collector_centroid", "related_cables": record.related_cables or [], "related_ixps": record.related_ixps or [], "created_at": to_iso8601_utc(record.created_at), @@ -739,7 +955,8 @@ async def get_bgp_anomalies_geojson( result = await db.execute(stmt) records = list(result.scalars().all()) - geojson = convert_bgp_anomalies_to_geojson(records) + geography_hints = await build_anomaly_geography_hints(db, records) + geojson = convert_bgp_anomalies_to_geojson(records, geography_hints) return {**geojson, "count": len(geojson.get("features", []))} @@ -758,7 +975,8 @@ async def get_bgp_incidents_geojson( result = await db.execute(stmt) records = list(result.scalars().all()) - geojson = convert_bgp_incidents_to_geojson(records) + geography_hints = await build_incident_geography_hints(db, records) + geojson = convert_bgp_incidents_to_geojson(records, geography_hints) return {**geojson, "count": len(geojson.get("features", []))} diff --git a/backend/app/core/countries.py b/backend/app/core/countries.py index b1e8bc3c..343cb392 100644 --- a/backend/app/core/countries.py +++ b/backend/app/core/countries.py @@ -232,6 +232,30 @@ for canonical, aliases in COUNTRY_ENTRIES: COUNTRY_ALIAS_MAP[alias.casefold()] = canonical +COUNTRY_CENTROIDS = { + "美国": {"latitude": 39.8283, "longitude": -98.5795}, + "英国": {"latitude": 55.3781, "longitude": -3.4360}, + "荷兰": {"latitude": 52.1326, "longitude": 5.2913}, + "日本": {"latitude": 36.2048, "longitude": 138.2529}, + "德国": {"latitude": 51.1657, "longitude": 10.4515}, + "法国": {"latitude": 46.2276, "longitude": 2.2137}, + "新加坡": {"latitude": 1.3521, "longitude": 103.8198}, + "中国": {"latitude": 35.8617, "longitude": 104.1954}, + "中国(香港)": {"latitude": 22.3193, "longitude": 114.1694}, + "中国(台湾)": {"latitude": 23.6978, "longitude": 120.9605}, + "韩国": {"latitude": 35.9078, "longitude": 127.7669}, + "俄罗斯": {"latitude": 61.5240, "longitude": 105.3188}, + "加拿大": {"latitude": 56.1304, "longitude": -106.3468}, + "澳大利亚": {"latitude": -25.2744, "longitude": 133.7751}, + "巴西": {"latitude": -14.2350, "longitude": -51.9253}, + "南非": {"latitude": -30.5595, "longitude": 22.9375}, + "西班牙": {"latitude": 40.4637, "longitude": -3.7492}, + "意大利": {"latitude": 41.8719, "longitude": 12.5674}, + "瑞士": {"latitude": 46.8182, "longitude": 8.2275}, + "阿联酋": {"latitude": 23.4241, "longitude": 53.8478}, +} + + def normalize_country(value: Any) -> Optional[str]: if value is None: return None @@ -258,6 +282,13 @@ def normalize_country(value: Any) -> Optional[str]: return COUNTRY_ALIAS_MAP.get(lowered) +def get_country_centroid(value: Any) -> Optional[dict[str, float]]: + canonical = normalize_country(value) + if not canonical: + return None + return COUNTRY_CENTROIDS.get(canonical) + + def get_country_search_variants(value: Any) -> list[str]: canonical = normalize_country(value) if canonical is None: diff --git a/backend/app/core/data_sources.py b/backend/app/core/data_sources.py index 6828771e..c677129c 100644 --- a/backend/app/core/data_sources.py +++ b/backend/app/core/data_sources.py @@ -25,6 +25,7 @@ COLLECTOR_URL_KEYS = { "spacetrack_tle": "spacetrack.tle_query_url", "ris_live_bgp": "ris_live.url", "bgpstream_bgp": "bgpstream.url", + "iptoasn_prefix_geo": "iptoasn.combined_url", } diff --git a/backend/app/core/data_sources.yaml b/backend/app/core/data_sources.yaml index 9c64adb4..faacac7c 100644 --- a/backend/app/core/data_sources.yaml +++ b/backend/app/core/data_sources.yaml @@ -43,3 +43,6 @@ ris_live: bgpstream: url: "https://broker.bgpstream.caida.org/v2" + +iptoasn: + combined_url: "https://iptoasn.com/data/ip2asn-combined.tsv.gz" diff --git a/backend/app/core/datasource_defaults.py b/backend/app/core/datasource_defaults.py index cf0e374a..9d44121c 100644 --- a/backend/app/core/datasource_defaults.py +++ b/backend/app/core/datasource_defaults.py @@ -134,6 +134,13 @@ DEFAULT_DATASOURCES = { "priority": "P1", "frequency_minutes": 360, }, + "iptoasn_prefix_geo": { + "id": 23, + "name": "IPtoASN Prefix Geography", + "module": "L3", + "priority": "P1", + "frequency_minutes": 1440, + }, } ID_TO_COLLECTOR = {info["id"]: name for name, info in DEFAULT_DATASOURCES.items()} diff --git a/backend/app/services/bgp_collectors.py b/backend/app/services/bgp_collectors.py index 488730f2..56a7a209 100644 --- a/backend/app/services/bgp_collectors.py +++ b/backend/app/services/bgp_collectors.py @@ -20,6 +20,7 @@ async def build_bgp_collector_coverage( source_filter: tuple[str, ...] | None = None, ) -> list[dict[str, Any]]: now = datetime.now(UTC) + recent_15m_threshold = now - timedelta(minutes=15) recent_24h_threshold = now - timedelta(hours=24) recent_7d_threshold = now - timedelta(days=7) @@ -52,8 +53,10 @@ async def build_bgp_collector_coverage( "event_types": defaultdict(int), "countries": set(), "cities": set(), + "recent_15m_observation_count": 0, "recent_24h_observation_count": 0, "recent_7d_observation_count": 0, + "recent_15m_prefixes": set(), "recent_24h_prefixes": set(), "recent_7d_prefixes": set(), "latest_observed_at": None, @@ -78,6 +81,10 @@ async def build_bgp_collector_coverage( if observed_at.tzinfo else observed_at.replace(tzinfo=UTC) ) + if aware_observed_at >= recent_15m_threshold: + coverage["recent_15m_observation_count"] += 1 + if record.prefix: + coverage["recent_15m_prefixes"].add(record.prefix) if aware_observed_at >= recent_24h_threshold: coverage["recent_24h_observation_count"] += 1 if record.prefix: @@ -116,8 +123,10 @@ async def build_bgp_collector_coverage( "event_types": defaultdict(int), "countries": {location.get("country")} if location.get("country") else set(), "cities": {location.get("city")} if location.get("city") else set(), + "recent_15m_observation_count": 0, "recent_24h_observation_count": 0, "recent_7d_observation_count": 0, + "recent_15m_prefixes": set(), "recent_24h_prefixes": set(), "recent_7d_prefixes": set(), "latest_observed_at": None, @@ -142,8 +151,10 @@ async def build_bgp_collector_coverage( "prefix_count": len(item["prefixes"]), "origin_asn_count": len(item["origin_asns"]), "peer_asn_count": len(item["peer_asns"]), + "recent_15m_observation_count": item["recent_15m_observation_count"], "recent_24h_observation_count": item["recent_24h_observation_count"], "recent_7d_observation_count": item["recent_7d_observation_count"], + "recent_15m_prefix_count": len(item["recent_15m_prefixes"]), "recent_24h_prefix_count": len(item["recent_24h_prefixes"]), "recent_7d_prefix_count": len(item["recent_7d_prefixes"]), "top_event_types": [ diff --git a/backend/app/services/bgp_detectors.py b/backend/app/services/bgp_detectors.py index 39f7e39d..c1263ff8 100644 --- a/backend/app/services/bgp_detectors.py +++ b/backend/app/services/bgp_detectors.py @@ -55,6 +55,11 @@ def _unique_peers(events: list[dict[str, Any]]) -> list[int]: return sorted(peers) +def _path_signature(metadata: dict[str, Any]) -> tuple[int, ...]: + path = metadata.get("as_path") or [] + return tuple(int(asn) for asn in path if asn is not None) + + def detect_origin_change_anomalies( *, source: str, @@ -100,6 +105,7 @@ def detect_origin_change_anomalies( ) sample_metadata = sample_event.get("metadata") or {} sample_enrichment = sample_metadata.get("enrichment") or {} + sample_prefix_geography = sample_enrichment.get("prefix_geography") or {} anomaly_type = "origin_change" severity = "critical" confidence = 0.86 @@ -140,8 +146,10 @@ def detect_origin_change_anomalies( "origin_asn_profile": sample_enrichment.get("origin_asn_profile"), "new_origin_asn_profile": sample_enrichment.get("new_origin_asn_profile"), "rpki_validation": sample_enrichment.get("rpki_validation"), + "prefix_geography": sample_prefix_geography, "prefix_scope": sample_enrichment.get("prefix_scope"), - "impacted_regions": related_regions + "impacted_regions": sample_prefix_geography.get("regions") + or related_regions or sample_enrichment.get("prefix_scope", {}).get("regions", []), }, ) @@ -180,6 +188,7 @@ def detect_more_specific_burst_anomalies( sample = more_specifics[0].get("metadata") or {} sample_enrichment = sample.get("enrichment") or {} + sample_prefix_geography = sample_enrichment.get("prefix_geography") or {} event_count = len(more_specifics) anomalies.append( BGPAnomaly( @@ -205,8 +214,10 @@ def detect_more_specific_burst_anomalies( "unique_prefixes": unique_prefixes, "rpki_validation": sample_enrichment.get("rpki_validation"), "origin_asn_profile": sample_enrichment.get("origin_asn_profile"), + "prefix_geography": sample_prefix_geography, "prefix_scope": sample_enrichment.get("prefix_scope"), - "impacted_regions": _iter_event_regions(more_specifics) + "impacted_regions": sample_prefix_geography.get("regions") + or _iter_event_regions(more_specifics) or sample_enrichment.get("prefix_scope", {}).get("regions", []), }, ) @@ -242,6 +253,7 @@ def detect_mass_withdrawal_anomalies( sample_event = related_events[0] if related_events else {} sample_metadata = sample_event.get("metadata") or {} sample_enrichment = sample_metadata.get("enrichment") or {} + sample_prefix_geography = sample_enrichment.get("prefix_geography") or {} severity = "medium" if count >= 4 or len(related_collectors) >= 3: severity = "high" @@ -277,8 +289,175 @@ def detect_mass_withdrawal_anomalies( ], "origin_asn_profile": sample_enrichment.get("origin_asn_profile"), "rpki_validation": sample_enrichment.get("rpki_validation"), + "prefix_geography": sample_prefix_geography, "prefix_scope": sample_enrichment.get("prefix_scope"), - "impacted_regions": _iter_event_regions(related_events) + "impacted_regions": sample_prefix_geography.get("regions") + or _iter_event_regions(related_events) + or sample_enrichment.get("prefix_scope", {}).get("regions", []), + }, + ) + ) + + return anomalies + + +def detect_route_leak_anomalies( + *, + source: str, + snapshot_id: int | None, + task_id: int | None, + events: list[dict[str, Any]], +) -> list[BGPAnomaly]: + events_by_prefix: defaultdict[str, list[dict[str, Any]]] = defaultdict(list) + for event in events: + metadata = event.get("metadata") or {} + prefix = metadata.get("prefix") + if prefix and metadata.get("event_type") == "announcement": + events_by_prefix[str(prefix)].append(event) + + anomalies: list[BGPAnomaly] = [] + for prefix, related_events in events_by_prefix.items(): + related_collectors = _unique_collectors(related_events) + if len(related_collectors) < 2: + continue + + path_signatures = Counter() + max_path_length = 0 + for event in related_events: + metadata = event.get("metadata") or {} + signature = _path_signature(metadata) + if signature: + path_signatures[signature] += 1 + max_path_length = max(max_path_length, len(signature)) + + if len(path_signatures) < 2: + continue + + dominant_length = len(path_signatures.most_common(1)[0][0]) + if max_path_length < max(dominant_length + 2, 5): + continue + + sample_event = max( + related_events, + key=lambda event: len(_path_signature((event.get("metadata") or {}))), + ) + sample_metadata = sample_event.get("metadata") or {} + sample_enrichment = sample_metadata.get("enrichment") or {} + sample_prefix_geography = sample_enrichment.get("prefix_geography") or {} + peer_scope = related_collectors + path_lengths = sorted({len(signature) for signature in path_signatures if signature}) + + anomalies.append( + BGPAnomaly( + snapshot_id=snapshot_id, + task_id=task_id, + source=source, + anomaly_type="route_leak_candidate", + severity="high" if max_path_length >= dominant_length + 3 else "medium", + status="active", + entity_key=f"route_leak_candidate:{prefix}:{max_path_length}:{len(related_collectors)}", + prefix=prefix, + origin_asn=sample_metadata.get("origin_asn"), + new_origin_asn=None, + peer_scope=peer_scope, + started_at=datetime.now(UTC), + confidence=min(0.58 + (0.05 * min(len(related_collectors), 4)) + (0.03 * min(max_path_length - dominant_length, 4)), 0.88), + summary=( + f"Prefix {prefix} shows divergent long AS paths across " + f"{len(related_collectors)} collectors, suggesting a possible route leak." + ), + evidence={ + "path_lengths": path_lengths, + "dominant_path_length": dominant_length, + "max_path_length": max_path_length, + "path_signatures": [ + {"path": list(signature), "count": count} + for signature, count in path_signatures.most_common(5) + ], + "events": [(item.get("metadata") or {}) for item in related_events[:10]], + "origin_asn_profile": sample_enrichment.get("origin_asn_profile"), + "rpki_validation": sample_enrichment.get("rpki_validation"), + "prefix_geography": sample_prefix_geography, + "prefix_scope": sample_enrichment.get("prefix_scope"), + "impacted_regions": sample_prefix_geography.get("regions") + or _iter_event_regions(related_events) + or sample_enrichment.get("prefix_scope", {}).get("regions", []), + }, + ) + ) + + return anomalies + + +def detect_path_flap_anomalies( + *, + source: str, + snapshot_id: int | None, + task_id: int | None, + events: list[dict[str, Any]], +) -> list[BGPAnomaly]: + events_by_prefix: defaultdict[str, list[dict[str, Any]]] = defaultdict(list) + for event in events: + metadata = event.get("metadata") or {} + prefix = metadata.get("prefix") + if prefix: + events_by_prefix[str(prefix)].append(event) + + anomalies: list[BGPAnomaly] = [] + for prefix, related_events in events_by_prefix.items(): + ordered = sorted( + related_events, + key=lambda event: str((event.get("metadata") or {}).get("timestamp") or ""), + ) + event_types = [str((item.get("metadata") or {}).get("event_type") or "") for item in ordered] + transitions = sum(1 for index in range(1, len(event_types)) if event_types[index] != event_types[index - 1]) + distinct_paths = { + _path_signature(item.get("metadata") or {}) + for item in ordered + if _path_signature(item.get("metadata") or {}) + } + related_collectors = _unique_collectors(ordered) + + if transitions < 3 and len(distinct_paths) < 3: + continue + + sample_metadata = (ordered[0].get("metadata") or {}) if ordered else {} + sample_enrichment = sample_metadata.get("enrichment") or {} + sample_prefix_geography = sample_enrichment.get("prefix_geography") or {} + severity = "medium" + if transitions >= 5 or len(distinct_paths) >= 4: + severity = "high" + + anomalies.append( + BGPAnomaly( + snapshot_id=snapshot_id, + task_id=task_id, + source=source, + anomaly_type="path_flap", + severity=severity, + status="active", + entity_key=f"path_flap:{prefix}:{transitions}:{len(distinct_paths)}", + prefix=prefix, + origin_asn=sample_metadata.get("origin_asn"), + new_origin_asn=None, + peer_scope=related_collectors, + started_at=datetime.now(UTC), + confidence=min(0.54 + (0.05 * min(transitions, 5)) + (0.03 * min(len(distinct_paths), 4)), 0.9), + summary=( + f"Prefix {prefix} shows repeated state/path changes " + f"({transitions} transitions, {len(distinct_paths)} distinct paths) in the current window." + ), + evidence={ + "transitions": transitions, + "event_types": event_types[:12], + "distinct_paths": [list(path) for path in list(distinct_paths)[:6]], + "events": [(item.get("metadata") or {}) for item in ordered[:10]], + "origin_asn_profile": sample_enrichment.get("origin_asn_profile"), + "rpki_validation": sample_enrichment.get("rpki_validation"), + "prefix_geography": sample_prefix_geography, + "prefix_scope": sample_enrichment.get("prefix_scope"), + "impacted_regions": sample_prefix_geography.get("regions") + or _iter_event_regions(ordered) or sample_enrichment.get("prefix_scope", {}).get("regions", []), }, ) diff --git a/backend/app/services/bgp_enrichment.py b/backend/app/services/bgp_enrichment.py index f8e04b65..32cc0fca 100644 --- a/backend/app/services/bgp_enrichment.py +++ b/backend/app/services/bgp_enrichment.py @@ -7,9 +7,10 @@ from collections import defaultdict from datetime import UTC, datetime from typing import Any -from sqlalchemy import select +from sqlalchemy import select, text from sqlalchemy.ext.asyncio import AsyncSession +from app.core.countries import get_country_centroid, normalize_country from app.models.bgp_observation import BGPObservation from app.models.collected_data import CollectedData @@ -96,6 +97,83 @@ def extract_bgp_network_fields(prefix: str) -> dict[str, Any]: } +async def _lookup_prefix_geography( + db: AsyncSession, + prefix_values: list[str], +) -> dict[str, dict[str, Any]]: + results: dict[str, dict[str, Any]] = {} + + for prefix in prefix_values: + try: + network = ipaddress.ip_network(prefix, strict=False) + except ValueError: + continue + + family = f"ipv{network.version}" + range_start = str(network.network_address) + range_end = str(network.broadcast_address) + result = await db.execute( + text( + """ + SELECT metadata + FROM collected_data + WHERE source = 'iptoasn_prefix_geo' + AND COALESCE(is_current, TRUE) = TRUE + AND metadata->>'family' = :family + AND CAST(metadata->>'range_start' AS inet) <= CAST(:range_start AS inet) + AND CAST(metadata->>'range_end' AS inet) >= CAST(:range_end AS inet) + ORDER BY id DESC + LIMIT 1 + """ + ), + { + "family": family, + "range_start": range_start, + "range_end": range_end, + }, + ) + row = result.fetchone() + if not row: + continue + + if isinstance(row, dict): + payload = row.get("metadata") or row.get("extra_data") + elif hasattr(row, "_mapping"): + payload = row._mapping.get("metadata") or row._mapping.get("extra_data") + else: + payload = row[0] + if not isinstance(payload, dict): + continue + + country = normalize_country(payload.get("country") or payload.get("country_code")) + prefix_hint = payload.get("prefix") or prefix + asn = _safe_int(payload.get("asn")) + as_name = payload.get("as_name") + centroid = get_country_centroid(country) + regions = [] + if country: + regions.append( + { + "country": country, + "city": None, + "latitude": centroid.get("latitude") if centroid else None, + "longitude": centroid.get("longitude") if centroid else None, + } + ) + + results[prefix] = { + "prefix": prefix_hint, + "country": country, + "asn": asn, + "as_name": as_name, + "source": payload.get("source_dataset") or "iptoasn_combined", + "confidence": "country_range", + "regions": regions, + } + + return results + + async def enrich_bgp_events_for_batch( db: AsyncSession, *, @@ -165,6 +243,7 @@ async def enrich_bgp_events_for_batch( } asn_profiles: dict[int, dict[str, Any]] = {} + prefix_geographies = await _lookup_prefix_geography(db, prefix_values) if prefix_values else {} if origin_asns: peeringdb_result = await db.execute( select(CollectedData).where(CollectedData.source == "peeringdb_network") @@ -207,21 +286,12 @@ async def enrich_bgp_events_for_batch( collector = str(metadata.get("collector") or "").strip() collector_location = metadata.get("collector_location") or {} baseline = historical_prefix_baseline.get(prefix, {}) + prefix_geography = prefix_geographies.get(prefix) observed_at = _parse_timestamp(metadata.get("timestamp") or event.get("reference_date")) origin_asn = _safe_int(metadata.get("origin_asn")) new_origin_asn = _safe_int(metadata.get("new_origin_asn")) - observed_regions = _compact_locations( - [ - { - "country": collector_location.get("country"), - "city": collector_location.get("city"), - "latitude": collector_location.get("latitude"), - "longitude": collector_location.get("longitude"), - } - ] - ) baseline_regions = baseline.get("historical_regions", []) - prefix_scope_regions = _compact_locations([*observed_regions, *baseline_regions]) + prefix_scope_regions = _compact_locations([*baseline_regions]) enrichment = { **extract_bgp_network_fields(prefix), @@ -248,6 +318,7 @@ async def enrich_bgp_events_for_batch( }, "origin_asn_profile": asn_profiles.get(origin_asn), "new_origin_asn_profile": asn_profiles.get(new_origin_asn), + "prefix_geography": prefix_geography, "prefix_scope": { "countries": sorted( { diff --git a/backend/app/services/bgp_incidents.py b/backend/app/services/bgp_incidents.py index 03149b4e..ee7bf41f 100644 --- a/backend/app/services/bgp_incidents.py +++ b/backend/app/services/bgp_incidents.py @@ -209,15 +209,14 @@ async def create_bgp_incidents_for_anomalies( grouped.setdefault(incident_key, []).append(anomaly) existing_result = await db.execute( - select(BGPIncident.incident_key).where(BGPIncident.incident_key.in_(sorted(grouped.keys()))) + select(BGPIncident).where(BGPIncident.incident_key.in_(sorted(grouped.keys()))) ) - existing_keys = {row[0] for row in existing_result.fetchall()} + existing_incidents = { + incident.incident_key: incident for incident in existing_result.scalars().all() + } created = 0 for incident_key, items in grouped.items(): - if incident_key in existing_keys: - continue - items = sorted(items, key=lambda item: item.created_at or item.started_at or datetime.now(UTC)) primary = items[0] prefixes = sorted({item.prefix for item in items if item.prefix}) @@ -270,6 +269,28 @@ async def create_bgp_incidents_for_anomalies( ) related_infrastructure = await infer_related_infrastructure(db, regions) + existing = existing_incidents.get(incident_key) + if existing is not None: + existing.snapshot_id = snapshot_id + existing.task_id = task_id + existing.source = source + existing.incident_type = primary.anomaly_type + existing.title = title + existing.summary = summary + existing.severity = severity + existing.status = "active" + existing.confidence = confidence + existing.started_at = primary.started_at or existing.started_at or datetime.now(UTC) + existing.ended_at = None + existing.affected_prefixes = prefixes + existing.affected_asns = asns + existing.affected_collectors = collectors + existing.affected_regions = regions + existing.related_cables = related_infrastructure["related_cables"] + existing.related_ixps = related_infrastructure["related_ixps"] + existing.evidence_refs = evidence_refs + continue + db.add( BGPIncident( snapshot_id=snapshot_id, @@ -294,7 +315,7 @@ async def create_bgp_incidents_for_anomalies( ) created += 1 - if created: + if created or existing_incidents: await db.commit() return created diff --git a/backend/app/services/collectors/__init__.py b/backend/app/services/collectors/__init__.py index 155f150d..3c83c86a 100644 --- a/backend/app/services/collectors/__init__.py +++ b/backend/app/services/collectors/__init__.py @@ -32,6 +32,7 @@ from app.services.collectors.spacetrack import SpaceTrackTLECollector from app.services.collectors.celestrak import CelesTrakTLECollector from app.services.collectors.ris_live import RISLiveCollector from app.services.collectors.bgpstream import BGPStreamBackfillCollector +from app.services.collectors.iptoasn import IPtoASNPrefixGeoCollector collector_registry.register(TOP500Collector()) collector_registry.register(EpochAIGPUCollector()) @@ -55,3 +56,4 @@ collector_registry.register(SpaceTrackTLECollector()) collector_registry.register(CelesTrakTLECollector()) collector_registry.register(RISLiveCollector()) collector_registry.register(BGPStreamBackfillCollector()) +collector_registry.register(IPtoASNPrefixGeoCollector()) diff --git a/backend/app/services/collectors/bgp_common.py b/backend/app/services/collectors/bgp_common.py index 9625aa40..ec54a73c 100644 --- a/backend/app/services/collectors/bgp_common.py +++ b/backend/app/services/collectors/bgp_common.py @@ -18,6 +18,8 @@ from app.services.bgp_detectors import ( detect_mass_withdrawal_anomalies, detect_more_specific_burst_anomalies, detect_origin_change_anomalies, + detect_path_flap_anomalies, + detect_route_leak_anomalies, ) from app.services.bgp_enrichment import enrich_bgp_events_for_batch, extract_bgp_network_fields @@ -282,6 +284,18 @@ async def create_bgp_anomalies_for_batch( task_id=task_id, events=enriched_events, ), + *detect_route_leak_anomalies( + source=source, + snapshot_id=snapshot_id, + task_id=task_id, + events=enriched_events, + ), + *detect_path_flap_anomalies( + source=source, + snapshot_id=snapshot_id, + task_id=task_id, + events=enriched_events, + ), ] if not pending_anomalies: @@ -302,16 +316,29 @@ async def create_bgp_anomalies_for_batch( created = 0 created_anomalies: list[BGPAnomaly] = [] + refreshed_anomalies: list[BGPAnomaly] = [] + existing_map = {item.entity_key: item for item in existing_anomalies if item.entity_key} for anomaly in pending_anomalies: if anomaly.entity_key in existing_keys: + existing = existing_map.get(anomaly.entity_key) + if existing is not None: + existing.severity = anomaly.severity + existing.status = anomaly.status + existing.summary = anomaly.summary + existing.confidence = anomaly.confidence + existing.peer_scope = anomaly.peer_scope + existing.evidence = anomaly.evidence + existing.new_origin_asn = anomaly.new_origin_asn + existing.origin_asn = anomaly.origin_asn + refreshed_anomalies.append(existing) continue db.add(anomaly) created_anomalies.append(anomaly) created += 1 - if created: + if created or refreshed_anomalies: await db.commit() - incident_seed_anomalies = [*created_anomalies, *existing_anomalies] + incident_seed_anomalies = [*created_anomalies, *refreshed_anomalies] if incident_seed_anomalies: await create_bgp_incidents_for_anomalies( db, diff --git a/backend/app/services/collectors/iptoasn.py b/backend/app/services/collectors/iptoasn.py new file mode 100644 index 00000000..ee0de6f9 --- /dev/null +++ b/backend/app/services/collectors/iptoasn.py @@ -0,0 +1,111 @@ +"""IPtoASN prefix geography collector. + +Downloads the public combined IPv4+IPv6 TSV database and stores coarse +prefix-to-country/ASN geography hints for BGP enrichment. +""" + +from __future__ import annotations + +import gzip +from datetime import UTC, datetime +from ipaddress import summarize_address_range, ip_address +from typing import Any + +import httpx + +from app.services.collectors.base import BaseCollector + + +class IPtoASNPrefixGeoCollector(BaseCollector): + name = "iptoasn_prefix_geo" + priority = "P1" + module = "L3" + frequency_hours = 24 + data_type = "prefix_geography" + fail_on_empty = True + + async def fetch(self) -> list[dict[str, Any]]: + if not self._resolved_url: + raise RuntimeError("IPtoASN combined URL is not configured") + + async with httpx.AsyncClient(timeout=180.0, follow_redirects=True) as client: + response = await client.get( + self._resolved_url, + headers={ + "User-Agent": "Planet-Intelligence-System/1.0 (Python/collector)", + "Accept": "application/gzip,application/octet-stream,*/*", + }, + ) + response.raise_for_status() + body = gzip.decompress(response.content).decode("utf-8", errors="replace") + + rows: list[dict[str, Any]] = [] + for raw_line in body.splitlines(): + line = raw_line.strip() + if not line or line.startswith("#"): + continue + parts = line.split("\t") + if len(parts) < 5: + continue + range_start, range_end, asn, country_code, as_name = parts[:5] + rows.append( + { + "range_start": range_start, + "range_end": range_end, + "asn": asn, + "country_code": country_code, + "as_name": as_name, + } + ) + return rows + + def transform(self, raw_data: list[dict[str, Any]]) -> list[dict[str, Any]]: + reference_date = datetime.now(UTC).isoformat() + transformed: list[dict[str, Any]] = [] + + for item in raw_data: + try: + start_ip = ip_address(str(item["range_start"])) + end_ip = ip_address(str(item["range_end"])) + except ValueError: + continue + + if start_ip.version != end_ip.version: + continue + + summarized = list(summarize_address_range(start_ip, end_ip)) + primary_prefix = str(summarized[0]) if summarized else f"{start_ip}/{32 if start_ip.version == 4 else 128}" + family = f"ipv{start_ip.version}" + + asn_value = item.get("asn") + try: + normalized_asn = int(str(asn_value)) + except (TypeError, ValueError): + normalized_asn = None + + transformed.append( + { + "source_id": f"{family}:{item['range_start']}-{item['range_end']}", + "name": primary_prefix, + "title": f"{primary_prefix} {item.get('country_code', '').strip()}".strip(), + "country": item.get("country_code"), + "city": "", + "latitude": None, + "longitude": None, + "metadata": { + "family": family, + "range_start": item["range_start"], + "range_end": item["range_end"], + "prefix": primary_prefix, + "prefixes": [str(prefix) for prefix in summarized[:8]], + "range_prefix_count": len(summarized), + "country_code": item.get("country_code"), + "asn": normalized_asn, + "as_name": item.get("as_name"), + "source_dataset": "iptoasn_combined", + }, + "reference_date": reference_date, + } + ) + + return transformed diff --git a/backend/tests/test_bgp.py b/backend/tests/test_bgp.py index a84f28de..d22cab90 100644 --- a/backend/tests/test_bgp.py +++ b/backend/tests/test_bgp.py @@ -13,6 +13,8 @@ from app.main import app from app.services.bgp_detectors import ( detect_mass_withdrawal_anomalies, detect_origin_change_anomalies, + detect_path_flap_anomalies, + detect_route_leak_anomalies, ) from app.services.collectors.bgp_common import ( create_bgp_anomalies_for_batch, @@ -24,6 +26,7 @@ from app.services.bgp_incidents import ( infer_related_infrastructure, ) from app.services.bgp_collectors import build_bgp_collector_coverage +from app.api.v1.visualization import convert_bgp_incidents_to_geojson, build_incident_geography_hints from app.models.bgp_anomaly import BGPAnomaly from app.models.collected_data import CollectedData from app.models.bgp_incident import BGPIncident @@ -31,6 +34,7 @@ from app.models.bgp_observation import BGPObservation from app.models.user import User from app.services.collectors.bgp_common import normalize_bgp_event from app.services.collectors.bgpstream import BGPStreamBackfillCollector +from app.services.collectors.iptoasn import IPtoASNPrefixGeoCollector class _FakeScalarResult: @@ -51,6 +55,9 @@ class _FakeResult: def fetchall(self): return self._rows + def fetchone(self): + return self._rows[0] if self._rows else None + class _FakeAsyncSession: def __init__(self, results, gets=None): @@ -59,7 +66,7 @@ class _FakeAsyncSession: self.added = [] self.commits = 0 - async def execute(self, _stmt): + async def execute(self, _stmt, _params=None): if not self._results: return _FakeResult([]) return _FakeResult(self._results.pop(0)) @@ -140,6 +147,29 @@ def test_bgpstream_transform_preserves_broker_record(): assert record["metadata"]["broker_record"]["filename"] == "rib.20260326.0800.gz" +def test_iptoasn_transform_creates_prefix_geography_records(): + collector = IPtoASNPrefixGeoCollector() + transformed = collector.transform( + [ + { + "range_start": "1.0.0.0", + "range_end": "1.0.0.255", + "asn": "13335", + "country_code": "AU", + "as_name": "CLOUDFLARENET", + } + ] + ) + + assert len(transformed) == 1 + record = transformed[0] + assert record["name"] == "1.0.0.0/24" + assert record["metadata"]["family"] == "ipv4" + assert record["metadata"]["country_code"] == "AU" + assert record["metadata"]["asn"] == 13335 + assert record["metadata"]["source_dataset"] == "iptoasn_combined" + + def test_bgp_anomaly_to_dict(): anomaly = BGPAnomaly( source="ris_live_bgp", @@ -315,6 +345,75 @@ def test_detect_mass_withdrawal_anomalies_accepts_cross_collector_pair(): assert anomalies[0].evidence["collector_count"] == 2 +def test_detect_route_leak_anomalies_creates_candidate_for_divergent_long_paths(): + events = [ + { + "metadata": { + "collector": "rrc00", + "event_type": "announcement", + "prefix": "203.0.113.0/24", + "origin_asn": 64496, + "as_path": [64500, 64496], + "collector_location": {"country": "NL", "city": "Amsterdam", "latitude": 52.3, "longitude": 4.9}, + "enrichment": {"prefix_scope": {"regions": [{"country": "NL"}]}}, + } + }, + { + "metadata": { + "collector": "rrc01", + "event_type": "announcement", + "prefix": "203.0.113.0/24", + "origin_asn": 64496, + "as_path": [64510, 64520, 64530, 64540, 64496], + "collector_location": {"country": "GB", "city": "London", "latitude": 51.5, "longitude": -0.1}, + "enrichment": {"prefix_scope": {"regions": [{"country": "GB"}]}}, + } + }, + ] + + anomalies = detect_route_leak_anomalies( + source="ris_live_bgp", + snapshot_id=1, + task_id=2, + events=events, + ) + + assert len(anomalies) == 1 + assert anomalies[0].anomaly_type == "route_leak_candidate" + assert anomalies[0].evidence["max_path_length"] == 5 + + +def test_detect_path_flap_anomalies_creates_signal_for_repeated_state_changes(): + base_timestamp = datetime(2026, 3, 27, 0, 0, tzinfo=UTC) + events = [] + for index, event_type in enumerate(["announcement", "withdrawal", "announcement", "withdrawal"]): + events.append( + { + "metadata": { + "collector": "rrc00", + "event_type": event_type, + "timestamp": (base_timestamp + timedelta(minutes=index)).isoformat(), + "prefix": "198.51.100.0/24", + "origin_asn": 64512, + "as_path": [64500 + index, 64512] if event_type == "announcement" else [], + "collector_location": {"country": "NL", "city": "Amsterdam", "latitude": 52.3, "longitude": 4.9}, + "enrichment": {"prefix_scope": {"regions": [{"country": "NL"}]}}, + } + } + ) + + anomalies = detect_path_flap_anomalies( + source="ris_live_bgp", + snapshot_id=1, + task_id=2, + events=events, + ) + + assert len(anomalies) == 1 + assert anomalies[0].anomaly_type == "path_flap" + assert anomalies[0].evidence["transitions"] == 3 + + def test_bgp_incident_to_dict(): incident = BGPIncident( source="ris_live_bgp", @@ -338,6 +437,131 @@ def test_bgp_incident_to_dict(): assert data["affected_collectors"] == ["rrc00", "rrc01"] +def test_convert_bgp_incidents_to_geojson_adds_estimated_geography(): + incident = BGPIncident( + source="ris_live_bgp", + incident_key="origin_change:203.0.113.0/24:64497", + incident_type="origin_change", + title="Origin Change incident on 203.0.113.0/24", + summary="Grouped incident summary", + severity="critical", + status="active", + confidence=0.91, + affected_prefixes=["203.0.113.0/24"], + affected_collectors=["rrc00", "rrc01"], + affected_regions=[ + { + "collector": "rrc00", + "country": "Netherlands", + "city": "Amsterdam", + "latitude": 52.3676, + "longitude": 4.9041, + }, + { + "collector": "rrc01", + "country": "United Kingdom", + "city": "London", + "latitude": 51.5072, + "longitude": -0.1276, + }, + ], + ) + + payload = convert_bgp_incidents_to_geojson([incident]) + feature = payload["features"][0] + assert feature["properties"]["geography_mode"] == "collector_centroid" + assert feature["properties"]["estimated_radius_km"] > 0 + assert feature["properties"]["estimated_center"]["latitude"] != 0 + + +def test_convert_bgp_incidents_to_geojson_prefers_prefix_scope_hint(): + incident = BGPIncident( + source="ris_live_bgp", + incident_key="origin_change:203.0.113.0/24:64497", + incident_type="origin_change", + title="Origin Change incident on 203.0.113.0/24", + summary="Grouped incident summary", + severity="critical", + status="active", + confidence=0.91, + affected_prefixes=["203.0.113.0/24"], + affected_collectors=["rrc00"], + affected_regions=[ + { + "collector": "rrc00", + "country": "Netherlands", + "city": "Amsterdam", + "latitude": 52.3676, + "longitude": 4.9041, + } + ], + ) + + payload = convert_bgp_incidents_to_geojson( + [incident], + { + incident.incident_key: { + "geography_mode": "prefix_scope", + "regions": [ + { + "country": "Japan", + "city": "Tokyo", + "latitude": 35.6764, + "longitude": 139.65, + } + ], + } + }, + ) + feature = payload["features"][0] + assert feature["properties"]["geography_mode"] == "prefix_scope" + assert feature["geometry"]["coordinates"] == [139.65, 35.6764] + + +def test_convert_bgp_incidents_to_geojson_prefers_prefix_geography_hint(): + incident = BGPIncident( + source="ris_live_bgp", + incident_key="origin_change:198.51.100.0/24:64512", + incident_type="origin_change", + title="Origin Change incident on 198.51.100.0/24", + summary="Grouped incident summary", + severity="critical", + status="active", + confidence=0.91, + affected_prefixes=["198.51.100.0/24"], + affected_collectors=["rrc00"], + affected_regions=[ + { + "collector": "rrc00", + "country": "Netherlands", + "city": "Amsterdam", + "latitude": 52.3676, + "longitude": 4.9041, + } + ], + ) + + payload = convert_bgp_incidents_to_geojson( + [incident], + { + incident.incident_key: { + "geography_mode": "prefix_geography", + "regions": [ + { + "country": "日本", + "city": None, + "latitude": 35.6764, + "longitude": 139.65, + } + ], + } + }, + ) + feature = payload["features"][0] + assert feature["properties"]["geography_mode"] == "prefix_geography" + assert feature["geometry"]["coordinates"] == [139.65, 35.6764] + + @pytest.mark.asyncio async def test_enrich_bgp_events_for_batch_adds_profiles_and_prefix_scope(): historical_observation = BGPObservation( @@ -367,8 +591,21 @@ async def test_enrich_bgp_events_for_batch_adds_profiles_and_prefix_scope(): }, ) peeringdb_record.id = 99 + iptoasn_row = { + "extra_data": { + "family": "ipv4", + "range_start": "203.0.113.0", + "range_end": "203.0.113.255", + "prefix": "203.0.113.0/24", + "country": "英国", + "country_code": "GB", + "asn": 64497, + "as_name": "Example ASN", + "source_dataset": "iptoasn_combined", + } + } - db = _FakeAsyncSession([[historical_observation], [peeringdb_record]]) + db = _FakeAsyncSession([[historical_observation], [iptoasn_row], [peeringdb_record]]) events = [ { "metadata": { @@ -396,8 +633,10 @@ async def test_enrich_bgp_events_for_batch_adds_profiles_and_prefix_scope(): assert enrichment["is_new_origin_for_prefix"] is True assert enrichment["rpki_validation"]["status"] == "unknown" assert enrichment["origin_asn_profile"]["name"] == "ExampleNet" - assert enrichment["prefix_scope"]["countries"] == ["Netherlands", "United Kingdom"] - assert enrichment["prefix_scope"]["cities"] == ["Amsterdam", "London"] + assert enrichment["prefix_geography"]["country"] == "英国" + assert enrichment["prefix_geography"]["source"] == "iptoasn_combined" + assert enrichment["prefix_scope"]["countries"] == ["United Kingdom"] + assert enrichment["prefix_scope"]["cities"] == ["London"] @pytest.mark.asyncio @@ -448,6 +687,126 @@ async def test_create_bgp_incidents_for_anomalies_aggregates_regions_and_collect assert incident.affected_regions[0]["city"] == "Amsterdam" +@pytest.mark.asyncio +async def test_create_bgp_incidents_for_anomalies_refreshes_existing_incident(): + existing = BGPIncident( + source="ris_live_bgp", + incident_key="origin_change:203.0.113.0/24:64497", + incident_type="origin_change", + title="Old title", + summary="Old summary", + severity="medium", + status="active", + confidence=0.4, + affected_prefixes=["203.0.113.0/24"], + affected_asns=[64496, 64497], + affected_collectors=["rrc00"], + affected_regions=[ + { + "collector": "rrc00", + "country": "Netherlands", + "city": "Amsterdam", + "latitude": 52.3676, + "longitude": 4.9041, + } + ], + related_cables=[], + related_ixps=[], + evidence_refs=["old-key"], + ) + db = _FakeAsyncSession([[existing]]) + anomaly = BGPAnomaly( + source="ris_live_bgp", + anomaly_type="origin_change", + severity="critical", + status="active", + entity_key="origin_change:203.0.113.0/24:64497", + prefix="203.0.113.0/24", + origin_asn=64496, + new_origin_asn=64497, + summary="Origin ASN changed", + confidence=0.9, + evidence={ + "impacted_regions": [ + { + "collector": None, + "country": "United States", + "city": None, + "latitude": 39.8283, + "longitude": -98.5795, + } + ] + }, + ) + + with patch( + "app.services.bgp_incidents.infer_related_infrastructure", + new=AsyncMock(return_value={"related_cables": [{"landing_point": "NYC"}], "related_ixps": []}), + ): + created = await create_bgp_incidents_for_anomalies( + db, + source="ris_live_bgp", + snapshot_id=1, + task_id=2, + anomalies=[anomaly], + ) + + assert created == 0 + assert db.commits == 1 + assert len(db.added) == 0 + assert existing.summary != "Old summary" + assert existing.severity == "critical" + assert existing.confidence == 0.9 + assert existing.affected_regions[0]["country"] == "United States" + assert existing.related_cables == [{"landing_point": "NYC"}] + assert existing.evidence_refs == ["origin_change:203.0.113.0/24:64497"] + + +@pytest.mark.asyncio +async def test_build_incident_geography_hints_prefers_evidence_prefix_scope_when_no_cached_prefix_geo(): + incident = BGPIncident( + source="ris_live_bgp", + incident_key="origin_change:93.175.153.0/24:16509", + incident_type="origin_change", + title="Origin Change incident on 93.175.153.0/24", + summary="summary", + severity="critical", + status="active", + affected_prefixes=["93.175.153.0/24"], + evidence_refs=["origin_change:93.175.153.0/24:16509"], + ) + anomaly = BGPAnomaly( + source="ris_live_bgp", + anomaly_type="origin_change", + severity="critical", + status="active", + entity_key="origin_change:93.175.153.0/24:16509", + prefix="93.175.153.0/24", + origin_asn=12654, + new_origin_asn=16509, + summary="summary", + confidence=0.8, + evidence={ + "prefix_scope": { + "regions": [ + { + "country": "Netherlands", + "city": "Amsterdam", + "latitude": 52.3676, + "longitude": 4.9041, + } + ] + } + }, + ) + db = _FakeAsyncSession([[anomaly]]) + + hints = await build_incident_geography_hints(db, [incident]) + + assert hints["origin_change:93.175.153.0/24:16509"]["geography_mode"] == "prefix_scope" + assert hints["origin_change:93.175.153.0/24:16509"]["regions"][0]["country"] == "Netherlands" + + @pytest.mark.asyncio async def test_infer_related_infrastructure_links_nearby_cables(): landing = CollectedData( @@ -524,9 +883,11 @@ async def test_build_bgp_collector_coverage_summarizes_observations(): first = next(item for item in coverage if item["collector"] == "rrc00") assert first["observation_count"] == 2 + assert first["recent_15m_observation_count"] == 2 assert first["recent_24h_observation_count"] == 2 assert first["recent_7d_observation_count"] == 2 assert first["prefix_count"] == 2 + assert first["recent_15m_prefix_count"] == 2 assert first["recent_24h_prefix_count"] == 2 assert first["origin_asn_count"] == 2 assert first["latest_event_type"] == "withdrawal" @@ -583,6 +944,7 @@ async def test_create_bgp_anomalies_for_batch_calls_incident_aggregation(): extra_data={"prefix": "203.0.113.0/24", "origin_asn": 64496}, ) db = _FakeAsyncSession([ + [], [], [], [previous_record], @@ -647,6 +1009,7 @@ async def test_create_bgp_anomalies_for_batch_skips_existing_entity_keys(): new_origin_asn=64497, ) db = _FakeAsyncSession([ + [], [], [], [previous_record], diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index e77425d8..c3d61f20 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -7,6 +7,49 @@ This project follows the repository versioning rule: - `feature` -> `+0.1.0` - `bugfix` -> `+0.0.1` +## 0.22.10 + +Released: 2026-04-02 + +### Highlights + +- Recovered the Earth-side BGP experience after a failed cache-busting / asset-loading refactor temporarily broke the globe runtime, removed textures, and made the BGP layer disappear when one backend endpoint timed out. +- Added a first usable `prefix_geography` data layer backed by `IPtoASN / IP-to-Country` ingestion so BGP geography can start moving away from pure collector-centric placement. +- Reworked BGP Earth rendering to keep collectors visible under degraded backend conditions, restore symbol-based incident markers, and split icon pulse from outward event-ring animation. + +### Added + +- Added a new `IPtoASN Prefix Geography` collector in [iptoasn.py](/home/ray/dev/linkong/planet/backend/app/services/collectors/iptoasn.py) and registered it through [data_sources.yaml](/home/ray/dev/linkong/planet/backend/app/core/data_sources.yaml), [data_sources.py](/home/ray/dev/linkong/planet/backend/app/core/data_sources.py), [datasource_defaults.py](/home/ray/dev/linkong/planet/backend/app/core/datasource_defaults.py), and [collectors/__init__.py](/home/ray/dev/linkong/planet/backend/app/services/collectors/__init__.py). +- Added country centroid helpers in [countries.py](/home/ray/dev/linkong/planet/backend/app/core/countries.py) so country-level prefix geography can produce map coordinates instead of only labels. +- Added a dedicated prefix-geography implementation note in [prefix-geography-plan.md](/home/ray/dev/linkong/planet/docs/prefix-geography-plan.md). +- Added recent `15m` collector activity dimensions to BGP coverage output in [bgp_collectors.py](/home/ray/dev/linkong/planet/backend/app/services/bgp_collectors.py) and [visualization.py](/home/ray/dev/linkong/planet/backend/app/api/v1/visualization.py). +- Added additional BGP detector coverage for `route_leak_candidate` and `path_flap` flows in [test_bgp.py](/home/ray/dev/linkong/planet/backend/tests/test_bgp.py). +- Added a local Earth cloud texture at [earth_clouds_1024.png](/home/ray/dev/linkong/planet/frontend/public/earth/assets/earth_clouds_1024.png) to avoid remote cloud-map dependency failures. + +### Improved + +- Improved BGP enrichment in [bgp_enrichment.py](/home/ray/dev/linkong/planet/backend/app/services/bgp_enrichment.py) so events now attach `prefix_geography`, `prefix_scope`, ASN profile context, and country-centroid-backed geography hints in one place. +- Improved incident aggregation in [bgp_incidents.py](/home/ray/dev/linkong/planet/backend/app/services/bgp_incidents.py) so existing incidents refresh their regions and geography metadata instead of remaining pinned to stale first-generation evidence forever. +- Improved anomaly generation flow in [bgp_common.py](/home/ray/dev/linkong/planet/backend/app/services/collectors/bgp_common.py) by cleaning up duplicate incident-seeding paths and only feeding newly created or refreshed anomalies forward. +- Improved Earth BGP loading in [bgp.js](/home/ray/dev/linkong/planet/frontend/public/earth/js/bgp.js) so collectors are now the mandatory baseline layer while anomalies and incidents can fail independently without blanking the whole BGP surface. +- Improved Earth BGP marker language in [bgp.js](/home/ray/dev/linkong/planet/frontend/public/earth/js/bgp.js) and [constants.js](/home/ray/dev/linkong/planet/frontend/public/earth/js/constants.js) by restoring typed event symbols, reducing additive white blowout, and making the incident ring animation read as an outward pulse instead of a generic glow blob. +- Improved Earth event animation semantics in [bgp.js](/home/ray/dev/linkong/planet/frontend/public/earth/js/bgp.js) by separating icon pulse from ring expansion so the center marker can breathe while the ring expands independently. +- Improved Earth texture reliability in [earth.js](/home/ray/dev/linkong/planet/frontend/public/earth/js/earth.js) by switching clouds back to a local static asset under the restored `public/earth` runtime. +- Improved frontend boot noise in [frontend/index.html](/home/ray/dev/linkong/planet/frontend/index.html) by removing the default Vite favicon request that was generating irrelevant `vite.svg` timeouts during Earth debugging. +- Improved project planning docs in [bgp-context.md](/home/ray/dev/linkong/planet/docs/bgp-context.md) and [TODO.md](/home/ray/dev/linkong/planet/TODO.md) so the roadmap now explicitly prioritizes `activity layer`, `prefix-centric geography`, and follow-up geofeed/whois work. + +### Fixed + +- Fixed a failed Earth asset-versioning route where hand-applied cache-busting and a parallel Vite multi-entry experiment introduced duplicate module instances, broken `/earth` boot paths, missing textures, and severe runtime instability; the globe has now been restored to the stable `frontend/public/earth` runtime instead of the abandoned refactor path. +- Fixed Earth cloud and terrain loading regressions by restoring the old static Earth entrypoint and ensuring local cloud and 8K day-map assets resolve again from `public/earth/assets`. +- Fixed a full-layer BGP disappearance regression where `bgp-anomalies` or `bgp-incidents` timeouts caused the entire BGP layer to show `0` collectors and `0` events even though collector data still existed. +- Fixed `prefix_geography` lookups in [bgp_enrichment.py](/home/ray/dev/linkong/planet/backend/app/services/bgp_enrichment.py) that previously failed because JSON metadata access mixed SQL column names and ORM property names. +- Fixed stale anomaly and incident geography reuse so pre-existing records can now absorb refreshed evidence instead of staying locked to older Amsterdam-centric geography forever. +- Fixed a wrong optimization path in [visualization.py](/home/ray/dev/linkong/planet/backend/app/api/v1/visualization.py) where live `prefix_geography` lookups were pushed directly into Earth visualization endpoints, causing `bgp-anomalies` and `bgp-incidents` to time out under load; the visualization layer now prefers cached evidence again so Earth remains responsive. +- Fixed Earth-side BGP fallback rendering so anomaly fallback no longer collapses into a single undifferentiated glow layer when incidents are unavailable. +- Fixed extreme incident brightness and same-coordinate blowout in [bgp.js](/home/ray/dev/linkong/planet/frontend/public/earth/js/bgp.js) by removing additive blending from incident cores, reducing ring intensity, and deduplicating incident rendering at the coordinate level. +- Fixed the confusing floating BGP event hub in [bgp.js](/home/ray/dev/linkong/planet/frontend/public/earth/js/bgp.js) by removing the suspended off-surface glow anchor and its arc links, leaving Earth incidents grounded on the globe surface with regional halo context instead. + ## 0.22.9 Released: 2026-04-02 diff --git a/docs/bgp-context.md b/docs/bgp-context.md index 6fa9290c..5f598755 100644 --- a/docs/bgp-context.md +++ b/docs/bgp-context.md @@ -6,7 +6,17 @@ The BGP module is being evolved from an anomaly-only demo into a layered observa `raw observations -> enrichment -> detectors -> incidents -> console/Earth visualization` -The practical product goal is to turn low-level BGP control-plane changes into understandable network situation events with collector coverage, impact regions, and incident-centric visualization. +The practical product goal is no longer just to "show incidents on the globe". The current product objective is: + +1. keep BGP visually present on Earth even when incident density is low +2. make incidents clearly feel like a higher-confidence layer than anomalies +3. show that the observation network is still active even when there are no active incidents + +In practice, that means Earth should behave like an observability surface, not only an incident map: + +- `collectors` show that observation is happening +- `activity` shows where routing state is currently active or noisy +- `incidents` become the highest-confidence focus layer ## Current Backend Architecture @@ -135,16 +145,26 @@ Current design: 2. Incident markers are now the primary Earth BGP markers. 3. If there are no incidents, Earth falls back to anomaly markers. 4. If there are no anomalies either, collectors still provide presence. +5. A dedicated `activity layer` now adds: + - per-collector recent 15-minute activity halos + - clustered regional activity hints derived from active collectors +6. Incident markers now use: + - symbol-driven event cores + - outward ring pulses + - reduced diffuse glow compared with older Earth builds 5. The right-side stats now show: - BGP events - collector count - BGP status summary +This is directionally correct, but still incomplete for low-event-density periods. Right now Earth can still feel too quiet when incidents are sparse because the system lacks a dedicated `activity layer` between raw observation and incident focus. + Current BGP status strategy: - incidents present: show active incident count -- no incidents but anomalies present: show active anomaly count -- no incidents/anomalies but collectors present: show `当前无活跃事件` +- no incidents but anomalies present: show active anomaly count, plus active observation regions when available +- no incidents/anomalies but activity present: show `观测网络运行中` +- no incidents/anomalies but collectors present: show `观测网络运行中 · 当前未发现聚合级事件` - no BGP data at all: show `暂无观测数据` Earth info-card strategy: @@ -152,6 +172,81 @@ Earth info-card strategy: - `bgp` card is now incident-centric in wording - `bgp_collector` card shows collector location and current event count +## Current Product Gap + +The main product gap is not architecture correctness. It is low-density visualization strategy. + +Current reality: + +- incident count is naturally much lower than anomaly count +- that is expected, because incidents are aggregated and de-noised +- but incident-first rendering makes the Earth view look too quiet unless there is another always-available activity layer + +So the immediate next milestone is: + +`event map -> observability map` + +That means Earth needs three simultaneously readable layers: + +1. `observation layer` + - collectors + - recent collector activity + - baseline coverage +2. `activity layer` + - recent event density + - anomaly/noise hotspots + - regional activity scoring + - incident presence bonus +3. `incident layer` + - sparse but highly legible, high-confidence event objects + - symbol-driven markers + - outward ring pulse instead of broad diffuse glow + +## Incident Visual Direction + +The Earth `incident` layer should not read like a large glowing patch. It should read like a compact, high-confidence event focus. + +Design principles: + +1. `incident` markers should use a strong primary symbol + - the symbol shape should carry type meaning where possible + - examples: + - `origin_change`: triangle-like warning marker + - `mass_withdrawal`: alert/exclamation-style marker + - `more_specific_burst`: split/radiating marker + +2. emphasis should come from outward ring pulses, not area flooding + - use a compact hot core + - use one or more expanding ring pulses + - avoid broad luminous blobs that make the event center feel vague + +3. `collector` and `incident` must stay visually distinct + - collectors are observation infrastructure + - incidents are extracted event focus + - collector activity should stay quieter than incident pulse language + +4. calm periods still need observability presence + - collectors and activity layers should keep the map alive + - once incidents appear, they should clearly dominate nearby BGP visuals + +5. incident geography should become `prefix-centric` + - collectors should remain evidence sources, not the primary event location + - preferred geography priority: + - `prefix_geography` + - `prefix_scope` + - `ASN organization region` + - `collector centroid` as final fallback + - `prefix_scope` should remain an observation-derived scope hint + - a new `prefix_geography` layer should be introduced for actual prefix-centric placement + +Reference inspiration: + +- `World Monitor` + - sparse event symbols + - compact centers + - ring-like outward pulses + - stronger incident legibility than diffuse glow + ## Current Console Behavior Relevant page: @@ -188,14 +283,15 @@ BGP-specific tests live in: Verified status at this point: -- `17 passed` +- `25 passed` for `backend/tests/test_bgp.py` +- `62 passed` for `backend/tests` Covered areas include: - normalization - observation serialization - enrichment -- detectors +- detectors, including route leak candidate and path flap - incident aggregation - batch anomaly creation - BGP events/incidents API @@ -226,9 +322,14 @@ Frontend: ## Recommended Next Steps -1. Expand realtime collector coverage and include withdrawals more broadly. -2. Integrate real RPKI validation data. -3. Improve route leak and path instability detectors. +### Next Backend / Detection Priority + +1. Integrate real RPKI validation data. +2. Expand realtime collector coverage and include withdrawals more broadly. +3. Continue refining route leak and path instability detectors with stronger heuristics. + +### Next Correlation / Storytelling Priority + 4. Strengthen incident aggregation semantics and titles. 5. Add weak correlation from incidents to: - cable corridors @@ -236,3 +337,12 @@ Frontend: - IXPs - other traffic anomaly sources 6. Refine Earth hover/click handoff between collectors and incidents. + +### Next Visualization Priority + +7. Refine regional activity scoring so the activity layer is informative without becoming noisy. +8. Add more incident symbol types as new detectors land. +9. Add a real prefix geography source: + - `IPtoASN / IPtoCountry` as the first practical dataset + - `OpenGeoFeed` as a higher-quality override layer + - registry/whois only as fallback diff --git a/docs/prefix-geography-plan.md b/docs/prefix-geography-plan.md new file mode 100644 index 00000000..32b6dcf8 --- /dev/null +++ b/docs/prefix-geography-plan.md @@ -0,0 +1,216 @@ +# Prefix Geography Plan + +## Goal + +Make Earth BGP incidents `prefix-centric` instead of `collector-centric`. + +The map should primarily answer: + +- where a prefix-related event is likely centered +- which regions the prefix is likely associated with +- which collectors observed the event as evidence + +It should not continue to imply that the event is located at the collector itself unless no better geography is available. + +## Why Current Geography Is Not Enough + +Current incident geography can still collapse back to collector-derived regions because: + +1. `prefix_scope` is currently built mostly from observed collector regions and historical observation regions. +2. `origin_asn_profile` currently comes from `peeringdb_network`, which is useful for ASN footprint hints but not sufficient as a primary prefix location source. +3. `collector centroid` is still a common fallback and therefore dominates sparse incidents. + +This makes Earth feel like a collector map with event decorations instead of a prefix impact map. + +## Data Source Layers + +Prefix geography should be built from four layers, ordered by confidence. + +### Layer 1. Prefix-to-country / prefix-to-region + +This is the primary source layer and the current missing piece. + +Recommended sources: + +1. `IPtoASN / IPtoCountry` + - URL: + - Good fit for this project because it provides downloadable IPv4/IPv6 range-to-ASN and range-to-country mappings. + - Best use: + - map a prefix to country code + - enrich prefixes with coarse regional placement + +2. `OpenGeoFeed` + - URL: + - Best use: + - override coarse country mappings when the prefix holder publishes a geofeed + - provide a more realistic deployment/service region than whois-style registration country + +### Layer 2. Registry allocation fallback + +Use these only as fallback signals, not as a ground-truth physical location. + +Candidate inputs: + +- RIR delegated stats +- `inetnum` / `inet6num` whois + +Best use: + +- detect registration country / allocation region +- provide fallback when no direct prefix geolocation dataset is available + +### Layer 3. ASN footprint hints + +Existing in this project: + +- `peeringdb_network` +- `peeringdb_facility` +- `peeringdb_ixp` + +Best use: + +- derive ASN city/country footprint +- identify likely exchange/facility regions +- act as secondary evidence when prefix-specific geography is unavailable + +### Layer 4. Observation evidence + +Existing in this project: + +- `RIPE RIS Live` +- `CAIDA BGPStream Backfill` + +Best use: + +- prove who observed the event +- derive affected observation regions +- support impact evidence + +This should remain the final fallback and evidence layer, not the primary event geography. + +## Recommended Geography Priority + +The backend should compute incident geography with this order: + +1. `prefix_geography` + - prefix-to-country / region / geofeed-backed result +2. `asn_region` + - ASN organization / facility / IXP footprint +3. `collector_centroid` + - observed collector regions only as final fallback + +Returned GeoJSON should keep exposing the selected mode through: + +- `geography_mode = prefix_geography | asn_region | collector_centroid` + +## Proposed Backend Changes + +### 1. Add a dedicated prefix geography dataset + +New datasource candidates: + +- `ip2asn_prefix_geo` +- optionally `opengeofeed_prefix_geo` + +Suggested storage model: + +- keep downloaded rows in `CollectedData` first for speed of integration +- later move to a dedicated table if lookup volume grows + +Minimum normalized fields: + +- `range_start` +- `range_end` +- `prefix` +- `country` +- `continent` +- `asn` +- `as_name` +- `source` +- `confidence` + +### 2. Add prefix geography enrichment + +Extend: + +- `backend/app/services/bgp_enrichment.py` + +New enrichment payload should include: + +- `prefix_geography` + - `country` + - `continent` + - `regions` + - `source` + - `confidence` + +This should be separate from the current `prefix_scope`. + +Suggested distinction: + +- `prefix_scope` + - observation-derived scope hint +- `prefix_geography` + - prefix-centric geography estimate + +### 3. Update incident visualization geography selection + +Extend: + +- `backend/app/api/v1/visualization.py` + +Selection order: + +1. `prefix_geography.regions` +2. ASN geography hints from PeeringDB-derived profile +3. observation-derived `affected_regions` + +### 4. Keep evidence visible in the frontend + +Earth should distinguish: + +- event center = prefix geography estimate +- evidence lines / collectors = observation proof + +This keeps the event meaningful for non-expert users without losing collector evidence. + +## Earth UX Result + +After this change, a user should see: + +- an incident marker near the estimated affected prefix region +- collectors as supporting evidence, not as the event center itself +- cables / landing points / nearby infrastructure as weak correlation around the estimated region + +This makes BGP incidents readable as “where the event is likely happening or affecting”, instead of “which station saw it”. + +## Implementation Order + +### Phase 1 + +1. Add `IPtoASN / IPtoCountry` datasource support +2. Normalize rows into lookup-friendly format +3. Enrich BGP events with `prefix_geography` +4. Switch incident geography priority to prefer `prefix_geography` + +### Phase 2 + +5. Add `OpenGeoFeed` support +6. Let geofeed override coarse country-level prefix geography +7. Add confidence scoring per geography source + +### Phase 3 + +8. Add RIR / whois fallback +9. Add better ASN regional footprint from PeeringDB facilities / IXPs +10. Refine Earth visual semantics for prefix geography vs observation evidence + +## Recommendation + +The best next engineering move is: + +1. integrate `IPtoASN / IPtoCountry` +2. model `prefix_geography` separately from `prefix_scope` +3. only then continue refining incident map placement + +Without this layer, any further Earth tuning will still be constrained by collector-centric data. diff --git a/frontend/index.html b/frontend/index.html index 67fed84b..a7137230 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -2,7 +2,7 @@ - + 智能星球计划 diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 906af7a7..ec7cb9ac 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "planet-frontend", - "version": "0.22.8", + "version": "0.22.10", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "planet-frontend", - "version": "0.22.8", + "version": "0.22.10", "dependencies": { "@ant-design/icons": "^5.2.6", "antd": "^5.12.5", @@ -16,7 +16,9 @@ "react-dom": "^18.2.0", "react-resizable": "^3.1.3", "react-router-dom": "^6.21.0", + "simplex-noise": "^4.0.1", "socket.io-client": "^4.7.2", + "three": "^0.160.0", "zustand": "^4.4.7" }, "devDependencies": { @@ -3009,6 +3011,12 @@ "semver": "bin/semver.js" } }, + "node_modules/simplex-noise": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/simplex-noise/-/simplex-noise-4.0.3.tgz", + "integrity": "sha512-qSE2I4AngLQG7BXqoZj51jokT4WUXe8mOBrvfOXpci8+6Yu44+/dD5zqDpOx3Ux792eamTd2lLcI8jqFntk/lg==", + "license": "MIT" + }, "node_modules/socket.io-client": { "version": "4.8.3", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz", @@ -3059,6 +3067,12 @@ "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", "license": "MIT" }, + "node_modules/three": { + "version": "0.160.1", + "resolved": "https://registry.npmjs.org/three/-/three-0.160.1.tgz", + "integrity": "sha512-Bgl2wPJypDOZ1stAxwfWAcJ0WQf7QzlptsxkjYiURPz+n5k4RBDLsq+6f9Y75TYxn6aHLcWz+JNmwTOXWrQTBQ==", + "license": "MIT" + }, "node_modules/throttle-debounce": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 575bf960..f2abbec9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "planet-frontend", - "version": "0.22.9", + "version": "0.22.10", "private": true, "dependencies": { "@ant-design/icons": "^5.2.6", diff --git a/frontend/public/earth/assets/earth_clouds_1024.png b/frontend/public/earth/assets/earth_clouds_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..5c6b17b74ce05f1c589d60a92a9d66635a5e4990 GIT binary patch literal 260222 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

QGo)G)Y0xHdq~vx%BhSAqom?PJqenU#~{ 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%0A~I~rppaDQA<{4<6f=b-@bHsbb9+r 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 w4rmI(fHuRsoi>us?(%S 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 literal 0 HcmV?d00001 diff --git a/frontend/public/earth/js/bgp.js b/frontend/public/earth/js/bgp.js index 1bcb0575..712bac6b 100644 --- a/frontend/public/earth/js/bgp.js +++ b/frontend/public/earth/js/bgp.js @@ -13,7 +13,9 @@ let showBGP = true; let totalAnomalyCount = 0; let totalIncidentCount = 0; let textureCache = null; +let eventRingTextureCache = null; let collectorTextureCache = null; +const eventTextureCache = new Map(); let activeEventOverlay = null; let activeCollectorOverlayContext = null; const relativeTimeFormatter = new Intl.RelativeTimeFormat("zh-CN", { @@ -60,6 +62,29 @@ function getMarkerTexture() { return textureCache; } +function getEventRingTexture() { + if (eventRingTextureCache) return eventRingTextureCache; + + const canvas = document.createElement("canvas"); + canvas.width = 128; + canvas.height = 128; + const context = canvas.getContext("2d"); + if (!context) { + eventRingTextureCache = new THREE.Texture(canvas); + return eventRingTextureCache; + } + + context.clearRect(0, 0, 128, 128); + context.strokeStyle = "rgba(255,255,255,0.98)"; + context.lineWidth = 6; + context.beginPath(); + context.arc(64, 64, 44, 0, Math.PI * 2); + context.stroke(); + + eventRingTextureCache = new THREE.CanvasTexture(canvas); + return eventRingTextureCache; +} + function getCollectorTexture() { if (collectorTextureCache) return collectorTextureCache; @@ -102,6 +127,121 @@ function getCollectorTexture() { return collectorTextureCache; } +function getEventSymbolKind(anomalyType) { + const value = String(anomalyType || "").toLowerCase(); + if (value.includes("origin")) return "triangle"; + if (value.includes("withdraw")) return "exclamation"; + if (value.includes("specific") || value.includes("burst")) return "burst"; + if (value.includes("flap")) return "wave"; + if (value.includes("leak")) return "leak"; + return "dot"; +} + +function drawTriangleSymbol(context) { + context.beginPath(); + context.moveTo(64, 18); + context.lineTo(110, 106); + context.lineTo(18, 106); + context.closePath(); + context.fill(); +} + +function drawExclamationSymbol(context) { + context.beginPath(); + context.roundRect(52, 22, 24, 62, 12); + context.fill(); + context.beginPath(); + context.arc(64, 102, 10, 0, Math.PI * 2); + context.fill(); +} + +function drawWaveSymbol(context) { + context.lineWidth = 12; + context.lineCap = "round"; + context.beginPath(); + context.moveTo(18, 76); + context.bezierCurveTo(34, 46, 46, 46, 64, 76); + context.bezierCurveTo(80, 106, 94, 106, 110, 76); + context.stroke(); +} + +function drawBurstSymbol(context) { + context.lineWidth = 10; + context.lineCap = "round"; + for (let index = 0; index < 6; index += 1) { + const angle = (Math.PI * 2 * index) / 6; + const inner = 26; + const outer = 48; + context.beginPath(); + context.moveTo(64 + Math.cos(angle) * inner, 64 + Math.sin(angle) * inner); + context.lineTo(64 + Math.cos(angle) * outer, 64 + Math.sin(angle) * outer); + context.stroke(); + } + context.beginPath(); + context.arc(64, 64, 16, 0, Math.PI * 2); + context.fill(); +} + +function drawLeakSymbol(context) { + context.lineWidth = 10; + context.lineCap = "round"; + context.beginPath(); + context.moveTo(28, 96); + context.lineTo(64, 28); + context.lineTo(100, 96); + context.stroke(); + context.beginPath(); + context.moveTo(40, 82); + context.lineTo(64, 54); + context.lineTo(88, 82); + context.stroke(); +} + +function drawDotSymbol(context) { + context.beginPath(); + context.arc(64, 64, 28, 0, Math.PI * 2); + context.fill(); +} + +function getEventTexture(anomalyType) { + const kind = getEventSymbolKind(anomalyType); + if (eventTextureCache.has(kind)) return eventTextureCache.get(kind); + + const canvas = document.createElement("canvas"); + canvas.width = 128; + canvas.height = 128; + const context = canvas.getContext("2d"); + if (!context) { + const fallback = new THREE.Texture(canvas); + eventTextureCache.set(kind, fallback); + return fallback; + } + + context.clearRect(0, 0, 128, 128); + context.fillStyle = "rgba(255,255,255,0.96)"; + context.strokeStyle = "rgba(255,255,255,0.96)"; + context.shadowBlur = 0; + context.lineJoin = "round"; + + if (kind === "triangle") { + drawTriangleSymbol(context); + } else if (kind === "exclamation") { + drawExclamationSymbol(context); + } else if (kind === "wave") { + drawWaveSymbol(context); + } else if (kind === "burst") { + drawBurstSymbol(context); + } else if (kind === "leak") { + drawLeakSymbol(context); + } else { + drawDotSymbol(context); + } + + const texture = new THREE.CanvasTexture(canvas); + eventTextureCache.set(kind, texture); + return texture; +} + function normalizeSeverity(severity) { const value = String(severity || "").trim().toLowerCase(); @@ -934,9 +1074,14 @@ function createCollectorMarker(markerData) { function createAnomalyMarker(markerData) { const sprite = new THREE.Sprite( - createSpriteMaterial({ + new THREE.SpriteMaterial({ + map: getEventTexture(markerData.incident_type || markerData.anomaly_type), color: getSeverityColor(markerData.severity), + transparent: true, opacity: BGP_CONFIG.opacity.normal, + depthWrite: false, + depthTest: true, + blending: THREE.NormalBlending, }), ); @@ -960,12 +1105,45 @@ function createAnomalyMarker(markerData) { ...markerData, }; + const ringA = new THREE.Sprite( + new THREE.SpriteMaterial({ + map: getEventRingTexture(), + color: getSeverityColor(markerData.severity), + transparent: true, + opacity: 0, + depthWrite: false, + depthTest: true, + blending: THREE.AdditiveBlending, + }), + ); + ringA.scale.setScalar(baseScale * BGP_CONFIG.eventRingScaleA); + ringA.position.set(0, 0, -0.01); + sprite.add(ringA); + + const ringB = new THREE.Sprite( + new THREE.SpriteMaterial({ + map: getEventRingTexture(), + color: getSeverityColor(markerData.severity), + transparent: true, + opacity: 0, + depthWrite: false, + depthTest: true, + blending: THREE.AdditiveBlending, + }), + ); + ringB.scale.setScalar(baseScale * BGP_CONFIG.eventRingScaleB); + ringB.position.set(0, 0, -0.02); + sprite.add(ringB); + + sprite.userData.ringA = ringA; + sprite.userData.ringB = ringB; + anomalyMarkers.push(sprite); bgpGroup.add(sprite); } function dedupeAnomalies(features) { - const latestByCollector = new Map(); + const latestByLocation = new Map(); features.forEach((feature) => { const data = buildAnomalyFeatureData(feature); @@ -976,22 +1154,30 @@ function dedupeAnomalies(features) { (activeEventCountByCollector.get(data.collector) || 0) + 1, ); - const dedupeKey = `${data.collector}|${data.latitude.toFixed(4)}|${data.longitude.toFixed(4)}`; - const previous = latestByCollector.get(dedupeKey); + const dedupeKey = `${data.latitude.toFixed(3)}|${data.longitude.toFixed(3)}`; + const previous = latestByLocation.get(dedupeKey); const currentTime = data.created_at_raw ? new Date(data.created_at_raw).getTime() : 0; const previousTime = previous?.created_at_raw ? new Date(previous.created_at_raw).getTime() : 0; + const currentSeverity = getSeverityScale(data.severity); + const previousSeverity = previous ? getSeverityScale(previous.severity) : 0; - if (!previous || currentTime >= previousTime) { - latestByCollector.set(dedupeKey, data); + if ( + !previous || + currentSeverity > previousSeverity || + (currentSeverity === previousSeverity && currentTime >= previousTime) + ) { + latestByLocation.set(dedupeKey, data); } }); - return Array.from(latestByCollector.values()) + return Array.from(latestByLocation.values()) .sort((a, b) => { + const severityDiff = getSeverityScale(b.severity) - getSeverityScale(a.severity); + if (severityDiff !== 0) return severityDiff; const timeA = a.created_at_raw ? new Date(a.created_at_raw).getTime() : 0; const timeB = b.created_at_raw ? new Date(b.created_at_raw).getTime() : 0; return timeB - timeA; @@ -1000,7 +1186,7 @@ function dedupeAnomalies(features) { } function dedupeIncidents(features) { - const latestByKey = new Map(); + const latestByLocation = new Map(); features.forEach((feature) => { const data = buildIncidentFeatureData(feature); @@ -1013,22 +1199,30 @@ function dedupeIncidents(features) { ); }); - const dedupeKey = String(data.incident_key || data.id); - const previous = latestByKey.get(dedupeKey); + const dedupeKey = `${data.latitude.toFixed(3)}|${data.longitude.toFixed(3)}`; + const previous = latestByLocation.get(dedupeKey); const currentTime = data.created_at_raw ? new Date(data.created_at_raw).getTime() : 0; const previousTime = previous?.created_at_raw ? new Date(previous.created_at_raw).getTime() : 0; + const currentSeverity = getSeverityScale(data.severity); + const previousSeverity = previous ? getSeverityScale(previous.severity) : 0; - if (!previous || currentTime >= previousTime) { - latestByKey.set(dedupeKey, data); + if ( + !previous || + currentSeverity > previousSeverity || + (currentSeverity === previousSeverity && currentTime >= previousTime) + ) { + latestByLocation.set(dedupeKey, data); } }); - return Array.from(latestByKey.values()) + return Array.from(latestByLocation.values()) .sort((a, b) => { + const severityDiff = getSeverityScale(b.severity) - getSeverityScale(a.severity); + if (severityDiff !== 0) return severityDiff; const timeA = a.created_at_raw ? new Date(a.created_at_raw).getTime() : 0; const timeB = b.created_at_raw ? new Date(b.created_at_raw).getTime() : 0; return timeB - timeA; @@ -1046,25 +1240,40 @@ function applyCollectorCounts() { export async function loadBGPAnomalies(scene, earth) { clearBGPData(earth); - const [collectorsResponse, incidentsResponse, anomaliesResponse] = await Promise.all([ - fetch(PATHS.bgpCollectorsApi), - fetch(`${PATHS.bgpIncidentsApi}?limit=${BGP_CONFIG.defaultFetchLimit}`), - fetch(`${PATHS.bgpApi}?limit=${BGP_CONFIG.defaultFetchLimit}`), - ]); - + const collectorsResponse = await fetch(PATHS.bgpCollectorsApi); if (!collectorsResponse.ok) { throw new Error(`BGP collectors HTTP ${collectorsResponse.status}`); } - if (!incidentsResponse.ok) { - throw new Error(`BGP incidents HTTP ${incidentsResponse.status}`); + + let anomaliesPayload = { type: "FeatureCollection", features: [], count: 0 }; + try { + const anomaliesResponse = await fetch( + `${PATHS.bgpApi}?limit=${BGP_CONFIG.defaultFetchLimit}`, + { signal: AbortSignal.timeout(5000) }, + ); + if (!anomaliesResponse.ok) { + throw new Error(`BGP anomalies HTTP ${anomaliesResponse.status}`); + } + anomaliesPayload = await anomaliesResponse.json(); + } catch (error) { + console.warn("BGP anomalies unavailable, falling back to collectors only:", error); } - if (!anomaliesResponse.ok) { - throw new Error(`BGP anomalies HTTP ${anomaliesResponse.status}`); + + let incidentsPayload = { type: "FeatureCollection", features: [], count: 0 }; + try { + const incidentsResponse = await fetch( + `${PATHS.bgpIncidentsApi}?limit=${BGP_CONFIG.defaultFetchLimit}`, + { signal: AbortSignal.timeout(5000) }, + ); + if (!incidentsResponse.ok) { + throw new Error(`BGP incidents HTTP ${incidentsResponse.status}`); + } + incidentsPayload = await incidentsResponse.json(); + } catch (error) { + console.warn("BGP incidents unavailable, falling back to anomalies:", error); } const collectorsPayload = await collectorsResponse.json(); - const incidentsPayload = await incidentsResponse.json(); - const anomaliesPayload = await anomaliesResponse.json(); const collectorFeatures = Array.isArray(collectorsPayload?.features) ? collectorsPayload.features : []; @@ -1232,28 +1441,59 @@ export function updateBGPVisualState(lockedObjectType, lockedObject, camera) { let scale = marker.userData.baseScale; let opacity = BGP_CONFIG.opacity.normal; let markerColor = marker.userData.baseColor || getSeverityColor(marker.userData.severity); + const isIncidentMarker = marker.userData.source === "bgp_incident"; + let ringBaseOpacity = isIncidentMarker + ? BGP_CONFIG.eventRingOpacity + : BGP_CONFIG.eventRingOpacity * 0.45; if (isLocked || isLinkedCollectorLocked) { scale *= 1 + BGP_CONFIG.lockedPulseAmplitude * pulse; opacity = BGP_CONFIG.opacity.lockedMin + (BGP_CONFIG.opacity.lockedMax - BGP_CONFIG.opacity.lockedMin) * pulse; + ringBaseOpacity *= 1.2; } else if (isHovered) { scale *= BGP_CONFIG.hoverScale; opacity = BGP_CONFIG.opacity.hover; + ringBaseOpacity *= 1.05; } else if (isOtherLocked) { scale *= BGP_CONFIG.dimmedScale; opacity = 0.1; markerColor = 0x7d8ca3; + ringBaseOpacity = 0.02; } else { scale *= 1 + BGP_CONFIG.normalPulseAmplitude * pulse; - opacity = BGP_CONFIG.opacity.normal; + opacity = isIncidentMarker ? 0.7 : 0.62; } marker.scale.setScalar(scale); marker.material.color.setHex(markerColor); marker.material.opacity = opacity; marker.visible = showBGP; + + const ringPhaseA = (now * BGP_CONFIG.eventRingSpeed + marker.userData.pulseOffset) % 1; + const applyRingState = (ring, phase, maxScale) => { + if (!ring) return; + const progress = Math.max(0, Math.min(1, phase)); + const minScale = 1.28; + const desiredWorldScale = + marker.userData.baseScale * (minScale + progress * (maxScale - minScale)); + const parentScale = Math.max(scale, 0.0001); + const localRingScale = desiredWorldScale / parentScale; + const fadeIn = Math.max(0, Math.min(1, (progress - 0.08) / 0.14)); + const fadeOut = 1 - progress; + const visibility = fadeIn * fadeOut; + ring.scale.setScalar(localRingScale); + ring.material.color.setHex(markerColor); + ring.material.opacity = showBGP ? ringBaseOpacity * visibility : 0; + ring.visible = showBGP; + }; + + applyRingState(marker.userData.ringA, ringPhaseA, BGP_CONFIG.eventRingScaleA); + if (marker.userData.ringB) { + marker.userData.ringB.material.opacity = 0; + marker.userData.ringB.visible = false; + } }); } @@ -1368,42 +1608,9 @@ export function showBGPEventOverlay(marker, earth) { typeof region?.longitude === "number", ); if (validRegions.length === 0) return; - - const averageLatitude = - validRegions.reduce((sum, region) => sum + region.latitude, 0) / - validRegions.length; - const averageLongitude = - validRegions.reduce((sum, region) => sum + region.longitude, 0) / - validRegions.length; - - const hubPosition = latLonToVector3( - averageLatitude, - averageLongitude, - CONFIG.earthRadius + BGP_CONFIG.eventHubAltitudeOffset, - ); - const hub = createOverlaySprite({ - color: BGP_CONFIG.eventHubColor, - opacity: 0.95, - scale: BGP_CONFIG.eventHubScale, - }); - hub.position.copy(hubPosition); - hub.renderOrder = 6; - bgpOverlayGroup.add(hub); - - const overlayItems = [hub]; + const overlayItems = []; validRegions.forEach((region) => { - const regionPosition = latLonToVector3( - region.latitude, - region.longitude, - CONFIG.earthRadius + BGP_CONFIG.collectorAltitudeOffset + 0.3, - ); - - const link = createArcLine(regionPosition, hubPosition, BGP_CONFIG.linkColor); - link.renderOrder = 4; - bgpOverlayGroup.add(link); - overlayItems.push(link); - const halo = createOverlaySprite({ color: BGP_CONFIG.regionColor, opacity: 0.24, diff --git a/frontend/public/earth/js/constants.js b/frontend/public/earth/js/constants.js index 7284ae57..5a4f47b0 100644 --- a/frontend/public/earth/js/constants.js +++ b/frontend/public/earth/js/constants.js @@ -138,6 +138,10 @@ export const BGP_CONFIG = { eventHubColor: 0x8af5ff, linkColor: 0x54d2ff, regionColor: 0x2dd4bf, + eventRingScaleA: 2.5, + eventRingScaleB: 3.4, + eventRingOpacity: 0.5, + eventRingSpeed: 0.001, collectorHaloScale: 11.5, collectorPulseHaloScale: 16.5, collectorCoverageHaloScale: 22.5 diff --git a/frontend/public/earth/js/earth.js b/frontend/public/earth/js/earth.js index f30934d9..2522eb48 100644 --- a/frontend/public/earth/js/earth.js +++ b/frontend/public/earth/js/earth.js @@ -104,7 +104,7 @@ export function createClouds(scene, earthObj) { earthObj.add(clouds); textureLoader.load( - 'https://threejs.org/examples/textures/planets/earth_clouds_1024.png', + './assets/earth_clouds_1024.png', function(texture) { material.map = texture; material.needsUpdate = true; diff --git a/pyproject.toml b/pyproject.toml index cd6090b6..d81f2744 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "planet" -version = "0.22.8" +version = "0.22.10" description = "智能星球计划 - 态势感知系统" requires-python = ">=3.14" dependencies = [