diff --git a/pkg/api/controller.go b/pkg/api/controller.go index e42e41fe3a5..ccdf2b7a64c 100644 --- a/pkg/api/controller.go +++ b/pkg/api/controller.go @@ -4480,6 +4480,7 @@ func (c *Controller) GetObject(w http.ResponseWriter, r *http.Request, repositor } ctx := r.Context() c.LogAction(ctx, "get_object", r, repository, ref, "") + requestStart := time.Now() repo, err := c.Catalog.GetRepository(ctx, repository) if c.handleAPIError(ctx, w, r, err) { @@ -4564,6 +4565,11 @@ func (c *Controller) GetObject(w http.ResponseWriter, r *http.Request, repositor w.Header().Set("Content-Length", fmt.Sprint(entry.Size)) } + // time to first byte - include out part of the processing without the actual data transfer + requestTTFBHistograms. + WithLabelValues("GetObject"). + Observe(time.Since(requestStart).Seconds()) + // copy the content _, err = io.Copy(w, reader) if err != nil { diff --git a/pkg/api/stats.go b/pkg/api/stats.go index 3cdb36e849d..ecd6a60a162 100644 --- a/pkg/api/stats.go +++ b/pkg/api/stats.go @@ -20,3 +20,11 @@ var requestHistograms = promauto.NewHistogramVec( Buckets: []float64{0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 30, 60}, }, []string{"operation", "code"}) + +var requestTTFBHistograms = promauto.NewHistogramVec( + prometheus.HistogramOpts{ + Name: "api_request_ttfb_duration_seconds", + Help: "request time-to-first-byte durations for lakeFS API", + Buckets: []float64{0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 30, 60}, + }, + []string{"operation"})