From 66a5574db9d4f1a1b6cdc24e1a635a6f0dfd5eb4 Mon Sep 17 00:00:00 2001 From: Fred Cox Date: Tue, 23 Jan 2018 16:20:34 +0200 Subject: [PATCH] Add server option to unbound plugin --- README.md | 2 +- plugins/inputs/unbound/README.md | 4 ++++ plugins/inputs/unbound/unbound.go | 22 +++++++++++++++++++--- plugins/inputs/unbound/unbound_test.go | 6 +++--- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 917975c788075..346abcbd5eaac 100644 --- a/README.md +++ b/README.md @@ -205,7 +205,7 @@ configuration options. * [teamspeak](./plugins/inputs/teamspeak) * [tomcat](./plugins/inputs/tomcat) * [twemproxy](./plugins/inputs/twemproxy) -* [unbound](./plugins/input/unbound) +* [unbound](./plugins/inputs/unbound) * [varnish](./plugins/inputs/varnish) * [zfs](./plugins/inputs/zfs) * [zookeeper](./plugins/inputs/zookeeper) diff --git a/plugins/inputs/unbound/README.md b/plugins/inputs/unbound/README.md index b3aff80784e54..f361ca9eb3145 100644 --- a/plugins/inputs/unbound/README.md +++ b/plugins/inputs/unbound/README.md @@ -18,6 +18,10 @@ This plugin gathers stats from [Unbound - a validating, recursive, and caching D ## Use the builtin fielddrop/fieldpass telegraf filters in order to keep only specific fields fieldpass = ["total_*", "num_*","time_up", "mem_*"] + + ## IP of server to connect to, read from unbound conf default, optionally '@port' + ## Will lookup IP if given a hostname + server = "127.0.0.1@8953" ``` ### Measurements & Fields: diff --git a/plugins/inputs/unbound/unbound.go b/plugins/inputs/unbound/unbound.go index 94a3323e5d493..22078a9e41662 100644 --- a/plugins/inputs/unbound/unbound.go +++ b/plugins/inputs/unbound/unbound.go @@ -4,6 +4,7 @@ import ( "bufio" "bytes" "fmt" + "net" "os/exec" "strconv" "strings" @@ -15,13 +16,14 @@ import ( "github.com/influxdata/telegraf/plugins/inputs" ) -type runner func(cmdName string, Timeout internal.Duration, UseSudo bool) (*bytes.Buffer, error) +type runner func(cmdName string, Timeout internal.Duration, UseSudo bool, Server string) (*bytes.Buffer, error) // Unbound is used to store configuration values type Unbound struct { Binary string Timeout internal.Duration UseSudo bool + Server string filter filter.Filter run runner @@ -42,6 +44,10 @@ var sampleConfig = ` ## Use the builtin fielddrop/fieldpass telegraf filters in order to keep/remove specific fields fieldpass = ["total_*", "num_*","time_up", "mem_*"] + + ## IP of server to connect to, read from unbound conf default, optionally '@port' + ## Will lookup IP if given a hostname + server = "127.0.0.1@8953" ` func (s *Unbound) Description() string { @@ -54,9 +60,18 @@ func (s *Unbound) SampleConfig() string { } // Shell out to unbound_stat and return the output -func unboundRunner(cmdName string, Timeout internal.Duration, UseSudo bool) (*bytes.Buffer, error) { +func unboundRunner(cmdName string, Timeout internal.Duration, UseSudo bool, Server string) (*bytes.Buffer, error) { cmdArgs := []string{"stats_noreset"} + if Server != "" { + // Unbound control requires an IP address, and we want to be nice to the user + serverIp, err := net.LookupIP(Server) + if err != nil { + return nil, fmt.Errorf("error looking up ip for server: %s: %s", Server, err) + } + cmdArgs = append(cmdArgs, "-s", serverIp[0].String()) + } + cmd := exec.Command(cmdName, cmdArgs...) if UseSudo { @@ -86,7 +101,7 @@ func (s *Unbound) Gather(acc telegraf.Accumulator) error { return err } - out, err := s.run(s.Binary, s.Timeout, s.UseSudo) + out, err := s.run(s.Binary, s.Timeout, s.UseSudo, s.Server) if err != nil { return fmt.Errorf("error gathering metrics: %s", err) } @@ -132,6 +147,7 @@ func init() { Binary: defaultBinary, Timeout: defaultTimeout, UseSudo: false, + Server: "", } }) } diff --git a/plugins/inputs/unbound/unbound_test.go b/plugins/inputs/unbound/unbound_test.go index b8e8210893b49..b1e0423070273 100644 --- a/plugins/inputs/unbound/unbound_test.go +++ b/plugins/inputs/unbound/unbound_test.go @@ -12,8 +12,8 @@ import ( var TestTimeout = internal.Duration{Duration: time.Second} -func UnboundControl(output string, Timeout internal.Duration, useSudo bool) func(string, internal.Duration, bool) (*bytes.Buffer, error) { - return func(string, internal.Duration, bool) (*bytes.Buffer, error) { +func UnboundControl(output string, Timeout internal.Duration, useSudo bool, Server string) func(string, internal.Duration, bool, string) (*bytes.Buffer, error) { + return func(string, internal.Duration, bool, string) (*bytes.Buffer, error) { return bytes.NewBuffer([]byte(output)), nil } } @@ -21,7 +21,7 @@ func UnboundControl(output string, Timeout internal.Duration, useSudo bool) func func TestParseFullOutput(t *testing.T) { acc := &testutil.Accumulator{} v := &Unbound{ - run: UnboundControl(fullOutput, TestTimeout, true), + run: UnboundControl(fullOutput, TestTimeout, true, ""), } err := v.Gather(acc)