diff --git a/api/prometheus/v1/api.go b/api/prometheus/v1/api.go index 0c8de071c..f6812d0f5 100644 --- a/api/prometheus/v1/api.go +++ b/api/prometheus/v1/api.go @@ -139,6 +139,7 @@ const ( epBuildinfo = apiPrefix + "/status/buildinfo" epRuntimeinfo = apiPrefix + "/status/runtimeinfo" epTSDB = apiPrefix + "/status/tsdb" + epWalReplay = apiPrefix + "/status/walreplay" ) // AlertState models the state of an alert. @@ -261,6 +262,8 @@ type API interface { Metadata(ctx context.Context, metric string, limit string) (map[string][]Metadata, error) // TSDB returns the cardinality statistics. TSDB(ctx context.Context) (TSDBResult, error) + // WalReplay returns the current replay status of the wal. + WalReplay(ctx context.Context) (WalReplayStatus, error) } // AlertsResult contains the result from querying the alerts endpoint. @@ -437,6 +440,13 @@ type TSDBResult struct { SeriesCountByLabelValuePair []Stat `json:"seriesCountByLabelValuePair"` } +// WalReplayStatus represents the wal replay status. +type WalReplayStatus struct { + Min int `json:"min"` + Max int `json:"max"` + Current int `json:"current"` +} + // Stat models information about statistic value. type Stat struct { Name string `json:"name"` @@ -984,6 +994,23 @@ func (h *httpAPI) TSDB(ctx context.Context) (TSDBResult, error) { return res, json.Unmarshal(body, &res) } +func (h *httpAPI) WalReplay(ctx context.Context) (WalReplayStatus, error) { + u := h.client.URL(epWalReplay, nil) + + req, err := http.NewRequest(http.MethodGet, u.String(), nil) + if err != nil { + return WalReplayStatus{}, err + } + + _, body, _, err := h.client.Do(ctx, req) + if err != nil { + return WalReplayStatus{}, err + } + + var res WalReplayStatus + return res, json.Unmarshal(body, &res) +} + func (h *httpAPI) QueryExemplars(ctx context.Context, query string, startTime time.Time, endTime time.Time) ([]ExemplarQueryResult, error) { u := h.client.URL(epQueryExemplars, nil) q := u.Query() diff --git a/api/prometheus/v1/api_test.go b/api/prometheus/v1/api_test.go index 4197d4288..a9b7f2094 100644 --- a/api/prometheus/v1/api_test.go +++ b/api/prometheus/v1/api_test.go @@ -230,6 +230,13 @@ func TestAPIs(t *testing.T) { } } + doWalReply := func() func() (interface{}, Warnings, error) { + return func() (interface{}, Warnings, error) { + v, err := promAPI.WalReplay(context.Background()) + return v, nil, err + } + } + doQueryExemplars := func(query string, startTime time.Time, endTime time.Time) func() (interface{}, Warnings, error) { return func() (interface{}, Warnings, error) { v, err := promAPI.QueryExemplars(context.Background(), query, startTime, endTime) @@ -1198,6 +1205,30 @@ func TestAPIs(t *testing.T) { }, }, + { + do: doWalReply(), + reqMethod: "GET", + reqPath: "/api/v1/status/walreplay", + inErr: fmt.Errorf("some error"), + err: fmt.Errorf("some error"), + }, + + { + do: doWalReply(), + reqMethod: "GET", + reqPath: "/api/v1/status/walreplay", + inRes: map[string]interface{}{ + "min": 2, + "max": 5, + "current": 40, + }, + res: WalReplayStatus{ + Min: 2, + Max: 5, + Current: 40, + }, + }, + { do: doQueryExemplars("tns_request_duration_seconds_bucket", testTime.Add(-1*time.Minute), testTime), reqMethod: "GET",