From 734221cceac7bc0c9f4a7b4f0e9d5ef3fc0ca1bf Mon Sep 17 00:00:00 2001 From: Daniel Nelson Date: Mon, 7 May 2018 18:18:01 -0700 Subject: [PATCH] Don't report 0ms on timeout in dns_query (#4118) --- plugins/inputs/dns_query/README.md | 42 ++++++++++----------------- plugins/inputs/dns_query/dns_query.go | 38 ++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 29 deletions(-) diff --git a/plugins/inputs/dns_query/README.md b/plugins/inputs/dns_query/README.md index 6110f5a7d..766d9811f 100644 --- a/plugins/inputs/dns_query/README.md +++ b/plugins/inputs/dns_query/README.md @@ -3,9 +3,8 @@ The DNS plugin gathers dns query times in miliseconds - like [Dig](https://en.wikipedia.org/wiki/Dig_\(command\)) ### Configuration: - -``` -# Sample Config: +```toml +# Query given DNS server and gives statistics [[inputs.dns_query]] ## servers to query servers = ["8.8.8.8"] @@ -27,29 +26,20 @@ The DNS plugin gathers dns query times in miliseconds - like [Dig](https://en.wi # timeout = 2 ``` -For querying more than one record type make: +### Metrics: + +- dns_query + - tags: + - server + - domain + - record_type + - result + - fields: + - query_time_ms (float) + - result_code (int, success = 0, timeout = 1, error = 2) + +### Example Output: ``` -[[inputs.dns_query]] - domains = ["mjasion.pl"] - servers = ["8.8.8.8", "8.8.4.4"] - record_type = "A" - -[[inputs.dns_query]] - domains = ["mjasion.pl"] - servers = ["8.8.8.8", "8.8.4.4"] - record_type = "MX" -``` - -### Tags: - -- server -- domain -- record_type - -### Example output: - -``` -telegraf --input-filter dns_query --test -> dns_query,domain=mjasion.pl,record_type=A,server=8.8.8.8 query_time_ms=67.189842 1456082743585760680 +dns_query,domain=mjasion.pl,record_type=A,server=8.8.8.8 query_time_ms=67.189842 1456082743585760680 ``` diff --git a/plugins/inputs/dns_query/dns_query.go b/plugins/inputs/dns_query/dns_query.go index 04ce8328d..98fcc09c2 100644 --- a/plugins/inputs/dns_query/dns_query.go +++ b/plugins/inputs/dns_query/dns_query.go @@ -13,6 +13,14 @@ import ( "github.com/influxdata/telegraf/plugins/inputs" ) +type ResultType uint64 + +const ( + Success ResultType = 0 + Timeout = 1 + Error = 2 +) + type DnsQuery struct { // Domains or subdomains to query Domains []string @@ -66,15 +74,24 @@ func (d *DnsQuery) Gather(acc telegraf.Accumulator) error { for _, domain := range d.Domains { for _, server := range d.Servers { - dnsQueryTime, err := d.getDnsQueryTime(domain, server) - acc.AddError(err) + fields := make(map[string]interface{}, 2) tags := map[string]string{ "server": server, "domain": domain, "record_type": d.RecordType, } - fields := map[string]interface{}{"query_time_ms": dnsQueryTime} + dnsQueryTime, err := d.getDnsQueryTime(domain, server) + if err == nil { + setResult(Success, fields, tags) + fields["query_time_ms"] = dnsQueryTime + } else if opErr, ok := err.(*net.OpError); ok && opErr.Timeout() { + setResult(Timeout, fields, tags) + } else if err != nil { + setResult(Error, fields, tags) + acc.AddError(err) + } + acc.AddFields("dns_query", fields, tags) } } @@ -165,6 +182,21 @@ func (d *DnsQuery) parseRecordType() (uint16, error) { return recordType, error } +func setResult(result ResultType, fields map[string]interface{}, tags map[string]string) { + var tag string + switch result { + case Success: + tag = "success" + case Timeout: + tag = "timeout" + case Error: + tag = "error" + } + + tags["result"] = tag + fields["result_code"] = uint64(result) +} + func init() { inputs.Add("dns_query", func() telegraf.Input { return &DnsQuery{}