github.com/netdata/go.d.plugin@v0.58.1/modules/dnsquery/dnsquery.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package dnsquery 4 5 import ( 6 _ "embed" 7 "time" 8 9 "github.com/netdata/go.d.plugin/agent/module" 10 "github.com/netdata/go.d.plugin/pkg/web" 11 12 "github.com/miekg/dns" 13 ) 14 15 //go:embed "config_schema.json" 16 var configSchema string 17 18 func init() { 19 module.Register("dns_query", module.Creator{ 20 JobConfigSchema: configSchema, 21 Defaults: module.Defaults{ 22 UpdateEvery: 5, 23 }, 24 Create: func() module.Module { return New() }, 25 }) 26 } 27 28 func New() *DNSQuery { 29 return &DNSQuery{ 30 Config: Config{ 31 Timeout: web.Duration{Duration: time.Second * 2}, 32 Network: "udp", 33 RecordTypes: []string{"A"}, 34 Port: 53, 35 }, 36 newDNSClient: func(network string, timeout time.Duration) dnsClient { 37 return &dns.Client{ 38 Net: network, 39 ReadTimeout: timeout, 40 } 41 }, 42 } 43 } 44 45 type Config struct { 46 Domains []string `yaml:"domains"` 47 Servers []string `yaml:"servers"` 48 Network string `yaml:"network"` 49 RecordType string `yaml:"record_type"` 50 RecordTypes []string `yaml:"record_types"` 51 Port int `yaml:"port"` 52 Timeout web.Duration `yaml:"timeout"` 53 } 54 55 type ( 56 DNSQuery struct { 57 module.Base 58 59 Config `yaml:",inline"` 60 61 charts *module.Charts 62 63 newDNSClient func(network string, duration time.Duration) dnsClient 64 recordTypes map[string]uint16 65 66 dnsClient dnsClient 67 } 68 69 dnsClient interface { 70 Exchange(msg *dns.Msg, address string) (response *dns.Msg, rtt time.Duration, err error) 71 } 72 ) 73 74 func (d *DNSQuery) Init() bool { 75 if err := d.verifyConfig(); err != nil { 76 d.Errorf("config validation: %v", err) 77 return false 78 } 79 80 rt, err := d.initRecordTypes() 81 if err != nil { 82 d.Errorf("init record type: %v", err) 83 return false 84 } 85 d.recordTypes = rt 86 87 charts, err := d.initCharts() 88 if err != nil { 89 d.Errorf("init charts: %v", err) 90 return false 91 } 92 d.charts = charts 93 94 return true 95 } 96 97 func (d *DNSQuery) Check() bool { 98 return true 99 } 100 101 func (d *DNSQuery) Charts() *module.Charts { 102 return d.charts 103 } 104 105 func (d *DNSQuery) Collect() map[string]int64 { 106 mx, err := d.collect() 107 if err != nil { 108 d.Error(err) 109 } 110 111 if len(mx) == 0 { 112 return nil 113 } 114 return mx 115 } 116 117 func (d *DNSQuery) Cleanup() {}