app/vmagent: accept requests with /prometheus and /influx path prefixes in the same way as VictoriaMetrics does

This allows using vmagent as a drop-in replacement for VictoriaMetrics
for push protocols.
This commit is contained in:
Aliaksandr Valialkin 2022-10-01 13:47:52 +03:00
parent b5fe42514d
commit d81285c814
No known key found for this signature in database
GPG Key ID: A72BEC6CD3D0DED1
2 changed files with 20 additions and 19 deletions

View File

@ -223,7 +223,7 @@ func requestHandler(w http.ResponseWriter, r *http.Request) bool {
path = strings.TrimSuffix(path, "/") path = strings.TrimSuffix(path, "/")
} }
switch path { switch path {
case "/api/v1/write": case "/prometheus/api/v1/write", "/api/v1/write":
prometheusWriteRequests.Inc() prometheusWriteRequests.Inc()
if err := promremotewrite.InsertHandler(nil, r); err != nil { if err := promremotewrite.InsertHandler(nil, r); err != nil {
prometheusWriteErrors.Inc() prometheusWriteErrors.Inc()
@ -232,7 +232,7 @@ func requestHandler(w http.ResponseWriter, r *http.Request) bool {
} }
w.WriteHeader(http.StatusNoContent) w.WriteHeader(http.StatusNoContent)
return true return true
case "/api/v1/import": case "/prometheus/api/v1/import", "/api/v1/import":
vmimportRequests.Inc() vmimportRequests.Inc()
if err := vmimport.InsertHandler(nil, r); err != nil { if err := vmimport.InsertHandler(nil, r); err != nil {
vmimportErrors.Inc() vmimportErrors.Inc()
@ -241,7 +241,7 @@ func requestHandler(w http.ResponseWriter, r *http.Request) bool {
} }
w.WriteHeader(http.StatusNoContent) w.WriteHeader(http.StatusNoContent)
return true return true
case "/api/v1/import/csv": case "/prometheus/api/v1/import/csv", "/api/v1/import/csv":
csvimportRequests.Inc() csvimportRequests.Inc()
if err := csvimport.InsertHandler(nil, r); err != nil { if err := csvimport.InsertHandler(nil, r); err != nil {
csvimportErrors.Inc() csvimportErrors.Inc()
@ -250,7 +250,7 @@ func requestHandler(w http.ResponseWriter, r *http.Request) bool {
} }
w.WriteHeader(http.StatusNoContent) w.WriteHeader(http.StatusNoContent)
return true return true
case "/api/v1/import/prometheus": case "/prometheus/api/v1/import/prometheus", "/api/v1/import/prometheus":
prometheusimportRequests.Inc() prometheusimportRequests.Inc()
if err := prometheusimport.InsertHandler(nil, r); err != nil { if err := prometheusimport.InsertHandler(nil, r); err != nil {
prometheusimportErrors.Inc() prometheusimportErrors.Inc()
@ -259,7 +259,7 @@ func requestHandler(w http.ResponseWriter, r *http.Request) bool {
} }
w.WriteHeader(http.StatusNoContent) w.WriteHeader(http.StatusNoContent)
return true return true
case "/api/v1/import/native": case "/prometheus/api/v1/import/native", "/api/v1/import/native":
nativeimportRequests.Inc() nativeimportRequests.Inc()
if err := native.InsertHandler(nil, r); err != nil { if err := native.InsertHandler(nil, r); err != nil {
nativeimportErrors.Inc() nativeimportErrors.Inc()
@ -268,7 +268,7 @@ func requestHandler(w http.ResponseWriter, r *http.Request) bool {
} }
w.WriteHeader(http.StatusNoContent) w.WriteHeader(http.StatusNoContent)
return true return true
case "/write", "/api/v2/write": case "/influx/write", "/influx/api/v2/write", "/write", "/api/v2/write":
influxWriteRequests.Inc() influxWriteRequests.Inc()
if err := influx.InsertHandlerForHTTP(nil, r); err != nil { if err := influx.InsertHandlerForHTTP(nil, r); err != nil {
influxWriteErrors.Inc() influxWriteErrors.Inc()
@ -277,7 +277,7 @@ func requestHandler(w http.ResponseWriter, r *http.Request) bool {
} }
w.WriteHeader(http.StatusNoContent) w.WriteHeader(http.StatusNoContent)
return true return true
case "/query": case "/influx/query", "/query":
influxQueryRequests.Inc() influxQueryRequests.Inc()
influxutils.WriteDatabaseNames(w) influxutils.WriteDatabaseNames(w)
return true return true
@ -316,15 +316,21 @@ func requestHandler(w http.ResponseWriter, r *http.Request) bool {
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
fmt.Fprintf(w, `{}`) fmt.Fprintf(w, `{}`)
return true return true
case "/targets": case "/prometheus/targets", "/targets":
promscrapeTargetsRequests.Inc() promscrapeTargetsRequests.Inc()
promscrape.WriteHumanReadableTargetsStatus(w, r) promscrape.WriteHumanReadableTargetsStatus(w, r)
return true return true
case "/service-discovery": case "/prometheus/service-discovery", "/service-discovery":
promscrapeServiceDiscoveryRequests.Inc() promscrapeServiceDiscoveryRequests.Inc()
promscrape.WriteServiceDiscovery(w, r) promscrape.WriteServiceDiscovery(w, r)
return true return true
case "/target_response": case "/prometheus/api/v1/targets", "/api/v1/targets":
promscrapeAPIV1TargetsRequests.Inc()
w.Header().Set("Content-Type", "application/json")
state := r.FormValue("state")
promscrape.WriteAPIV1Targets(w, state)
return true
case "/prometheus/target_response", "/target_response":
promscrapeTargetResponseRequests.Inc() promscrapeTargetResponseRequests.Inc()
if err := promscrape.WriteTargetResponse(w, r); err != nil { if err := promscrape.WriteTargetResponse(w, r); err != nil {
promscrapeTargetResponseErrors.Inc() promscrapeTargetResponseErrors.Inc()
@ -332,7 +338,7 @@ func requestHandler(w http.ResponseWriter, r *http.Request) bool {
return true return true
} }
return true return true
case "/config": case "/prometheus/config", "/config":
if *configAuthKey != "" && r.FormValue("authKey") != *configAuthKey { if *configAuthKey != "" && r.FormValue("authKey") != *configAuthKey {
err := &httpserver.ErrorWithStatusCode{ err := &httpserver.ErrorWithStatusCode{
Err: fmt.Errorf("The provided authKey doesn't match -configAuthKey"), Err: fmt.Errorf("The provided authKey doesn't match -configAuthKey"),
@ -345,7 +351,7 @@ func requestHandler(w http.ResponseWriter, r *http.Request) bool {
w.Header().Set("Content-Type", "text/plain; charset=utf-8") w.Header().Set("Content-Type", "text/plain; charset=utf-8")
promscrape.WriteConfigData(w) promscrape.WriteConfigData(w)
return true return true
case "/api/v1/status/config": case "/prometheus/api/v1/status/config", "/api/v1/status/config":
// See https://prometheus.io/docs/prometheus/latest/querying/api/#config // See https://prometheus.io/docs/prometheus/latest/querying/api/#config
if *configAuthKey != "" && r.FormValue("authKey") != *configAuthKey { if *configAuthKey != "" && r.FormValue("authKey") != *configAuthKey {
err := &httpserver.ErrorWithStatusCode{ err := &httpserver.ErrorWithStatusCode{
@ -361,13 +367,7 @@ func requestHandler(w http.ResponseWriter, r *http.Request) bool {
promscrape.WriteConfigData(&bb) promscrape.WriteConfigData(&bb)
fmt.Fprintf(w, `{"status":"success","data":{"yaml":%q}}`, bb.B) fmt.Fprintf(w, `{"status":"success","data":{"yaml":%q}}`, bb.B)
return true return true
case "/api/v1/targets": case "/prometheus/-/reload", "/-/reload":
promscrapeAPIV1TargetsRequests.Inc()
w.Header().Set("Content-Type", "application/json")
state := r.FormValue("state")
promscrape.WriteAPIV1Targets(w, state)
return true
case "/-/reload":
promscrapeConfigReloadRequests.Inc() promscrapeConfigReloadRequests.Inc()
procutil.SelfSIGHUP() procutil.SelfSIGHUP()
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)

View File

@ -45,6 +45,7 @@ See [these docs](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#m
* FEATURE: [vmbackup](https://docs.victoriametrics.com/vmbackup.html) and [vmrestore](https://docs.victoriametrics.com/vmrestore.html): retry GCS operations for up to 3 minutes on temporary failures. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3147). * FEATURE: [vmbackup](https://docs.victoriametrics.com/vmbackup.html) and [vmrestore](https://docs.victoriametrics.com/vmrestore.html): retry GCS operations for up to 3 minutes on temporary failures. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3147).
* FEATURE: [vmgateway](https://docs.victoriametrics.com/vmgateway.html): add ability to extract JWT authorization token from non-standard HTTP header by passing it via `-auth.httpHeader` command-line flag. See [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3054). * FEATURE: [vmgateway](https://docs.victoriametrics.com/vmgateway.html): add ability to extract JWT authorization token from non-standard HTTP header by passing it via `-auth.httpHeader` command-line flag. See [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3054).
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): expose `__meta_ec2_region` label for [ec2_sd_config](https://docs.victoriametrics.com/sd_configs.html#ec2_sd_configs) in the same way as [Prometheus 2.39 does](https://github.com/prometheus/prometheus/pull/11326). * FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): expose `__meta_ec2_region` label for [ec2_sd_config](https://docs.victoriametrics.com/sd_configs.html#ec2_sd_configs) in the same way as [Prometheus 2.39 does](https://github.com/prometheus/prometheus/pull/11326).
* FEATURE: [vmagent](https://docs.victoriametrics.com/vmagent.html): accept data ingestion requests via paths starting from `/prometheus` prefix in the same way as [VictoriaMetrics does](https://docs.victoriametrics.com/#how-to-import-time-series-data). For example, `vmagent` now accepts Prometheus `remote_write` data via both `/api/v1/write` and `/prometheus/api/v1/write`. This simplifies switching between single-node VictoriaMetrics and `vmagent`.
* BUGFIX: [vmagent](https://docs.victoriametrics.com/vmagent.html): properly encode query params for aws signed requests, use `%20` instead of `+` as api requires. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3171). * BUGFIX: [vmagent](https://docs.victoriametrics.com/vmagent.html): properly encode query params for aws signed requests, use `%20` instead of `+` as api requires. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3171).
* BUGFIX: [vmagent](https://docs.victoriametrics.com/vmagent.html): properly parse relabel config when regex ending with escaped `$`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3131). * BUGFIX: [vmagent](https://docs.victoriametrics.com/vmagent.html): properly parse relabel config when regex ending with escaped `$`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3131).