diff --git a/cmd/watchdog/root.go b/cmd/watchdog/root.go index e64e158..9ab1df0 100644 --- a/cmd/watchdog/root.go +++ b/cmd/watchdog/root.go @@ -11,13 +11,13 @@ import ( "path/filepath" "strings" "syscall" - "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "notashelf.dev/watchdog/internal/aggregate" "notashelf.dev/watchdog/internal/api" "notashelf.dev/watchdog/internal/config" + "notashelf.dev/watchdog/internal/limits" "notashelf.dev/watchdog/internal/normalize" ) @@ -91,9 +91,9 @@ func Run(cfg *config.Config) error { srv := &http.Server{ Addr: cfg.Server.ListenAddr, Handler: mux, - ReadTimeout: 10 * time.Second, - WriteTimeout: 10 * time.Second, - IdleTimeout: 60 * time.Second, + ReadTimeout: limits.HTTPReadTimeout, + WriteTimeout: limits.HTTPWriteTimeout, + IdleTimeout: limits.HTTPIdleTimeout, } // Start server in goroutine @@ -115,8 +115,8 @@ func Run(cfg *config.Config) error { case sig := <-shutdown: log.Printf("Received signal: %v, starting graceful shutdown", sig) - // Give outstanding requests 30 seconds to complete - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + // Give outstanding requests time to complete + ctx, cancel := context.WithTimeout(context.Background(), limits.ShutdownTimeout) defer cancel() // Shutdown metrics aggregator. diff --git a/internal/aggregate/metrics.go b/internal/aggregate/metrics.go index a9ba3ad..055896e 100644 --- a/internal/aggregate/metrics.go +++ b/internal/aggregate/metrics.go @@ -9,6 +9,7 @@ import ( "github.com/prometheus/client_golang/prometheus" "notashelf.dev/watchdog/internal/config" + "notashelf.dev/watchdog/internal/limits" ) var prometheusLabelPattern = regexp.MustCompile(`^[a-zA-Z0-9_/:.-]*$`) @@ -121,11 +122,11 @@ func NewMetricsAggregator( return m } -// Background goroutine to update the unique visitors gauge every 10 seconds +// Background goroutine to update the unique visitors gauge periodically // instead of on every request. This should help with performance. func (m *MetricsAggregator) updateUniquesGauge() { defer m.wg.Done() - ticker := time.NewTicker(10 * time.Second) + ticker := time.NewTicker(limits.UniquesUpdatePeriod) defer ticker.Stop() for { diff --git a/internal/limits/constants.go b/internal/limits/constants.go index 14985a9..2db5dc1 100644 --- a/internal/limits/constants.go +++ b/internal/limits/constants.go @@ -1,5 +1,7 @@ package limits +import "time" + // Size limits for request processing const ( MaxEventSize = 4 * 1024 // 4KB max event payload @@ -7,3 +9,12 @@ const ( MaxRefLen = 2048 // max referrer length MaxWidth = 10000 // max reasonable screen width ) + +// Timeout constants +const ( + HTTPReadTimeout = 10 * time.Second // HTTP server read timeout + HTTPWriteTimeout = 10 * time.Second // HTTP server write timeout + HTTPIdleTimeout = 60 * time.Second // HTTP server idle timeout + ShutdownTimeout = 30 * time.Second // graceful shutdown timeout + UniquesUpdatePeriod = 10 * time.Second // HLL gauge update interval +) diff --git a/internal/normalize/path.go b/internal/normalize/path.go index 2148f34..9836b67 100644 --- a/internal/normalize/path.go +++ b/internal/normalize/path.go @@ -4,6 +4,7 @@ import ( "strings" "notashelf.dev/watchdog/internal/config" + "notashelf.dev/watchdog/internal/limits" ) type PathNormalizer struct { @@ -14,7 +15,7 @@ type PathNormalizer struct { func NewPathNormalizer(cfg config.PathConfig) *PathNormalizer { return &PathNormalizer{ cfg: cfg, - maxLength: 2048, + maxLength: limits.MaxPathLen, } }