master
go 250 lines 6.76 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package scaleio
4
5 import "github.com/netdata/netdata/go/plugins/plugin/go.d/collector/scaleio/client"
6
7 func (c *Collector) 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 }