From ec4efe5b035d7123e977b721c3022e23350496f6 Mon Sep 17 00:00:00 2001
From: Daniel Nelson <daniel@wavesofdawn.com>
Date: Wed, 18 Oct 2017 17:42:30 -0700
Subject: [PATCH] Use labels in prometheus output for string fields (#3350)

---
 .../prometheus_client/prometheus_client.go    |  9 ++++++
 .../prometheus_client_test.go                 | 28 +++++++++++++++++++
 2 files changed, 37 insertions(+)

diff --git a/plugins/outputs/prometheus_client/prometheus_client.go b/plugins/outputs/prometheus_client/prometheus_client.go
index 48b62551..d7702a06 100644
--- a/plugins/outputs/prometheus_client/prometheus_client.go
+++ b/plugins/outputs/prometheus_client/prometheus_client.go
@@ -242,6 +242,15 @@ func (p *PrometheusClient) Write(metrics []telegraf.Metric) error {
 			labels[sanitize(k)] = v
 		}
 
+		// Prometheus doesn't have a string value type, so convert string
+		// fields to labels.
+		for fn, fv := range point.Fields() {
+			switch fv := fv.(type) {
+			case string:
+				labels[sanitize(fn)] = fv
+			}
+		}
+
 		for fn, fv := range point.Fields() {
 			// Ignore string and bool fields.
 			var value float64
diff --git a/plugins/outputs/prometheus_client/prometheus_client_test.go b/plugins/outputs/prometheus_client/prometheus_client_test.go
index a997c040..1bb1cc83 100644
--- a/plugins/outputs/prometheus_client/prometheus_client_test.go
+++ b/plugins/outputs/prometheus_client/prometheus_client_test.go
@@ -324,6 +324,34 @@ func TestWrite_Tags(t *testing.T) {
 	require.True(t, now.Before(sample2.Expiration))
 }
 
+func TestWrite_StringFields(t *testing.T) {
+	now := time.Now()
+	p1, err := metric.New(
+		"foo",
+		make(map[string]string),
+		map[string]interface{}{"value": 1.0, "status": "good"},
+		now,
+		telegraf.Counter)
+	p2, err := metric.New(
+		"bar",
+		make(map[string]string),
+		map[string]interface{}{"status": "needs numeric field"},
+		now,
+		telegraf.Gauge)
+	var metrics = []telegraf.Metric{p1, p2}
+
+	client := NewClient()
+	err = client.Write(metrics)
+	require.NoError(t, err)
+
+	fam, ok := client.fam["foo"]
+	require.True(t, ok)
+	require.Equal(t, 1, fam.LabelSet["status"])
+
+	fam, ok = client.fam["bar"]
+	require.False(t, ok)
+}
+
 func TestExpire(t *testing.T) {
 	client := NewClient()
 
-- 
GitLab