github.com/divyam234/rclone@v1.64.1/fs/accounting/prometheus.go (about) 1 package accounting 2 3 import ( 4 "context" 5 6 "github.com/prometheus/client_golang/prometheus" 7 ) 8 9 var namespace = "rclone_" 10 11 // RcloneCollector is a Prometheus collector for Rclone 12 type RcloneCollector struct { 13 ctx context.Context 14 bytesTransferred *prometheus.Desc 15 transferSpeed *prometheus.Desc 16 numOfErrors *prometheus.Desc 17 numOfCheckFiles *prometheus.Desc 18 transferredFiles *prometheus.Desc 19 deletes *prometheus.Desc 20 deletedDirs *prometheus.Desc 21 renames *prometheus.Desc 22 fatalError *prometheus.Desc 23 retryError *prometheus.Desc 24 } 25 26 // NewRcloneCollector make a new RcloneCollector 27 func NewRcloneCollector(ctx context.Context) *RcloneCollector { 28 return &RcloneCollector{ 29 ctx: ctx, 30 bytesTransferred: prometheus.NewDesc(namespace+"bytes_transferred_total", 31 "Total transferred bytes since the start of the Rclone process", 32 nil, nil, 33 ), 34 transferSpeed: prometheus.NewDesc(namespace+"speed", 35 "Average speed in bytes per second since the start of the Rclone process", 36 nil, nil, 37 ), 38 numOfErrors: prometheus.NewDesc(namespace+"errors_total", 39 "Number of errors thrown", 40 nil, nil, 41 ), 42 numOfCheckFiles: prometheus.NewDesc(namespace+"checked_files_total", 43 "Number of checked files", 44 nil, nil, 45 ), 46 transferredFiles: prometheus.NewDesc(namespace+"files_transferred_total", 47 "Number of transferred files", 48 nil, nil, 49 ), 50 deletes: prometheus.NewDesc(namespace+"files_deleted_total", 51 "Total number of files deleted", 52 nil, nil, 53 ), 54 deletedDirs: prometheus.NewDesc(namespace+"dirs_deleted_total", 55 "Total number of directories deleted", 56 nil, nil, 57 ), 58 renames: prometheus.NewDesc(namespace+"files_renamed_total", 59 "Total number of files renamed", 60 nil, nil, 61 ), 62 fatalError: prometheus.NewDesc(namespace+"fatal_error", 63 "Whether a fatal error has occurred", 64 nil, nil, 65 ), 66 retryError: prometheus.NewDesc(namespace+"retry_error", 67 "Whether there has been an error that will be retried", 68 nil, nil, 69 ), 70 } 71 } 72 73 // Describe is part of the Collector interface: https://godoc.org/github.com/prometheus/client_golang/prometheus#Collector 74 func (c *RcloneCollector) Describe(ch chan<- *prometheus.Desc) { 75 ch <- c.bytesTransferred 76 ch <- c.transferSpeed 77 ch <- c.numOfErrors 78 ch <- c.numOfCheckFiles 79 ch <- c.transferredFiles 80 ch <- c.deletes 81 ch <- c.deletedDirs 82 ch <- c.renames 83 ch <- c.fatalError 84 ch <- c.retryError 85 } 86 87 // Collect is part of the Collector interface: https://godoc.org/github.com/prometheus/client_golang/prometheus#Collector 88 func (c *RcloneCollector) Collect(ch chan<- prometheus.Metric) { 89 s := groups.sum(c.ctx) 90 s.mu.RLock() 91 92 ch <- prometheus.MustNewConstMetric(c.bytesTransferred, prometheus.CounterValue, float64(s.bytes)) 93 ch <- prometheus.MustNewConstMetric(c.transferSpeed, prometheus.GaugeValue, s.speed()) 94 ch <- prometheus.MustNewConstMetric(c.numOfErrors, prometheus.CounterValue, float64(s.errors)) 95 ch <- prometheus.MustNewConstMetric(c.numOfCheckFiles, prometheus.CounterValue, float64(s.checks)) 96 ch <- prometheus.MustNewConstMetric(c.transferredFiles, prometheus.CounterValue, float64(s.transfers)) 97 ch <- prometheus.MustNewConstMetric(c.deletes, prometheus.CounterValue, float64(s.deletes)) 98 ch <- prometheus.MustNewConstMetric(c.deletedDirs, prometheus.CounterValue, float64(s.deletedDirs)) 99 ch <- prometheus.MustNewConstMetric(c.renames, prometheus.CounterValue, float64(s.renames)) 100 ch <- prometheus.MustNewConstMetric(c.fatalError, prometheus.GaugeValue, bool2Float(s.fatalError)) 101 ch <- prometheus.MustNewConstMetric(c.retryError, prometheus.GaugeValue, bool2Float(s.retryError)) 102 103 s.mu.RUnlock() 104 } 105 106 // bool2Float is a small function to convert a boolean into a float64 value that can be used for Prometheus 107 func bool2Float(e bool) float64 { 108 if e { 109 return 1 110 } 111 return 0 112 }