Private
Public Access
1
0

3 Commits

Author SHA1 Message Date
118e596098 build: update goreleaser to 2.7.0
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2025-02-23 09:49:39 -08:00
e6f39f201c dns queries: set cache-control header 2025-02-23 09:48:56 -08:00
962839ed89 add dns query count endpoint 2025-02-23 09:28:30 -08:00
3 changed files with 74 additions and 2 deletions

View File

@@ -24,9 +24,11 @@ type UserCountry []flatAPI
func (s UserCountry) Len() int { func (s UserCountry) Len() int {
return len(s) return len(s)
} }
func (s UserCountry) Swap(i, j int) { func (s UserCountry) Swap(i, j int) {
s[i], s[j] = s[j], s[i] s[i], s[j] = s[j], s[i]
} }
func (s UserCountry) Less(i, j int) bool { func (s UserCountry) Less(i, j int) bool {
return s[i].IPv4 > s[j].IPv4 return s[i].IPv4 > s[j].IPv4
} }
@@ -183,3 +185,55 @@ func (d *ClickHouse) UserCountryData(ctx context.Context) (*UserCountry, error)
return nil, nil return nil, nil
} }
type DNSQueryCounts struct {
T uint32 `json:"t"`
Avg float64 `json:"avg"`
Max uint64 `json:"max"`
}
func (d *ClickHouse) DNSQueries(ctx context.Context) ([]DNSQueryCounts, error) {
log := logger.Setup()
ctx, span := tracing.Tracer().Start(ctx, "DNSQueries")
defer span.End()
startUnix := time.Now().Add(2 * time.Hour * -1).Unix()
startUnix -= startUnix % (60 * 5)
log.InfoContext(ctx, "start time", "start", startUnix)
rows, err := d.Logs.Query(clickhouse.Context(ctx, clickhouse.WithSpan(span.SpanContext())),
`
select toUnixTimestamp(toStartOfFiveMinute(t)) as t,
sum(q)/300 as avg, max(q) as max
from (
select window as t, sumSimpleState(queries) as q
from geodns.by_origin_1s
where
window > FROM_UNIXTIME(?)
and Origin IN ('pool.ntp.org', 'g.ntpns.org')
group by t order by t
)
group by t order by t
`, startUnix)
if err != nil {
log.ErrorContext(ctx, "query error", "err", err)
return nil, fmt.Errorf("database error")
}
var t uint32
var avg float64
var max uint64
r := []DNSQueryCounts{}
for rows.Next() {
if err := rows.Scan(&t, &avg, &max); err != nil {
return nil, err
}
log.InfoContext(ctx, "data", "t", t, "avg", avg, "max", max)
r = append(r, DNSQueryCounts{t, avg, max})
}
return r, nil
}

View File

@@ -2,7 +2,7 @@
set -euo pipefail set -euo pipefail
go install github.com/goreleaser/goreleaser/v2@v2.5.1 go install github.com/goreleaser/goreleaser/v2@v2.7.0
if [ ! -z "${harbor_username:-}" ]; then if [ ! -z "${harbor_username:-}" ]; then
DOCKER_FILE=~/.docker/config.json DOCKER_FILE=~/.docker/config.json

View File

@@ -207,6 +207,7 @@ func (srv *Server) Run() error {
e.GET("/api/usercc", srv.userCountryData) e.GET("/api/usercc", srv.userCountryData)
e.GET("/api/server/dns/answers/:server", srv.dnsAnswers) e.GET("/api/server/dns/answers/:server", srv.dnsAnswers)
e.GET("/api/server/scores/:server/:mode", srv.history) e.GET("/api/server/scores/:server/:mode", srv.history)
e.GET("/api/dns/counts", srv.dnsQueryCounts)
if len(ntpconf.WebHostname()) > 0 { if len(ntpconf.WebHostname()) > 0 {
e.POST("/api/server/scores/:server/:mode", func(c echo.Context) error { e.POST("/api/server/scores/:server/:mode", func(c echo.Context) error {
@@ -261,7 +262,7 @@ func (srv *Server) userCountryData(c echo.Context) error {
log.InfoContext(ctx, "didn't get zoneStats") log.InfoContext(ctx, "didn't get zoneStats")
} }
data, err := srv.ch.UserCountryData(c.Request().Context()) data, err := srv.ch.UserCountryData(ctx)
if err != nil { if err != nil {
log.ErrorContext(ctx, "UserCountryData", "err", err) log.ErrorContext(ctx, "UserCountryData", "err", err)
return c.String(http.StatusInternalServerError, err.Error()) return c.String(http.StatusInternalServerError, err.Error())
@@ -276,6 +277,23 @@ func (srv *Server) userCountryData(c echo.Context) error {
}) })
} }
func (srv *Server) dnsQueryCounts(c echo.Context) error {
log := logger.Setup()
ctx, span := tracing.Tracer().Start(c.Request().Context(), "dnsQueryCounts")
defer span.End()
data, err := srv.ch.DNSQueries(ctx)
if err != nil {
log.ErrorContext(ctx, "dnsQueryCounts", "err", err)
return c.String(http.StatusInternalServerError, err.Error())
}
hdr := c.Response().Header()
hdr.Set("Cache-Control", "s-maxage=30,max-age=60")
return c.JSON(http.StatusOK, data)
}
func healthHandler(srv *Server, log *slog.Logger) func(w http.ResponseWriter, req *http.Request) { func healthHandler(srv *Server, log *slog.Logger) func(w http.ResponseWriter, req *http.Request) {
return func(w http.ResponseWriter, req *http.Request) { return func(w http.ResponseWriter, req *http.Request) {
ctx := req.Context() ctx := req.Context()