master
go 244 lines 9.02 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package powerstore
4
5 import "github.com/netdata/netdata/go/plugins/pkg/metrix"
6
7 type collectorMetrics struct {
8 cluster clusterGauges
9 appliance applianceGauges
10 volume volumeGauges
11 node nodeGauges
12 fcPort fcPortGauges
13 ethPort ethPortGauges
14 fileSystem fileSystemGauges
15 hardware hardwareGauges
16 alerts alertGauges
17 drive driveGauges
18 nas nasGauges
19 replication replicationGauges
20 }
21
22 type clusterGauges struct {
23 spacePhysicalTotal metrix.SnapshotGauge
24 spacePhysicalUsed metrix.SnapshotGauge
25 spaceLogicalProvisioned metrix.SnapshotGauge
26 spaceLogicalUsed metrix.SnapshotGauge
27 spaceDataPhysicalUsed metrix.SnapshotGauge
28 spaceSharedLogicalUsed metrix.SnapshotGauge
29 spaceEfficiencyRatio metrix.SnapshotGauge
30 spaceDataReduction metrix.SnapshotGauge
31 spaceSnapshotSavings metrix.SnapshotGauge
32 spaceThinSavings metrix.SnapshotGauge
33 }
34
35 type perfGaugeVecs struct {
36 readIops metrix.SnapshotGaugeVec
37 writeIops metrix.SnapshotGaugeVec
38 readBandwidth metrix.SnapshotGaugeVec
39 writeBandwidth metrix.SnapshotGaugeVec
40 avgReadLatency metrix.SnapshotGaugeVec
41 avgWriteLatency metrix.SnapshotGaugeVec
42 avgLatency metrix.SnapshotGaugeVec
43 }
44
45 type spaceGaugeVecs struct {
46 physicalTotal metrix.SnapshotGaugeVec
47 physicalUsed metrix.SnapshotGaugeVec
48 logicalProvisioned metrix.SnapshotGaugeVec
49 logicalUsed metrix.SnapshotGaugeVec
50 dataPhysicalUsed metrix.SnapshotGaugeVec
51 sharedLogicalUsed metrix.SnapshotGaugeVec
52 efficiencyRatio metrix.SnapshotGaugeVec
53 dataReduction metrix.SnapshotGaugeVec
54 snapshotSavings metrix.SnapshotGaugeVec
55 thinSavings metrix.SnapshotGaugeVec
56 }
57
58 type applianceGauges struct {
59 perf perfGaugeVecs
60 space spaceGaugeVecs
61 cpu metrix.SnapshotGaugeVec
62 }
63
64 type volumeGauges struct {
65 perf perfGaugeVecs
66 spaceLogicalProv metrix.SnapshotGaugeVec
67 spaceLogicalUsed metrix.SnapshotGaugeVec
68 spaceThinSavings metrix.SnapshotGaugeVec
69 }
70
71 type nodeGauges struct {
72 perf perfGaugeVecs
73 currentLogins metrix.SnapshotGaugeVec
74 }
75
76 type fcPortGauges struct {
77 perf perfGaugeVecs
78 linkUp metrix.SnapshotGaugeVec
79 }
80
81 type ethPortGauges struct {
82 bytesRxPs metrix.SnapshotGaugeVec
83 bytesTxPs metrix.SnapshotGaugeVec
84 pktRxPs metrix.SnapshotGaugeVec
85 pktTxPs metrix.SnapshotGaugeVec
86 pktRxCrcErrorPs metrix.SnapshotGaugeVec
87 pktRxNoBufferErrorPs metrix.SnapshotGaugeVec
88 pktTxErrorPs metrix.SnapshotGaugeVec
89 linkUp metrix.SnapshotGaugeVec
90 }
91
92 type fileSystemGauges struct {
93 perf perfGaugeVecs
94 }
95
96 type hardwareGauges struct {
97 fanOK, fanDegraded, fanFailed, fanUnknown metrix.SnapshotGauge
98 psuOK, psuDegraded, psuFailed, psuUnknown metrix.SnapshotGauge
99 driveOK, driveDegraded, driveFailed, driveUnknown metrix.SnapshotGauge
100 batteryOK, batteryDegraded, batteryFailed, batteryUnknown metrix.SnapshotGauge
101 nodeOK, nodeDegraded, nodeFailed, nodeUnknown metrix.SnapshotGauge
102 }
103
104 type alertGauges struct {
105 critical metrix.SnapshotGauge
106 major metrix.SnapshotGauge
107 minor metrix.SnapshotGauge
108 info metrix.SnapshotGauge
109 }
110
111 type driveGauges struct {
112 enduranceRemaining metrix.SnapshotGaugeVec
113 }
114
115 type nasGauges struct {
116 started metrix.SnapshotGauge
117 stopped metrix.SnapshotGauge
118 degraded metrix.SnapshotGauge
119 unknown metrix.SnapshotGauge
120 }
121
122 type replicationGauges struct {
123 dataRemaining metrix.SnapshotGauge
124 dataTransferred metrix.SnapshotGauge
125 transferRate metrix.SnapshotGauge
126 }
127
128 func newCollectorMetrics(store metrix.CollectorStore) *collectorMetrics {
129 meter := store.Write().SnapshotMeter("")
130
131 appVec := meter.Vec("appliance")
132 volVec := meter.Vec("volume")
133 nodeVec := meter.Vec("node")
134 fcVec := meter.Vec("fc_port")
135 ethVec := meter.Vec("eth_port")
136 fsVec := meter.Vec("filesystem")
137 driveVec := meter.Vec("drive")
138
139 newPerfVecs := func(vec metrix.SnapshotVecMeter, prefix string) perfGaugeVecs {
140 return perfGaugeVecs{
141 readIops: vec.Gauge(prefix + "_perf_read_iops"),
142 writeIops: vec.Gauge(prefix + "_perf_write_iops"),
143 readBandwidth: vec.Gauge(prefix + "_perf_read_bandwidth"),
144 writeBandwidth: vec.Gauge(prefix + "_perf_write_bandwidth"),
145 avgReadLatency: vec.Gauge(prefix + "_perf_avg_read_latency"),
146 avgWriteLatency: vec.Gauge(prefix + "_perf_avg_write_latency"),
147 avgLatency: vec.Gauge(prefix + "_perf_avg_latency"),
148 }
149 }
150
151 newSpaceVecs := func(vec metrix.SnapshotVecMeter, prefix string) spaceGaugeVecs {
152 return spaceGaugeVecs{
153 physicalTotal: vec.Gauge(prefix + "_space_physical_total"),
154 physicalUsed: vec.Gauge(prefix + "_space_physical_used"),
155 logicalProvisioned: vec.Gauge(prefix + "_space_logical_provisioned"),
156 logicalUsed: vec.Gauge(prefix + "_space_logical_used"),
157 dataPhysicalUsed: vec.Gauge(prefix + "_space_data_physical_used"),
158 sharedLogicalUsed: vec.Gauge(prefix + "_space_shared_logical_used"),
159 efficiencyRatio: vec.Gauge(prefix + "_space_efficiency_ratio"),
160 dataReduction: vec.Gauge(prefix + "_space_data_reduction"),
161 snapshotSavings: vec.Gauge(prefix + "_space_snapshot_savings"),
162 thinSavings: vec.Gauge(prefix + "_space_thin_savings"),
163 }
164 }
165
166 return &collectorMetrics{
167 cluster: clusterGauges{
168 spacePhysicalTotal: meter.Gauge("cluster_space_physical_total"),
169 spacePhysicalUsed: meter.Gauge("cluster_space_physical_used"),
170 spaceLogicalProvisioned: meter.Gauge("cluster_space_logical_provisioned"),
171 spaceLogicalUsed: meter.Gauge("cluster_space_logical_used"),
172 spaceDataPhysicalUsed: meter.Gauge("cluster_space_data_physical_used"),
173 spaceSharedLogicalUsed: meter.Gauge("cluster_space_shared_logical_used"),
174 spaceEfficiencyRatio: meter.Gauge("cluster_space_efficiency_ratio"),
175 spaceDataReduction: meter.Gauge("cluster_space_data_reduction"),
176 spaceSnapshotSavings: meter.Gauge("cluster_space_snapshot_savings"),
177 spaceThinSavings: meter.Gauge("cluster_space_thin_savings"),
178 },
179 appliance: applianceGauges{
180 perf: newPerfVecs(appVec, "appliance"),
181 space: newSpaceVecs(appVec, "appliance"),
182 cpu: appVec.Gauge("appliance_cpu_utilization"),
183 },
184 volume: volumeGauges{
185 perf: newPerfVecs(volVec, "volume"),
186 spaceLogicalProv: volVec.Gauge("volume_space_logical_provisioned"),
187 spaceLogicalUsed: volVec.Gauge("volume_space_logical_used"),
188 spaceThinSavings: volVec.Gauge("volume_space_thin_savings"),
189 },
190 node: nodeGauges{
191 perf: newPerfVecs(nodeVec, "node"),
192 currentLogins: nodeVec.Gauge("node_current_logins"),
193 },
194 fcPort: fcPortGauges{
195 perf: newPerfVecs(fcVec, "fc_port"),
196 linkUp: fcVec.Gauge("fc_port_link_up"),
197 },
198 ethPort: ethPortGauges{
199 bytesRxPs: ethVec.Gauge("eth_port_bytes_rx_ps"),
200 bytesTxPs: ethVec.Gauge("eth_port_bytes_tx_ps"),
201 pktRxPs: ethVec.Gauge("eth_port_pkt_rx_ps"),
202 pktTxPs: ethVec.Gauge("eth_port_pkt_tx_ps"),
203 pktRxCrcErrorPs: ethVec.Gauge("eth_port_pkt_rx_crc_error_ps"),
204 pktRxNoBufferErrorPs: ethVec.Gauge("eth_port_pkt_rx_no_buffer_error_ps"),
205 pktTxErrorPs: ethVec.Gauge("eth_port_pkt_tx_error_ps"),
206 linkUp: ethVec.Gauge("eth_port_link_up"),
207 },
208 fileSystem: fileSystemGauges{
209 perf: newPerfVecs(fsVec, "file_system"),
210 },
211 hardware: hardwareGauges{
212 fanOK: meter.Gauge("hardware_fan_ok"), fanDegraded: meter.Gauge("hardware_fan_degraded"),
213 fanFailed: meter.Gauge("hardware_fan_failed"), fanUnknown: meter.Gauge("hardware_fan_unknown"),
214 psuOK: meter.Gauge("hardware_psu_ok"), psuDegraded: meter.Gauge("hardware_psu_degraded"),
215 psuFailed: meter.Gauge("hardware_psu_failed"), psuUnknown: meter.Gauge("hardware_psu_unknown"),
216 driveOK: meter.Gauge("hardware_drive_ok"), driveDegraded: meter.Gauge("hardware_drive_degraded"),
217 driveFailed: meter.Gauge("hardware_drive_failed"), driveUnknown: meter.Gauge("hardware_drive_unknown"),
218 batteryOK: meter.Gauge("hardware_battery_ok"), batteryDegraded: meter.Gauge("hardware_battery_degraded"),
219 batteryFailed: meter.Gauge("hardware_battery_failed"), batteryUnknown: meter.Gauge("hardware_battery_unknown"),
220 nodeOK: meter.Gauge("hardware_node_ok"), nodeDegraded: meter.Gauge("hardware_node_degraded"),
221 nodeFailed: meter.Gauge("hardware_node_failed"), nodeUnknown: meter.Gauge("hardware_node_unknown"),
222 },
223 alerts: alertGauges{
224 critical: meter.Gauge("alerts_critical"),
225 major: meter.Gauge("alerts_major"),
226 minor: meter.Gauge("alerts_minor"),
227 info: meter.Gauge("alerts_info"),
228 },
229 drive: driveGauges{
230 enduranceRemaining: driveVec.Gauge("drive_endurance_remaining"),
231 },
232 nas: nasGauges{
233 started: meter.Gauge("nas_started"),
234 stopped: meter.Gauge("nas_stopped"),
235 degraded: meter.Gauge("nas_degraded"),
236 unknown: meter.Gauge("nas_unknown"),
237 },
238 replication: replicationGauges{
239 dataRemaining: meter.Gauge("copy_data_remaining"),
240 dataTransferred: meter.Gauge("copy_data_transferred"),
241 transferRate: meter.Gauge("copy_transfer_rate"),
242 },
243 }
244 }