diff --git a/CHANGELOG.md b/CHANGELOG.md
index 74bed127895e84cbd894f9e03cf1f95575a859da..8919669d1bc61957d4b91eb395b3fe034190d373 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 32e6a9f57a4e8583c353ba6f508ab787817ce9e5..7f371c935549d2bb3e86461bb5f640edca80cf04 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 ccde619b5d79794545dd978758d4f4dedccb4940..3c4fc25618216a3c2aeabb4177506ef780865e9c 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: "_",
 	}
 }