From c4cc57956bab19a57e8ab445f469e3cad3f95151 Mon Sep 17 00:00:00 2001 From: Dimitris Rozakis Date: Thu, 14 Sep 2017 03:27:01 +0300 Subject: [PATCH] Respect path prefix in influx output uri (#3224) (cherry picked from commit 9c8f4afa372e1008204dcc6a1e74f2a628d5a61e) --- etc/telegraf.conf | 4 +-- plugins/outputs/influxdb/README.md | 4 +-- plugins/outputs/influxdb/client/http.go | 15 ++++++--- plugins/outputs/influxdb/client/http_test.go | 34 ++++++++++++++++++++ plugins/outputs/influxdb/influxdb.go | 4 +-- 5 files changed, 48 insertions(+), 13 deletions(-) diff --git a/etc/telegraf.conf b/etc/telegraf.conf index 11ee76472..c86272640 100644 --- a/etc/telegraf.conf +++ b/etc/telegraf.conf @@ -84,9 +84,7 @@ # Configuration for influxdb server to send metrics to [[outputs.influxdb]] - ## The HTTP or UDP URL for your InfluxDB instance. Each item should be - ## of the form: - ## scheme "://" host [ ":" port] + ## The full HTTP or UDP URL for your InfluxDB instance. ## ## Multiple urls can be specified as part of the same cluster, ## this means that only ONE of the urls will be written to each interval. diff --git a/plugins/outputs/influxdb/README.md b/plugins/outputs/influxdb/README.md index 31326c918..fdaa5e506 100644 --- a/plugins/outputs/influxdb/README.md +++ b/plugins/outputs/influxdb/README.md @@ -7,9 +7,7 @@ This plugin writes to [InfluxDB](https://www.influxdb.com) via HTTP or UDP. ```toml # Configuration for influxdb server to send metrics to [[outputs.influxdb]] - ## The HTTP or UDP URL for your InfluxDB instance. Each item should be - ## of the form: - ## scheme "://" host [ ":" port] + ## The full HTTP or UDP URL for your InfluxDB instance. ## ## Multiple urls can be specified as part of the same cluster, ## this means that only ONE of the urls will be written to each interval. diff --git a/plugins/outputs/influxdb/client/http.go b/plugins/outputs/influxdb/client/http.go index 98be4bf31..4dea82a8d 100644 --- a/plugins/outputs/influxdb/client/http.go +++ b/plugins/outputs/influxdb/client/http.go @@ -10,6 +10,7 @@ import ( "io/ioutil" "net/http" "net/url" + "path" "time" ) @@ -255,8 +256,11 @@ func writeURL(u *url.URL, wp WriteParams) string { } u.RawQuery = params.Encode() - u.Path = "write" - return u.String() + p := u.Path + u.Path = path.Join(p, "write") + s := u.String() + u.Path = p + return s } func queryURL(u *url.URL, command string) string { @@ -264,6 +268,9 @@ func queryURL(u *url.URL, command string) string { params.Set("q", command) u.RawQuery = params.Encode() - u.Path = "query" - return u.String() + p := u.Path + u.Path = path.Join(p, "query") + s := u.String() + u.Path = p + return s } diff --git a/plugins/outputs/influxdb/client/http_test.go b/plugins/outputs/influxdb/client/http_test.go index 0bbf947a8..2cb0182e8 100644 --- a/plugins/outputs/influxdb/client/http_test.go +++ b/plugins/outputs/influxdb/client/http_test.go @@ -299,3 +299,37 @@ func TestGzipCompression(t *testing.T) { assert.Equal(t, []byte(influxLine), uncompressed.Bytes()) } + +func TestHTTPClient_PathPrefix(t *testing.T) { + prefix := "/some/random/prefix" + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case prefix + "/write": + w.WriteHeader(http.StatusNoContent) + w.Header().Set("Content-Type", "application/json") + case prefix + "/query": + w.WriteHeader(http.StatusOK) + w.Header().Set("Content-Type", "application/json") + fmt.Fprintln(w, `{"results":[{}]}`) + default: + w.WriteHeader(http.StatusNotFound) + msg := fmt.Sprintf("Path not found: %s", r.URL.Path) + fmt.Fprintln(w, msg) + } + })) + defer ts.Close() + + config := HTTPConfig{ + URL: ts.URL + prefix, + } + wp := WriteParams{ + Database: "test", + } + client, err := NewHTTP(config, wp) + defer client.Close() + assert.NoError(t, err) + err = client.Query("CREATE DATABASE test") + assert.NoError(t, err) + err = client.WriteStream(bytes.NewReader([]byte("cpu value=99\n"))) + assert.NoError(t, err) +} diff --git a/plugins/outputs/influxdb/influxdb.go b/plugins/outputs/influxdb/influxdb.go index 98bf252c3..cda52018d 100644 --- a/plugins/outputs/influxdb/influxdb.go +++ b/plugins/outputs/influxdb/influxdb.go @@ -53,9 +53,7 @@ type InfluxDB struct { } var sampleConfig = ` - ## The HTTP or UDP URL for your InfluxDB instance. Each item should be - ## of the form: - ## scheme "://" host [ ":" port] + ## The full HTTP or UDP URL for your InfluxDB instance. ## ## Multiple urls can be specified as part of the same cluster, ## this means that only ONE of the urls will be written to each interval.