From b7d29ca0e94cb9a89af16f313aefd5d19d5fc002 Mon Sep 17 00:00:00 2001 From: Patrick Hemmer Date: Thu, 12 Jan 2017 06:08:22 -0500 Subject: [PATCH] allow changing jolokia delimiter (#2255) --- CHANGELOG.md | 1 + plugins/inputs/jolokia/jolokia.go | 27 +++++++++++++++++--------- plugins/inputs/jolokia/jolokia_test.go | 7 ++++--- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 74bed1278..8919669d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ plugins, not just statsd. - [#1942](https://github.com/influxdata/telegraf/pull/1942): Change Amazon Kinesis output plugin to use the built-in serializer plugins. - [#1980](https://github.com/influxdata/telegraf/issues/1980): Hide username/password from elasticsearch error log messages. - [#2097](https://github.com/influxdata/telegraf/issues/2097): Configurable HTTP timeouts in Jolokia plugin +- [#2255](https://github.com/influxdata/telegraf/pull/2255): Allow changing jolokia attribute delimiter ### Bugfixes diff --git a/plugins/inputs/jolokia/jolokia.go b/plugins/inputs/jolokia/jolokia.go index 32e6a9f57..7f371c935 100644 --- a/plugins/inputs/jolokia/jolokia.go +++ b/plugins/inputs/jolokia/jolokia.go @@ -47,12 +47,13 @@ func (c JolokiaClientImpl) MakeRequest(req *http.Request) (*http.Response, error } type Jolokia struct { - jClient JolokiaClient - Context string - Mode string - Servers []Server - Metrics []Metric - Proxy Server + jClient JolokiaClient + Context string + Mode string + Servers []Server + Metrics []Metric + Proxy Server + Delimiter string ResponseHeaderTimeout internal.Duration `toml:"response_header_timeout"` ClientTimeout internal.Duration `toml:"client_timeout"` @@ -84,6 +85,13 @@ const sampleConfig = ` ## Includes connection time, any redirects, and reading the response body. # client_timeout = "4s" + ## Attribute delimiter + ## + ## When multiple attributes are returned for a single + ## [inputs.jolokia.metrics], the field name is a concatenation of the metric + ## name, and the attribute name, separated by the given delimiter. + # delimiter = "_" + ## List of servers exposing jolokia read service [[inputs.jolokia.servers]] name = "as-server-01" @@ -238,10 +246,10 @@ func (j *Jolokia) prepareRequest(server Server, metric Metric) (*http.Request, e return req, nil } -func extractValues(measurement string, value interface{}, fields map[string]interface{}) { +func (j *Jolokia) extractValues(measurement string, value interface{}, fields map[string]interface{}) { if mapValues, ok := value.(map[string]interface{}); ok { for k2, v2 := range mapValues { - extractValues(measurement+"_"+k2, v2, fields) + j.extractValues(measurement+j.Delimiter+k2, v2, fields) } } else { fields[measurement] = value @@ -282,7 +290,7 @@ func (j *Jolokia) Gather(acc telegraf.Accumulator) error { fmt.Printf("Error handling response: %s\n", err) } else { if values, ok := out["value"]; ok { - extractValues(measurement, values, fields) + j.extractValues(measurement, values, fields) } else { fmt.Printf("Missing key 'value' in output response\n") } @@ -301,6 +309,7 @@ func init() { return &Jolokia{ ResponseHeaderTimeout: DefaultResponseHeaderTimeout, ClientTimeout: DefaultClientTimeout, + Delimiter: "_", } }) } diff --git a/plugins/inputs/jolokia/jolokia_test.go b/plugins/inputs/jolokia/jolokia_test.go index ccde619b5..3c4fc2561 100644 --- a/plugins/inputs/jolokia/jolokia_test.go +++ b/plugins/inputs/jolokia/jolokia_test.go @@ -104,9 +104,10 @@ func (c jolokiaClientStub) MakeRequest(req *http.Request) (*http.Response, error // *HttpJson: Pointer to an HttpJson object that uses the generated mock HTTP client func genJolokiaClientStub(response string, statusCode int, servers []Server, metrics []Metric) *Jolokia { return &Jolokia{ - jClient: jolokiaClientStub{responseBody: response, statusCode: statusCode}, - Servers: servers, - Metrics: metrics, + jClient: jolokiaClientStub{responseBody: response, statusCode: statusCode}, + Servers: servers, + Metrics: metrics, + Delimiter: "_", } }