diff --git a/cmd/promtool/main.go b/cmd/promtool/main.go index 7de7996642..e1074549e3 100644 --- a/cmd/promtool/main.go +++ b/cmd/promtool/main.go @@ -71,12 +71,12 @@ func main() { queryCmdFmt := queryCmd.Flag("format", "Output format of the query.").Short('o').Default("promql").Enum("promql", "json") queryInstantCmd := queryCmd.Command("instant", "Run instant query.") - queryInstantServer := queryInstantCmd.Arg("server", "Prometheus server to query.").Required().String() + queryInstantServer := queryInstantCmd.Arg("server", "Prometheus server to query.").Required().URL() queryInstantExpr := queryInstantCmd.Arg("expr", "PromQL query expression.").Required().String() queryInstantTime := queryInstantCmd.Flag("time", "Query evaluation time (RFC3339 or Unix timestamp).").String() queryRangeCmd := queryCmd.Command("range", "Run range query.") - queryRangeServer := queryRangeCmd.Arg("server", "Prometheus server to query.").Required().String() + queryRangeServer := queryRangeCmd.Arg("server", "Prometheus server to query.").Required().URL() queryRangeExpr := queryRangeCmd.Arg("expr", "PromQL query expression.").Required().String() queryRangeHeaders := queryRangeCmd.Flag("header", "Extra headers to send to server.").StringMap() queryRangeBegin := queryRangeCmd.Flag("start", "Query range start time (RFC3339 or Unix timestamp).").String() @@ -437,9 +437,12 @@ func CheckMetrics() int { } // QueryInstant performs an instant query against a Prometheus server. -func QueryInstant(url, query, evalTime string, p printer) int { +func QueryInstant(url *url.URL, query, evalTime string, p printer) int { + if url.Scheme == "" { + url.Scheme = "http" + } config := api.Config{ - Address: url, + Address: url.String(), } // Create new client. @@ -475,9 +478,12 @@ func QueryInstant(url, query, evalTime string, p printer) int { } // QueryRange performs a range query against a Prometheus server. -func QueryRange(url string, headers map[string]string, query, start, end string, step time.Duration, p printer) int { +func QueryRange(url *url.URL, headers map[string]string, query, start, end string, step time.Duration, p printer) int { + if url.Scheme == "" { + url.Scheme = "http" + } config := api.Config{ - Address: url, + Address: url.String(), } if len(headers) > 0 { @@ -547,6 +553,9 @@ func QueryRange(url string, headers map[string]string, query, start, end string, // QuerySeries queries for a series against a Prometheus server. func QuerySeries(url *url.URL, matchers []string, start, end string, p printer) int { + if url.Scheme == "" { + url.Scheme = "http" + } config := api.Config{ Address: url.String(), } @@ -581,6 +590,9 @@ func QuerySeries(url *url.URL, matchers []string, start, end string, p printer) // QueryLabels queries for label values against a Prometheus server. func QueryLabels(url *url.URL, name string, start, end string, p printer) int { + if url.Scheme == "" { + url.Scheme = "http" + } config := api.Config{ Address: url.String(), } diff --git a/cmd/promtool/main_test.go b/cmd/promtool/main_test.go index f3f6d0e162..112c387c93 100644 --- a/cmd/promtool/main_test.go +++ b/cmd/promtool/main_test.go @@ -17,6 +17,7 @@ import ( "fmt" "net/http" "net/http/httptest" + "net/url" "testing" "time" @@ -27,15 +28,18 @@ func TestQueryRange(t *testing.T) { s, getRequest := mockServer(200, `{"status": "success", "data": {"resultType": "matrix", "result": []}}`) defer s.Close() + urlObject, err := url.Parse(s.URL) + require.Equal(t, nil, err) + p := &promqlPrinter{} - exitCode := QueryRange(s.URL, map[string]string{}, "up", "0", "300", 0, p) + exitCode := QueryRange(urlObject, map[string]string{}, "up", "0", "300", 0, p) require.Equal(t, "/api/v1/query_range", getRequest().URL.Path) form := getRequest().Form require.Equal(t, "up", form.Get("query")) require.Equal(t, "1", form.Get("step")) require.Equal(t, 0, exitCode) - exitCode = QueryRange(s.URL, map[string]string{}, "up", "0", "300", 10*time.Millisecond, p) + exitCode = QueryRange(urlObject, map[string]string{}, "up", "0", "300", 10*time.Millisecond, p) require.Equal(t, "/api/v1/query_range", getRequest().URL.Path) form = getRequest().Form require.Equal(t, "up", form.Get("query")) @@ -47,8 +51,11 @@ func TestQueryInstant(t *testing.T) { s, getRequest := mockServer(200, `{"status": "success", "data": {"resultType": "vector", "result": []}}`) defer s.Close() + urlObject, err := url.Parse(s.URL) + require.Equal(t, nil, err) + p := &promqlPrinter{} - exitCode := QueryInstant(s.URL, "up", "300", p) + exitCode := QueryInstant(urlObject, "up", "300", p) require.Equal(t, "/api/v1/query", getRequest().URL.Path) form := getRequest().Form require.Equal(t, "up", form.Get("query"))