From b7d29ca0e94cb9a89af16f313aefd5d19d5fc002 Mon Sep 17 00:00:00 2001
From: Patrick Hemmer <phemmer@users.noreply.github.com>
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 74bed127..8919669d 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 32e6a9f5..7f371c93 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 ccde619b..3c4fc256 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: "_",
 	}
 }
 
-- 
GitLab