diff --git a/collector/dfsr.go b/collector/dfsr.go index 88e9c462..b331b16d 100644 --- a/collector/dfsr.go +++ b/collector/dfsr.go @@ -3,111 +3,508 @@ package collector import ( + "errors" + "strings" + "sync" + "time" + "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/log" + "gopkg.in/alecthomas/kingpin.v2" ) -const ( - dfsrVolumeSubsystem = "dfsr_volume" - dfsrConnectionSubsystem = "dfsr_connection" - dfsrFoldersSubsystem = "dfsr_folder" -) +var dfsrEnabledCollectors = kingpin.Flag("collectors.dfsr.sources-enabled", "Comma-seperated list of DFSR Perflib sources to use.").Default("connection,folder,volume").String() func init() { - registerCollector(dfsrConnectionSubsystem, NewDFSRConnectionCollector, "DFS Replication Service Connections") - registerCollector(dfsrFoldersSubsystem, NewDFSRConnectionCollector, "DFS Replication Service Folders") - registerCollector(dfsrVolumeSubsystem, NewDFSRConnectionCollector, "DFS Replication Service Volumes") + // Perflib sources are dynamic, depending on the enabled child collectors + var perflibDependencies []string + for _, source := range expandEnabledChildCollectors(*dfsrEnabledCollectors) { + perflibDependencies = append(perflibDependencies, dfsrGetPerfObjectName(source)) + } + + registerCollector("dfsr", NewDFSRCollector, perflibDependencies...) } -type DFSRConnectionCollector struct { - BandwidthSavingsUsingDFSReplicationTotal *prometheus.Desc - BytesReceivedTotal *prometheus.Desc - CompressedSizeOfFilesReceivedTotal *prometheus.Desc - FilesReceivedTotal *prometheus.Desc - RDCBytesReceivedTotal *prometheus.Desc - RDCCompressedSizeOfFilesReceivedTotal *prometheus.Desc - RDCSizeOfFilesReceivedTotal *prometheus.Desc - RDCNumberofFilesReceivedTotal *prometheus.Desc - SizeOfFilesReceivedTotal *prometheus.Desc +// DFSRCollector contains the metric and state data of the DFSR collectors. +type DFSRCollector struct { + // Meta + dfsrScrapeDurationDesc *prometheus.Desc + dfsrScrapeSuccessDesc *prometheus.Desc + + // Connection source + ConnectionBandwidthSavingsUsingDFSReplicationTotal *prometheus.Desc + ConnectionBytesReceivedTotal *prometheus.Desc + ConnectionCompressedSizeOfFilesReceivedTotal *prometheus.Desc + ConnectionFilesReceivedTotal *prometheus.Desc + ConnectionRDCBytesReceivedTotal *prometheus.Desc + ConnectionRDCCompressedSizeOfFilesReceivedTotal *prometheus.Desc + ConnectionRDCSizeOfFilesReceivedTotal *prometheus.Desc + ConnectionRDCNumberofFilesReceivedTotal *prometheus.Desc + ConnectionSizeOfFilesReceivedTotal *prometheus.Desc + + // Folder source + FolderBandwidthSavingsUsingDFSReplicationTotal *prometheus.Desc + FolderCompressedSizeOfFilesReceivedTotal *prometheus.Desc + FolderConflictBytesCleanedupTotal *prometheus.Desc + FolderConflictBytesGeneratedTotal *prometheus.Desc + FolderConflictFilesCleanedUpTotal *prometheus.Desc + FolderConflictFilesGeneratedTotal *prometheus.Desc + FolderConflictFolderCleanupsCompletedTotal *prometheus.Desc + FolderConflictSpaceInUse *prometheus.Desc + FolderDeletedSpaceInUse *prometheus.Desc + FolderDeletedBytesCleanedUpTotal *prometheus.Desc + FolderDeletedBytesGeneratedTotal *prometheus.Desc + FolderDeletedFilesCleanedUpTotal *prometheus.Desc + FolderDeletedFilesGeneratedTotal *prometheus.Desc + FolderFileInstallsRetriedTotal *prometheus.Desc + FolderFileInstallsSucceededTotal *prometheus.Desc + FolderFilesReceivedTotal *prometheus.Desc + FolderRDCBytesReceivedTotal *prometheus.Desc + FolderRDCCompressedSizeOfFilesReceivedTotal *prometheus.Desc + FolderRDCNumberofFilesReceivedTotal *prometheus.Desc + FolderRDCSizeOfFilesReceivedTotal *prometheus.Desc + FolderSizeOfFilesReceivedTotal *prometheus.Desc + FolderStagingSpaceInUse *prometheus.Desc + FolderStagingBytesCleanedUpTotal *prometheus.Desc + FolderStagingBytesGeneratedTotal *prometheus.Desc + FolderStagingFilesCleanedUpTotal *prometheus.Desc + FolderStagingFilesGeneratedTotal *prometheus.Desc + FolderUpdatesDroppedTotal *prometheus.Desc + + // Volume source + VolumeDatabaseLookupsTotal *prometheus.Desc + VolumeDatabaseCommitsTotal *prometheus.Desc + VolumeUSNJournalUnreadPercentage *prometheus.Desc + VolumeUSNJournalRecordsAcceptedTotal *prometheus.Desc + VolumeUSNJournalRecordsReadTotal *prometheus.Desc + + // Map of child collector functions used during collection + dfsrChildCollectors dfsrCollectorMap + // Internal counter for number of child collector failures during collection + dfsrChildCollectorFailure int } -func NewDFSRConnectionCollector() (Collector, error) { - return &DFSRConnectionCollector{ - BandwidthSavingsUsingDFSReplicationTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "bandwidth_savings_using_dfs_replication_total"), +type dfsrCollectorMap map[string]dfsrCollectorFunc + +type dfsrCollectorFunc func(ctx *ScrapeContext, ch chan<- prometheus.Metric) (*prometheus.Desc, error) + +// Split provided perflib sources and deduplicate +func dfsrExpandEnabledSources(enabled string) []string { + separated := strings.Split(enabled, ",") + unique := map[string]bool{} + for _, s := range separated { + if s != "" { + unique[s] = true + } + } + result := make([]string, 0, len(unique)) + for s := range unique { + result = append(result, s) + } + return result +} + +// Map Perflib sources to DFSR collector names +// E.G. volume -> DFS Replication Service Volumes +func dfsrGetPerfObjectName(collector string) string { + prefix := "DFS " + suffix := "" + switch collector { + case "connection": + suffix = "Replication Connections" + case "folder": + suffix = "Replicated Folders" + case "volume": + suffix = "Replication Service Volumes" + } + return (prefix + suffix) +} + +// NewDFSRCollector is registered +func NewDFSRCollector() (Collector, error) { + const subsystem = "dfsr" + + enabled := dfsrExpandEnabledSources(*dfsrEnabledCollectors) + perfCounters := make([]string, 0, len(enabled)) + for _, c := range enabled { + perfCounters = append(perfCounters, dfsrGetPerfObjectName(c)) + } + addPerfCounterDependencies(subsystem, perfCounters) + + dfsrCollector := DFSRCollector{ + // meta + dfsrScrapeDurationDesc: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "collector_duration_seconds"), + "windows_exporter: Duration of an dfsr child collection.", + []string{"collector"}, + nil, + ), + dfsrScrapeSuccessDesc: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "collector_success"), + "windows_exporter: Whether a dfsr child collector was successful.", + []string{"collector"}, + nil, + ), + + // Connection + ConnectionBandwidthSavingsUsingDFSReplicationTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "bandwidth_savings_using_dfs_replication_total"), "Total amount of bandwidth savings using DFS Replication for this connection, in bytes", []string{"name"}, nil, ), - BytesReceivedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "bytes_received_total"), + ConnectionBytesReceivedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "bytes_received_total"), "Total bytes received for connection", []string{"name"}, nil, ), - CompressedSizeOfFilesReceivedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "compressed_size_of_files_received_total"), + ConnectionCompressedSizeOfFilesReceivedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "compressed_size_of_files_received_total"), "", []string{"name"}, nil, ), - FilesReceivedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "files_received_total"), + ConnectionFilesReceivedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "files_received_total"), "Total number of files receieved for connection", []string{"name"}, nil, ), - RDCBytesReceivedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "rdc_bytes_received_total"), + ConnectionRDCBytesReceivedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "rdc_bytes_received_total"), "", []string{"name"}, nil, ), - RDCCompressedSizeOfFilesReceivedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "rdc_compressed_size_of_files_received_total"), + ConnectionRDCCompressedSizeOfFilesReceivedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "rdc_compressed_size_of_files_received_total"), "", []string{"name"}, nil, ), - RDCNumberofFilesReceivedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "rdc_number_of_files_received_total"), + ConnectionRDCNumberofFilesReceivedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "rdc_number_of_files_received_total"), "", []string{"name"}, nil, ), - RDCSizeOfFilesReceivedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "rdc_size_of_files_received_total"), + ConnectionRDCSizeOfFilesReceivedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "rdc_size_of_files_received_total"), "", []string{"name"}, nil, ), - SizeOfFilesReceivedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "size_of_files_received_total"), + ConnectionSizeOfFilesReceivedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "size_of_files_received_total"), "", []string{"name"}, nil, ), - }, nil + + // Folder + FolderBandwidthSavingsUsingDFSReplicationTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "bandwidth_savings_using_dfs_replication_total"), + "", + []string{"name"}, + nil, + ), + + FolderCompressedSizeOfFilesReceivedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "compressed_size_of_files_received_total"), + "", + []string{"name"}, + nil, + ), + + FolderConflictBytesCleanedupTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "conflict_bytes_cleaned_up_total"), + "", + []string{"name"}, + nil, + ), + + FolderConflictBytesGeneratedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "conflict_bytes_generated_total"), + "", + []string{"name"}, + nil, + ), + + FolderConflictFilesCleanedUpTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "conflict_files_cleaned_up_total"), + "", + []string{"name"}, + nil, + ), + + FolderConflictFilesGeneratedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "conflict_files_generated_total"), + "", + []string{"name"}, + nil, + ), + + FolderConflictFolderCleanupsCompletedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "conflict_folder_cleanups_total"), + "", + []string{"name"}, + nil, + ), + + FolderConflictSpaceInUse: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "conflict_space_in_use"), + "", + []string{"name"}, + nil, + ), + + FolderDeletedSpaceInUse: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "deleted_space_in_use"), + "", + []string{"name"}, + nil, + ), + + FolderDeletedBytesCleanedUpTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "deleted_bytes_cleaned_up_total"), + "", + []string{"name"}, + nil, + ), + + FolderDeletedBytesGeneratedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "deleted_bytes_generated_total"), + "", + []string{"name"}, + nil, + ), + + FolderDeletedFilesCleanedUpTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "deleted_files_cleaned_up_total"), + "", + []string{"name"}, + nil, + ), + + FolderDeletedFilesGeneratedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "deleted_files_generated_total"), + "", + []string{"name"}, + nil, + ), + + FolderFileInstallsRetriedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "file_installs_retried_total"), + "", + []string{"name"}, + nil, + ), + + FolderFileInstallsSucceededTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "file_installs_succeeded_total"), + "", + []string{"name"}, + nil, + ), + + FolderFilesReceivedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "files_received_total"), + "", + []string{"name"}, + nil, + ), + + FolderRDCBytesReceivedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "rdc_bytes_received_total"), + "", + []string{"name"}, + nil, + ), + + FolderRDCCompressedSizeOfFilesReceivedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "rdc_compressed_size_of_files_received_total"), + "", + []string{"name"}, + nil, + ), + + FolderRDCNumberofFilesReceivedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "rdc_number_of_files_received_total"), + "", + []string{"name"}, + nil, + ), + + FolderRDCSizeOfFilesReceivedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "rdc_size_of_files_received_total"), + "", + []string{"name"}, + nil, + ), + + FolderSizeOfFilesReceivedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "size_of_files_received_total"), + "", + []string{"name"}, + nil, + ), + + FolderStagingSpaceInUse: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "staging_space_in_use"), + "", + []string{"name"}, + nil, + ), + + FolderStagingBytesCleanedUpTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "staging_bytes_cleaned_up_total"), + "", + []string{"name"}, + nil, + ), + + FolderStagingBytesGeneratedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "staging_bytes_generated_total"), + "", + []string{"name"}, + nil, + ), + + FolderStagingFilesCleanedUpTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "staging_files_cleaned_up_total"), + "", + []string{"name"}, + nil, + ), + + FolderStagingFilesGeneratedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "staging_files_generated_total"), + "", + []string{"name"}, + nil, + ), + + FolderUpdatesDroppedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "updates_dropped_total"), + "", + []string{"name"}, + nil, + ), + + // Volume + VolumeDatabaseCommitsTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "database_commits_total"), + "Total number of DFSR Volume database commits", + []string{"name"}, + nil, + ), + + VolumeDatabaseLookupsTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "database_lookups_total"), + "Total number of DFSR Volume database lookups", + []string{"name"}, + nil, + ), + + VolumeUSNJournalUnreadPercentage: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "usn_journal_unread_percentage"), + "Percentage of DFSR Volume USN journal records that are unread", + []string{"name"}, + nil, + ), + + VolumeUSNJournalRecordsAcceptedTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "usn_journal_records_accepted_total"), + "Total number of USN journal records accepted", + []string{"name"}, + nil, + ), + + VolumeUSNJournalRecordsReadTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "usn_journal_records_read_total"), + "Total number of DFSR Volume USN journal records read", + []string{"name"}, + nil, + ), + } + + dfsrCollector.dfsrChildCollectors = dfsrCollector.getDFSRChildCollectors() + + return &dfsrCollector, nil } -// Collect sends the metric values for each metric -// to the provided prometheus Metric channel. -func (c *DFSRConnectionCollector) Collect(ctx *ScrapeContext, ch chan<- prometheus.Metric) error { - if desc, err := c.collect(ctx, ch); err != nil { - log.Error("failed collecting dfsr_connection metrics:", desc, err) - return err +// Maps child collectors names to their relevant collection function, +// for use in DFSRCollector.Collect() +func (c *DFSRCollector) getDFSRChildCollectors() dfsrCollectorMap { + dfsrCollectors := make(dfsrCollectorMap) + dfsrCollectors["connection"] = c.collectConnection + dfsrCollectors["folder"] = c.collectFolder + dfsrCollectors["volume"] = c.collectVolume + + return dfsrCollectors +} + +// Collect implements the Collector interface. +// Sends metric values for each metric to the provided prometheus Metric channel. +func (c *DFSRCollector) Collect(ctx *ScrapeContext, ch chan<- prometheus.Metric) error { + wg := sync.WaitGroup{} + + for name, function := range c.dfsrChildCollectors { + wg.Add(1) + go c.execute(ctx, name, function, ch, &wg) + + } + wg.Wait() + + if c.dfsrChildCollectorFailure > 0 { + return errors.New("at least one child collector failed") } return nil } +// Child-specific functions are provided to this function and executed concurrently. +// Child collector metrics & results are reported. +func (c *DFSRCollector) execute(ctx *ScrapeContext, name string, fn dfsrCollectorFunc, ch chan<- prometheus.Metric, wg *sync.WaitGroup) { + defer wg.Done() + + begin := time.Now() + // Child collector function called here, sends metric data back through channel + _, err := fn(ctx, ch) + duration := time.Since(begin) + var success float64 + + if err != nil { + log.Errorf("dfsr class collector %s failed after %fs: %s", name, duration.Seconds(), err) + success = 0 + c.dfsrChildCollectorFailure++ + } else { + log.Debugf("dfsr class collector %s succeeded after %fs.", name, duration.Seconds()) + success = 1 + } + + ch <- prometheus.MustNewConstMetric( + c.dfsrScrapeDurationDesc, + prometheus.GaugeValue, + duration.Seconds(), + name, + ) + ch <- prometheus.MustNewConstMetric( + c.dfsrScrapeSuccessDesc, + prometheus.GaugeValue, + success, + name, + ) +} + // Perflib: "DFS Replication Service Connections" type PerflibDFSRConnection struct { Name string @@ -123,7 +520,7 @@ type PerflibDFSRConnection struct { SizeOfFilesReceivedTotal float64 `perflib:"Size of Files Received"` } -func (c *DFSRConnectionCollector) collect(ctx *ScrapeContext, ch chan<- prometheus.Metric) (*prometheus.Desc, error) { +func (c *DFSRCollector) collectConnection(ctx *ScrapeContext, ch chan<- prometheus.Metric) (*prometheus.Desc, error) { var dst []PerflibDFSRConnection if err := unmarshalObject(ctx.perfObjects["DFS Replication Connections"], &dst); err != nil { return nil, err @@ -131,63 +528,63 @@ func (c *DFSRConnectionCollector) collect(ctx *ScrapeContext, ch chan<- promethe for _, connection := range dst { ch <- prometheus.MustNewConstMetric( - c.BandwidthSavingsUsingDFSReplicationTotal, + c.ConnectionBandwidthSavingsUsingDFSReplicationTotal, prometheus.CounterValue, connection.BandwidthSavingsUsingDFSReplicationTotal, connection.Name, ) ch <- prometheus.MustNewConstMetric( - c.BytesReceivedTotal, + c.ConnectionBytesReceivedTotal, prometheus.CounterValue, connection.BytesReceivedTotal, connection.Name, ) ch <- prometheus.MustNewConstMetric( - c.CompressedSizeOfFilesReceivedTotal, + c.ConnectionCompressedSizeOfFilesReceivedTotal, prometheus.CounterValue, connection.CompressedSizeOfFilesReceivedTotal, connection.Name, ) ch <- prometheus.MustNewConstMetric( - c.FilesReceivedTotal, + c.ConnectionFilesReceivedTotal, prometheus.CounterValue, connection.FilesReceivedTotal, connection.Name, ) ch <- prometheus.MustNewConstMetric( - c.RDCBytesReceivedTotal, + c.ConnectionRDCBytesReceivedTotal, prometheus.CounterValue, connection.RDCBytesReceivedTotal, connection.Name, ) ch <- prometheus.MustNewConstMetric( - c.RDCCompressedSizeOfFilesReceivedTotal, + c.ConnectionRDCCompressedSizeOfFilesReceivedTotal, prometheus.CounterValue, connection.RDCCompressedSizeOfFilesReceivedTotal, connection.Name, ) ch <- prometheus.MustNewConstMetric( - c.RDCSizeOfFilesReceivedTotal, + c.ConnectionRDCSizeOfFilesReceivedTotal, prometheus.CounterValue, connection.RDCSizeOfFilesReceivedTotal, connection.Name, ) ch <- prometheus.MustNewConstMetric( - c.RDCNumberofFilesReceivedTotal, + c.ConnectionRDCNumberofFilesReceivedTotal, prometheus.CounterValue, connection.RDCNumberofFilesReceivedTotal, connection.Name, ) ch <- prometheus.MustNewConstMetric( - c.SizeOfFilesReceivedTotal, + c.ConnectionSizeOfFilesReceivedTotal, prometheus.CounterValue, connection.SizeOfFilesReceivedTotal, connection.Name, @@ -195,353 +592,7 @@ func (c *DFSRConnectionCollector) collect(ctx *ScrapeContext, ch chan<- promethe } return nil, nil -} -type DFSRVolumeCollector struct { - DatabaseLookupsTotal *prometheus.Desc - DatabaseCommitsTotal *prometheus.Desc - USNJournalUnreadPercentage *prometheus.Desc - USNJournalRecordsAcceptedTotal *prometheus.Desc - USNJournalRecordsReadTotal *prometheus.Desc -} - -func NewDFSRVolumeCollector() (Collector, error) { - return &DFSRVolumeCollector{ - DatabaseCommitsTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "database_commits_total"), - "Total number of DFSR Volume database commits", - []string{"name"}, - nil, - ), - - DatabaseLookupsTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "database_lookups_total"), - "Total number of DFSR Volume database lookups", - []string{"name"}, - nil, - ), - - USNJournalUnreadPercentage: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "usn_journal_unread_percentage"), - "Percentage of DFSR Volume USN journal records that are unread", - []string{"name"}, - nil, - ), - - USNJournalRecordsAcceptedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "usn_journal_records_accepted_total"), - "Total number of USN journal records accepted", - []string{"name"}, - nil, - ), - - USNJournalRecordsReadTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "usn_journal_records_read_total"), - "Total number of DFSR Volume USN journal records read", - []string{"name"}, - nil, - ), - }, nil -} - -// Collect sends the metric values for each metric -// to the provided prometheus Metric channel. -func (c *DFSRVolumeCollector) Collect(ctx *ScrapeContext, ch chan<- prometheus.Metric) error { - if desc, err := c.collect(ctx, ch); err != nil { - log.Error("failed collecting dfsr_volume metrics:", desc, err) - return err - } - return nil -} - -// Perflib: "DFS Replication Service Volumes" -type PerflibDFSRVolume struct { - Name string - - DatabaseCommitsTotal float64 `perflib:"Database Commits"` - DatabaseLookupsTotal float64 `perflib:"Database Lookups"` - USNJournalRecordsReadTotal float64 `perflib:"USN Journal Records Read"` - USNJournalRecordsAcceptedTotal float64 `perflib:"USN Journal Records Accepted"` - USNJournalUnreadPercentage float64 `perflib:"USN Journal Records Unread Percentage"` -} - -func (c *DFSRVolumeCollector) collect(ctx *ScrapeContext, ch chan<- prometheus.Metric) (*prometheus.Desc, error) { - var dst []PerflibDFSRVolume - if err := unmarshalObject(ctx.perfObjects["DFS Replication Service Volumes"], &dst); err != nil { - return nil, err - } - - for _, volume := range dst { - ch <- prometheus.MustNewConstMetric( - c.DatabaseLookupsTotal, - prometheus.CounterValue, - volume.DatabaseLookupsTotal, - volume.Name, - ) - - ch <- prometheus.MustNewConstMetric( - c.DatabaseCommitsTotal, - prometheus.CounterValue, - volume.DatabaseCommitsTotal, - volume.Name, - ) - - ch <- prometheus.MustNewConstMetric( - c.USNJournalRecordsAcceptedTotal, - prometheus.CounterValue, - volume.USNJournalRecordsAcceptedTotal, - volume.Name, - ) - - ch <- prometheus.MustNewConstMetric( - c.USNJournalRecordsReadTotal, - prometheus.CounterValue, - volume.USNJournalRecordsReadTotal, - volume.Name, - ) - - ch <- prometheus.MustNewConstMetric( - c.USNJournalUnreadPercentage, - prometheus.GaugeValue, - volume.USNJournalUnreadPercentage, - volume.Name, - ) - - } - return nil, nil -} - -type DFSRReplicatedFoldersCollector struct { - BandwidthSavingsUsingDFSReplicationTotal *prometheus.Desc - CompressedSizeOfFilesReceivedTotal *prometheus.Desc - ConflictBytesCleanedupTotal *prometheus.Desc - ConflictBytesGeneratedTotal *prometheus.Desc - ConflictFilesCleanedUpTotal *prometheus.Desc - ConflictFilesGeneratedTotal *prometheus.Desc - ConflictFolderCleanupsCompletedTotal *prometheus.Desc - ConflictSpaceInUse *prometheus.Desc - DeletedSpaceInUse *prometheus.Desc - DeletedBytesCleanedUpTotal *prometheus.Desc - DeletedBytesGeneratedTotal *prometheus.Desc - DeletedFilesCleanedUpTotal *prometheus.Desc - DeletedFilesGeneratedTotal *prometheus.Desc - FileInstallsRetriedTotal *prometheus.Desc - FileInstallsSucceededTotal *prometheus.Desc - FilesReceivedTotal *prometheus.Desc - RDCBytesReceivedTotal *prometheus.Desc - RDCCompressedSizeOfFilesReceivedTotal *prometheus.Desc - RDCNumberofFilesReceivedTotal *prometheus.Desc - RDCSizeOfFilesReceivedTotal *prometheus.Desc - SizeOfFilesReceivedTotal *prometheus.Desc - StagingSpaceInUse *prometheus.Desc - StagingBytesCleanedUpTotal *prometheus.Desc - StagingBytesGeneratedTotal *prometheus.Desc - StagingFilesCleanedUpTotal *prometheus.Desc - StagingFilesGeneratedTotal *prometheus.Desc - UpdatesDroppedTotal *prometheus.Desc -} - -func NewDFSRReplicatedFoldersCollector() (Collector, error) { - return &DFSRReplicatedFoldersCollector{ - BandwidthSavingsUsingDFSReplicationTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "bandwidth_savings_using_dfs_replication_total"), - "", - []string{"name"}, - nil, - ), - - CompressedSizeOfFilesReceivedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "compressed_size_of_files_received_total"), - "", - []string{"name"}, - nil, - ), - - ConflictBytesCleanedupTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "conflict_bytes_cleaned_up_total"), - "", - []string{"name"}, - nil, - ), - - ConflictBytesGeneratedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "conflict_bytes_generated_total"), - "", - []string{"name"}, - nil, - ), - - ConflictFilesCleanedUpTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "conflict_files_cleaned_up_total"), - "", - []string{"name"}, - nil, - ), - - ConflictFilesGeneratedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "conflict_files_generated_total"), - "", - []string{"name"}, - nil, - ), - - ConflictFolderCleanupsCompletedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "conflict_folder_cleanups_total"), - "", - []string{"name"}, - nil, - ), - - ConflictSpaceInUse: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "conflict_space_in_use"), - "", - []string{"name"}, - nil, - ), - - DeletedSpaceInUse: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "deleted_space_in_use"), - "", - []string{"name"}, - nil, - ), - - DeletedBytesCleanedUpTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "deleted_bytes_cleaned_up_total"), - "", - []string{"name"}, - nil, - ), - - DeletedBytesGeneratedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "deleted_bytes_generated_total"), - "", - []string{"name"}, - nil, - ), - - DeletedFilesCleanedUpTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "deleted_files_cleaned_up_total"), - "", - []string{"name"}, - nil, - ), - - DeletedFilesGeneratedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "deleted_files_generated_total"), - "", - []string{"name"}, - nil, - ), - - FileInstallsRetriedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "file_installs_retried_total"), - "", - []string{"name"}, - nil, - ), - - FileInstallsSucceededTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "file_installs_succeeded_total"), - "", - []string{"name"}, - nil, - ), - - FilesReceivedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "files_received_total"), - "", - []string{"name"}, - nil, - ), - - RDCBytesReceivedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "rdc_bytes_received_total"), - "", - []string{"name"}, - nil, - ), - - RDCCompressedSizeOfFilesReceivedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "rdc_compressed_size_of_files_received_total"), - "", - []string{"name"}, - nil, - ), - - RDCNumberofFilesReceivedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "rdc_number_of_files_received_total"), - "", - []string{"name"}, - nil, - ), - - RDCSizeOfFilesReceivedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "rdc_size_of_files_received_total"), - "", - []string{"name"}, - nil, - ), - - SizeOfFilesReceivedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "size_of_files_received_total"), - "", - []string{"name"}, - nil, - ), - - StagingSpaceInUse: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "staging_space_in_use"), - "", - []string{"name"}, - nil, - ), - - StagingBytesCleanedUpTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "staging_bytes_cleaned_up_total"), - "", - []string{"name"}, - nil, - ), - - StagingBytesGeneratedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "staging_bytes_generated_total"), - "", - []string{"name"}, - nil, - ), - - StagingFilesCleanedUpTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "staging_files_cleaned_up_total"), - "", - []string{"name"}, - nil, - ), - - StagingFilesGeneratedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "staging_files_generated_total"), - "", - []string{"name"}, - nil, - ), - - UpdatesDroppedTotal: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, dfsrVolumeSubsystem, "updates_dropped_total"), - "", - []string{"name"}, - nil, - ), - }, nil -} - -// Collect sends the metric values for each metric -// to the provided prometheus Metric channel. -func (c *DFSRReplicatedFoldersCollector) Collect(ctx *ScrapeContext, ch chan<- prometheus.Metric) error { - if desc, err := c.collect(ctx, ch); err != nil { - log.Error("failed collecting dfsr_folder metrics:", desc, err) - return err - } - return nil } // Perflib: "DFS Replicated Folder" @@ -577,7 +628,7 @@ type PerflibDFSRFolder struct { UpdatesDroppedTotal float64 `perflib:"Updates Dropped"` } -func (c *DFSRReplicatedFoldersCollector) collect(ctx *ScrapeContext, ch chan<- prometheus.Metric) (*prometheus.Desc, error) { +func (c *DFSRCollector) collectFolder(ctx *ScrapeContext, ch chan<- prometheus.Metric) (*prometheus.Desc, error) { var dst []PerflibDFSRFolder if err := unmarshalObject(ctx.perfObjects["DFS Replicated Folders"], &dst); err != nil { return nil, err @@ -585,189 +636,189 @@ func (c *DFSRReplicatedFoldersCollector) collect(ctx *ScrapeContext, ch chan<- p for _, folder := range dst { ch <- prometheus.MustNewConstMetric( - c.BandwidthSavingsUsingDFSReplicationTotal, + c.FolderBandwidthSavingsUsingDFSReplicationTotal, prometheus.CounterValue, folder.BandwidthSavingsUsingDFSReplicationTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.CompressedSizeOfFilesReceivedTotal, + c.FolderCompressedSizeOfFilesReceivedTotal, prometheus.CounterValue, folder.CompressedSizeOfFilesReceivedTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.ConflictBytesCleanedupTotal, + c.FolderConflictBytesCleanedupTotal, prometheus.CounterValue, folder.ConflictBytesCleanedupTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.ConflictBytesGeneratedTotal, + c.FolderConflictBytesGeneratedTotal, prometheus.CounterValue, folder.ConflictBytesGeneratedTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.ConflictFilesCleanedUpTotal, + c.FolderConflictFilesCleanedUpTotal, prometheus.CounterValue, folder.ConflictFilesCleanedUpTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.ConflictFilesGeneratedTotal, + c.FolderConflictFilesGeneratedTotal, prometheus.CounterValue, folder.ConflictFilesGeneratedTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.ConflictFolderCleanupsCompletedTotal, + c.FolderConflictFolderCleanupsCompletedTotal, prometheus.CounterValue, folder.ConflictFolderCleanupsCompletedTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.ConflictSpaceInUse, + c.FolderConflictSpaceInUse, prometheus.GaugeValue, folder.ConflictSpaceInUse, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.DeletedSpaceInUse, + c.FolderDeletedSpaceInUse, prometheus.GaugeValue, folder.DeletedSpaceInUse, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.DeletedBytesCleanedUpTotal, + c.FolderDeletedBytesCleanedUpTotal, prometheus.CounterValue, folder.DeletedBytesCleanedUpTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.DeletedBytesGeneratedTotal, + c.FolderDeletedBytesGeneratedTotal, prometheus.CounterValue, folder.DeletedBytesGeneratedTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.DeletedFilesCleanedUpTotal, + c.FolderDeletedFilesCleanedUpTotal, prometheus.CounterValue, folder.DeletedFilesCleanedUpTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.DeletedFilesGeneratedTotal, + c.FolderDeletedFilesGeneratedTotal, prometheus.CounterValue, folder.DeletedFilesGeneratedTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.FileInstallsRetriedTotal, + c.FolderFileInstallsRetriedTotal, prometheus.CounterValue, folder.FileInstallsRetriedTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.FileInstallsSucceededTotal, + c.FolderFileInstallsSucceededTotal, prometheus.CounterValue, folder.FileInstallsSucceededTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.FilesReceivedTotal, + c.FolderFilesReceivedTotal, prometheus.CounterValue, folder.FilesReceivedTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.RDCBytesReceivedTotal, + c.FolderRDCBytesReceivedTotal, prometheus.CounterValue, folder.RDCBytesReceivedTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.RDCCompressedSizeOfFilesReceivedTotal, + c.FolderRDCCompressedSizeOfFilesReceivedTotal, prometheus.CounterValue, folder.RDCCompressedSizeOfFilesReceivedTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.RDCNumberofFilesReceivedTotal, + c.FolderRDCNumberofFilesReceivedTotal, prometheus.CounterValue, folder.RDCNumberofFilesReceivedTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.RDCSizeOfFilesReceivedTotal, + c.FolderRDCSizeOfFilesReceivedTotal, prometheus.CounterValue, folder.RDCSizeOfFilesReceivedTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.SizeOfFilesReceivedTotal, + c.FolderSizeOfFilesReceivedTotal, prometheus.CounterValue, folder.SizeOfFilesReceivedTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.StagingSpaceInUse, + c.FolderStagingSpaceInUse, prometheus.GaugeValue, folder.StagingSpaceInUse, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.StagingBytesCleanedUpTotal, + c.FolderStagingBytesCleanedUpTotal, prometheus.CounterValue, folder.StagingBytesCleanedUpTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.StagingBytesGeneratedTotal, + c.FolderStagingBytesGeneratedTotal, prometheus.CounterValue, folder.StagingBytesGeneratedTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.StagingFilesCleanedUpTotal, + c.FolderStagingFilesCleanedUpTotal, prometheus.CounterValue, folder.StagingFilesCleanedUpTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.StagingFilesGeneratedTotal, + c.FolderStagingFilesGeneratedTotal, prometheus.CounterValue, folder.StagingFilesGeneratedTotal, folder.Name, ) ch <- prometheus.MustNewConstMetric( - c.UpdatesDroppedTotal, + c.FolderUpdatesDroppedTotal, prometheus.CounterValue, folder.UpdatesDroppedTotal, folder.Name, @@ -775,3 +826,60 @@ func (c *DFSRReplicatedFoldersCollector) collect(ctx *ScrapeContext, ch chan<- p } return nil, nil } + +// Perflib: "DFS Replication Service Volumes" +type PerflibDFSRVolume struct { + Name string + + DatabaseCommitsTotal float64 `perflib:"Database Commits"` + DatabaseLookupsTotal float64 `perflib:"Database Lookups"` + USNJournalRecordsReadTotal float64 `perflib:"USN Journal Records Read"` + USNJournalRecordsAcceptedTotal float64 `perflib:"USN Journal Records Accepted"` + USNJournalUnreadPercentage float64 `perflib:"USN Journal Records Unread Percentage"` +} + +func (c *DFSRCollector) collectVolume(ctx *ScrapeContext, ch chan<- prometheus.Metric) (*prometheus.Desc, error) { + var dst []PerflibDFSRVolume + if err := unmarshalObject(ctx.perfObjects["DFS Replication Service Volumes"], &dst); err != nil { + return nil, err + } + + for _, volume := range dst { + ch <- prometheus.MustNewConstMetric( + c.VolumeDatabaseLookupsTotal, + prometheus.CounterValue, + volume.DatabaseLookupsTotal, + volume.Name, + ) + + ch <- prometheus.MustNewConstMetric( + c.VolumeDatabaseCommitsTotal, + prometheus.CounterValue, + volume.DatabaseCommitsTotal, + volume.Name, + ) + + ch <- prometheus.MustNewConstMetric( + c.VolumeUSNJournalRecordsAcceptedTotal, + prometheus.CounterValue, + volume.USNJournalRecordsAcceptedTotal, + volume.Name, + ) + + ch <- prometheus.MustNewConstMetric( + c.VolumeUSNJournalRecordsReadTotal, + prometheus.CounterValue, + volume.USNJournalRecordsReadTotal, + volume.Name, + ) + + ch <- prometheus.MustNewConstMetric( + c.VolumeUSNJournalUnreadPercentage, + prometheus.GaugeValue, + volume.USNJournalUnreadPercentage, + volume.Name, + ) + + } + return nil, nil +} diff --git a/docs/collector.dfsr.md b/docs/collector.dfsr.md index 01faef70..9369048d 100644 --- a/docs/collector.dfsr.md +++ b/docs/collector.dfsr.md @@ -1,66 +1,71 @@ -# dfsr collectors +# dfsr collector -The dfsr collectors expose metrics for [DFSR](https://docs.microsoft.com/en-us/windows-server/storage/dfs-replication/dfsr-overview). +The dfsr collector exposes metrics for [DFSR](https://docs.microsoft.com/en-us/windows-server/storage/dfs-replication/dfsr-overview). ||| -|- -Metric name prefix | `dfsr_connection`, `dfsr_folder`, `dfsr_volume` +Metric name prefix | `dfsr` Data source | Perflib Enabled by default? | No ## Flags -None +### `--collectors.dfsr.sources-enabled` + +Comma-separated list of DFSR Perflib sources to use. Supported values are `connection`, `folder` and `volume`. +All sources are enabled by default ## Metrics Name | Description | Type | Labels -----|-------------|------|------- -`dfsr_connection_bandwidth_savings_using_dfs_replication_total` | | counter | None -`dfsr_connection_bytes_received_total` | | counter | None -`dfsr_connection_compressed_size_of_files_received_total` | | counter | None -`dfsr_connection_files_received_total` | | counter | None -`dfsr_connection_rdc_bytes_received_total` | | counter | None -`dfsr_connection_rdc_compressed_size_of_files_received_total` | | counter | None -`dfsr_connection_rdc_number_of_files_received_total` | | counter | None -`dfsr_connection_rdc_size_of_files_received_total` | | counter | None -`dfsr_connection_size_of_files_received_total` | | counter | None -`dfsr_folder_bandwidth_savings_using_dfs_replication_total` | | counter | None -`dfsr_folder_compressed_size_of_files_received_total` | | counter | None -`dfsr_folder_conflict_bytes_cleaned_up_total` | | counter | None -`dfsr_folder_conflict_bytes_generated_total` | | counter | None -`dfsr_folder_conflict_files_cleaned_up_total` | | counter | None -`dfsr_folder_conflict_files_generated_total` | | counter | None -`dfsr_folder_conflict_folder_cleanups_total` | | counter | None -`dfsr_folder_conflict_space_in_use` | | gauge | None -`dfsr_folder_deleted_space_in_use` | | gauge | None -`dfsr_folder_deleted_bytes_cleaned_up_total` | | counter | None -`dfsr_folder_deleted_bytes_generated_total` | | counter | None -`dfsr_folder_deleted_files_cleaned_up_total` | | counter | None -`dfsr_folder_deleted_files_generated_total` | | counter | None -`dfsr_folder_file_installs_retried_total` | | counter | None -`dfsr_folder_file_installs_succeeded_total` | | counter | None -`dfsr_folder_files_received_total` | | counter | None -`dfsr_folder_rdc_bytes_received_total` | | counter | None -`dfsr_folder_rdc_compressed_size_of_files_received_total` | | counter | None -`dfsr_folder_rdc_number_of_files_received_total` | | counter | None -`dfsr_folder_rdc_size_of_files_received_total` | | counter | None -`dfsr_folder_size_of_files_received_total` | | counter | None -`dfsr_folder_staging_space_in_use` | | gauge | None -`dfsr_folder_staging_bytes_cleaned_up_total` | | counter | None -`dfsr_folder_staging_bytes_generated_total` | | counter | None -`dfsr_folder_staging_files_cleaned_up_total` | | counter | None -`dfsr_folder_staging_files_generated_total` | | counter | None -`dfsr_folder_updates_dropped_total` | | counter | None -`dfsr_volume_bandwidth_savings_using_dfs_replication_total` | | counter | None -`dfsr_volume_bytes_received_total` | | counter | None -`dfsr_volume_compressed_size_of_files_received_total` | | counter | None -`dfsr_volume_files_received_total` | | counter | None -`dfsr_volume_rdc_bytes_received_total` | | counter | None -`dfsr_volume_rdc_compressed_size_of_files_received_total` | | counter | None -`dfsr_volume_rdc_number_of_files_received_total` | | counter | None -`dfsr_volume_rdc_size_of_files_received_total` | | counter | None -`dfsr_volume_size_of_files_received_total` | | counter | None +`windows_dfsr_collector_duration_seconds` | The time taken for each sub-collector to return | gauge | collector +`windows_dfsr_collector_success` | 1 if sub-collector succeeded, 0 otherwise | gauge | collector +`windows_dfsr_connection_bandwidth_savings_using_dfs_replication_total` | | counter | name +`windows_dfsr_connection_bytes_received_total` | | counter | name +`windows_dfsr_connection_compressed_size_of_files_received_total` | | counter | name +`windows_dfsr_connection_files_received_total` | | counter | name +`windows_dfsr_connection_rdc_bytes_received_total` | | counter | name +`windows_dfsr_connection_rdc_compressed_size_of_files_received_total` | | counter | name +`windows_dfsr_connection_rdc_number_of_files_received_total` | | counter | name +`windows_dfsr_connection_rdc_size_of_files_received_total` | | counter | name +`windows_dfsr_connection_size_of_files_received_total` | | counter | name +`windows_dfsr_folder_bandwidth_savings_using_dfs_replication_total` | | counter | name +`windows_dfsr_folder_compressed_size_of_files_received_total` | | counter | name +`windows_dfsr_folder_conflict_bytes_cleaned_up_total` | | counter | name +`windows_dfsr_folder_conflict_bytes_generated_total` | | counter | name +`windows_dfsr_folder_conflict_files_cleaned_up_total` | | counter | name +`windows_dfsr_folder_conflict_files_generated_total` | | counter | name +`windows_dfsr_folder_conflict_folder_cleanups_total` | | counter | name +`windows_dfsr_folder_conflict_space_in_use` | | gauge | name +`windows_dfsr_folder_deleted_space_in_use` | | gauge | name +`windows_dfsr_folder_deleted_bytes_cleaned_up_total` | | counter | name +`windows_dfsr_folder_deleted_bytes_generated_total` | | counter | name +`windows_dfsr_folder_deleted_files_cleaned_up_total` | | counter | name +`windows_dfsr_folder_deleted_files_generated_total` | | counter | name +`windows_dfsr_folder_file_installs_retried_total` | | counter | name +`windows_dfsr_folder_file_installs_succeeded_total` | | counter | name +`windows_dfsr_folder_files_received_total` | | counter | name +`windows_dfsr_folder_rdc_bytes_received_total` | | counter | name +`windows_dfsr_folder_rdc_compressed_size_of_files_received_total` | | counter | name +`windows_dfsr_folder_rdc_number_of_files_received_total` | | counter | name +`windows_dfsr_folder_rdc_size_of_files_received_total` | | counter | name +`windows_dfsr_folder_size_of_files_received_total` | | counter | name +`windows_dfsr_folder_staging_space_in_use` | | gauge | name +`windows_dfsr_folder_staging_bytes_cleaned_up_total` | | counter | name +`windows_dfsr_folder_staging_bytes_generated_total` | | counter | name +`windows_dfsr_folder_staging_files_cleaned_up_total` | | counter | name +`windows_dfsr_folder_staging_files_generated_total` | | counter | name +`windows_dfsr_folder_updates_dropped_total` | | counter | name +`windows_dfsr_volume_bandwidth_savings_using_dfs_replication_total` | | counter | name +`windows_dfsr_volume_bytes_received_total` | | counter | name +`windows_dfsr_volume_compressed_size_of_files_received_total` | | counter | name +`windows_dfsr_volume_files_received_total` | | counter | name +`windows_dfsr_volume_rdc_bytes_received_total` | | counter | name +`windows_dfsr_volume_rdc_compressed_size_of_files_received_total` | | counter | name +`windows_dfsr_volume_rdc_number_of_files_received_total` | | counter | name +`windows_dfsr_volume_rdc_size_of_files_received_total` | | counter | name +`windows_dfsr_volume_size_of_files_received_total` | | counter | name ### Example metric _This collector does not yet have explained examples, we would appreciate your help adding them!_