diff --git a/changelogs/unreleased/mk-more-image-scaler-prometheus-metrics.yml b/changelogs/unreleased/mk-more-image-scaler-prometheus-metrics.yml new file mode 100644 index 0000000000000000000000000000000000000000..229933e6be2007c61f27a9cc7dbdde5660955253 --- /dev/null +++ b/changelogs/unreleased/mk-more-image-scaler-prometheus-metrics.yml @@ -0,0 +1,5 @@ +--- +title: Add image scaler duration histogram +merge_request: 614 +author: +type: other diff --git a/internal/imageresizer/image_resizer.go b/internal/imageresizer/image_resizer.go index 545fc8c8c8c3b7dd101cdd8ae4fed3e4ca699739..aa9df89cf34e368a187ee5acf34f746b84f774ad 100644 --- a/internal/imageresizer/image_resizer.go +++ b/internal/imageresizer/image_resizer.go @@ -65,24 +65,52 @@ var httpClient = &http.Client{ Transport: httpTransport, } +const ( + namespace = "gitlab_workhorse" + subsystem = "image_resize" +) + var ( imageResizeConcurrencyLimitExceeds = prometheus.NewCounter( prometheus.CounterOpts{ - Name: "gitlab_workhorse_image_resize_concurrency_limit_exceeds_total", - Help: "Amount of image resizing requests that exceeded the maximum allowed scaler processes", + Namespace: namespace, + Subsystem: subsystem, + Name: "concurrency_limit_exceeds_total", + Help: "Amount of image resizing requests that exceeded the maximum allowed scaler processes", }, ) imageResizeProcesses = prometheus.NewGauge( prometheus.GaugeOpts{ - Name: "gitlab_workhorse_image_resize_processes", - Help: "Amount of image resizing scaler processes working now", + Namespace: namespace, + Subsystem: subsystem, + Name: "processes", + Help: "Amount of image resizing scaler processes working now", }, ) imageResizeCompleted = prometheus.NewCounter( prometheus.CounterOpts{ - Name: "gitlab_workhorse_image_resize_completed_total", - Help: "Amount of image resizing processes successfully completed", + Namespace: namespace, + Subsystem: subsystem, + Name: "completed_total", + Help: "Amount of image resizing processes sucessfully completed", + }, + ) + imageResizeDurations = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "duration_seconds", + Help: "Total seconds spent serving image resizing requests", + Buckets: []float64{ + 0.050, /* 50ms */ + 0.1, /* 100ms */ + 0.2, /* 200ms */ + 0.4, /* 400ms */ + 0.8, /* 800ms */ + 1.6, /* 1600ms */ + }, }, + []string{"content_type", "width"}, ) ) @@ -90,6 +118,7 @@ func init() { prometheus.MustRegister(imageResizeConcurrencyLimitExceeds) prometheus.MustRegister(imageResizeProcesses) prometheus.MustRegister(imageResizeCompleted) + prometheus.MustRegister(imageResizeDurations) } // This Injecter forks into a dedicated scaler process to resize an image identified by path or URL @@ -135,11 +164,17 @@ func (r *resizer) Inject(w http.ResponseWriter, req *http.Request, paramsData st w.Header().Del("Content-Length") bytesWritten, err := serveImage(imageReader, w, resizeCmd) + if err != nil { handleFailedCommand(w, req, bytesWritten, err, logFields(bytesWritten)) return } + if resizeCmd != nil { + widthLabelVal := strconv.Itoa(int(params.Width)) + imageResizeDurations.WithLabelValues(params.ContentType, widthLabelVal).Observe(time.Since(start).Seconds()) + } + logger.WithFields(*logFields(bytesWritten)).Printf("ImageResizer: Success") } @@ -153,9 +188,7 @@ func serveImage(r io.Reader, w io.Writer, resizeCmd *exec.Cmd) (int64, error) { } if resizeCmd != nil { - if err = resizeCmd.Wait(); err != nil { - return bytesWritten, err - } + return bytesWritten, resizeCmd.Wait() } return bytesWritten, nil