From f85f09ebcf1677463b0df0733f08d655dbdc0435 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ask=20Bj=C3=B8rn=20Hansen?= Date: Sun, 22 Oct 2023 16:28:24 -0700 Subject: [PATCH] Small error handling updates --- go.mod | 2 +- go.sum | 4 ++-- server/dnsanswers.go | 51 ++++++++++++++++++++++++++++---------------- 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 4cb4a5c..e0f4534 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module go.ntppool.org/data-api go 1.21.3 -replace github.com/samber/slog-echo => github.com/abh/slog-echo v0.0.0-20231023011242-479313afb549 +replace github.com/samber/slog-echo => github.com/abh/slog-echo v0.0.0-20231024051244-af740639893e require ( github.com/ClickHouse/clickhouse-go/v2 v2.14.3 diff --git a/go.sum b/go.sum index e923ebf..a2cc102 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,8 @@ github.com/ClickHouse/ch-go v0.58.2 h1:jSm2szHbT9MCAB1rJ3WuCJqmGLi5UTjlNu+f530UT github.com/ClickHouse/ch-go v0.58.2/go.mod h1:Ap/0bEmiLa14gYjCiRkYGbXvbe8vwdrfTYWhsuQ99aw= github.com/ClickHouse/clickhouse-go/v2 v2.14.3 h1:s9SuU3PfJrfJ4SDbVRo6XM2ZWlr7efvW9Z/ppUpE1vo= github.com/ClickHouse/clickhouse-go/v2 v2.14.3/go.mod h1:qdw8IMGH4Y+PedKlf9QEhFO1ATTSFhh4exQRVIa3y2A= -github.com/abh/slog-echo v0.0.0-20231023011242-479313afb549 h1:kS58DLWQiBfTsrz6TBjiJ5NhJ33aYuf4GzM8jomgxr8= -github.com/abh/slog-echo v0.0.0-20231023011242-479313afb549/go.mod h1:iLkF/wVZhBWabIw4dB+bfbj1TjCd/OXnag0AE8IDFRg= +github.com/abh/slog-echo v0.0.0-20231024051244-af740639893e h1:RkyCTh9poEVRWZi9RWdSkcveX8TM5YVORZtdIeogUlI= +github.com/abh/slog-echo v0.0.0-20231024051244-af740639893e/go.mod h1:iLkF/wVZhBWabIw4dB+bfbj1TjCd/OXnag0AE8IDFRg= github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= diff --git a/server/dnsanswers.go b/server/dnsanswers.go index 487ee69..cefc0bf 100644 --- a/server/dnsanswers.go +++ b/server/dnsanswers.go @@ -1,11 +1,13 @@ package server import ( - "log/slog" + "database/sql" + "errors" "net/http" "net/netip" "github.com/labstack/echo/v4" + "go.opentelemetry.io/otel/attribute" "golang.org/x/sync/errgroup" "go.ntppool.org/common/logger" @@ -27,21 +29,27 @@ func (srv *Server) dnsAnswers(c echo.Context) error { ctx, span := tracing.Tracer().Start(ctx, "dnsanswers") defer span.End() - c.Response().Header().Set("Cache-Control", "max-age=20") + // for errors and 404s, a shorter cache time + c.Response().Header().Set("Cache-Control", "public,max-age=300") // conn, err := srv.chConn(ctx) // if err != nil { - // slog.Error("could not connect to clickhouse", "err", err) + // log.Error("could not connect to clickhouse", "err", err) // return c.String(http.StatusInternalServerError, "clickhouse error") // } + log = log.With("server_param", c.Param("server")) + span.SetAttributes(attribute.String("server_param", c.Param("server"))) + ip, err := netip.ParseAddr(c.Param("server")) if err != nil { log.Warn("could not parse server parameter", "server", c.Param("server"), "err", err) - return c.NoContent(http.StatusNotFound) + return c.NoContent(http.StatusBadRequest) } if ip.String() != c.Param("server") || len(c.QueryString()) > 0 { + // better URLs are forever + c.Response().Header().Set("Cache-Control", "public,max-age=10400") return c.Redirect(http.StatusPermanentRedirect, "https://www.ntppool.org/api/data/server/dns/answers/"+ip.String()) } @@ -53,20 +61,24 @@ func (srv *Server) dnsAnswers(c echo.Context) error { queryGroup.Go(func() error { var err error q := ntpdb.NewWrappedQuerier(ntpdb.New(srv.db)) - zoneStats, err = q.GetZoneStatsV2(ctx, ip.String()) - if err != nil { - slog.Error("GetZoneStatsV2", "err", err) - return err - } - if zoneStats == nil { - slog.Info("didn't get zoneStats") - } serverNetspeed, err = q.GetServerNetspeed(ctx, ip.String()) if err != nil { - slog.Error("GetServerNetspeed", "err", err) + if !errors.Is(err, sql.ErrNoRows) { + log.Error("GetServerNetspeed", "err", err) + } + return err // this will return if the server doesn't exist + } + + zoneStats, err = q.GetZoneStatsV2(ctx, ip.String()) + if err != nil { + // if we had a netspeed we expect rows here, too. + log.Error("GetZoneStatsV2", "err", err) return err } + if zoneStats == nil { + log.Warn("didn't get zoneStats") + } return nil }) @@ -79,7 +91,7 @@ func (srv *Server) dnsAnswers(c echo.Context) error { var err error serverData, err = srv.ch.ServerAnswerCounts(c.Request().Context(), ip.String(), days) if err != nil { - slog.Error("ServerUserCCData", "err", err) + log.Error("ServerUserCCData", "err", err) return err } return nil @@ -97,14 +109,17 @@ func (srv *Server) dnsAnswers(c echo.Context) error { totalData, err = srv.ch.AnswerTotals(c.Request().Context(), qtype, days) if err != nil { - slog.Error("AnswerTotals", "err", err) + log.Error("AnswerTotals", "err", err) } return err }) err = queryGroup.Wait() if err != nil { - slog.Error("query error", "err", err) + if errors.Is(err, sql.ErrNoRows) { + return c.String(http.StatusNotFound, "Not found") + } + log.Error("query error", "err", err) return c.String(http.StatusInternalServerError, err.Error()) } @@ -116,7 +131,7 @@ func (srv *Server) dnsAnswers(c echo.Context) error { zn = "" } zoneTotals[zn] = z.NetspeedActive // binary.BigEndian.Uint64(...) - // slog.Info("zone netspeed", "cc", z.ZoneName, "speed", z.NetspeedActive) + // log.Info("zone netspeed", "cc", z.ZoneName, "speed", z.NetspeedActive) } for _, cc := range serverData { @@ -141,7 +156,7 @@ func (srv *Server) dnsAnswers(c echo.Context) error { // Totals: totalData, } - c.Response().Header().Set("Cache-Control", "max-age=1800") + c.Response().Header().Set("Cache-Control", "public,max-age=1800") return c.JSONPretty(http.StatusOK, r, "")