master
go 52 lines 1.46 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package powervault
4
5 func (c *Collector) collectPortStats() {
6 stats, err := c.client.PortStatistics()
7 if err != nil {
8 c.Warningf("error collecting port statistics: %v", err)
9 return
10 }
11
12 for _, s := range stats {
13 id := s.DurableID
14 c.mx.port.readOps.WithLabelValues(id).Observe(float64(s.NumReads))
15 c.mx.port.writeOps.WithLabelValues(id).Observe(float64(s.NumWrites))
16 c.mx.port.dataRead.WithLabelValues(id).Observe(float64(s.DataRead))
17 c.mx.port.dataWritten.WithLabelValues(id).Observe(float64(s.DataWritten))
18 }
19 }
20
21 func (c *Collector) collectPhyStats() {
22 stats, err := c.client.PhyStatistics()
23 if err != nil {
24 c.Warningf("error collecting PHY statistics: %v", err)
25 return
26 }
27
28 // Aggregate PHY errors per port (multiple PHYs per port).
29 type portErrors struct {
30 disparity, lost, invalid int64
31 }
32 byPort := make(map[string]*portErrors)
33
34 for _, s := range stats {
35 // Normalize to match port durable ID format (e.g. "A0" → "hostport_A0").
36 portID := "hostport_" + s.Port
37 pe, ok := byPort[portID]
38 if !ok {
39 pe = &portErrors{}
40 byPort[portID] = pe
41 }
42 pe.disparity += s.DisparityErrors
43 pe.lost += s.LostDwords
44 pe.invalid += s.InvalidDwords
45 }
46
47 for portID, pe := range byPort {
48 c.mx.phy.disparityErrors.WithLabelValues(portID).Observe(float64(pe.disparity))
49 c.mx.phy.lostDwords.WithLabelValues(portID).Observe(float64(pe.lost))
50 c.mx.phy.invalidDwords.WithLabelValues(portID).Observe(float64(pe.invalid))
51 }
52 }