Fix field name mismatches, add events filter, in-place suppression refresh
Lint / Python (flake8) (push) Failing after 50s
Lint / JS (eslint) (push) Successful in 7s
Test / Python Tests (pytest) (push) Successful in 51s
Lint / Notify on failure (push) Successful in 2s
Lint / Deploy (push) Has been skipped
Security / Python Security (bandit) (push) Failing after 59s
Lint / Python (flake8) (push) Failing after 50s
Lint / JS (eslint) (push) Successful in 7s
Test / Python Tests (pytest) (push) Successful in 51s
Lint / Notify on failure (push) Successful in 2s
Lint / Deploy (push) Has been skipped
Security / Python Security (bandit) (push) Failing after 59s
- links.html: fix all field name bugs (auto_negotiation→autoneg, full_duplex, tx/rx_errors/drops_per_sec→_rate, tx/rx_bytes_per_sec→_rate, poe_total_w/poe_max_w computed from ports, renderUnifiSwitches uses top-level updated timestamp) - suppressions.html: in-place DOM refresh after create/remove (no page reload), datalist autocomplete for target names, form reset after submit - inspector.html: ESC key closes detail panel via lt.keys.on - index.html: events filter bar with search input + severity pills (All/Critical/Warning), MutationObserver re-applies filter after dynamic updates - style.css: g-section-actions, events-filter-bar, sev-pills layout - app.js/db.py/monitor.py: carry forward prior session fixes (Promise.allSettled, daemon_ok, stale connection handling, double Prometheus call, self.cfg fix) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+9
-9
@@ -325,6 +325,7 @@ class LinkStatsCollector:
|
||||
|
||||
def __init__(self, cfg: dict, prom: 'PrometheusClient',
|
||||
unifi: Optional['UnifiClient'] = None):
|
||||
self.cfg = cfg
|
||||
self.prom = prom
|
||||
self.pulse = PulseClient(cfg)
|
||||
self.unifi = unifi
|
||||
@@ -876,8 +877,7 @@ class NetworkMonitor:
|
||||
# ------------------------------------------------------------------
|
||||
# Snapshot collection (for dashboard)
|
||||
# ------------------------------------------------------------------
|
||||
def _collect_snapshot(self) -> dict:
|
||||
iface_states = self.prom.get_interface_states()
|
||||
def _collect_snapshot(self, iface_states: Dict[str, Dict[str, bool]]) -> dict:
|
||||
unifi_devices = self.unifi.get_devices() or []
|
||||
|
||||
hosts = {}
|
||||
@@ -930,23 +930,23 @@ class NetworkMonitor:
|
||||
try:
|
||||
logger.info('Starting network check cycle')
|
||||
|
||||
# 1. Collect and store snapshot for dashboard
|
||||
snapshot = self._collect_snapshot()
|
||||
# 1. Fetch interface states once — shared by snapshot and alert processing
|
||||
iface_states = self.prom.get_interface_states()
|
||||
|
||||
# 2. Collect and store snapshot for dashboard
|
||||
snapshot = self._collect_snapshot(iface_states)
|
||||
db.set_state('network_snapshot', snapshot)
|
||||
db.set_state('last_check', _now_utc())
|
||||
|
||||
# 2. Collect link stats (ethtool + traffic metrics)
|
||||
# 3. Collect link stats (ethtool + traffic metrics)
|
||||
try:
|
||||
link_data = self.link_stats.collect(self._instance_map)
|
||||
db.set_state('link_stats', link_data)
|
||||
except Exception as e:
|
||||
logger.error(f'Link stats collection failed: {e}', exc_info=True)
|
||||
|
||||
# 3. Process alerts (separate Prometheus call for fresh data)
|
||||
# Load suppressions once per cycle to avoid N*M DB queries
|
||||
# 4. Process alerts using already-fetched interface states
|
||||
suppressions = db.get_active_suppressions()
|
||||
|
||||
iface_states = self.prom.get_interface_states()
|
||||
self._process_interfaces(iface_states, suppressions)
|
||||
|
||||
unifi_devices = self.unifi.get_devices()
|
||||
|
||||
Reference in New Issue
Block a user