diff --git a/handlers.go b/handlers.go index 3459332..25903db 100644 --- a/handlers.go +++ b/handlers.go @@ -103,6 +103,25 @@ func getFilePath(r *http.Request, fileType, name string) (string, error) { return join(Config.Path, getRepo(r), fileType, name) } +// getUser returns the username from the request, or an empty string if none. +func getUser(r *http.Request) string { + username, _, ok := r.BasicAuth() + if !ok { + return "" + } + return username +} + +// getMetricLabels returns the prometheus labels from the request. +func getMetricLabels(r *http.Request) prometheus.Labels { + labels := prometheus.Labels{ + "user": getUser(r), + "repo": getRepo(r), + "type": pat.Param(r, "type"), + } + return labels +} + // AuthHandler wraps h with a http.HandlerFunc that performs basic authentication against the user/passwords pairs // stored in f and returns the http.HandlerFunc. func AuthHandler(f *HtpasswdFile, h http.Handler) http.HandlerFunc { @@ -329,7 +348,7 @@ func GetBlob(w http.ResponseWriter, r *http.Request) { } if Config.Prometheus { - labels := prometheus.Labels{"repo": getRepo(r), "type": pat.Param(r, "type")} + labels := getMetricLabels(r) metricBlobReadTotal.With(labels).Inc() metricBlobReadBytesTotal.With(labels).Add(float64(wc.Count())) } @@ -387,7 +406,7 @@ func SaveBlob(w http.ResponseWriter, r *http.Request) { } if Config.Prometheus { - labels := prometheus.Labels{"repo": getRepo(r), "type": pat.Param(r, "type")} + labels := getMetricLabels(r) metricBlobWriteTotal.With(labels).Inc() metricBlobWriteBytesTotal.With(labels).Add(float64(written)) } @@ -410,6 +429,14 @@ func DeleteBlob(w http.ResponseWriter, r *http.Request) { return } + var size int64 + if Config.Prometheus { + stat, err := os.Stat(path) + if err != nil { + size = stat.Size() + } + } + if err := os.Remove(path); err != nil { if Config.Debug { log.Print(err) @@ -421,6 +448,12 @@ func DeleteBlob(w http.ResponseWriter, r *http.Request) { } return } + + if Config.Prometheus { + labels := getMetricLabels(r) + metricBlobDeleteTotal.With(labels).Inc() + metricBlobDeleteBytesTotal.With(labels).Add(float64(size)) + } } // CreateRepo creates repository directories. diff --git a/metrics.go b/metrics.go index 086a5a4..636eabb 100644 --- a/metrics.go +++ b/metrics.go @@ -2,12 +2,14 @@ package restserver import "github.com/prometheus/client_golang/prometheus" +var metricLabelList = []string{"user", "repo", "type"} + var metricBlobWriteTotal = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "rest_server_blob_write_total", Help: "Total number of blobs written", }, - []string{"repo", "type"}, + metricLabelList, ) var metricBlobWriteBytesTotal = prometheus.NewCounterVec( @@ -15,7 +17,7 @@ var metricBlobWriteBytesTotal = prometheus.NewCounterVec( Name: "rest_server_blob_write_bytes_total", Help: "Total number of bytes written to blobs", }, - []string{"repo", "type"}, + metricLabelList, ) var metricBlobReadTotal = prometheus.NewCounterVec( @@ -23,7 +25,7 @@ var metricBlobReadTotal = prometheus.NewCounterVec( Name: "rest_server_blob_read_total", Help: "Total number of blobs read", }, - []string{"repo", "type"}, + metricLabelList, ) var metricBlobReadBytesTotal = prometheus.NewCounterVec( @@ -31,7 +33,23 @@ var metricBlobReadBytesTotal = prometheus.NewCounterVec( Name: "rest_server_blob_read_bytes_total", Help: "Total number of bytes read from blobs", }, - []string{"repo", "type"}, + metricLabelList, +) + +var metricBlobDeleteTotal = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "rest_server_blob_delete_total", + Help: "Total number of blobs deleted", + }, + metricLabelList, +) + +var metricBlobDeleteBytesTotal = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "rest_server_blob_delete_bytes_total", + Help: "Total number of bytes of blobs deleted", + }, + metricLabelList, ) func init() { @@ -40,4 +58,6 @@ func init() { prometheus.MustRegister(metricBlobWriteBytesTotal) prometheus.MustRegister(metricBlobReadTotal) prometheus.MustRegister(metricBlobReadBytesTotal) + prometheus.MustRegister(metricBlobDeleteTotal) + prometheus.MustRegister(metricBlobDeleteBytesTotal) }