mirror of
https://github.com/prometheus/prometheus
synced 2024-12-26 16:43:21 +00:00
Merge pull request #13219 from djcode/main
Discovery: Add support for NS records to DNS Discovery
This commit is contained in:
commit
52b15d2195
@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -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": "",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -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:
|
||||
[ - <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' ]
|
||||
|
||||
# The port number used if the query type is not SRV.
|
||||
|
Loading…
Reference in New Issue
Block a user