github.com/netdata/go.d.plugin@v0.58.1/modules/scaleio/collect_system.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package scaleio
     4  
     5  import "github.com/netdata/go.d.plugin/modules/scaleio/client"
     6  
     7  func (ScaleIO) collectSystem(ss client.SystemStatistics) systemMetrics {
     8  	var sm systemMetrics
     9  	collectSystemCapacity(&sm, ss)
    10  	collectSystemWorkload(&sm, ss)
    11  	collectSystemRebalance(&sm, ss)
    12  	collectSystemRebuild(&sm, ss)
    13  	collectSystemComponents(&sm, ss)
    14  	return sm
    15  }
    16  
    17  func collectSystemCapacity(sm *systemMetrics, ss client.SystemStatistics) {
    18  	collectCapacity(&sm.Capacity, ss.CapacityStatistics)
    19  }
    20  
    21  func collectCapacity(m *capacity, ss client.CapacityStatistics) {
    22  	// Health
    23  	m.Protected = ss.ProtectedCapacityInKb
    24  	m.InMaintenance = ss.InMaintenanceCapacityInKb
    25  	m.Degraded = sum(ss.DegradedFailedCapacityInKb, ss.DegradedHealthyCapacityInKb)
    26  	m.Failed = ss.FailedCapacityInKb
    27  	m.UnreachableUnused = ss.UnreachableUnusedCapacityInKb
    28  
    29  	// Capacity
    30  	m.MaxCapacity = ss.MaxCapacityInKb
    31  	m.ThickInUse = ss.ThickCapacityInUseInKb
    32  	m.ThinInUse = ss.ThinCapacityInUseInKb
    33  	m.Snapshot = ss.SnapCapacityInUseOccupiedInKb
    34  	m.Spare = ss.SpareCapacityInKb
    35  	m.Decreased = sum(ss.MaxCapacityInKb, -ss.CapacityLimitInKb) // TODO: probably wrong
    36  	// Note: can't use 'UnusedCapacityInKb' directly, dashboard shows calculated value
    37  	used := sum(
    38  		ss.ProtectedCapacityInKb,
    39  		ss.InMaintenanceCapacityInKb,
    40  		m.Decreased,
    41  		m.Degraded,
    42  		ss.FailedCapacityInKb,
    43  		ss.SpareCapacityInKb,
    44  		ss.UnreachableUnusedCapacityInKb,
    45  		ss.SnapCapacityInUseOccupiedInKb,
    46  	)
    47  	m.Unused = sum(ss.MaxCapacityInKb, -used)
    48  
    49  	// Other
    50  	m.InUse = ss.CapacityInUseInKb
    51  	m.AvailableForVolumeAllocation = ss.CapacityAvailableForVolumeAllocationInKb
    52  }
    53  
    54  func collectSystemComponents(sm *systemMetrics, ss client.SystemStatistics) {
    55  	m := &sm.Components
    56  
    57  	m.Devices = ss.NumOfDevices
    58  	m.FaultSets = ss.NumOfFaultSets
    59  	m.MappedToAllVolumes = ss.NumOfMappedToAllVolumes
    60  	m.ProtectionDomains = ss.NumOfProtectionDomains
    61  	m.RfcacheDevices = ss.NumOfRfcacheDevices
    62  	m.Sdc = ss.NumOfSdc
    63  	m.Sds = ss.NumOfSds
    64  	m.Snapshots = ss.NumOfSnapshots
    65  	m.StoragePools = ss.NumOfStoragePools
    66  	m.VTrees = ss.NumOfVtrees
    67  	m.Volumes = ss.NumOfVolumes
    68  	m.ThickBaseVolumes = ss.NumOfThickBaseVolumes
    69  	m.ThinBaseVolumes = ss.NumOfThinBaseVolumes
    70  	m.UnmappedVolumes = ss.NumOfUnmappedVolumes
    71  	m.MappedVolumes = sum(ss.NumOfVolumes, -ss.NumOfUnmappedVolumes)
    72  }
    73  
    74  func collectSystemWorkload(sm *systemMetrics, ss client.SystemStatistics) {
    75  	m := &sm.Workload
    76  
    77  	m.Total.BW.set(
    78  		calcBW(ss.TotalReadBwc),
    79  		calcBW(ss.TotalWriteBwc),
    80  	)
    81  	m.Frontend.BW.set(
    82  		calcBW(ss.UserDataReadBwc),
    83  		calcBW(ss.UserDataWriteBwc),
    84  	)
    85  	m.Backend.Primary.BW.set(
    86  		calcBW(ss.PrimaryReadBwc),
    87  		calcBW(ss.PrimaryWriteBwc),
    88  	)
    89  	m.Backend.Secondary.BW.set(
    90  		calcBW(ss.SecondaryReadBwc),
    91  		calcBW(ss.SecondaryWriteBwc),
    92  	)
    93  	m.Backend.Total.BW.set(
    94  		sumFloat(m.Backend.Primary.BW.Read, m.Backend.Secondary.BW.Read),
    95  		sumFloat(m.Backend.Primary.BW.Write, m.Backend.Secondary.BW.Write),
    96  	)
    97  
    98  	m.Total.IOPS.set(
    99  		calcIOPS(ss.TotalReadBwc),
   100  		calcIOPS(ss.TotalWriteBwc),
   101  	)
   102  	m.Frontend.IOPS.set(
   103  		calcIOPS(ss.UserDataReadBwc),
   104  		calcIOPS(ss.UserDataWriteBwc),
   105  	)
   106  	m.Backend.Primary.IOPS.set(
   107  		calcIOPS(ss.PrimaryReadBwc),
   108  		calcIOPS(ss.PrimaryWriteBwc),
   109  	)
   110  	m.Backend.Secondary.IOPS.set(
   111  		calcIOPS(ss.SecondaryReadBwc),
   112  		calcIOPS(ss.SecondaryWriteBwc),
   113  	)
   114  	m.Backend.Total.IOPS.set(
   115  		sumFloat(m.Backend.Primary.IOPS.Read, m.Backend.Secondary.IOPS.Read),
   116  		sumFloat(m.Backend.Primary.IOPS.Write, m.Backend.Secondary.IOPS.Write),
   117  	)
   118  
   119  	m.Total.IOSize.set(
   120  		calcIOSize(ss.TotalReadBwc),
   121  		calcIOSize(ss.TotalWriteBwc),
   122  	)
   123  	m.Frontend.IOSize.set(
   124  		calcIOSize(ss.UserDataReadBwc),
   125  		calcIOSize(ss.UserDataWriteBwc),
   126  	)
   127  	m.Backend.Primary.IOSize.set(
   128  		calcIOSize(ss.PrimaryReadBwc),
   129  		calcIOSize(ss.PrimaryWriteBwc),
   130  	)
   131  	m.Backend.Secondary.IOSize.set(
   132  		calcIOSize(ss.SecondaryReadBwc),
   133  		calcIOSize(ss.SecondaryWriteBwc),
   134  	)
   135  	m.Backend.Total.IOSize.set(
   136  		sumFloat(m.Backend.Primary.IOSize.Read, m.Backend.Secondary.IOSize.Read),
   137  		sumFloat(m.Backend.Primary.IOSize.Write, m.Backend.Secondary.IOSize.Write),
   138  	)
   139  }
   140  
   141  func collectSystemRebuild(sm *systemMetrics, ss client.SystemStatistics) {
   142  	m := &sm.Rebuild
   143  
   144  	m.Forward.BW.set(
   145  		calcBW(ss.FwdRebuildReadBwc),
   146  		calcBW(ss.FwdRebuildWriteBwc),
   147  	)
   148  	m.Backward.BW.set(
   149  		calcBW(ss.BckRebuildReadBwc),
   150  		calcBW(ss.BckRebuildWriteBwc),
   151  	)
   152  	m.Normal.BW.set(
   153  		calcBW(ss.NormRebuildReadBwc),
   154  		calcBW(ss.NormRebuildWriteBwc),
   155  	)
   156  	m.Total.BW.set(
   157  		sumFloat(m.Forward.BW.Read, m.Backward.BW.Read, m.Normal.BW.Read),
   158  		sumFloat(m.Forward.BW.Write, m.Backward.BW.Write, m.Normal.BW.Write),
   159  	)
   160  
   161  	m.Forward.IOPS.set(
   162  		calcIOPS(ss.FwdRebuildReadBwc),
   163  		calcIOPS(ss.FwdRebuildWriteBwc),
   164  	)
   165  	m.Backward.IOPS.set(
   166  		calcIOPS(ss.BckRebuildReadBwc),
   167  		calcIOPS(ss.BckRebuildWriteBwc),
   168  	)
   169  	m.Normal.IOPS.set(
   170  		calcIOPS(ss.NormRebuildReadBwc),
   171  		calcIOPS(ss.NormRebuildWriteBwc),
   172  	)
   173  	m.Total.IOPS.set(
   174  		sumFloat(m.Forward.IOPS.Read, m.Backward.IOPS.Read, m.Normal.IOPS.Read),
   175  		sumFloat(m.Forward.IOPS.Write, m.Backward.IOPS.Write, m.Normal.IOPS.Write),
   176  	)
   177  
   178  	m.Forward.IOSize.set(
   179  		calcIOSize(ss.FwdRebuildReadBwc),
   180  		calcIOSize(ss.FwdRebuildWriteBwc),
   181  	)
   182  	m.Backward.IOSize.set(
   183  		calcIOSize(ss.BckRebuildReadBwc),
   184  		calcIOSize(ss.BckRebuildWriteBwc),
   185  	)
   186  	m.Normal.IOSize.set(
   187  		calcIOSize(ss.NormRebuildReadBwc),
   188  		calcIOSize(ss.NormRebuildWriteBwc),
   189  	)
   190  	m.Total.IOSize.set(
   191  		sumFloat(m.Forward.IOSize.Read, m.Backward.IOSize.Read, m.Normal.IOSize.Read),
   192  		sumFloat(m.Forward.IOSize.Write, m.Backward.IOSize.Write, m.Normal.IOSize.Write),
   193  	)
   194  
   195  	m.Forward.Pending = ss.PendingFwdRebuildCapacityInKb
   196  	m.Backward.Pending = ss.PendingBckRebuildCapacityInKb
   197  	m.Normal.Pending = ss.PendingNormRebuildCapacityInKb
   198  	m.Total.Pending = sum(m.Forward.Pending, m.Backward.Pending, m.Normal.Pending)
   199  }
   200  
   201  func collectSystemRebalance(sm *systemMetrics, ss client.SystemStatistics) {
   202  	m := &sm.Rebalance
   203  
   204  	m.BW.set(
   205  		calcBW(ss.RebalanceReadBwc),
   206  		calcBW(ss.RebalanceWriteBwc),
   207  	)
   208  
   209  	m.IOPS.set(
   210  		calcIOPS(ss.RebalanceReadBwc),
   211  		calcIOPS(ss.RebalanceWriteBwc),
   212  	)
   213  
   214  	m.IOSize.set(
   215  		calcIOSize(ss.RebalanceReadBwc),
   216  		calcIOSize(ss.RebalanceWriteBwc),
   217  	)
   218  
   219  	m.Pending = ss.PendingRebalanceCapacityInKb
   220  	m.TimeUntilFinish = divFloat(float64(m.Pending), m.BW.ReadWrite)
   221  }
   222  
   223  func calcBW(bwc client.Bwc) float64     { return div(bwc.TotalWeightInKb, bwc.NumSeconds) }
   224  func calcIOPS(bwc client.Bwc) float64   { return div(bwc.NumOccured, bwc.NumSeconds) }
   225  func calcIOSize(bwc client.Bwc) float64 { return div(bwc.TotalWeightInKb, bwc.NumOccured) }
   226  
   227  func sum(a, b int64, others ...int64) (res int64) {
   228  	for _, v := range others {
   229  		res += v
   230  	}
   231  	return res + a + b
   232  }
   233  
   234  func sumFloat(a, b float64, others ...float64) (res float64) {
   235  	for _, v := range others {
   236  		res += v
   237  	}
   238  	return res + a + b
   239  }
   240  
   241  func div(a, b int64) float64 {
   242  	return divFloat(float64(a), float64(b))
   243  }
   244  
   245  func divFloat(a, b float64) float64 {
   246  	if b == 0 {
   247  		return 0
   248  	}
   249  	return a / b
   250  }