From d570763c91a235cfcbaf1b799cbfbefa557ee7e1 Mon Sep 17 00:00:00 2001 From: crossoverJie <crossoverJie@gmail.com> Date: Sat, 16 Sep 2023 21:10:29 +0800 Subject: [PATCH] app/vlinsert: Add vl_http_request_duration_seconds metrics (#4934) --- app/vlinsert/elasticsearch/elasticsearch.go | 4 +++- app/vlinsert/jsonline/jsonline.go | 3 +++ app/vlinsert/loki/loki.go | 11 ++++++++--- docs/VictoriaLogs/data-ingestion/README.md | 6 ++++++ 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/vlinsert/elasticsearch/elasticsearch.go b/app/vlinsert/elasticsearch/elasticsearch.go index 60ae8ddeb..aaa845745 100644 --- a/app/vlinsert/elasticsearch/elasticsearch.go +++ b/app/vlinsert/elasticsearch/elasticsearch.go @@ -86,6 +86,7 @@ func RequestHandler(path string, w http.ResponseWriter, r *http.Request) bool { return true case "/_bulk": startTime := time.Now() + defer bulkRequestDuration.UpdateDuration(startTime) bulkRequestsTotal.Inc() cp, err := insertutils.GetCommonParams(r) @@ -116,7 +117,8 @@ func RequestHandler(path string, w http.ResponseWriter, r *http.Request) bool { } var ( - bulkRequestsTotal = metrics.NewCounter(`vl_http_requests_total{path="/insert/elasticsearch/_bulk"}`) + bulkRequestsTotal = metrics.NewCounter(`vl_http_requests_total{path="/insert/elasticsearch/_bulk"}`) + bulkRequestDuration = metrics.NewSummary(`vl_http_request_duration_seconds{path="/insert/elasticsearch/_bulk"}`) ) func readBulkRequest(r io.Reader, isGzip bool, timeField, msgField string, diff --git a/app/vlinsert/jsonline/jsonline.go b/app/vlinsert/jsonline/jsonline.go index 1b901db36..965f1b15c 100644 --- a/app/vlinsert/jsonline/jsonline.go +++ b/app/vlinsert/jsonline/jsonline.go @@ -19,8 +19,11 @@ import ( "github.com/VictoriaMetrics/metrics" ) +var jsonlineRequestDuration = metrics.NewSummary(`vl_http_request_duration_seconds{path="/insert/jsonline"}`) + // RequestHandler processes jsonline insert requests func RequestHandler(w http.ResponseWriter, r *http.Request) bool { + defer jsonlineRequestDuration.UpdateDuration(time.Now()) w.Header().Add("Content-Type", "application/json") if r.Method != "POST" { diff --git a/app/vlinsert/loki/loki.go b/app/vlinsert/loki/loki.go index 09faa742c..98bb68811 100644 --- a/app/vlinsert/loki/loki.go +++ b/app/vlinsert/loki/loki.go @@ -2,6 +2,7 @@ package loki import ( "net/http" + "time" "github.com/VictoriaMetrics/metrics" @@ -10,8 +11,10 @@ import ( ) var ( - lokiRequestsJSONTotal = metrics.NewCounter(`vl_http_requests_total{path="/insert/loki/api/v1/push",format="json"}`) - lokiRequestsProtobufTotal = metrics.NewCounter(`vl_http_requests_total{path="/insert/loki/api/v1/push",format="protobuf"}`) + lokiRequestsJSONTotal = metrics.NewCounter(`vl_http_requests_total{path="/insert/loki/api/v1/push",format="json"}`) + lokiRequestsProtobufTotal = metrics.NewCounter(`vl_http_requests_total{path="/insert/loki/api/v1/push",format="protobuf"}`) + lokiRequestJSONDuration = metrics.NewSummary(`vl_http_request_duration_seconds{path="/insert/loki/api/v1/push",format="json"}`) + lokiRequestProtobufDuration = metrics.NewSummary(`vl_http_request_duration_seconds{path="/insert/loki/api/v1/push",format="protobuf"}`) ) // RequestHandler processes Loki insert requests @@ -34,10 +37,12 @@ func handleInsert(r *http.Request, w http.ResponseWriter) bool { contentType := r.Header.Get("Content-Type") switch contentType { case "application/json": + defer lokiRequestJSONDuration.UpdateDuration(time.Now()) lokiRequestsJSONTotal.Inc() return handleJSON(r, w) default: - // Protobuf request body should be handled by default accoring to https://grafana.com/docs/loki/latest/api/#push-log-entries-to-loki + // Protobuf request body should be handled by default according to https://grafana.com/docs/loki/latest/api/#push-log-entries-to-loki + defer lokiRequestProtobufDuration.UpdateDuration(time.Now()) lokiRequestsProtobufTotal.Inc() return handleProtobuf(r, w) } diff --git a/docs/VictoriaLogs/data-ingestion/README.md b/docs/VictoriaLogs/data-ingestion/README.md index 9876edacb..6d657b2af 100644 --- a/docs/VictoriaLogs/data-ingestion/README.md +++ b/docs/VictoriaLogs/data-ingestion/README.md @@ -81,6 +81,8 @@ The response by default contains [`_msg`](https://docs.victoriametrics.com/Victo [`_time`](https://docs.victoriametrics.com/VictoriaLogs/keyConcepts.html#time-field) fields plus the explicitly mentioned fields. See [these docs](https://docs.victoriametrics.com/VictoriaLogs/LogsQL.html#querying-specific-fields) for details. +The duration of requests to `/insert/elasticsearch/_bulk` can be monitored with `vl_http_request_duration_seconds{path="/insert/elasticsearch/_bulk"}` metric. + See also: - [How to debug data ingestion](#troubleshooting). @@ -133,6 +135,8 @@ The response by default contains [`_msg`](https://docs.victoriametrics.com/Victo [`_time`](https://docs.victoriametrics.com/VictoriaLogs/keyConcepts.html#time-field) fields plus the explicitly mentioned fields. See [these docs](https://docs.victoriametrics.com/VictoriaLogs/LogsQL.html#querying-specific-fields) for details. +The duration of requests to `/insert/jsonline` can be monitored with `vl_http_request_duration_seconds{path="/insert/jsonline"}` metric. + See also: - [How to debug data ingestion](#troubleshooting). @@ -172,6 +176,8 @@ The response by default contains [`_msg`](https://docs.victoriametrics.com/Victo [`_time`](https://docs.victoriametrics.com/VictoriaLogs/keyConcepts.html#time-field) fields plus the explicitly mentioned fields. See [these docs](https://docs.victoriametrics.com/VictoriaLogs/LogsQL.html#querying-specific-fields) for details. +The duration of requests to `/insert/loki/api/v1/push` can be monitored with `vl_http_request_duration_seconds{path="/insert/loki/api/v1/push"}` metric. + See also: - [How to debug data ingestion](#troubleshooting).