2019-05-22 21:16:55 +00:00
package vminsert
import (
2022-06-06 21:57:05 +00:00
"embed"
2019-05-22 21:16:55 +00:00
"flag"
"fmt"
"net/http"
"strings"
2021-07-07 10:25:16 +00:00
"time"
2019-05-22 21:16:55 +00:00
2023-10-05 12:39:51 +00:00
"github.com/VictoriaMetrics/metrics"
2023-01-04 06:19:18 +00:00
vminsertCommon "github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/common"
2020-03-10 17:35:58 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/csvimport"
2024-02-06 20:58:11 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/datadogsketches"
2023-12-21 16:29:10 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/datadogv1"
"github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/datadogv2"
2019-05-22 21:16:55 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/graphite"
"github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/influx"
2020-09-26 01:29:45 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/native"
2023-10-05 12:39:51 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/newrelic"
2023-07-27 20:26:45 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/opentelemetry"
2019-05-22 21:16:55 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/opentsdb"
2019-08-22 09:27:18 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/opentsdbhttp"
2020-07-10 09:00:35 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/prometheusimport"
2020-02-23 11:35:47 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/prompush"
"github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/promremotewrite"
2020-07-02 16:42:12 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/relabel"
2024-05-07 19:46:08 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/statsd"
2019-12-09 18:58:19 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/app/vminsert/vmimport"
2022-08-08 11:46:24 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/lib/auth"
2022-05-25 06:57:11 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/lib/bytesutil"
2024-01-21 19:58:26 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/lib/flagutil"
2019-05-22 21:16:55 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/lib/httpserver"
2021-03-15 19:37:13 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/lib/influxutils"
2020-02-23 11:35:47 +00:00
graphiteserver "github.com/VictoriaMetrics/VictoriaMetrics/lib/ingestserver/graphite"
2020-02-25 17:09:46 +00:00
influxserver "github.com/VictoriaMetrics/VictoriaMetrics/lib/ingestserver/influx"
2020-02-23 11:35:47 +00:00
opentsdbserver "github.com/VictoriaMetrics/VictoriaMetrics/lib/ingestserver/opentsdb"
opentsdbhttpserver "github.com/VictoriaMetrics/VictoriaMetrics/lib/ingestserver/opentsdbhttp"
2024-05-07 19:46:08 +00:00
statsdserver "github.com/VictoriaMetrics/VictoriaMetrics/lib/ingestserver/statsd"
2024-05-16 07:25:42 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/lib/logger"
2020-04-29 23:15:39 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/lib/procutil"
2022-08-08 11:46:24 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/lib/prompbmarshal"
2020-02-23 11:35:47 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape"
2020-09-28 01:11:55 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/lib/protoparser/common"
2024-04-02 14:51:18 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/lib/protoparser/opentelemetry/firehose"
2019-08-23 05:45:11 +00:00
"github.com/VictoriaMetrics/VictoriaMetrics/lib/storage"
2019-05-22 21:16:55 +00:00
)
var (
2023-01-27 07:08:35 +00:00
graphiteListenAddr = flag . String ( "graphiteListenAddr" , "" , "TCP and UDP address to listen for Graphite plaintext data. Usually :2003 must be set. Doesn't work if empty. " +
"See also -graphiteListenAddr.useProxyProtocol" )
graphiteUseProxyProtocol = flag . Bool ( "graphiteListenAddr.useProxyProtocol" , false , "Whether to use proxy protocol for connections accepted at -graphiteListenAddr . " +
"See https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt" )
2024-05-07 19:46:08 +00:00
statsdListenAddr = flag . String ( "statsdListenAddr" , "" , "TCP and UDP address to listen for Statsd plaintext data. Usually :8125 must be set. Doesn't work if empty. " +
"See also -statsdListenAddr.useProxyProtocol" )
statsdUseProxyProtocol = flag . Bool ( "statsdListenAddr.useProxyProtocol" , false , "Whether to use proxy protocol for connections accepted at -statsdListenAddr . " +
"See https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt" )
2024-05-16 07:25:42 +00:00
statsdDisableAggregationEnforcemenet = flag . Bool ( ` statsd.disableAggregationEnforcement ` , false , "Whether to disable streaming aggregation requirement check. " +
"It's recommended to run statsdServer with pre-configured streaming aggregation to decrease load at database." )
2023-01-27 07:08:35 +00:00
influxListenAddr = flag . String ( "influxListenAddr" , "" , "TCP and UDP address to listen for InfluxDB line protocol data. Usually :8089 must be set. Doesn't work if empty. " +
"This flag isn't needed when ingesting data over HTTP - just send it to http://<victoriametrics>:8428/write . " +
"See also -influxListenAddr.useProxyProtocol" )
influxUseProxyProtocol = flag . Bool ( "influxListenAddr.useProxyProtocol" , false , "Whether to use proxy protocol for connections accepted at -influxListenAddr . " +
"See https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt" )
2023-02-22 10:24:26 +00:00
opentsdbListenAddr = flag . String ( "opentsdbListenAddr" , "" , "TCP and UDP address to listen for OpenTSDB metrics. " +
2019-12-13 22:29:14 +00:00
"Telnet put messages and HTTP /api/put messages are simultaneously served on TCP port. " +
2023-01-27 07:08:35 +00:00
"Usually :4242 must be set. Doesn't work if empty. " +
"See also -opentsdbListenAddr.useProxyProtocol" )
opentsdbUseProxyProtocol = flag . Bool ( "opentsdbListenAddr.useProxyProtocol" , false , "Whether to use proxy protocol for connections accepted at -opentsdbListenAddr . " +
"See https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt" )
2023-02-22 10:24:26 +00:00
opentsdbHTTPListenAddr = flag . String ( "opentsdbHTTPListenAddr" , "" , "TCP address to listen for OpenTSDB HTTP put requests. Usually :4242 must be set. Doesn't work if empty. " +
2023-01-27 07:08:35 +00:00
"See also -opentsdbHTTPListenAddr.useProxyProtocol" )
opentsdbHTTPUseProxyProtocol = flag . Bool ( "opentsdbHTTPListenAddr.useProxyProtocol" , false , "Whether to use proxy protocol for connections accepted " +
"at -opentsdbHTTPListenAddr . See https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt" )
2024-01-21 19:58:26 +00:00
configAuthKey = flagutil . NewPassword ( "configAuthKey" , "Authorization key for accessing /config page. It must be passed via authKey query arg" )
reloadAuthKey = flagutil . NewPassword ( "reloadAuthKey" , "Auth key for /-/reload http endpoint. It must be passed as authKey=..." )
2021-12-06 09:39:19 +00:00
maxLabelsPerTimeseries = flag . Int ( "maxLabelsPerTimeseries" , 30 , "The maximum number of labels accepted per time series. Superfluous labels are dropped. In this case the vm_metrics_with_dropped_labels_total metric at /metrics page is incremented" )
maxLabelValueLen = flag . Int ( "maxLabelValueLen" , 16 * 1024 , "The maximum length of label values in the accepted time series. Longer label values are truncated. In this case the vm_too_long_label_values_total metric at /metrics page is incremented" )
2019-05-22 21:16:55 +00:00
)
2019-12-13 22:29:14 +00:00
var (
2020-02-23 11:35:47 +00:00
graphiteServer * graphiteserver . Server
2024-05-07 19:46:08 +00:00
statsdServer * statsdserver . Server
2021-05-08 14:55:44 +00:00
influxServer * influxserver . Server
2020-02-23 11:35:47 +00:00
opentsdbServer * opentsdbserver . Server
opentsdbhttpServer * opentsdbhttpserver . Server
2019-12-13 22:29:14 +00:00
)
2022-06-06 21:57:05 +00:00
//go:embed static
var staticFiles embed . FS
var staticServer = http . FileServer ( http . FS ( staticFiles ) )
2019-05-22 21:16:55 +00:00
// Init initializes vminsert.
func Init ( ) {
2020-07-02 16:42:12 +00:00
relabel . Init ( )
2023-01-04 06:19:18 +00:00
vminsertCommon . InitStreamAggr ( )
2019-08-23 05:45:11 +00:00
storage . SetMaxLabelsPerTimeseries ( * maxLabelsPerTimeseries )
2021-12-06 09:39:19 +00:00
storage . SetMaxLabelValueLen ( * maxLabelValueLen )
2020-09-28 01:11:55 +00:00
common . StartUnmarshalWorkers ( )
2019-05-22 21:16:55 +00:00
if len ( * graphiteListenAddr ) > 0 {
2023-01-27 07:08:35 +00:00
graphiteServer = graphiteserver . MustStart ( * graphiteListenAddr , * graphiteUseProxyProtocol , graphite . InsertHandler )
2019-05-22 21:16:55 +00:00
}
2024-05-07 19:46:08 +00:00
if len ( * statsdListenAddr ) > 0 {
2024-05-16 07:25:42 +00:00
if ! vminsertCommon . HasStreamAggrConfigured ( ) && ! * statsdDisableAggregationEnforcemenet {
logger . Fatalf ( "streaming aggregation must be configured with enabled statsd server. It's recommended to aggregate metrics received at statsd listener. This check could be disabled with flag -statsd.disableAggregationEnforcement" )
}
2024-05-07 19:46:08 +00:00
statsdServer = statsdserver . MustStart ( * statsdListenAddr , * statsdUseProxyProtocol , statsd . InsertHandler )
}
2021-05-08 14:55:44 +00:00
if len ( * influxListenAddr ) > 0 {
2023-01-27 07:08:35 +00:00
influxServer = influxserver . MustStart ( * influxListenAddr , * influxUseProxyProtocol , influx . InsertHandlerForReader )
2021-05-08 14:55:44 +00:00
}
2019-05-22 21:16:55 +00:00
if len ( * opentsdbListenAddr ) > 0 {
2023-01-27 07:08:35 +00:00
opentsdbServer = opentsdbserver . MustStart ( * opentsdbListenAddr , * opentsdbUseProxyProtocol , opentsdb . InsertHandler , opentsdbhttp . InsertHandler )
2019-05-22 21:16:55 +00:00
}
2019-08-22 09:27:18 +00:00
if len ( * opentsdbHTTPListenAddr ) > 0 {
2023-01-27 07:08:35 +00:00
opentsdbhttpServer = opentsdbhttpserver . MustStart ( * opentsdbHTTPListenAddr , * opentsdbHTTPUseProxyProtocol , opentsdbhttp . InsertHandler )
2019-08-22 09:27:18 +00:00
}
2024-04-02 20:16:24 +00:00
promscrape . Init ( func ( _ * auth . Token , wr * prompbmarshal . WriteRequest ) {
2022-08-08 11:46:24 +00:00
prompush . Push ( wr )
} )
2019-05-22 21:16:55 +00:00
}
// Stop stops vminsert.
func Stop ( ) {
2020-02-23 11:35:47 +00:00
promscrape . Stop ( )
2019-05-22 21:16:55 +00:00
if len ( * graphiteListenAddr ) > 0 {
2019-12-13 22:29:14 +00:00
graphiteServer . MustStop ( )
2019-05-22 21:16:55 +00:00
}
2024-05-07 19:46:08 +00:00
if len ( * statsdListenAddr ) > 0 {
statsdServer . MustStop ( )
}
2021-05-08 14:55:44 +00:00
if len ( * influxListenAddr ) > 0 {
influxServer . MustStop ( )
}
2019-05-22 21:16:55 +00:00
if len ( * opentsdbListenAddr ) > 0 {
2019-12-13 22:29:14 +00:00
opentsdbServer . MustStop ( )
2019-05-22 21:16:55 +00:00
}
2019-08-22 09:27:18 +00:00
if len ( * opentsdbHTTPListenAddr ) > 0 {
2019-12-13 22:29:14 +00:00
opentsdbhttpServer . MustStop ( )
2019-08-22 09:27:18 +00:00
}
2020-09-28 01:11:55 +00:00
common . StopUnmarshalWorkers ( )
2023-01-04 06:19:18 +00:00
vminsertCommon . MustStopStreamAggr ( )
2019-05-22 21:16:55 +00:00
}
// RequestHandler is a handler for Prometheus remote storage write API
func RequestHandler ( w http . ResponseWriter , r * http . Request ) bool {
2021-07-07 10:25:16 +00:00
startTime := time . Now ( )
defer requestDuration . UpdateDuration ( startTime )
2019-05-22 21:16:55 +00:00
path := strings . Replace ( r . URL . Path , "//" , "/" , - 1 )
2022-06-06 21:57:05 +00:00
if strings . HasPrefix ( path , "/static" ) {
staticServer . ServeHTTP ( w , r )
return true
}
if strings . HasPrefix ( path , "/prometheus/static" ) {
r . URL . Path = strings . TrimPrefix ( path , "/prometheus" )
staticServer . ServeHTTP ( w , r )
return true
}
2022-11-26 00:40:23 +00:00
if strings . HasPrefix ( path , "/prometheus/api/v1/import/prometheus" ) || strings . HasPrefix ( path , "/api/v1/import/prometheus" ) {
prometheusimportRequests . Inc ( )
if err := prometheusimport . InsertHandler ( r ) ; err != nil {
prometheusimportErrors . Inc ( )
httpserver . Errorf ( w , r , "%s" , err )
return true
}
2023-01-15 21:23:34 +00:00
statusCode := http . StatusNoContent
if strings . HasPrefix ( path , "/prometheus/api/v1/import/prometheus/metrics/job/" ) ||
strings . HasPrefix ( path , "/api/v1/import/prometheus/metrics/job/" ) {
// Return 200 status code for pushgateway requests.
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3636
statusCode = http . StatusOK
}
w . WriteHeader ( statusCode )
2022-11-26 00:40:23 +00:00
return true
}
2022-06-07 12:16:48 +00:00
if strings . HasPrefix ( path , "/datadog/" ) {
// Trim suffix from paths starting from /datadog/ in order to support legacy DataDog agent.
// See https://github.com/VictoriaMetrics/VictoriaMetrics/pull/2670
path = strings . TrimSuffix ( path , "/" )
}
2019-05-22 21:16:55 +00:00
switch path {
2024-04-03 23:15:50 +00:00
case "/prometheus/api/v1/write" , "/api/v1/write" , "/api/v1/push" , "/prometheus/api/v1/push" :
2023-02-24 01:36:52 +00:00
if common . HandleVMProtoServerHandshake ( w , r ) {
return true
}
2019-05-22 21:16:55 +00:00
prometheusWriteRequests . Inc ( )
2020-02-23 11:35:47 +00:00
if err := promremotewrite . InsertHandler ( r ) ; err != nil {
2019-05-22 21:16:55 +00:00
prometheusWriteErrors . Inc ( )
2021-07-07 09:59:03 +00:00
httpserver . Errorf ( w , r , "%s" , err )
2019-05-22 21:16:55 +00:00
return true
}
w . WriteHeader ( http . StatusNoContent )
return true
2021-02-04 18:00:22 +00:00
case "/prometheus/api/v1/import" , "/api/v1/import" :
2019-12-09 18:58:19 +00:00
vmimportRequests . Inc ( )
if err := vmimport . InsertHandler ( r ) ; err != nil {
vmimportErrors . Inc ( )
2021-07-07 09:59:03 +00:00
httpserver . Errorf ( w , r , "%s" , err )
2019-12-09 18:58:19 +00:00
return true
}
2019-12-18 23:21:49 +00:00
w . WriteHeader ( http . StatusNoContent )
2019-12-09 18:58:19 +00:00
return true
2021-02-04 18:00:22 +00:00
case "/prometheus/api/v1/import/csv" , "/api/v1/import/csv" :
2020-03-10 17:35:58 +00:00
csvimportRequests . Inc ( )
if err := csvimport . InsertHandler ( r ) ; err != nil {
csvimportErrors . Inc ( )
2021-07-07 09:59:03 +00:00
httpserver . Errorf ( w , r , "%s" , err )
2020-03-10 17:35:58 +00:00
return true
}
w . WriteHeader ( http . StatusNoContent )
return true
2021-02-04 18:00:22 +00:00
case "/prometheus/api/v1/import/native" , "/api/v1/import/native" :
2020-09-26 01:29:45 +00:00
nativeimportRequests . Inc ( )
if err := native . InsertHandler ( r ) ; err != nil {
nativeimportErrors . Inc ( )
2021-07-07 09:59:03 +00:00
httpserver . Errorf ( w , r , "%s" , err )
2020-09-26 01:29:45 +00:00
return true
}
w . WriteHeader ( http . StatusNoContent )
return true
2021-02-04 18:00:22 +00:00
case "/influx/write" , "/influx/api/v2/write" , "/write" , "/api/v2/write" :
2019-05-22 21:16:55 +00:00
influxWriteRequests . Inc ( )
2022-02-17 10:45:20 +00:00
addInfluxResponseHeaders ( w )
2020-02-25 17:09:46 +00:00
if err := influx . InsertHandlerForHTTP ( r ) ; err != nil {
2019-05-22 21:16:55 +00:00
influxWriteErrors . Inc ( )
2021-07-07 09:59:03 +00:00
httpserver . Errorf ( w , r , "%s" , err )
2019-05-22 21:16:55 +00:00
return true
}
w . WriteHeader ( http . StatusNoContent )
return true
2021-02-04 18:00:22 +00:00
case "/influx/query" , "/query" :
2019-05-22 21:16:55 +00:00
influxQueryRequests . Inc ( )
2022-02-17 10:45:20 +00:00
addInfluxResponseHeaders ( w )
2021-03-15 19:37:13 +00:00
influxutils . WriteDatabaseNames ( w )
2019-05-22 21:16:55 +00:00
return true
2024-02-29 15:58:49 +00:00
case "/opentelemetry/api/v1/push" , "/opentelemetry/v1/metrics" :
2023-07-27 20:26:45 +00:00
opentelemetryPushRequests . Inc ( )
2024-04-02 14:51:18 +00:00
if err := opentelemetry . InsertHandler ( r ) ; err != nil {
2023-07-27 20:26:45 +00:00
opentelemetryPushErrors . Inc ( )
2024-04-02 14:51:18 +00:00
httpserver . Errorf ( w , r , "%s" , err )
return true
2023-07-27 20:26:45 +00:00
}
2024-04-02 14:51:18 +00:00
firehose . WriteSuccessResponse ( w , r )
2023-07-27 20:26:45 +00:00
return true
2023-10-15 22:25:23 +00:00
case "/newrelic" :
2023-10-05 12:39:51 +00:00
newrelicCheckRequest . Inc ( )
w . Header ( ) . Set ( "Content-Type" , "application/json" )
w . WriteHeader ( 202 )
fmt . Fprintf ( w , ` { "status":"ok"} ` )
return true
2023-10-15 22:25:23 +00:00
case "/newrelic/inventory/deltas" :
2023-10-05 12:39:51 +00:00
newrelicInventoryRequests . Inc ( )
w . Header ( ) . Set ( "Content-Type" , "application/json" )
w . WriteHeader ( 202 )
fmt . Fprintf ( w , ` { "payload": { "version": 1, "state": { }, "reset": "false"}} ` )
return true
2023-10-15 22:25:23 +00:00
case "/newrelic/infra/v2/metrics/events/bulk" :
2023-10-05 12:39:51 +00:00
newrelicWriteRequests . Inc ( )
if err := newrelic . InsertHandlerForHTTP ( r ) ; err != nil {
newrelicWriteErrors . Inc ( )
httpserver . Errorf ( w , r , "%s" , err )
return true
}
w . Header ( ) . Set ( "Content-Type" , "application/json" )
w . WriteHeader ( 202 )
fmt . Fprintf ( w , ` { "status":"ok"} ` )
return true
2021-09-28 19:47:45 +00:00
case "/datadog/api/v1/series" :
2023-12-21 16:29:10 +00:00
datadogv1WriteRequests . Inc ( )
if err := datadogv1 . InsertHandlerForHTTP ( r ) ; err != nil {
datadogv1WriteErrors . Inc ( )
httpserver . Errorf ( w , r , "%s" , err )
return true
}
w . Header ( ) . Set ( "Content-Type" , "application/json" )
w . WriteHeader ( 202 )
fmt . Fprintf ( w , ` { "status":"ok"} ` )
return true
case "/datadog/api/v2/series" :
datadogv2WriteRequests . Inc ( )
if err := datadogv2 . InsertHandlerForHTTP ( r ) ; err != nil {
datadogv2WriteErrors . Inc ( )
2021-09-28 19:47:45 +00:00
httpserver . Errorf ( w , r , "%s" , err )
return true
}
// See https://docs.datadoghq.com/api/latest/metrics/#submit-metrics
2021-11-09 16:03:50 +00:00
w . Header ( ) . Set ( "Content-Type" , "application/json" )
2021-09-28 19:47:45 +00:00
w . WriteHeader ( 202 )
fmt . Fprintf ( w , ` { "status":"ok"} ` )
return true
2024-02-06 20:58:11 +00:00
case "/datadog/api/beta/sketches" :
datadogsketchesWriteRequests . Inc ( )
if err := datadogsketches . InsertHandlerForHTTP ( r ) ; err != nil {
datadogsketchesWriteErrors . Inc ( )
httpserver . Errorf ( w , r , "%s" , err )
return true
}
w . WriteHeader ( 202 )
return true
2021-09-28 19:47:45 +00:00
case "/datadog/api/v1/validate" :
datadogValidateRequests . Inc ( )
// See https://docs.datadoghq.com/api/latest/authentication/#validate-api-key
2021-11-09 16:03:50 +00:00
w . Header ( ) . Set ( "Content-Type" , "application/json" )
2021-09-28 19:47:45 +00:00
fmt . Fprintf ( w , ` { "valid":true} ` )
return true
case "/datadog/api/v1/check_run" :
datadogCheckRunRequests . Inc ( )
// See https://docs.datadoghq.com/api/latest/service-checks/#submit-a-service-check
2021-11-09 16:03:50 +00:00
w . Header ( ) . Set ( "Content-Type" , "application/json" )
2021-09-28 19:47:45 +00:00
w . WriteHeader ( 202 )
fmt . Fprintf ( w , ` { "status":"ok"} ` )
return true
2022-06-07 12:16:48 +00:00
case "/datadog/intake" :
2021-09-28 19:47:45 +00:00
datadogIntakeRequests . Inc ( )
2021-11-09 16:03:50 +00:00
w . Header ( ) . Set ( "Content-Type" , "application/json" )
2021-09-28 19:47:45 +00:00
fmt . Fprintf ( w , ` { } ` )
return true
2022-06-13 06:52:13 +00:00
case "/datadog/api/v1/metadata" :
datadogMetadataRequests . Inc ( )
w . Header ( ) . Set ( "Content-Type" , "application/json" )
fmt . Fprintf ( w , ` { } ` )
return true
2021-02-04 18:00:22 +00:00
case "/prometheus/targets" , "/targets" :
2020-02-25 16:13:11 +00:00
promscrapeTargetsRequests . Inc ( )
2020-12-14 12:02:57 +00:00
promscrape . WriteHumanReadableTargetsStatus ( w , r )
2020-02-25 16:13:11 +00:00
return true
2022-06-06 21:57:05 +00:00
case "/prometheus/service-discovery" , "/service-discovery" :
promscrapeServiceDiscoveryRequests . Inc ( )
promscrape . WriteServiceDiscovery ( w , r )
return true
2021-02-04 18:00:22 +00:00
case "/prometheus/api/v1/targets" , "/api/v1/targets" :
2020-10-20 18:44:59 +00:00
promscrapeAPIV1TargetsRequests . Inc ( )
2021-11-09 16:03:50 +00:00
w . Header ( ) . Set ( "Content-Type" , "application/json" )
2020-10-20 18:44:59 +00:00
state := r . FormValue ( "state" )
promscrape . WriteAPIV1Targets ( w , state )
return true
2022-02-03 16:57:36 +00:00
case "/prometheus/target_response" , "/target_response" :
promscrapeTargetResponseRequests . Inc ( )
if err := promscrape . WriteTargetResponse ( w , r ) ; err != nil {
promscrapeTargetResponseErrors . Inc ( )
httpserver . Errorf ( w , r , "%s" , err )
return true
}
return true
2021-10-12 13:23:42 +00:00
case "/prometheus/config" , "/config" :
2024-01-21 19:58:26 +00:00
if ! httpserver . CheckAuthFlag ( w , r , configAuthKey . Get ( ) , "configAuthKey" ) {
2021-11-01 14:44:51 +00:00
return true
}
2021-10-12 13:23:42 +00:00
promscrapeConfigRequests . Inc ( )
w . Header ( ) . Set ( "Content-Type" , "text/plain; charset=utf-8" )
promscrape . WriteConfigData ( w )
return true
2022-05-25 06:57:11 +00:00
case "/prometheus/api/v1/status/config" , "/api/v1/status/config" :
// See https://prometheus.io/docs/prometheus/latest/querying/api/#config
2024-01-21 19:58:26 +00:00
if ! httpserver . CheckAuthFlag ( w , r , configAuthKey . Get ( ) , "configAuthKey" ) {
2022-05-25 06:57:11 +00:00
return true
}
promscrapeStatusConfigRequests . Inc ( )
w . Header ( ) . Set ( "Content-Type" , "application/json" )
var bb bytesutil . ByteBuffer
promscrape . WriteConfigData ( & bb )
fmt . Fprintf ( w , ` { "status":"success","data": { "yaml":%q}} ` , bb . B )
return true
2021-02-04 18:00:22 +00:00
case "/prometheus/-/reload" , "/-/reload" :
2024-01-21 19:58:26 +00:00
if ! httpserver . CheckAuthFlag ( w , r , reloadAuthKey . Get ( ) , "reloadAuthKey" ) {
return true
}
2020-04-29 23:15:39 +00:00
promscrapeConfigReloadRequests . Inc ( )
procutil . SelfSIGHUP ( )
2024-02-07 20:00:04 +00:00
w . WriteHeader ( http . StatusOK )
2020-04-29 23:15:39 +00:00
return true
2020-11-04 18:29:18 +00:00
case "/ready" :
2024-02-24 00:07:51 +00:00
if rdy := promscrape . PendingScrapeConfigs . Load ( ) ; rdy > 0 {
2020-11-04 18:29:18 +00:00
errMsg := fmt . Sprintf ( "waiting for scrape config to init targets, configs left: %d" , rdy )
http . Error ( w , errMsg , http . StatusTooEarly )
} else {
2020-11-13 08:25:39 +00:00
w . Header ( ) . Set ( "Content-Type" , "text/plain; charset=utf-8" )
2020-11-04 18:29:18 +00:00
w . WriteHeader ( http . StatusOK )
w . Write ( [ ] byte ( "OK" ) )
}
return true
2019-05-22 21:16:55 +00:00
default :
// This is not our link
return false
}
}
2022-02-17 10:45:20 +00:00
func addInfluxResponseHeaders ( w http . ResponseWriter ) {
// This is needed for some clients, which expect InfluxDB version header.
// See, for example, https://github.com/ntop/ntopng/issues/5449#issuecomment-1005347597
w . Header ( ) . Set ( "X-Influxdb-Version" , "1.8.0" )
}
2019-05-22 21:16:55 +00:00
var (
2021-07-07 10:25:16 +00:00
requestDuration = metrics . NewHistogram ( ` vminsert_request_duration_seconds ` )
2020-03-10 17:35:58 +00:00
prometheusWriteRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/api/v1/write", protocol="promremotewrite"} ` )
prometheusWriteErrors = metrics . NewCounter ( ` vm_http_request_errors_total { path="/api/v1/write", protocol="promremotewrite"} ` )
vmimportRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/api/v1/import", protocol="vmimport"} ` )
vmimportErrors = metrics . NewCounter ( ` vm_http_request_errors_total { path="/api/v1/import", protocol="vmimport"} ` )
2019-05-22 21:16:55 +00:00
2020-03-10 17:35:58 +00:00
csvimportRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/api/v1/import/csv", protocol="csvimport"} ` )
csvimportErrors = metrics . NewCounter ( ` vm_http_request_errors_total { path="/api/v1/import/csv", protocol="csvimport"} ` )
2019-12-09 18:58:19 +00:00
2020-07-10 09:00:35 +00:00
prometheusimportRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/api/v1/import/prometheus", protocol="prometheusimport"} ` )
prometheusimportErrors = metrics . NewCounter ( ` vm_http_request_errors_total { path="/api/v1/import/prometheus", protocol="prometheusimport"} ` )
2020-09-26 01:29:45 +00:00
nativeimportRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/api/v1/import/native", protocol="nativeimport"} ` )
nativeimportErrors = metrics . NewCounter ( ` vm_http_request_errors_total { path="/api/v1/import/native", protocol="nativeimport"} ` )
2021-09-28 19:47:45 +00:00
influxWriteRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/influx/write", protocol="influx"} ` )
influxWriteErrors = metrics . NewCounter ( ` vm_http_request_errors_total { path="/influx/write", protocol="influx"} ` )
influxQueryRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/influx/query", protocol="influx"} ` )
2023-12-21 16:29:10 +00:00
datadogv1WriteRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/datadog/api/v1/series", protocol="datadog"} ` )
datadogv1WriteErrors = metrics . NewCounter ( ` vm_http_request_errors_total { path="/datadog/api/v1/series", protocol="datadog"} ` )
datadogv2WriteRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/datadog/api/v2/series", protocol="datadog"} ` )
datadogv2WriteErrors = metrics . NewCounter ( ` vm_http_request_errors_total { path="/datadog/api/v2/series", protocol="datadog"} ` )
2019-05-22 21:16:55 +00:00
2024-02-06 20:58:11 +00:00
datadogsketchesWriteRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/datadog/api/beta/sketches", protocol="datadog"} ` )
datadogsketchesWriteErrors = metrics . NewCounter ( ` vm_http_request_errors_total { path="/datadog/api/beta/sketches", protocol="datadog"} ` )
2021-09-28 19:47:45 +00:00
datadogValidateRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/datadog/api/v1/validate", protocol="datadog"} ` )
datadogCheckRunRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/datadog/api/v1/check_run", protocol="datadog"} ` )
2022-06-07 12:16:48 +00:00
datadogIntakeRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/datadog/intake", protocol="datadog"} ` )
2022-06-13 06:52:13 +00:00
datadogMetadataRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/datadog/api/v1/metadata", protocol="datadog"} ` )
2020-02-25 16:13:11 +00:00
2024-02-29 16:02:48 +00:00
opentelemetryPushRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/opentelemetry/v1/metrics", protocol="opentelemetry"} ` )
opentelemetryPushErrors = metrics . NewCounter ( ` vm_http_request_errors_total { path="/opentelemetry/v1/metrics", protocol="opentelemetry"} ` )
2023-07-27 20:26:45 +00:00
2023-10-15 22:25:23 +00:00
newrelicWriteRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/newrelic/infra/v2/metrics/events/bulk", protocol="newrelic"} ` )
newrelicWriteErrors = metrics . NewCounter ( ` vm_http_request_errors_total { path="/newrelic/infra/v2/metrics/events/bulk", protocol="newrelic"} ` )
2023-10-05 12:39:51 +00:00
2023-10-15 22:25:23 +00:00
newrelicInventoryRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/newrelic/inventory/deltas", protocol="newrelic"} ` )
newrelicCheckRequest = metrics . NewCounter ( ` vm_http_requests_total { path="/newrelic", protocol="newrelic"} ` )
2023-10-05 12:39:51 +00:00
2022-06-06 21:57:05 +00:00
promscrapeTargetsRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/targets"} ` )
promscrapeServiceDiscoveryRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/service-discovery"} ` )
2022-12-10 10:09:21 +00:00
promscrapeAPIV1TargetsRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/api/v1/targets"} ` )
2020-04-29 23:15:39 +00:00
2022-02-03 16:57:36 +00:00
promscrapeTargetResponseRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/target_response"} ` )
promscrapeTargetResponseErrors = metrics . NewCounter ( ` vm_http_request_errors_total { path="/target_response"} ` )
2022-05-25 06:57:11 +00:00
promscrapeConfigRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/config"} ` )
promscrapeStatusConfigRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/api/v1/status/config"} ` )
2021-10-12 13:23:42 +00:00
2020-04-29 23:15:39 +00:00
promscrapeConfigReloadRequests = metrics . NewCounter ( ` vm_http_requests_total { path="/-/reload"} ` )
2020-06-18 22:10:18 +00:00
_ = metrics . NewGauge ( ` vm_metrics_with_dropped_labels_total ` , func ( ) float64 {
2024-02-23 22:15:21 +00:00
return float64 ( storage . MetricsWithDroppedLabels . Load ( ) )
2020-06-18 22:10:18 +00:00
} )
_ = metrics . NewGauge ( ` vm_too_long_label_names_total ` , func ( ) float64 {
2024-02-23 22:15:21 +00:00
return float64 ( storage . TooLongLabelNames . Load ( ) )
2020-06-18 22:10:18 +00:00
} )
_ = metrics . NewGauge ( ` vm_too_long_label_values_total ` , func ( ) float64 {
2024-02-23 22:15:21 +00:00
return float64 ( storage . TooLongLabelValues . Load ( ) )
2020-06-18 22:10:18 +00:00
} )
2019-05-22 21:16:55 +00:00
)