|
|
|
@ -40,6 +40,7 @@ import (
|
|
|
|
|
"github.com/prometheus/prometheus/rules" |
|
|
|
|
"github.com/prometheus/prometheus/scrape" |
|
|
|
|
"github.com/prometheus/prometheus/tsdb" |
|
|
|
|
"github.com/prometheus/prometheus/util/testutil" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
func TestMain(m *testing.M) { |
|
|
|
@ -118,8 +119,10 @@ func TestReadyAndHealthy(t *testing.T) {
|
|
|
|
|
db, err := tsdb.Open(dbDir, nil, nil, nil, nil) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
|
|
port := fmt.Sprintf(":%d", testutil.RandomUnprivilegedPort(t)) |
|
|
|
|
|
|
|
|
|
opts := &Options{ |
|
|
|
|
ListenAddress: ":9090", |
|
|
|
|
ListenAddress: port, |
|
|
|
|
ReadTimeout: 30 * time.Second, |
|
|
|
|
MaxConnections: 512, |
|
|
|
|
Context: nil, |
|
|
|
@ -134,7 +137,7 @@ func TestReadyAndHealthy(t *testing.T) {
|
|
|
|
|
EnableAdminAPI: true, |
|
|
|
|
ExternalURL: &url.URL{ |
|
|
|
|
Scheme: "http", |
|
|
|
|
Host: "localhost:9090", |
|
|
|
|
Host: "localhost" + port, |
|
|
|
|
Path: "/", |
|
|
|
|
}, |
|
|
|
|
Version: &PrometheusVersion{}, |
|
|
|
@ -165,20 +168,22 @@ func TestReadyAndHealthy(t *testing.T) {
|
|
|
|
|
// to be up before starting tests.
|
|
|
|
|
time.Sleep(5 * time.Second) |
|
|
|
|
|
|
|
|
|
resp, err := http.Get("http://localhost:9090/-/healthy") |
|
|
|
|
baseURL := "http://localhost" + port |
|
|
|
|
|
|
|
|
|
resp, err := http.Get(baseURL + "/-/healthy") |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, http.StatusOK, resp.StatusCode) |
|
|
|
|
cleanupTestResponse(t, resp) |
|
|
|
|
|
|
|
|
|
for _, u := range []string{ |
|
|
|
|
"http://localhost:9090/-/ready", |
|
|
|
|
"http://localhost:9090/classic/graph", |
|
|
|
|
"http://localhost:9090/classic/flags", |
|
|
|
|
"http://localhost:9090/classic/rules", |
|
|
|
|
"http://localhost:9090/classic/service-discovery", |
|
|
|
|
"http://localhost:9090/classic/targets", |
|
|
|
|
"http://localhost:9090/classic/status", |
|
|
|
|
"http://localhost:9090/classic/config", |
|
|
|
|
baseURL + "/-/ready", |
|
|
|
|
baseURL + "/classic/graph", |
|
|
|
|
baseURL + "/classic/flags", |
|
|
|
|
baseURL + "/classic/rules", |
|
|
|
|
baseURL + "/classic/service-discovery", |
|
|
|
|
baseURL + "/classic/targets", |
|
|
|
|
baseURL + "/classic/status", |
|
|
|
|
baseURL + "/classic/config", |
|
|
|
|
} { |
|
|
|
|
resp, err = http.Get(u) |
|
|
|
|
require.NoError(t, err) |
|
|
|
@ -186,12 +191,12 @@ func TestReadyAndHealthy(t *testing.T) {
|
|
|
|
|
cleanupTestResponse(t, resp) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
resp, err = http.Post("http://localhost:9090/api/v1/admin/tsdb/snapshot", "", strings.NewReader("")) |
|
|
|
|
resp, err = http.Post(baseURL+"/api/v1/admin/tsdb/snapshot", "", strings.NewReader("")) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, http.StatusServiceUnavailable, resp.StatusCode) |
|
|
|
|
cleanupTestResponse(t, resp) |
|
|
|
|
|
|
|
|
|
resp, err = http.Post("http://localhost:9090/api/v1/admin/tsdb/delete_series", "", strings.NewReader("{}")) |
|
|
|
|
resp, err = http.Post(baseURL+"/api/v1/admin/tsdb/delete_series", "", strings.NewReader("{}")) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, http.StatusServiceUnavailable, resp.StatusCode) |
|
|
|
|
cleanupTestResponse(t, resp) |
|
|
|
@ -200,15 +205,15 @@ func TestReadyAndHealthy(t *testing.T) {
|
|
|
|
|
webHandler.Ready() |
|
|
|
|
|
|
|
|
|
for _, u := range []string{ |
|
|
|
|
"http://localhost:9090/-/healthy", |
|
|
|
|
"http://localhost:9090/-/ready", |
|
|
|
|
"http://localhost:9090/classic/graph", |
|
|
|
|
"http://localhost:9090/classic/flags", |
|
|
|
|
"http://localhost:9090/classic/rules", |
|
|
|
|
"http://localhost:9090/classic/service-discovery", |
|
|
|
|
"http://localhost:9090/classic/targets", |
|
|
|
|
"http://localhost:9090/classic/status", |
|
|
|
|
"http://localhost:9090/classic/config", |
|
|
|
|
baseURL + "/-/healthy", |
|
|
|
|
baseURL + "/-/ready", |
|
|
|
|
baseURL + "/classic/graph", |
|
|
|
|
baseURL + "/classic/flags", |
|
|
|
|
baseURL + "/classic/rules", |
|
|
|
|
baseURL + "/classic/service-discovery", |
|
|
|
|
baseURL + "/classic/targets", |
|
|
|
|
baseURL + "/classic/status", |
|
|
|
|
baseURL + "/classic/config", |
|
|
|
|
} { |
|
|
|
|
resp, err = http.Get(u) |
|
|
|
|
require.NoError(t, err) |
|
|
|
@ -216,13 +221,13 @@ func TestReadyAndHealthy(t *testing.T) {
|
|
|
|
|
cleanupTestResponse(t, resp) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
resp, err = http.Post("http://localhost:9090/api/v1/admin/tsdb/snapshot", "", strings.NewReader("")) |
|
|
|
|
resp, err = http.Post(baseURL+"/api/v1/admin/tsdb/snapshot", "", strings.NewReader("")) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, http.StatusOK, resp.StatusCode) |
|
|
|
|
cleanupSnapshot(t, dbDir, resp) |
|
|
|
|
cleanupTestResponse(t, resp) |
|
|
|
|
|
|
|
|
|
resp, err = http.Post("http://localhost:9090/api/v1/admin/tsdb/delete_series?match[]=up", "", nil) |
|
|
|
|
resp, err = http.Post(baseURL+"/api/v1/admin/tsdb/delete_series?match[]=up", "", nil) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, http.StatusNoContent, resp.StatusCode) |
|
|
|
|
cleanupTestResponse(t, resp) |
|
|
|
@ -237,8 +242,10 @@ func TestRoutePrefix(t *testing.T) {
|
|
|
|
|
db, err := tsdb.Open(dbDir, nil, nil, nil, nil) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
|
|
port := fmt.Sprintf(":%d", testutil.RandomUnprivilegedPort(t)) |
|
|
|
|
|
|
|
|
|
opts := &Options{ |
|
|
|
|
ListenAddress: ":9091", |
|
|
|
|
ListenAddress: port, |
|
|
|
|
ReadTimeout: 30 * time.Second, |
|
|
|
|
MaxConnections: 512, |
|
|
|
|
Context: nil, |
|
|
|
@ -252,7 +259,7 @@ func TestRoutePrefix(t *testing.T) {
|
|
|
|
|
RoutePrefix: "/prometheus", |
|
|
|
|
EnableAdminAPI: true, |
|
|
|
|
ExternalURL: &url.URL{ |
|
|
|
|
Host: "localhost.localdomain:9090", |
|
|
|
|
Host: "localhost.localdomain" + port, |
|
|
|
|
Scheme: "http", |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
@ -277,22 +284,24 @@ func TestRoutePrefix(t *testing.T) {
|
|
|
|
|
// to be up before starting tests.
|
|
|
|
|
time.Sleep(5 * time.Second) |
|
|
|
|
|
|
|
|
|
resp, err := http.Get("http://localhost:9091" + opts.RoutePrefix + "/-/healthy") |
|
|
|
|
baseURL := "http://localhost" + port |
|
|
|
|
|
|
|
|
|
resp, err := http.Get(baseURL + opts.RoutePrefix + "/-/healthy") |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, http.StatusOK, resp.StatusCode) |
|
|
|
|
cleanupTestResponse(t, resp) |
|
|
|
|
|
|
|
|
|
resp, err = http.Get("http://localhost:9091" + opts.RoutePrefix + "/-/ready") |
|
|
|
|
resp, err = http.Get(baseURL + opts.RoutePrefix + "/-/ready") |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, http.StatusServiceUnavailable, resp.StatusCode) |
|
|
|
|
cleanupTestResponse(t, resp) |
|
|
|
|
|
|
|
|
|
resp, err = http.Post("http://localhost:9091"+opts.RoutePrefix+"/api/v1/admin/tsdb/snapshot", "", strings.NewReader("")) |
|
|
|
|
resp, err = http.Post(baseURL+opts.RoutePrefix+"/api/v1/admin/tsdb/snapshot", "", strings.NewReader("")) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, http.StatusServiceUnavailable, resp.StatusCode) |
|
|
|
|
cleanupTestResponse(t, resp) |
|
|
|
|
|
|
|
|
|
resp, err = http.Post("http://localhost:9091"+opts.RoutePrefix+"/api/v1/admin/tsdb/delete_series", "", strings.NewReader("{}")) |
|
|
|
|
resp, err = http.Post(baseURL+opts.RoutePrefix+"/api/v1/admin/tsdb/delete_series", "", strings.NewReader("{}")) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, http.StatusServiceUnavailable, resp.StatusCode) |
|
|
|
|
cleanupTestResponse(t, resp) |
|
|
|
@ -300,23 +309,23 @@ func TestRoutePrefix(t *testing.T) {
|
|
|
|
|
// Set to ready.
|
|
|
|
|
webHandler.Ready() |
|
|
|
|
|
|
|
|
|
resp, err = http.Get("http://localhost:9091" + opts.RoutePrefix + "/-/healthy") |
|
|
|
|
resp, err = http.Get(baseURL + opts.RoutePrefix + "/-/healthy") |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, http.StatusOK, resp.StatusCode) |
|
|
|
|
cleanupTestResponse(t, resp) |
|
|
|
|
|
|
|
|
|
resp, err = http.Get("http://localhost:9091" + opts.RoutePrefix + "/-/ready") |
|
|
|
|
resp, err = http.Get(baseURL + opts.RoutePrefix + "/-/ready") |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, http.StatusOK, resp.StatusCode) |
|
|
|
|
cleanupTestResponse(t, resp) |
|
|
|
|
|
|
|
|
|
resp, err = http.Post("http://localhost:9091"+opts.RoutePrefix+"/api/v1/admin/tsdb/snapshot", "", strings.NewReader("")) |
|
|
|
|
resp, err = http.Post(baseURL+opts.RoutePrefix+"/api/v1/admin/tsdb/snapshot", "", strings.NewReader("")) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, http.StatusOK, resp.StatusCode) |
|
|
|
|
cleanupSnapshot(t, dbDir, resp) |
|
|
|
|
cleanupTestResponse(t, resp) |
|
|
|
|
|
|
|
|
|
resp, err = http.Post("http://localhost:9091"+opts.RoutePrefix+"/api/v1/admin/tsdb/delete_series?match[]=up", "", nil) |
|
|
|
|
resp, err = http.Post(baseURL+opts.RoutePrefix+"/api/v1/admin/tsdb/delete_series?match[]=up", "", nil) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, http.StatusNoContent, resp.StatusCode) |
|
|
|
|
cleanupTestResponse(t, resp) |
|
|
|
@ -404,8 +413,10 @@ func TestShutdownWithStaleConnection(t *testing.T) {
|
|
|
|
|
|
|
|
|
|
timeout := 10 * time.Second |
|
|
|
|
|
|
|
|
|
port := fmt.Sprintf(":%d", testutil.RandomUnprivilegedPort(t)) |
|
|
|
|
|
|
|
|
|
opts := &Options{ |
|
|
|
|
ListenAddress: ":9090", |
|
|
|
|
ListenAddress: port, |
|
|
|
|
ReadTimeout: timeout, |
|
|
|
|
MaxConnections: 512, |
|
|
|
|
Context: nil, |
|
|
|
@ -419,7 +430,7 @@ func TestShutdownWithStaleConnection(t *testing.T) {
|
|
|
|
|
RoutePrefix: "/", |
|
|
|
|
ExternalURL: &url.URL{ |
|
|
|
|
Scheme: "http", |
|
|
|
|
Host: "localhost:9090", |
|
|
|
|
Host: "localhost" + port, |
|
|
|
|
Path: "/", |
|
|
|
|
}, |
|
|
|
|
Version: &PrometheusVersion{}, |
|
|
|
@ -454,7 +465,7 @@ func TestShutdownWithStaleConnection(t *testing.T) {
|
|
|
|
|
|
|
|
|
|
// Open a socket, and don't use it. This connection should then be closed
|
|
|
|
|
// after the ReadTimeout.
|
|
|
|
|
c, err := net.Dial("tcp", "localhost:9090") |
|
|
|
|
c, err := net.Dial("tcp", opts.ExternalURL.Host) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
t.Cleanup(func() { require.NoError(t, c.Close()) }) |
|
|
|
|
|
|
|
|
@ -469,14 +480,16 @@ func TestShutdownWithStaleConnection(t *testing.T) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestHandleMultipleQuitRequests(t *testing.T) { |
|
|
|
|
port := fmt.Sprintf(":%d", testutil.RandomUnprivilegedPort(t)) |
|
|
|
|
|
|
|
|
|
opts := &Options{ |
|
|
|
|
ListenAddress: ":9090", |
|
|
|
|
ListenAddress: port, |
|
|
|
|
MaxConnections: 512, |
|
|
|
|
EnableLifecycle: true, |
|
|
|
|
RoutePrefix: "/", |
|
|
|
|
ExternalURL: &url.URL{ |
|
|
|
|
Scheme: "http", |
|
|
|
|
Host: "localhost:9090", |
|
|
|
|
Host: "localhost" + port, |
|
|
|
|
Path: "/", |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
@ -501,6 +514,8 @@ func TestHandleMultipleQuitRequests(t *testing.T) {
|
|
|
|
|
// to be up before starting tests.
|
|
|
|
|
time.Sleep(5 * time.Second) |
|
|
|
|
|
|
|
|
|
baseURL := opts.ExternalURL.Scheme + "://" + opts.ExternalURL.Host |
|
|
|
|
|
|
|
|
|
start := make(chan struct{}) |
|
|
|
|
var wg sync.WaitGroup |
|
|
|
|
for i := 0; i < 3; i++ { |
|
|
|
@ -508,7 +523,7 @@ func TestHandleMultipleQuitRequests(t *testing.T) {
|
|
|
|
|
go func() { |
|
|
|
|
defer wg.Done() |
|
|
|
|
<-start |
|
|
|
|
resp, err := http.Post("http://localhost:9090/-/quit", "", strings.NewReader("")) |
|
|
|
|
resp, err := http.Post(baseURL+"/-/quit", "", strings.NewReader("")) |
|
|
|
|
require.NoError(t, err) |
|
|
|
|
require.Equal(t, http.StatusOK, resp.StatusCode) |
|
|
|
|
}() |
|
|
|
|