Private
Public Access
1
0
Files
data-api/ntpdb/zone_stats.go
Ask Bjørn Hansen ca2cdaf458
All checks were successful
continuous-integration/drone/push Build is passing
Go 1.21.1, log/slog, dependencies
2023-09-17 23:12:33 -07:00

86 lines
1.4 KiB
Go

package ntpdb
import (
"context"
"log/slog"
)
type ZoneStats []ZoneStat
type ZoneStat struct {
CC string
V4 float64
V6 float64
}
func (q *Queries) GetZoneStats(ctx context.Context) (*ZoneStats, error) {
zoneStatsRows, err := q.GetZoneStatsData(ctx)
if err != nil {
return nil, err
}
var (
total4 float64
total6 float64
)
// todo: consider how many servers and if they are managed
// by the same account, in the same ASN, etc.
type counts struct {
Netspeed4 uint64
Netspeed6 uint64
PercentTotal struct {
V4 float64
V6 float64
}
}
ccs := map[string]*counts{}
for _, r := range zoneStatsRows {
if r.Name == "." {
switch r.IpVersion {
case "v4":
total4 = float64(r.NetspeedActive)
case "v6":
total6 = float64(r.NetspeedActive)
}
continue
}
if _, ok := ccs[r.Name]; !ok {
ccs[r.Name] = &counts{}
}
c := ccs[r.Name]
switch r.IpVersion {
case "v4":
c.Netspeed4 = uint64(r.NetspeedActive)
case "v6":
c.Netspeed6 = uint64(r.NetspeedActive)
}
}
data := ZoneStats{}
for name, cc := range ccs {
slog.Info("zone stats cc", "name", name)
cc.PercentTotal.V4 = (100 / total4) * float64(cc.Netspeed4)
cc.PercentTotal.V6 = (100 / total6) * float64(cc.Netspeed6)
data = append(data, ZoneStat{
CC: name,
V4: cc.PercentTotal.V4,
V6: cc.PercentTotal.V6,
})
}
return &data, nil
}