Merge pull request #13219 from djcode/main

Discovery: Add support for NS records to DNS Discovery
This commit is contained in:
Julien Pivotto 2023-12-01 16:10:07 +01:00 committed by GitHub
commit 52b15d2195
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 4 deletions

View file

@ -42,6 +42,8 @@ const (
dnsSrvRecordPortLabel = dnsSrvRecordPrefix + "port" dnsSrvRecordPortLabel = dnsSrvRecordPrefix + "port"
dnsMxRecordPrefix = model.MetaLabelPrefix + "dns_mx_record_" dnsMxRecordPrefix = model.MetaLabelPrefix + "dns_mx_record_"
dnsMxRecordTargetLabel = dnsMxRecordPrefix + "target" dnsMxRecordTargetLabel = dnsMxRecordPrefix + "target"
dnsNsRecordPrefix = model.MetaLabelPrefix + "dns_ns_record_"
dnsNsRecordTargetLabel = dnsNsRecordPrefix + "target"
// Constants for instrumentation. // Constants for instrumentation.
namespace = "prometheus" namespace = "prometheus"
@ -102,7 +104,7 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
} }
switch strings.ToUpper(c.Type) { switch strings.ToUpper(c.Type) {
case "SRV": case "SRV":
case "A", "AAAA", "MX": case "A", "AAAA", "MX", "NS":
if c.Port == 0 { if c.Port == 0 {
return errors.New("a port is required in DNS-SD configs for all record types except SRV") 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 qtype = dns.TypeSRV
case "MX": case "MX":
qtype = dns.TypeMX qtype = dns.TypeMX
case "NS":
qtype = dns.TypeNS
} }
d := &Discovery{ d := &Discovery{
names: conf.Names, names: conf.Names,
@ -199,7 +203,7 @@ func (d *Discovery) refreshOne(ctx context.Context, name string, ch chan<- *targ
} }
for _, record := range response.Answer { for _, record := range response.Answer {
var target, dnsSrvRecordTarget, dnsSrvRecordPort, dnsMxRecordTarget model.LabelValue var target, dnsSrvRecordTarget, dnsSrvRecordPort, dnsMxRecordTarget, dnsNsRecordTarget model.LabelValue
switch addr := record.(type) { switch addr := record.(type) {
case *dns.SRV: 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, ".") addr.Mx = strings.TrimRight(addr.Mx, ".")
target = hostPort(addr.Mx, d.port) 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: case *dns.A:
target = hostPort(addr.A.String(), d.port) target = hostPort(addr.A.String(), d.port)
case *dns.AAAA: case *dns.AAAA:
@ -234,6 +245,7 @@ func (d *Discovery) refreshOne(ctx context.Context, name string, ch chan<- *targ
dnsSrvRecordTargetLabel: dnsSrvRecordTarget, dnsSrvRecordTargetLabel: dnsSrvRecordTarget,
dnsSrvRecordPortLabel: dnsSrvRecordPort, dnsSrvRecordPortLabel: dnsSrvRecordPort,
dnsMxRecordTargetLabel: dnsMxRecordTarget, dnsMxRecordTargetLabel: dnsMxRecordTarget,
dnsNsRecordTargetLabel: dnsNsRecordTarget,
}) })
} }

View file

@ -81,6 +81,7 @@ func TestDNS(t *testing.T) {
"__meta_dns_srv_record_target": "", "__meta_dns_srv_record_target": "",
"__meta_dns_srv_record_port": "", "__meta_dns_srv_record_port": "",
"__meta_dns_mx_record_target": "", "__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_target": "",
"__meta_dns_srv_record_port": "", "__meta_dns_srv_record_port": "",
"__meta_dns_mx_record_target": "", "__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_target": "db1.example.com.",
"__meta_dns_srv_record_port": "3306", "__meta_dns_srv_record_port": "3306",
"__meta_dns_mx_record_target": "", "__meta_dns_mx_record_target": "",
"__meta_dns_ns_record_target": "",
}, },
{ {
"__address__": "db2.example.com:3306", "__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_target": "db2.example.com.",
"__meta_dns_srv_record_port": "3306", "__meta_dns_srv_record_port": "3306",
"__meta_dns_mx_record_target": "", "__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_target": "db1.example.com.",
"__meta_dns_srv_record_port": "3306", "__meta_dns_srv_record_port": "3306",
"__meta_dns_mx_record_target": "", "__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_target": "",
"__meta_dns_srv_record_port": "", "__meta_dns_srv_record_port": "",
"__meta_dns_mx_record_target": "smtp1.example.com.", "__meta_dns_mx_record_target": "smtp1.example.com.",
"__meta_dns_ns_record_target": "",
}, },
{ {
"__address__": "smtp2.example.com:25", "__address__": "smtp2.example.com:25",
@ -234,6 +240,7 @@ func TestDNS(t *testing.T) {
"__meta_dns_srv_record_target": "", "__meta_dns_srv_record_target": "",
"__meta_dns_srv_record_port": "", "__meta_dns_srv_record_port": "",
"__meta_dns_mx_record_target": "smtp2.example.com.", "__meta_dns_mx_record_target": "smtp2.example.com.",
"__meta_dns_ns_record_target": "",
}, },
}, },
}, },

View file

@ -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 domain names which are periodically queried to discover a list of targets. The
DNS servers to be contacted are read from `/etc/resolv.conf`. 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 record queries, but not the advanced DNS-SD approach specified in
[RFC6763](https://tools.ietf.org/html/rfc6763). [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_target`: the target field of the SRV record
* `__meta_dns_srv_record_port`: the port 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_mx_record_target`: the target field of the MX record
* `__meta_dns_ns_record_target`: the target field of the NS record
```yaml ```yaml
# A list of DNS domain names to be queried. # A list of DNS domain names to be queried.
names: names:
[ - <string> ] [ - <string> ]
# 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: <string> | default = 'SRV' ] [ type: <string> | default = 'SRV' ]
# The port number used if the query type is not SRV. # The port number used if the query type is not SRV.