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}