| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | package powerstore |
| 4 | |
| 5 | // collectHardwareHealth classifies hardware components by lifecycle state. |
| 6 | // Uses cached hardware data from discovery to avoid redundant API calls. |
| 7 | func (c *Collector) collectHardwareHealth() { |
| 8 | var fanOK, fanDeg, fanFail, fanUnk float64 |
| 9 | var psuOK, psuDeg, psuFail, psuUnk float64 |
| 10 | var drvOK, drvDeg, drvFail, drvUnk float64 |
| 11 | var batOK, batDeg, batFail, batUnk float64 |
| 12 | var nodOK, nodDeg, nodFail, nodUnk float64 |
| 13 | |
| 14 | for _, h := range c.discovered.hardware { |
| 15 | ok, deg, fail, unk := classifyState(h.LifecycleState) |
| 16 | switch h.Type { |
| 17 | case "Fan": |
| 18 | fanOK += ok |
| 19 | fanDeg += deg |
| 20 | fanFail += fail |
| 21 | fanUnk += unk |
| 22 | case "Power_Supply": |
| 23 | psuOK += ok |
| 24 | psuDeg += deg |
| 25 | psuFail += fail |
| 26 | psuUnk += unk |
| 27 | case "Drive": |
| 28 | drvOK += ok |
| 29 | drvDeg += deg |
| 30 | drvFail += fail |
| 31 | drvUnk += unk |
| 32 | case "Battery": |
| 33 | batOK += ok |
| 34 | batDeg += deg |
| 35 | batFail += fail |
| 36 | batUnk += unk |
| 37 | case "Node": |
| 38 | nodOK += ok |
| 39 | nodDeg += deg |
| 40 | nodFail += fail |
| 41 | nodUnk += unk |
| 42 | } |
| 43 | } |
| 44 | |
| 45 | hw := c.mx.hardware |
| 46 | hw.fanOK.Observe(fanOK) |
| 47 | hw.fanDegraded.Observe(fanDeg) |
| 48 | hw.fanFailed.Observe(fanFail) |
| 49 | hw.fanUnknown.Observe(fanUnk) |
| 50 | hw.psuOK.Observe(psuOK) |
| 51 | hw.psuDegraded.Observe(psuDeg) |
| 52 | hw.psuFailed.Observe(psuFail) |
| 53 | hw.psuUnknown.Observe(psuUnk) |
| 54 | hw.driveOK.Observe(drvOK) |
| 55 | hw.driveDegraded.Observe(drvDeg) |
| 56 | hw.driveFailed.Observe(drvFail) |
| 57 | hw.driveUnknown.Observe(drvUnk) |
| 58 | hw.batteryOK.Observe(batOK) |
| 59 | hw.batteryDegraded.Observe(batDeg) |
| 60 | hw.batteryFailed.Observe(batFail) |
| 61 | hw.batteryUnknown.Observe(batUnk) |
| 62 | hw.nodeOK.Observe(nodOK) |
| 63 | hw.nodeDegraded.Observe(nodDeg) |
| 64 | hw.nodeFailed.Observe(nodFail) |
| 65 | hw.nodeUnknown.Observe(nodUnk) |
| 66 | } |
| 67 | |
| 68 | func classifyState(state string) (ok, degraded, failed, unknown float64) { |
| 69 | switch state { |
| 70 | case "Healthy", "healthy": |
| 71 | return 1, 0, 0, 0 |
| 72 | case "Degraded", "degraded": |
| 73 | return 0, 1, 0, 0 |
| 74 | case "Failed", "failed", "Error", "error": |
| 75 | return 0, 0, 1, 0 |
| 76 | default: |
| 77 | return 0, 0, 0, 1 |
| 78 | } |
| 79 | } |