0a025aabfd
We use the system commands "git-receive-pack", "git-upload-pack" and "git-upload-archive". they need to be installed and in your system's PATH. Since we execute system commands we have no direct control on file creation/deletion and so quota check is suboptimal: if quota is enabled, the number of files is checked at the command begin and not while new files are created. The allowed size is calculated as the difference between the max quota and the used one. The command is aborted if it uploads more bytes than the remaining allowed size calculated at the command start. Quotas are recalculated at the command end with a full home directory scan, this could be heavy for big directories.
234 lines
7.6 KiB
Go
234 lines
7.6 KiB
Go
// Package metrics provides Prometheus metrics support
|
|
package metrics
|
|
|
|
import (
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"github.com/prometheus/client_golang/prometheus/promauto"
|
|
)
|
|
|
|
var (
|
|
// dataproviderAvailability is the metric that reports the availability for the configured data provider
|
|
dataproviderAvailability = promauto.NewGauge(prometheus.GaugeOpts{
|
|
Name: "sftpgo_dataprovider_availability",
|
|
Help: "Availability for the configured data provider, 1 means OK, 0 KO",
|
|
})
|
|
|
|
// activeConnections is the metric that reports the total number of active connections
|
|
activeConnections = promauto.NewGauge(prometheus.GaugeOpts{
|
|
Name: "sftpgo_active_connections",
|
|
Help: "Total number of logged in users",
|
|
})
|
|
|
|
// totalUploads is the metric that reports the total number of uploads
|
|
totalUploads = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_uploads_total",
|
|
Help: "The total number of uploads",
|
|
})
|
|
|
|
// totalDownloads is the metric that reports the total number of downloads
|
|
totalDownloads = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_downloads_total",
|
|
Help: "The total number of downloads",
|
|
})
|
|
|
|
// totalUploadErrors is the metric that reports the total number of upload errors
|
|
totalUploadErrors = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_upload_errors_total",
|
|
Help: "The total number of upload errors",
|
|
})
|
|
|
|
// totalDownloadErrors is the metric that reports the total number of download errors
|
|
totalDownloadErrors = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_download_errors_total",
|
|
Help: "The total number of download errors",
|
|
})
|
|
|
|
// totalUploadSize is the metric that reports the total uploads size as bytes
|
|
totalUploadSize = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_upload_size",
|
|
Help: "The total upload size as bytes",
|
|
})
|
|
|
|
// totalDownloadSize is the metric that reports the total downloads size as bytes
|
|
totalDownloadSize = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_download_size",
|
|
Help: "The total download size as bytes",
|
|
})
|
|
|
|
// totalSSHCommands is the metric that reports the total number of executed SSH commands
|
|
totalSSHCommands = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_ssh_commands_total",
|
|
Help: "The total number of executed SSH commands",
|
|
})
|
|
|
|
// totalSSHCommandErrors is the metric that reports the total number of SSH command errors
|
|
totalSSHCommandErrors = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_ssh_command_errors_total",
|
|
Help: "The total number of SSH command errors",
|
|
})
|
|
|
|
// totalLoginAttempts is the metric that reports the total number of login attempts
|
|
totalLoginAttempts = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_login_attempts_total",
|
|
Help: "The total number of login attempts",
|
|
})
|
|
|
|
// totalLoginOK is the metric that reports the total number of successful logins
|
|
totalLoginOK = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_login_ok_total",
|
|
Help: "The total number of successful logins",
|
|
})
|
|
|
|
// totalLoginFailed is the metric that reports the total number of failed logins
|
|
totalLoginFailed = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_login_ko_total",
|
|
Help: "The total number of failed logins",
|
|
})
|
|
|
|
// totalPasswordLoginAttempts is the metric that reports the total number of login attempts
|
|
// using a password
|
|
totalPasswordLoginAttempts = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_password_login_attempts_total",
|
|
Help: "The total number of login attempts using a password",
|
|
})
|
|
|
|
// totalPasswordLoginOK is the metric that reports the total number of successful logins
|
|
// using a password
|
|
totalPasswordLoginOK = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_password_login_ok_total",
|
|
Help: "The total number of successful logins using a password",
|
|
})
|
|
|
|
// totalPasswordLoginFailed is the metric that reports the total number of failed logins
|
|
// using a password
|
|
totalPasswordLoginFailed = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_password_login_ko_total",
|
|
Help: "The total number of failed logins using a password",
|
|
})
|
|
|
|
// totalKeyLoginAttempts is the metric that reports the total number of login attempts
|
|
// using a public key
|
|
totalKeyLoginAttempts = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_public_key_login_attempts_total",
|
|
Help: "The total number of login attempts using a public key",
|
|
})
|
|
|
|
// totalKeyLoginOK is the metric that reports the total number of successful logins
|
|
// using a public key
|
|
totalKeyLoginOK = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_public_key_login_ok_total",
|
|
Help: "The total number of successful logins using a public key",
|
|
})
|
|
|
|
// totalKeyLoginFailed is the metric that reports the total number of failed logins
|
|
// using a public key
|
|
totalKeyLoginFailed = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_public_key_login_ko_total",
|
|
Help: "The total number of failed logins using a public key",
|
|
})
|
|
|
|
totalHTTPRequests = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_http_req_total",
|
|
Help: "The total number of HTTP requests served",
|
|
})
|
|
|
|
totalHTTPOK = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_http_req_ok_total",
|
|
Help: "The total number of HTTP requests served with 2xx status code",
|
|
})
|
|
|
|
totalHTTPClientErrors = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_http_client_errors_total",
|
|
Help: "The total number of HTTP requests served with 4xx status code",
|
|
})
|
|
|
|
totalHTTPServerErrors = promauto.NewCounter(prometheus.CounterOpts{
|
|
Name: "sftpgo_http_server_errors_total",
|
|
Help: "The total number of HTTP requests served with 5xx status code",
|
|
})
|
|
)
|
|
|
|
// TransferCompleted update metrics after an upload or a download
|
|
func TransferCompleted(bytesSent, bytesReceived int64, transferKind int, err error) {
|
|
if transferKind == 0 {
|
|
// upload
|
|
if err == nil {
|
|
totalUploads.Inc()
|
|
totalUploadSize.Add(float64(bytesReceived))
|
|
} else {
|
|
totalUploadErrors.Inc()
|
|
}
|
|
} else {
|
|
// download
|
|
if err == nil {
|
|
totalDownloads.Inc()
|
|
totalDownloadSize.Add(float64(bytesSent))
|
|
} else {
|
|
totalDownloadErrors.Inc()
|
|
}
|
|
}
|
|
}
|
|
|
|
// SSHCommandCompleted update metrics after an SSH command terminates
|
|
func SSHCommandCompleted(err error) {
|
|
if err == nil {
|
|
totalSSHCommands.Inc()
|
|
} else {
|
|
totalSSHCommandErrors.Inc()
|
|
}
|
|
}
|
|
|
|
// UpdateDataProviderAvailability updates the metric for the data provider availability
|
|
func UpdateDataProviderAvailability(err error) {
|
|
if err == nil {
|
|
dataproviderAvailability.Set(1)
|
|
} else {
|
|
dataproviderAvailability.Set(0)
|
|
}
|
|
}
|
|
|
|
// AddLoginAttempt increments the metrics for login attempts
|
|
func AddLoginAttempt(withKey bool) {
|
|
totalLoginAttempts.Inc()
|
|
if withKey {
|
|
totalKeyLoginAttempts.Inc()
|
|
} else {
|
|
totalPasswordLoginAttempts.Inc()
|
|
}
|
|
}
|
|
|
|
// AddLoginResult increments the metrics for login results
|
|
func AddLoginResult(withKey bool, err error) {
|
|
if err == nil {
|
|
totalLoginOK.Inc()
|
|
if withKey {
|
|
totalKeyLoginOK.Inc()
|
|
} else {
|
|
totalPasswordLoginOK.Inc()
|
|
}
|
|
} else {
|
|
totalLoginFailed.Inc()
|
|
if withKey {
|
|
totalKeyLoginFailed.Inc()
|
|
} else {
|
|
totalPasswordLoginFailed.Inc()
|
|
}
|
|
}
|
|
}
|
|
|
|
// HTTPRequestServed increments the metrics for HTTP requests
|
|
func HTTPRequestServed(status int) {
|
|
totalHTTPRequests.Inc()
|
|
if status >= 200 && status < 300 {
|
|
totalHTTPOK.Inc()
|
|
} else if status >= 400 && status < 500 {
|
|
totalHTTPClientErrors.Inc()
|
|
} else if status >= 500 {
|
|
totalHTTPServerErrors.Inc()
|
|
}
|
|
}
|
|
|
|
// UpdateActiveConnectionsSize sets the metric for active connections
|
|
func UpdateActiveConnectionsSize(size int) {
|
|
activeConnections.Set(float64(size))
|
|
}
|