From f61490966f70ade813b7cb1d21a24df93fe172b2 Mon Sep 17 00:00:00 2001 From: SmsS4 <36403983+SmsS4@users.noreply.github.com> Date: Mon, 21 Aug 2023 11:12:39 +0330 Subject: [PATCH] Add time to first byte metric for s3 (#4768) * Add time to first byte metric for s3 * Change second to millisecond --- weed/s3api/s3api_object_handlers.go | 3 ++- weed/s3api/stats.go | 5 +++++ weed/stats/metrics.go | 10 ++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index e959ff1f1..b63997cd3 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -355,6 +355,7 @@ func (s3a *S3ApiServer) doDeleteEmptyDirectories(client filer_pb.SeaweedFilerCli func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, destUrl string, isWrite bool, responseFn func(proxyResponse *http.Response, w http.ResponseWriter) (statusCode int)) { glog.V(3).Infof("s3 proxying %s to %s", r.Method, destUrl) + start := time.Now() proxyReq, err := http.NewRequest(r.Method, destUrl, r.Body) @@ -404,12 +405,12 @@ func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, des return } } - if resp.StatusCode == http.StatusNotFound { s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey) return } + TimeToFirstByte(r.Method, start, r) if resp.Header.Get(s3_constants.X_SeaweedFS_Header_Directory_Key) == "true" { responseStatusCode := responseFn(resp, w) s3err.PostLog(r, responseStatusCode, s3err.ErrNone) diff --git a/weed/s3api/stats.go b/weed/s3api/stats.go index 2b36478ad..369c3e0f6 100644 --- a/weed/s3api/stats.go +++ b/weed/s3api/stats.go @@ -43,3 +43,8 @@ func track(f http.HandlerFunc, action string) http.HandlerFunc { stats_collect.S3RequestCounter.WithLabelValues(action, strconv.Itoa(recorder.Status), bucket).Inc() } } + +func TimeToFirstByte(action string, start time.Time, r *http.Request) { + bucket, _ := s3_constants.GetBucketAndObject(r) + stats_collect.S3TimeToFirstByteHistogram.WithLabelValues(action, bucket).Observe(float64(time.Since(start).Milliseconds())) +} diff --git a/weed/stats/metrics.go b/weed/stats/metrics.go index 454b35d7a..dda4d95e5 100644 --- a/weed/stats/metrics.go +++ b/weed/stats/metrics.go @@ -226,6 +226,15 @@ var ( Help: "Bucketed histogram of s3 request processing time.", Buckets: prometheus.ExponentialBuckets(0.0001, 2, 24), }, []string{"type", "bucket"}) + S3TimeToFirstByteHistogram = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: Namespace, + Subsystem: "s3", + Name: "time_to_first_byte_millisecond", + Help: "Bucketed histogram of s3 time to first byte request processing time.", + Buckets: prometheus.ExponentialBuckets(0.001, 2, 27), + }, []string{"type", "bucket"}) + ) func init() { @@ -258,6 +267,7 @@ func init() { Gather.MustRegister(S3RequestCounter) Gather.MustRegister(S3RequestHistogram) + Gather.MustRegister(S3TimeToFirstByteHistogram) } func LoopPushingMetric(name, instance, addr string, intervalSeconds int) {