diff --git a/discovery/dns/dns.go b/discovery/dns/dns.go index 96e07254f0..4838a89547 100644 --- a/discovery/dns/dns.go +++ b/discovery/dns/dns.go @@ -42,6 +42,8 @@ const ( dnsSrvRecordPortLabel = dnsSrvRecordPrefix + "port" dnsMxRecordPrefix = model.MetaLabelPrefix + "dns_mx_record_" dnsMxRecordTargetLabel = dnsMxRecordPrefix + "target" + dnsNsRecordPrefix = model.MetaLabelPrefix + "dns_ns_record_" + dnsNsRecordTargetLabel = dnsNsRecordPrefix + "target" // Constants for instrumentation. namespace = "prometheus" @@ -102,7 +104,7 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { } switch strings.ToUpper(c.Type) { case "SRV": - case "A", "AAAA", "MX": + case "A", "AAAA", "MX", "NS": if c.Port == 0 { return errors.New("a port is required in DNS-SD configs for all record types except SRV") } @@ -140,6 +142,8 @@ func NewDiscovery(conf SDConfig, logger log.Logger) *Discovery { qtype = dns.TypeSRV case "MX": qtype = dns.TypeMX + case "NS": + qtype = dns.TypeNS } d := &Discovery{ names: conf.Names, @@ -199,7 +203,7 @@ func (d *Discovery) refreshOne(ctx context.Context, name string, ch chan<- *targ } for _, record := range response.Answer { - var target, dnsSrvRecordTarget, dnsSrvRecordPort, dnsMxRecordTarget model.LabelValue + var target, dnsSrvRecordTarget, dnsSrvRecordPort, dnsMxRecordTarget, dnsNsRecordTarget model.LabelValue switch addr := record.(type) { case *dns.SRV: @@ -217,6 +221,13 @@ func (d *Discovery) refreshOne(ctx context.Context, name string, ch chan<- *targ addr.Mx = strings.TrimRight(addr.Mx, ".") target = hostPort(addr.Mx, d.port) + case *dns.NS: + dnsNsRecordTarget = model.LabelValue(addr.Ns) + + // Remove the final dot from rooted DNS names to make them look more usual. + addr.Ns = strings.TrimRight(addr.Ns, ".") + + target = hostPort(addr.Ns, d.port) case *dns.A: target = hostPort(addr.A.String(), d.port) case *dns.AAAA: @@ -234,6 +245,7 @@ func (d *Discovery) refreshOne(ctx context.Context, name string, ch chan<- *targ dnsSrvRecordTargetLabel: dnsSrvRecordTarget, dnsSrvRecordPortLabel: dnsSrvRecordPort, dnsMxRecordTargetLabel: dnsMxRecordTarget, + dnsNsRecordTargetLabel: dnsNsRecordTarget, }) } diff --git a/discovery/dns/dns_test.go b/discovery/dns/dns_test.go index 50b2860496..52ca72c797 100644 --- a/discovery/dns/dns_test.go +++ b/discovery/dns/dns_test.go @@ -81,6 +81,7 @@ func TestDNS(t *testing.T) { "__meta_dns_srv_record_target": "", "__meta_dns_srv_record_port": "", "__meta_dns_mx_record_target": "", + "__meta_dns_ns_record_target": "", }, }, }, @@ -112,6 +113,7 @@ func TestDNS(t *testing.T) { "__meta_dns_srv_record_target": "", "__meta_dns_srv_record_port": "", "__meta_dns_mx_record_target": "", + "__meta_dns_ns_record_target": "", }, }, }, @@ -143,6 +145,7 @@ func TestDNS(t *testing.T) { "__meta_dns_srv_record_target": "db1.example.com.", "__meta_dns_srv_record_port": "3306", "__meta_dns_mx_record_target": "", + "__meta_dns_ns_record_target": "", }, { "__address__": "db2.example.com:3306", @@ -150,6 +153,7 @@ func TestDNS(t *testing.T) { "__meta_dns_srv_record_target": "db2.example.com.", "__meta_dns_srv_record_port": "3306", "__meta_dns_mx_record_target": "", + "__meta_dns_ns_record_target": "", }, }, }, @@ -180,6 +184,7 @@ func TestDNS(t *testing.T) { "__meta_dns_srv_record_target": "db1.example.com.", "__meta_dns_srv_record_port": "3306", "__meta_dns_mx_record_target": "", + "__meta_dns_ns_record_target": "", }, }, }, @@ -227,6 +232,7 @@ func TestDNS(t *testing.T) { "__meta_dns_srv_record_target": "", "__meta_dns_srv_record_port": "", "__meta_dns_mx_record_target": "smtp1.example.com.", + "__meta_dns_ns_record_target": "", }, { "__address__": "smtp2.example.com:25", @@ -234,6 +240,7 @@ func TestDNS(t *testing.T) { "__meta_dns_srv_record_target": "", "__meta_dns_srv_record_port": "", "__meta_dns_mx_record_target": "smtp2.example.com.", + "__meta_dns_ns_record_target": "", }, }, }, diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md index c129c7e66c..f05925d2b1 100644 --- a/docs/configuration/configuration.md +++ b/docs/configuration/configuration.md @@ -1126,7 +1126,7 @@ A DNS-based service discovery configuration allows specifying a set of DNS domain names which are periodically queried to discover a list of targets. The DNS servers to be contacted are read from `/etc/resolv.conf`. -This service discovery method only supports basic DNS A, AAAA, MX and SRV +This service discovery method only supports basic DNS A, AAAA, MX, NS and SRV record queries, but not the advanced DNS-SD approach specified in [RFC6763](https://tools.ietf.org/html/rfc6763). @@ -1136,13 +1136,14 @@ The following meta labels are available on targets during [relabeling](#relabel_ * `__meta_dns_srv_record_target`: the target field of the SRV record * `__meta_dns_srv_record_port`: the port field of the SRV record * `__meta_dns_mx_record_target`: the target field of the MX record +* `__meta_dns_ns_record_target`: the target field of the NS record ```yaml # A list of DNS domain names to be queried. names: [ - ] -# The type of DNS query to perform. One of SRV, A, AAAA or MX. +# The type of DNS query to perform. One of SRV, A, AAAA, MX or NS. [ type: | default = 'SRV' ] # The port number used if the query type is not SRV.