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  }