From fce956d95a26912efc05f2294320d55b6887ea42 Mon Sep 17 00:00:00 2001 From: Ben Ye Date: Fri, 18 Nov 2022 16:52:35 -0800 Subject: [PATCH 1/4] support Prometheus /api/v1/status/buildinfo API Signed-off-by: Ben Ye --- pkg/api/api.go | 4 +++- pkg/api/handlers.go | 9 ++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/pkg/api/api.go b/pkg/api/api.go index 2e4d6645ba7..75aadfd5e20 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -352,7 +352,7 @@ type Distributor interface { UserStatsHandler(w http.ResponseWriter, r *http.Request) } -// RegisterQueryable registers the the default routes associated with the querier +// RegisterQueryable registers the default routes associated with the querier // module. func (a *API) RegisterQueryable( queryable storage.SampleAndChunkQueryable, @@ -374,6 +374,7 @@ func (a *API) RegisterQueryAPI(handler http.Handler) { a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/label/{name}/values"), handler, true, "GET") a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/series"), handler, true, "GET", "POST", "DELETE") a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/metadata"), handler, true, "GET") + a.RegisterRoute(path.Join(a.cfg.PrometheusHTTPPrefix, "/api/v1/status/buildinfo"), handler, true, "GET") // Register Legacy Routers a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/read"), handler, true, "POST") @@ -384,6 +385,7 @@ func (a *API) RegisterQueryAPI(handler http.Handler) { a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/label/{name}/values"), handler, true, "GET") a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/series"), handler, true, "GET", "POST", "DELETE") a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/metadata"), handler, true, "GET") + a.RegisterRoute(path.Join(a.cfg.LegacyHTTPPrefix, "/api/v1/status/buildinfo"), handler, true, "GET") } // RegisterQueryFrontend registers the Prometheus routes supported by the diff --git a/pkg/api/handlers.go b/pkg/api/handlers.go index af3e65a01f3..a7b0b4f97a5 100644 --- a/pkg/api/handlers.go +++ b/pkg/api/handlers.go @@ -15,6 +15,7 @@ import ( "github.com/prometheus/client_golang/prometheus/promauto" dto "github.com/prometheus/client_model/go" "github.com/prometheus/common/route" + "github.com/prometheus/common/version" "github.com/prometheus/prometheus/config" "github.com/prometheus/prometheus/storage" v1 "github.com/prometheus/prometheus/web/api/v1" @@ -211,7 +212,11 @@ func NewQuerierHandler( false, regexp.MustCompile(".*"), func() (v1.RuntimeInfo, error) { return v1.RuntimeInfo{}, errors.New("not implemented") }, - &v1.PrometheusVersion{}, + &v1.PrometheusVersion{ + Version: version.Version, + Branch: version.Branch, + Revision: version.Revision, + }, // This is used for the stats API which we should not support. Or find other ways to. prometheus.GathererFunc(func() ([]*dto.MetricFamily, error) { return nil, nil }), reg, @@ -255,6 +260,7 @@ func NewQuerierHandler( router.Path(path.Join(prefix, "/api/v1/label/{name}/values")).Methods("GET").Handler(promRouter) router.Path(path.Join(prefix, "/api/v1/series")).Methods("GET", "POST", "DELETE").Handler(promRouter) router.Path(path.Join(prefix, "/api/v1/metadata")).Methods("GET").Handler(promRouter) + router.Path(path.Join(prefix, "/api/v1/status/buildinfo")).Methods("GET").Handler(promRouter) // TODO(gotjosh): This custom handler is temporary until we're able to vendor the changes in: // https://github.com/prometheus/prometheus/pull/7125/files @@ -268,6 +274,7 @@ func NewQuerierHandler( router.Path(path.Join(legacyPrefix, "/api/v1/label/{name}/values")).Methods("GET").Handler(legacyPromRouter) router.Path(path.Join(legacyPrefix, "/api/v1/series")).Methods("GET", "POST", "DELETE").Handler(legacyPromRouter) router.Path(path.Join(legacyPrefix, "/api/v1/metadata")).Methods("GET").Handler(legacyPromRouter) + router.Path(path.Join(legacyPrefix, "/api/v1/status/buildinfo")).Methods("GET").Handler(legacyPromRouter) // Track execution time. return stats.NewWallTimeMiddleware().Wrap(router) From 0c607ab0dca54f2193ad6a74d10d705cc02a919f Mon Sep 17 00:00:00 2001 From: Ben Ye Date: Sat, 19 Nov 2022 10:51:06 -0800 Subject: [PATCH 2/4] add unit test Signed-off-by: Ben Ye --- CHANGELOG.md | 1 + pkg/api/handlers_test.go | 56 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 469757f4515..e3798a71fc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ## master / unreleased +* [FEATURE] Querier/Query Frontend: support Prometheus /api/v1/status/buildinfo API. #4978 ## 1.14.0 in progress diff --git a/pkg/api/handlers_test.go b/pkg/api/handlers_test.go index be0d7aa6429..96ba3b36e12 100644 --- a/pkg/api/handlers_test.go +++ b/pkg/api/handlers_test.go @@ -1,14 +1,20 @@ package api import ( + "encoding/json" "io" "net/http" "net/http/httptest" "strings" "testing" + "github.com/prometheus/common/version" + v1 "github.com/prometheus/prometheus/web/api/v1" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/weaveworks/common/user" + + "github.com/cortexproject/cortex/pkg/purger" ) func TestIndexHandlerPrefix(t *testing.T) { @@ -189,3 +195,53 @@ func TestConfigOverrideHandler(t *testing.T) { assert.NoError(t, err) assert.Equal(t, []byte("config"), body) } + +func TestBuildInfoAPI(t *testing.T) { + type buildInfo struct { + Status string `json:"status"` + Data v1.PrometheusVersion `json:"data"` + } + + for _, tc := range []struct { + name string + version string + branch string + revision string + expected buildInfo + }{ + { + name: "empty", + expected: buildInfo{Status: "success"}, + }, + { + name: "set versions", + version: "v0.14.0", + branch: "test", + revision: "foo", + expected: buildInfo{Status: "success", Data: v1.PrometheusVersion{ + Version: "v0.14.0", + Branch: "test", + Revision: "foo", + }}, + }, + } { + t.Run(tc.name, func(t *testing.T) { + cfg := Config{} + version.Version = tc.version + version.Branch = tc.branch + version.Revision = tc.revision + handler := NewQuerierHandler(cfg, nil, nil, nil, nil, purger.NewNoopTombstonesLoader(), nil, &FakeLogger{}) + writer := httptest.NewRecorder() + req := httptest.NewRequest("GET", "/api/v1/status/buildinfo", nil) + req = req.WithContext(user.InjectOrgID(req.Context(), "test")) + handler.ServeHTTP(writer, req) + out, err := io.ReadAll(writer.Body) + require.NoError(t, err) + + var info buildInfo + err = json.Unmarshal(out, &info) + require.NoError(t, err) + require.Equal(t, tc.expected, info) + }) + } +} From b5c0f5127d24801fd4506ac92725270f1294f899 Mon Sep 17 00:00:00 2001 From: Ben Ye Date: Mon, 21 Nov 2022 11:27:16 -0800 Subject: [PATCH 3/4] update api doc Signed-off-by: Ben Ye --- docs/api/_index.md | 127 +++++++++++++++++++++------------------ pkg/api/handlers.go | 9 ++- pkg/api/handlers_test.go | 14 +++-- 3 files changed, 85 insertions(+), 65 deletions(-) diff --git a/docs/api/_index.md b/docs/api/_index.md index 32dce280eb5..5f12d86dc38 100644 --- a/docs/api/_index.md +++ b/docs/api/_index.md @@ -15,63 +15,64 @@ For the sake of clarity, in this document we have grouped API endpoints by servi ## Endpoints -| API | Service | Endpoint | -| --- | ------- | -------- | -| [Index page](#index-page) | _All services_ | `GET /` | -| [Configuration](#configuration) | _All services_ | `GET /config` | -| [Runtime Configuration](#runtime-configuration) | _All services_ | `GET /runtime_config` | -| [Services status](#services-status) | _All services_ | `GET /services` | -| [Readiness probe](#readiness-probe) | _All services_ | `GET /ready` | -| [Metrics](#metrics) | _All services_ | `GET /metrics` | -| [Pprof](#pprof) | _All services_ | `GET /debug/pprof` | -| [Fgprof](#fgprof) | _All services_ | `GET /debug/fgprof` | -| [Remote write](#remote-write) | Distributor | `POST /api/v1/push` | -| [Tenants stats](#tenants-stats) | Distributor | `GET /distributor/all_user_stats` | -| [HA tracker status](#ha-tracker-status) | Distributor | `GET /distributor/ha_tracker` | -| [Flush blocks](#flush-blocks) | Ingester | `GET,POST /ingester/flush` | -| [Shutdown](#shutdown) | Ingester | `GET,POST /ingester/shutdown` | -| [Ingesters ring status](#ingesters-ring-status) | Ingester | `GET /ingester/ring` | -| [Instant query](#instant-query) | Querier, Query-frontend | `GET,POST /api/v1/query` | -| [Range query](#range-query) | Querier, Query-frontend | `GET,POST /api/v1/query_range` | -| [Exemplar query](#exemplar-query) | Querier, Query-frontend | `GET,POST /api/v1/query_exemplars` | -| [Get series by label matchers](#get-series-by-label-matchers) | Querier, Query-frontend | `GET,POST /api/v1/series` | -| [Get label names](#get-label-names) | Querier, Query-frontend | `GET,POST /api/v1/labels` | -| [Get label values](#get-label-values) | Querier, Query-frontend | `GET /api/v1/label/{name}/values` | -| [Get metric metadata](#get-metric-metadata) | Querier, Query-frontend | `GET /api/v1/metadata` | -| [Remote read](#remote-read) | Querier, Query-frontend | `POST /api/v1/read` | -| [Get tenant ingestion stats](#get-tenant-ingestion-stats) | Querier | `GET /api/v1/user_stats` | -| [Ruler ring status](#ruler-ring-status) | Ruler | `GET /ruler/ring` | -| [Ruler rules ](#ruler-rule-groups) | Ruler | `GET /ruler/rule_groups` | -| [List rules](#list-rules) | Ruler | `GET /api/v1/rules` | -| [List alerts](#list-alerts) | Ruler | `GET /api/v1/alerts` | -| [List rule groups](#list-rule-groups) | Ruler | `GET /api/v1/rules` | -| [Get rule groups by namespace](#get-rule-groups-by-namespace) | Ruler | `GET /api/v1/rules/{namespace}` | -| [Get rule group](#get-rule-group) | Ruler | `GET /api/v1/rules/{namespace}/{groupName}` | -| [Set rule group](#set-rule-group) | Ruler | `POST /api/v1/rules/{namespace}` | -| [Delete rule group](#delete-rule-group) | Ruler | `DELETE /api/v1/rules/{namespace}/{groupName}` | -| [Delete namespace](#delete-namespace) | Ruler | `DELETE /api/v1/rules/{namespace}` | -| [Delete tenant configuration](#delete-tenant-configuration) | Ruler | `POST /ruler/delete_tenant_config` | -| [Alertmanager status](#alertmanager-status) | Alertmanager | `GET /multitenant_alertmanager/status` | -| [Alertmanager configs](#alertmanager-configs) | Alertmanager | `GET /multitenant_alertmanager/configs` | -| [Alertmanager ring status](#alertmanager-ring-status) | Alertmanager | `GET /multitenant_alertmanager/ring` | -| [Alertmanager UI](#alertmanager-ui) | Alertmanager | `GET /` | -| [Alertmanager Delete Tenant Configuration](#alertmanager-delete-tenant-configuration) | Alertmanager | `POST /multitenant_alertmanager/delete_tenant_config` | -| [Get Alertmanager configuration](#get-alertmanager-configuration) | Alertmanager | `GET /api/v1/alerts` | -| [Set Alertmanager configuration](#set-alertmanager-configuration) | Alertmanager | `POST /api/v1/alerts` | -| [Delete Alertmanager configuration](#delete-alertmanager-configuration) | Alertmanager | `DELETE /api/v1/alerts` | -| [Tenant delete request](#tenant-delete-request) | Purger | `POST /purger/delete_tenant` | -| [Tenant delete status](#tenant-delete-status) | Purger | `GET /purger/delete_tenant_status` | -| [Store-gateway ring status](#store-gateway-ring-status) | Store-gateway | `GET /store-gateway/ring` | -| [Compactor ring status](#compactor-ring-status) | Compactor | `GET /compactor/ring` | -| [Get rule files](#get-rule-files) | Configs API (deprecated) | `GET /api/prom/configs/rules` | -| [Set rule files](#set-rule-files) | Configs API (deprecated) | `POST /api/prom/configs/rules` | -| [Get template files](#get-template-files) | Configs API (deprecated) | `GET /api/prom/configs/templates` | -| [Set template files](#set-template-files) | Configs API (deprecated) | `POST /api/prom/configs/templates` | -| [Get Alertmanager config file](#get-alertmanager-config-file) | Configs API (deprecated) | `GET /api/prom/configs/alertmanager` | -| [Set Alertmanager config file](#set-alertmanager-config-file) | Configs API (deprecated) | `POST /api/prom/configs/alertmanager` | -| [Validate Alertmanager config](#validate-alertmanager-config-file) | Configs API (deprecated) | `POST /api/prom/configs/alertmanager/validate` | -| [Deactivate configs](#deactivate-configs) | Configs API (deprecated) | `DELETE /api/prom/configs/deactivate` | -| [Restore configs](#restore-configs) | Configs API (deprecated) | `POST /api/prom/configs/restore` | +| API | Service | Endpoint | +|---------------------------------------------------------------------------------------| ------- |------------------------------------------------------------| +| [Index page](#index-page) | _All services_ | `GET /` | +| [Configuration](#configuration) | _All services_ | `GET /config` | +| [Runtime Configuration](#runtime-configuration) | _All services_ | `GET /runtime_config` | +| [Services status](#services-status) | _All services_ | `GET /services` | +| [Readiness probe](#readiness-probe) | _All services_ | `GET /ready` | +| [Metrics](#metrics) | _All services_ | `GET /metrics` | +| [Pprof](#pprof) | _All services_ | `GET /debug/pprof` | +| [Fgprof](#fgprof) | _All services_ | `GET /debug/fgprof` | +| [Remote write](#remote-write) | Distributor | `POST /api/v1/push` | +| [Tenants stats](#tenants-stats) | Distributor | `GET /distributor/all_user_stats` | +| [HA tracker status](#ha-tracker-status) | Distributor | `GET /distributor/ha_tracker` | +| [Flush blocks](#flush-blocks) | Ingester | `GET,POST /ingester/flush` | +| [Shutdown](#shutdown) | Ingester | `GET,POST /ingester/shutdown` | +| [Ingesters ring status](#ingesters-ring-status) | Ingester | `GET /ingester/ring` | +| [Instant query](#instant-query) | Querier, Query-frontend | `GET,POST /api/v1/query` | +| [Range query](#range-query) | Querier, Query-frontend | `GET,POST /api/v1/query_range` | +| [Exemplar query](#exemplar-query) | Querier, Query-frontend | `GET,POST /api/v1/query_exemplars` | +| [Get series by label matchers](#get-series-by-label-matchers) | Querier, Query-frontend | `GET,POST /api/v1/series` | +| [Get label names](#get-label-names) | Querier, Query-frontend | `GET,POST /api/v1/labels` | +| [Get label values](#get-label-values) | Querier, Query-frontend | `GET /api/v1/label/{name}/values` | +| [Get metric metadata](#get-metric-metadata) | Querier, Query-frontend | `GET /api/v1/metadata` | +| [Remote read](#remote-read) | Querier, Query-frontend | `POST /api/v1/read` | +| [Build information](#build-information) | Querier, Query-frontend | `POST /api/v1/status/buildinfo` | +| [Get tenant ingestion stats](#get-tenant-ingestion-stats) | Querier | `GET /api/v1/user_stats` | +| [Ruler ring status](#ruler-ring-status) | Ruler | `GET /ruler/ring` | +| [Ruler rules ](#ruler-rule-groups) | Ruler | `GET /ruler/rule_groups` | +| [List rules](#list-rules) | Ruler | `GET /api/v1/rules` | +| [List alerts](#list-alerts) | Ruler | `GET /api/v1/alerts` | +| [List rule groups](#list-rule-groups) | Ruler | `GET /api/v1/rules` | +| [Get rule groups by namespace](#get-rule-groups-by-namespace) | Ruler | `GET /api/v1/rules/{namespace}` | +| [Get rule group](#get-rule-group) | Ruler | `GET /api/v1/rules/{namespace}/{groupName}` | +| [Set rule group](#set-rule-group) | Ruler | `POST /api/v1/rules/{namespace}` | +| [Delete rule group](#delete-rule-group) | Ruler | `DELETE /api/v1/rules/{namespace}/{groupName}` | +| [Delete namespace](#delete-namespace) | Ruler | `DELETE /api/v1/rules/{namespace}` | +| [Delete tenant configuration](#delete-tenant-configuration) | Ruler | `POST /ruler/delete_tenant_config` | +| [Alertmanager status](#alertmanager-status) | Alertmanager | `GET /multitenant_alertmanager/status` | +| [Alertmanager configs](#alertmanager-configs) | Alertmanager | `GET /multitenant_alertmanager/configs` | +| [Alertmanager ring status](#alertmanager-ring-status) | Alertmanager | `GET /multitenant_alertmanager/ring` | +| [Alertmanager UI](#alertmanager-ui) | Alertmanager | `GET /` | +| [Alertmanager Delete Tenant Configuration](#alertmanager-delete-tenant-configuration) | Alertmanager | `POST /multitenant_alertmanager/delete_tenant_config` | +| [Get Alertmanager configuration](#get-alertmanager-configuration) | Alertmanager | `GET /api/v1/alerts` | +| [Set Alertmanager configuration](#set-alertmanager-configuration) | Alertmanager | `POST /api/v1/alerts` | +| [Delete Alertmanager configuration](#delete-alertmanager-configuration) | Alertmanager | `DELETE /api/v1/alerts` | +| [Tenant delete request](#tenant-delete-request) | Purger | `POST /purger/delete_tenant` | +| [Tenant delete status](#tenant-delete-status) | Purger | `GET /purger/delete_tenant_status` | +| [Store-gateway ring status](#store-gateway-ring-status) | Store-gateway | `GET /store-gateway/ring` | +| [Compactor ring status](#compactor-ring-status) | Compactor | `GET /compactor/ring` | +| [Get rule files](#get-rule-files) | Configs API (deprecated) | `GET /api/prom/configs/rules` | +| [Set rule files](#set-rule-files) | Configs API (deprecated) | `POST /api/prom/configs/rules` | +| [Get template files](#get-template-files) | Configs API (deprecated) | `GET /api/prom/configs/templates` | +| [Set template files](#set-template-files) | Configs API (deprecated) | `POST /api/prom/configs/templates` | +| [Get Alertmanager config file](#get-alertmanager-config-file) | Configs API (deprecated) | `GET /api/prom/configs/alertmanager` | +| [Set Alertmanager config file](#set-alertmanager-config-file) | Configs API (deprecated) | `POST /api/prom/configs/alertmanager` | +| [Validate Alertmanager config](#validate-alertmanager-config-file) | Configs API (deprecated) | `POST /api/prom/configs/alertmanager/validate` | +| [Deactivate configs](#deactivate-configs) | Configs API (deprecated) | `DELETE /api/prom/configs/deactivate` | +| [Restore configs](#restore-configs) | Configs API (deprecated) | `POST /api/prom/configs/restore` | ### Path prefixes @@ -407,6 +408,18 @@ _For more information, please check out Prometheus [Remote storage integrations] _Requires [authentication](#authentication)._ +### Build Information + +``` +POST /api/v1/status/buildinfo + +# Legacy +POST /api/v1/status/buildinfo +``` + +Prometheus-compatible [build information](https://prometheus.io/docs/prometheus/latest/querying/api/#build-information) endpoint. + +_Requires [authentication](#authentication)._ ## Querier diff --git a/pkg/api/handlers.go b/pkg/api/handlers.go index a7b0b4f97a5..1b8528301b0 100644 --- a/pkg/api/handlers.go +++ b/pkg/api/handlers.go @@ -213,9 +213,12 @@ func NewQuerierHandler( regexp.MustCompile(".*"), func() (v1.RuntimeInfo, error) { return v1.RuntimeInfo{}, errors.New("not implemented") }, &v1.PrometheusVersion{ - Version: version.Version, - Branch: version.Branch, - Revision: version.Revision, + Version: version.Version, + Branch: version.Branch, + Revision: version.Revision, + BuildUser: version.BuildUser, + BuildDate: version.BuildDate, + GoVersion: version.GoVersion, }, // This is used for the stats API which we should not support. Or find other ways to. prometheus.GathererFunc(func() ([]*dto.MetricFamily, error) { return nil, nil }), diff --git a/pkg/api/handlers_test.go b/pkg/api/handlers_test.go index 96ba3b36e12..a641f3e2427 100644 --- a/pkg/api/handlers_test.go +++ b/pkg/api/handlers_test.go @@ -5,6 +5,7 @@ import ( "io" "net/http" "net/http/httptest" + "runtime" "strings" "testing" @@ -210,8 +211,10 @@ func TestBuildInfoAPI(t *testing.T) { expected buildInfo }{ { - name: "empty", - expected: buildInfo{Status: "success"}, + name: "empty", + expected: buildInfo{Status: "success", Data: v1.PrometheusVersion{ + GoVersion: runtime.Version(), + }}, }, { name: "set versions", @@ -219,9 +222,10 @@ func TestBuildInfoAPI(t *testing.T) { branch: "test", revision: "foo", expected: buildInfo{Status: "success", Data: v1.PrometheusVersion{ - Version: "v0.14.0", - Branch: "test", - Revision: "foo", + Version: "v0.14.0", + Branch: "test", + Revision: "foo", + GoVersion: runtime.Version(), }}, }, } { From a405e9ce6658fd1658d83b5086426b0a13fdcc0f Mon Sep 17 00:00:00 2001 From: Ben Ye Date: Tue, 22 Nov 2022 11:58:43 -0800 Subject: [PATCH 4/4] revert docs update Signed-off-by: Ben Ye --- docs/api/_index.md | 127 ++++++++++++++++++++------------------------- 1 file changed, 57 insertions(+), 70 deletions(-) diff --git a/docs/api/_index.md b/docs/api/_index.md index 5f12d86dc38..32dce280eb5 100644 --- a/docs/api/_index.md +++ b/docs/api/_index.md @@ -15,64 +15,63 @@ For the sake of clarity, in this document we have grouped API endpoints by servi ## Endpoints -| API | Service | Endpoint | -|---------------------------------------------------------------------------------------| ------- |------------------------------------------------------------| -| [Index page](#index-page) | _All services_ | `GET /` | -| [Configuration](#configuration) | _All services_ | `GET /config` | -| [Runtime Configuration](#runtime-configuration) | _All services_ | `GET /runtime_config` | -| [Services status](#services-status) | _All services_ | `GET /services` | -| [Readiness probe](#readiness-probe) | _All services_ | `GET /ready` | -| [Metrics](#metrics) | _All services_ | `GET /metrics` | -| [Pprof](#pprof) | _All services_ | `GET /debug/pprof` | -| [Fgprof](#fgprof) | _All services_ | `GET /debug/fgprof` | -| [Remote write](#remote-write) | Distributor | `POST /api/v1/push` | -| [Tenants stats](#tenants-stats) | Distributor | `GET /distributor/all_user_stats` | -| [HA tracker status](#ha-tracker-status) | Distributor | `GET /distributor/ha_tracker` | -| [Flush blocks](#flush-blocks) | Ingester | `GET,POST /ingester/flush` | -| [Shutdown](#shutdown) | Ingester | `GET,POST /ingester/shutdown` | -| [Ingesters ring status](#ingesters-ring-status) | Ingester | `GET /ingester/ring` | -| [Instant query](#instant-query) | Querier, Query-frontend | `GET,POST /api/v1/query` | -| [Range query](#range-query) | Querier, Query-frontend | `GET,POST /api/v1/query_range` | -| [Exemplar query](#exemplar-query) | Querier, Query-frontend | `GET,POST /api/v1/query_exemplars` | -| [Get series by label matchers](#get-series-by-label-matchers) | Querier, Query-frontend | `GET,POST /api/v1/series` | -| [Get label names](#get-label-names) | Querier, Query-frontend | `GET,POST /api/v1/labels` | -| [Get label values](#get-label-values) | Querier, Query-frontend | `GET /api/v1/label/{name}/values` | -| [Get metric metadata](#get-metric-metadata) | Querier, Query-frontend | `GET /api/v1/metadata` | -| [Remote read](#remote-read) | Querier, Query-frontend | `POST /api/v1/read` | -| [Build information](#build-information) | Querier, Query-frontend | `POST /api/v1/status/buildinfo` | -| [Get tenant ingestion stats](#get-tenant-ingestion-stats) | Querier | `GET /api/v1/user_stats` | -| [Ruler ring status](#ruler-ring-status) | Ruler | `GET /ruler/ring` | -| [Ruler rules ](#ruler-rule-groups) | Ruler | `GET /ruler/rule_groups` | -| [List rules](#list-rules) | Ruler | `GET /api/v1/rules` | -| [List alerts](#list-alerts) | Ruler | `GET /api/v1/alerts` | -| [List rule groups](#list-rule-groups) | Ruler | `GET /api/v1/rules` | -| [Get rule groups by namespace](#get-rule-groups-by-namespace) | Ruler | `GET /api/v1/rules/{namespace}` | -| [Get rule group](#get-rule-group) | Ruler | `GET /api/v1/rules/{namespace}/{groupName}` | -| [Set rule group](#set-rule-group) | Ruler | `POST /api/v1/rules/{namespace}` | -| [Delete rule group](#delete-rule-group) | Ruler | `DELETE /api/v1/rules/{namespace}/{groupName}` | -| [Delete namespace](#delete-namespace) | Ruler | `DELETE /api/v1/rules/{namespace}` | -| [Delete tenant configuration](#delete-tenant-configuration) | Ruler | `POST /ruler/delete_tenant_config` | -| [Alertmanager status](#alertmanager-status) | Alertmanager | `GET /multitenant_alertmanager/status` | -| [Alertmanager configs](#alertmanager-configs) | Alertmanager | `GET /multitenant_alertmanager/configs` | -| [Alertmanager ring status](#alertmanager-ring-status) | Alertmanager | `GET /multitenant_alertmanager/ring` | -| [Alertmanager UI](#alertmanager-ui) | Alertmanager | `GET /` | -| [Alertmanager Delete Tenant Configuration](#alertmanager-delete-tenant-configuration) | Alertmanager | `POST /multitenant_alertmanager/delete_tenant_config` | -| [Get Alertmanager configuration](#get-alertmanager-configuration) | Alertmanager | `GET /api/v1/alerts` | -| [Set Alertmanager configuration](#set-alertmanager-configuration) | Alertmanager | `POST /api/v1/alerts` | -| [Delete Alertmanager configuration](#delete-alertmanager-configuration) | Alertmanager | `DELETE /api/v1/alerts` | -| [Tenant delete request](#tenant-delete-request) | Purger | `POST /purger/delete_tenant` | -| [Tenant delete status](#tenant-delete-status) | Purger | `GET /purger/delete_tenant_status` | -| [Store-gateway ring status](#store-gateway-ring-status) | Store-gateway | `GET /store-gateway/ring` | -| [Compactor ring status](#compactor-ring-status) | Compactor | `GET /compactor/ring` | -| [Get rule files](#get-rule-files) | Configs API (deprecated) | `GET /api/prom/configs/rules` | -| [Set rule files](#set-rule-files) | Configs API (deprecated) | `POST /api/prom/configs/rules` | -| [Get template files](#get-template-files) | Configs API (deprecated) | `GET /api/prom/configs/templates` | -| [Set template files](#set-template-files) | Configs API (deprecated) | `POST /api/prom/configs/templates` | -| [Get Alertmanager config file](#get-alertmanager-config-file) | Configs API (deprecated) | `GET /api/prom/configs/alertmanager` | -| [Set Alertmanager config file](#set-alertmanager-config-file) | Configs API (deprecated) | `POST /api/prom/configs/alertmanager` | -| [Validate Alertmanager config](#validate-alertmanager-config-file) | Configs API (deprecated) | `POST /api/prom/configs/alertmanager/validate` | -| [Deactivate configs](#deactivate-configs) | Configs API (deprecated) | `DELETE /api/prom/configs/deactivate` | -| [Restore configs](#restore-configs) | Configs API (deprecated) | `POST /api/prom/configs/restore` | +| API | Service | Endpoint | +| --- | ------- | -------- | +| [Index page](#index-page) | _All services_ | `GET /` | +| [Configuration](#configuration) | _All services_ | `GET /config` | +| [Runtime Configuration](#runtime-configuration) | _All services_ | `GET /runtime_config` | +| [Services status](#services-status) | _All services_ | `GET /services` | +| [Readiness probe](#readiness-probe) | _All services_ | `GET /ready` | +| [Metrics](#metrics) | _All services_ | `GET /metrics` | +| [Pprof](#pprof) | _All services_ | `GET /debug/pprof` | +| [Fgprof](#fgprof) | _All services_ | `GET /debug/fgprof` | +| [Remote write](#remote-write) | Distributor | `POST /api/v1/push` | +| [Tenants stats](#tenants-stats) | Distributor | `GET /distributor/all_user_stats` | +| [HA tracker status](#ha-tracker-status) | Distributor | `GET /distributor/ha_tracker` | +| [Flush blocks](#flush-blocks) | Ingester | `GET,POST /ingester/flush` | +| [Shutdown](#shutdown) | Ingester | `GET,POST /ingester/shutdown` | +| [Ingesters ring status](#ingesters-ring-status) | Ingester | `GET /ingester/ring` | +| [Instant query](#instant-query) | Querier, Query-frontend | `GET,POST /api/v1/query` | +| [Range query](#range-query) | Querier, Query-frontend | `GET,POST /api/v1/query_range` | +| [Exemplar query](#exemplar-query) | Querier, Query-frontend | `GET,POST /api/v1/query_exemplars` | +| [Get series by label matchers](#get-series-by-label-matchers) | Querier, Query-frontend | `GET,POST /api/v1/series` | +| [Get label names](#get-label-names) | Querier, Query-frontend | `GET,POST /api/v1/labels` | +| [Get label values](#get-label-values) | Querier, Query-frontend | `GET /api/v1/label/{name}/values` | +| [Get metric metadata](#get-metric-metadata) | Querier, Query-frontend | `GET /api/v1/metadata` | +| [Remote read](#remote-read) | Querier, Query-frontend | `POST /api/v1/read` | +| [Get tenant ingestion stats](#get-tenant-ingestion-stats) | Querier | `GET /api/v1/user_stats` | +| [Ruler ring status](#ruler-ring-status) | Ruler | `GET /ruler/ring` | +| [Ruler rules ](#ruler-rule-groups) | Ruler | `GET /ruler/rule_groups` | +| [List rules](#list-rules) | Ruler | `GET /api/v1/rules` | +| [List alerts](#list-alerts) | Ruler | `GET /api/v1/alerts` | +| [List rule groups](#list-rule-groups) | Ruler | `GET /api/v1/rules` | +| [Get rule groups by namespace](#get-rule-groups-by-namespace) | Ruler | `GET /api/v1/rules/{namespace}` | +| [Get rule group](#get-rule-group) | Ruler | `GET /api/v1/rules/{namespace}/{groupName}` | +| [Set rule group](#set-rule-group) | Ruler | `POST /api/v1/rules/{namespace}` | +| [Delete rule group](#delete-rule-group) | Ruler | `DELETE /api/v1/rules/{namespace}/{groupName}` | +| [Delete namespace](#delete-namespace) | Ruler | `DELETE /api/v1/rules/{namespace}` | +| [Delete tenant configuration](#delete-tenant-configuration) | Ruler | `POST /ruler/delete_tenant_config` | +| [Alertmanager status](#alertmanager-status) | Alertmanager | `GET /multitenant_alertmanager/status` | +| [Alertmanager configs](#alertmanager-configs) | Alertmanager | `GET /multitenant_alertmanager/configs` | +| [Alertmanager ring status](#alertmanager-ring-status) | Alertmanager | `GET /multitenant_alertmanager/ring` | +| [Alertmanager UI](#alertmanager-ui) | Alertmanager | `GET /` | +| [Alertmanager Delete Tenant Configuration](#alertmanager-delete-tenant-configuration) | Alertmanager | `POST /multitenant_alertmanager/delete_tenant_config` | +| [Get Alertmanager configuration](#get-alertmanager-configuration) | Alertmanager | `GET /api/v1/alerts` | +| [Set Alertmanager configuration](#set-alertmanager-configuration) | Alertmanager | `POST /api/v1/alerts` | +| [Delete Alertmanager configuration](#delete-alertmanager-configuration) | Alertmanager | `DELETE /api/v1/alerts` | +| [Tenant delete request](#tenant-delete-request) | Purger | `POST /purger/delete_tenant` | +| [Tenant delete status](#tenant-delete-status) | Purger | `GET /purger/delete_tenant_status` | +| [Store-gateway ring status](#store-gateway-ring-status) | Store-gateway | `GET /store-gateway/ring` | +| [Compactor ring status](#compactor-ring-status) | Compactor | `GET /compactor/ring` | +| [Get rule files](#get-rule-files) | Configs API (deprecated) | `GET /api/prom/configs/rules` | +| [Set rule files](#set-rule-files) | Configs API (deprecated) | `POST /api/prom/configs/rules` | +| [Get template files](#get-template-files) | Configs API (deprecated) | `GET /api/prom/configs/templates` | +| [Set template files](#set-template-files) | Configs API (deprecated) | `POST /api/prom/configs/templates` | +| [Get Alertmanager config file](#get-alertmanager-config-file) | Configs API (deprecated) | `GET /api/prom/configs/alertmanager` | +| [Set Alertmanager config file](#set-alertmanager-config-file) | Configs API (deprecated) | `POST /api/prom/configs/alertmanager` | +| [Validate Alertmanager config](#validate-alertmanager-config-file) | Configs API (deprecated) | `POST /api/prom/configs/alertmanager/validate` | +| [Deactivate configs](#deactivate-configs) | Configs API (deprecated) | `DELETE /api/prom/configs/deactivate` | +| [Restore configs](#restore-configs) | Configs API (deprecated) | `POST /api/prom/configs/restore` | ### Path prefixes @@ -408,18 +407,6 @@ _For more information, please check out Prometheus [Remote storage integrations] _Requires [authentication](#authentication)._ -### Build Information - -``` -POST /api/v1/status/buildinfo - -# Legacy -POST /api/v1/status/buildinfo -``` - -Prometheus-compatible [build information](https://prometheus.io/docs/prometheus/latest/querying/api/#build-information) endpoint. - -_Requires [authentication](#authentication)._ ## Querier