+4
-2
docs/alky.toml
+4
-2
docs/alky.toml
······
+109
-43
main.go
+109
-43
main.go
······+metricsClient, err := metrics.NewClickHouseMetrics(&cfg.Metrics, logger.With("component", "metrics"))+logger.Error("Failed to load root hints or no root servers found", "path", cfg.Server.RootHintsFile, "error", err)+cache := dns.NewLRUCache(cfg.Cache.MaxItems, cfg.Cache.CleanupInterval.Duration, logger.With("component", "cache"))func monitorCacheMetrics(cache dns.Cache, metricsClient *metrics.ClickHouseMetrics, logger *slog.Logger) {
+60
migrations/00002_modified_metrics.sql
+60
migrations/00002_modified_metrics.sql
···
+91
-30
pkg/config/config.go
+91
-30
pkg/config/config.go
············+return cfg, fmt.Errorf("invalid logging level '%s', must be one of: %v", cfg.Logging.Level, validLevels)
+188
-171
pkg/dns/cache.go
+188
-171
pkg/dns/cache.go
············+cache.logger.Info("starting LRU cache", "max_size", maxSize, "cleanup_interval", cleanupInterval)············+c.logger.Info("Cache cleanup finished", "items_removed", cleanedCount, "current_size", c.stats.Size.Load())···+if response.Header.RCode == magna.NXDOMAIN || (response.Header.RCode == magna.NOERROR && len(response.Answer) == 0) {-if len(msg.Answer) == 0 && len(msg.Authority) > 0 && msg.Authority[0].RType == magna.SOAType {-entry.Authority[i] = CachedResourceRecord{Record: rr, ExpireAt: now.Add(time.Duration(recordTTL) * time.Second), BailiwickRule: rule}-entry.Answer[i] = CachedResourceRecord{Record: rr, ExpireAt: now.Add(time.Duration(recordTTL) * time.Second), BailiwickRule: rule}-entry.Authority[i] = CachedResourceRecord{Record: rr, ExpireAt: now.Add(time.Duration(recordTTL) * time.Second), BailiwickRule: rule}-entry.Additional[i] = CachedResourceRecord{Record: rr, ExpireAt: now.Add(time.Duration(recordTTL) * time.Second), BailiwickRule: rule}
+122
-14
pkg/dns/resolve.go
+122
-14
pkg/dns/resolve.go
······func (h *QueryHandler) resolveQuestion(ctx context.Context, question magna.Question, servers []string) ([]magna.ResourceRecord, error) {+h.Logger.Debug("cache hit during recursion", "question", question.QName, "type", question.QType)···-cname_answers, err := h.resolveQuestion(resolveCtx, magna.Question{QName: msg.Answer[0].RData.String(), QType: question.QType, QClass: question.QClass}, h.RootServers)···-nsAnswers, err := h.resolveQuestion(resolveCtx, magna.Question{QName: nsName, QType: magna.AType, QClass: magna.IN}, h.RootServers)···-slog.Warn("unexpected response state", "question", question, "server", res.Server, "rcode", msg.Header.RCode)+h.Logger.Warn("unexpected response state", "question", question.QName, "server", res.Server, "rcode", msg.Header.RCode)
+155
-38
pkg/dns/server.go
+155
-38
pkg/dns/server.go
······+w.logger.Debug("Response exceeds UDP size, setting TC bit", "size", len(ans), "limit", w.udpSize, "client", w.addr)+w.logger.Warn("Truncated message still exceeds UDP size limit!", "size", len(ans), "limit", w.udpSize)······+srv.Logger.Info("Starting DNS server", "address", srv.Address, "port", srv.Port, "udp_size", srv.UDPSize)······+if opErr, ok := err.(*net.OpError); ok && opErr.Err.Error() == "use of closed network connection" {······+if opErr, ok := err.(*net.OpError); ok && opErr.Err.Error() == "use of closed network connection" {···+srv.Logger.Warn("Error setting TCP initial read deadline", "error", err, "client", conn.RemoteAddr())+srv.Logger.Warn("TCP error reading message length", "error", err, "client", conn.RemoteAddr())+srv.Logger.Warn("TCP message size exceeds limit", "size", size, "limit", maxTCPMessageSize, "client", conn.RemoteAddr())+srv.Logger.Warn("Error setting TCP read deadline for body", "error", err, "client", conn.RemoteAddr())···func (srv *Server) handleQuery(messageBuffer []byte, w ResponseWriter, remoteAddr net.Addr) {
+137
-66
pkg/metrics/clickhouse.go
+137
-66
pkg/metrics/clickhouse.go
···············func NewClickHouseMetrics(config *config.MetricsConfig, logger *slog.Logger) (*ClickHouseMetrics, error) {······+m.logger.Warn("Invalid retention period configured, skipping TTL update", "retention", m.config.RetentionPeriod.Duration)+m.logger.Warn("Table not found while updating TTL, likely needs migration", "table", tableName)······+m.logger.Error("Failed to execute statement for query metric", "error", err, "metric_index", count)+m.logger.Debug("Successfully flushed query metrics", "count", count, "duration", time.Since(start))···+m.logger.Error("Failed to execute statement for cache metric", "error", err, "metric_index", count)+m.logger.Debug("Successfully flushed cache metrics", "count", count, "duration", time.Since(start))
+39
-17
pkg/metrics/middleware.go
+39
-17
pkg/metrics/middleware.go
·········+slog.Warn("Metrics middleware received request with missing message or question", "remote_addr", r.RemoteAddr)