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 }