a recursive dns resolver

ope

Changed files
-14
docs
pkg
config
dns
metrics
-7
docs/alky.toml
···
# This uses time.ParseDuration semantics
retention_period = "720h"
-
[cache]
-
# The maximum number of items to store in the cache.
-
max_items = 5000
-
-
# How often the cache will evict items.
-
cleanup_interval = "5m"
-
[advanced]
# Timeout (in milliseconds) for outgoing queries before being cancelled.
query_timeout = 100
···
# This uses time.ParseDuration semantics
retention_period = "720h"
[advanced]
# Timeout (in milliseconds) for outgoing queries before being cancelled.
query_timeout = 100
-1
pkg/config/config.go
···
"fmt"
"os"
"slices"
-
"strings"
"time"
"github.com/BurntSushi/toml"
···
"fmt"
"os"
"slices"
"time"
"github.com/BurntSushi/toml"
-4
pkg/dns/resolve.go
···
"fmt"
"log/slog"
"net"
-
"strings"
"time"
"tangled.sh/seiso.moe/magna"
···
func (h *QueryHandler) resolveQuestion(ctx context.Context, question magna.Question, servers []string) ([]magna.ResourceRecord, error) {
ch := make(chan queryResponse, len(servers))
-
labels = strings.Split(question.QName, ".")
-
-
for label in
for _, s := range servers {
go queryServer(ctx, question, s, ch, h.Timeout)
}
···
"fmt"
"log/slog"
"net"
"time"
"tangled.sh/seiso.moe/magna"
···
func (h *QueryHandler) resolveQuestion(ctx context.Context, question magna.Question, servers []string) ([]magna.ResourceRecord, error) {
ch := make(chan queryResponse, len(servers))
for _, s := range servers {
go queryServer(ctx, question, s, ch, h.Timeout)
}
-2
pkg/metrics/middleware.go
···
if r.Message != nil && len(r.Message.Question) > 0 {
question := r.Message.Question[0]
-
cacheHit := dns.GetCacheHit(r.Context)
metrics.RecordQuery(QueryMetric{
Timestamp: start,
···
RemoteAddr: r.RemoteAddr.String(),
ResponseCode: r.Message.Header.RCode.String(),
Duration: duration.Nanoseconds(),
-
CacheHit: cacheHit,
})
} else {
slog := slog.Default()
···
if r.Message != nil && len(r.Message.Question) > 0 {
question := r.Message.Question[0]
metrics.RecordQuery(QueryMetric{
Timestamp: start,
···
RemoteAddr: r.RemoteAddr.String(),
ResponseCode: r.Message.Header.RCode.String(),
Duration: duration.Nanoseconds(),
})
} else {
slog := slog.Default()