Plot city-level traffic activity from local GeoIP coordinates

This commit is contained in:
Maxim
2026-10-15 20:48:04 +03:00
parent 03b6c1f289
commit 46bd6e8be6
6 changed files with 192 additions and 26 deletions

View File

@@ -12,21 +12,22 @@ import (
)
type TrafficEvent struct {
City string `json:"city,omitempty"`
Region string `json:"region,omitempty"`
Monitoring bool `json:"monitoring"`
ID string `json:"id"`
Sequence int64 `json:"sequence,omitempty"`
Time int64 `json:"time"`
Kind string `json:"kind"`
IP string `json:"ip"`
Domain string `json:"domain,omitempty"`
Method string `json:"method,omitempty"`
Path string `json:"path,omitempty"`
Status int `json:"status,omitempty"`
Reason string `json:"reason,omitempty"`
Country string `json:"country,omitempty"`
Agent string `json:"agent,omitempty"`
Location *TrafficCityLocation `json:"location,omitempty"`
City string `json:"city,omitempty"`
Region string `json:"region,omitempty"`
Monitoring bool `json:"monitoring"`
ID string `json:"id"`
Sequence int64 `json:"sequence,omitempty"`
Time int64 `json:"time"`
Kind string `json:"kind"`
IP string `json:"ip"`
Domain string `json:"domain,omitempty"`
Method string `json:"method,omitempty"`
Path string `json:"path,omitempty"`
Status int `json:"status,omitempty"`
Reason string `json:"reason,omitempty"`
Country string `json:"country,omitempty"`
Agent string `json:"agent,omitempty"`
}
type TrafficBatch struct {
@@ -62,6 +63,9 @@ type TrafficCountryDetail struct {
LastSeen int64 `json:"lastSeen"`
}
type TrafficView struct {
Cities []TrafficMapCity `json:"cities"`
CitiesLimited bool `json:"citiesLimited"`
CityReady bool `json:"cityReady"`
MaxSequence int64 `json:"maxSequence"`
CountryDetails []TrafficCountryDetail `json:"countryDetails"`
@@ -209,7 +213,11 @@ func (s *Store) TrafficView(domain, kind string, external bool, hideMonitoring .
return v, err
}
e.Monitoring = isMonitoringRequest(e, v.Settings.MonitoringRules)
e.City, e.Region = lookupTrafficCity(e.IP)
g := lookupTrafficCityLocation(e.IP)
e.City, e.Region = g.City, g.Region
if g.Located {
e.Location = &g
}
v.Events = append(v.Events, e)
}
err = rows.Err()
@@ -257,6 +265,14 @@ func (s *Store) TrafficView(domain, kind string, external bool, hideMonitoring .
if detailErr != nil {
return v, detailErr
}
v.CityReady = trafficCityReady()
if v.CityReady {
var cityErr error
v.Cities, v.CitiesLimited, cityErr = s.trafficMapCities(where, args)
if cityErr != nil {
return v, cityErr
}
}
r, err := s.db.Query(`SELECT CAST((ts/60)*60 AS TEXT),COUNT(*) FROM traffic_events`+where+` AND kind='request' AND ts>=? GROUP BY ts/60 ORDER BY ts/60`, append(args, now-3600)...)
if err != nil {
return v, err