a recursive dns resolver
1package metrics 2 3import ( 4 "context" 5 "fmt" 6 "os" 7 "time" 8 9 "code.kiri.systems/kiri/alky/pkg/dns" 10) 11 12var ( 13 instanceID string 14 version string 15) 16 17func init() { 18 var err error 19 hostname, err := os.Hostname() 20 if err != nil { 21 hostname = "unknown" 22 } 23 24 if version != "" { 25 instanceID = fmt.Sprintf("%s-%s", hostname, version) 26 } else { 27 instanceID = hostname 28 } 29} 30 31func MetricsMiddleware(metrics *ClickHouseMetrics) func(dns.Handler) dns.Handler { 32 return func(next dns.Handler) dns.Handler { 33 return dns.HandlerFunc(func(w dns.ResponseWriter, r *dns.Request) { 34 if r.Context == nil { 35 r.Context = context.Background() 36 } 37 38 start := time.Now() 39 next.ServeDNS(w, r) 40 duration := time.Since(start) 41 42 question := r.Message.Question[0] 43 metrics.RecordQuery(QueryMetric{ 44 Timestamp: time.Now(), 45 InstanceID: instanceID, 46 QueryName: question.QName, 47 QueryType: question.QType.String(), 48 QueryClass: question.QClass.String(), 49 RemoteAddr: r.RemoteAddr.String(), 50 ResponseCode: r.Message.Header.RCode.String(), 51 Duration: duration.Nanoseconds(), 52 CacheHit: dns.GetCacheHit(r.Context), 53 }) 54 }) 55 } 56} 57 58func GetInstanceID() string { 59 return instanceID 60}