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() {}