Add template variable substitution to influx queries

pull/10616/head
Chris Goller 2017-04-19 12:10:18 -05:00
parent c2cd7887e3
commit 0902f23f96
2 changed files with 42 additions and 19 deletions

View File

@ -68,17 +68,20 @@ func (c *Client) query(u *url.URL, q chronograf.Query) (chronograf.Response, err
return nil, err
}
req.Header.Set("Content-Type", "application/json")
c.Logger.
command := q.Command
if len(q.TemplateVars) > 0 {
command = TemplateReplace(q.Command, q.TemplateVars)
}
logs := c.Logger.
WithField("component", "proxy").
WithField("host", req.Host).
WithField("command", q.Command).
WithField("command", command).
WithField("db", q.DB).
WithField("rp", q.RP).
Debug("query")
WithField("rp", q.RP)
logs.Debug("query")
params := req.URL.Query()
params.Set("q", q.Command)
params.Set("q", command)
params.Set("db", q.DB)
params.Set("rp", q.RP)
params.Set("epoch", "ms")
@ -111,13 +114,7 @@ func (c *Client) query(u *url.URL, q chronograf.Query) (chronograf.Response, err
// If we got a valid decode error, send that back
if decErr != nil {
c.Logger.
WithField("component", "proxy").
WithField("host", req.Host).
WithField("command", q.Command).
WithField("db", q.DB).
WithField("rp", q.RP).
WithField("influx_status", resp.StatusCode).
logs.WithField("influx_status", resp.StatusCode).
Error("Error parsing results from influxdb: err:", decErr)
return nil, decErr
}
@ -125,12 +122,7 @@ func (c *Client) query(u *url.URL, q chronograf.Query) (chronograf.Response, err
// If we don't have an error in our json response, and didn't get statusOK
// then send back an error
if resp.StatusCode != http.StatusOK && response.Err != "" {
c.Logger.
WithField("component", "proxy").
WithField("host", req.Host).
WithField("command", q.Command).
WithField("db", q.DB).
WithField("rp", q.RP).
logs.
WithField("influx_status", resp.StatusCode).
Error("Received non-200 response from influxdb")

View File

@ -82,6 +82,7 @@ func Test_Influx_HTTPS_Failure(t *testing.T) {
func Test_Influx_HTTPS_InsecureSkipVerify(t *testing.T) {
t.Parallel()
called := false
q := ""
ts := httptest.NewTLSServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
rw.WriteHeader(http.StatusOK)
rw.Write([]byte(`{}`))
@ -89,6 +90,8 @@ func Test_Influx_HTTPS_InsecureSkipVerify(t *testing.T) {
if path := r.URL.Path; path != "/query" {
t.Error("Expected the path to contain `/query` but was", path)
}
values := r.URL.Query()
q = values.Get("q")
}))
defer ts.Close()
@ -118,6 +121,34 @@ func Test_Influx_HTTPS_InsecureSkipVerify(t *testing.T) {
if called == false {
t.Error("Expected http request to Influx but there was none")
}
called = false
q = ""
query = chronograf.Query{
Command: "select $field from cpu",
TemplateVars: []chronograf.TemplateVar{
{
Var: "$field",
Values: []chronograf.TemplateValue{
{
Value: "usage_user",
Type: "fieldKey",
},
},
},
},
}
_, err = series.Query(ctx, query)
if err != nil {
t.Fatal("Expected no error but was", err)
}
if called == false {
t.Error("Expected http request to Influx but there was none")
}
if q != `select "usage_user" from cpu` {
t.Errorf("Unexpected query: %s", q)
}
}
func Test_Influx_CancelsInFlightRequests(t *testing.T) {