Skip to content

Commit 6e15892

Browse files
committed
collector/netdev_linux.go: Fallback to 32-bit stats
On some platforms, `msg.Attributes.Stats64` is `nil` because the kernel doesn't expose 64-bit stats. In that case, return `msg.Attributes.Stats` instead, which are the 32-bit equivalent. Note that `RXOtherhostDropped` isn't available in that case, so we hardcode it to zero. Fixes #2756. Signed-off-by: Benoît Knecht <[email protected]>
1 parent 8fb4f78 commit 6e15892

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

collector/netdev_linux.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,53 @@ func parseNetlinkStats(links []rtnetlink.LinkMessage, filter *deviceFilter, logg
5656
metrics := netDevStats{}
5757

5858
for _, msg := range links {
59+
if msg.Attributes == nil {
60+
level.Debug(logger).Log("msg", "No netlink attributes, skipping")
61+
continue
62+
}
5963
name := msg.Attributes.Name
6064
stats := msg.Attributes.Stats64
65+
if stats32 := msg.Attributes.Stats; stats == nil && stats32 != nil {
66+
stats = &rtnetlink.LinkStats64{
67+
RXPackets: uint64(stats32.RXPackets),
68+
TXPackets: uint64(stats32.TXPackets),
69+
RXBytes: uint64(stats32.RXBytes),
70+
TXBytes: uint64(stats32.TXBytes),
71+
RXErrors: uint64(stats32.RXErrors),
72+
TXErrors: uint64(stats32.TXErrors),
73+
RXDropped: uint64(stats32.RXDropped),
74+
TXDropped: uint64(stats32.TXDropped),
75+
Multicast: uint64(stats32.Multicast),
76+
Collisions: uint64(stats32.Collisions),
77+
RXLengthErrors: uint64(stats32.RXLengthErrors),
78+
RXOverErrors: uint64(stats32.RXOverErrors),
79+
RXCRCErrors: uint64(stats32.RXCRCErrors),
80+
RXFrameErrors: uint64(stats32.RXFrameErrors),
81+
RXFIFOErrors: uint64(stats32.RXFIFOErrors),
82+
RXMissedErrors: uint64(stats32.RXMissedErrors),
83+
TXAbortedErrors: uint64(stats32.TXAbortedErrors),
84+
TXCarrierErrors: uint64(stats32.TXCarrierErrors),
85+
TXFIFOErrors: uint64(stats32.TXFIFOErrors),
86+
TXHeartbeatErrors: uint64(stats32.TXHeartbeatErrors),
87+
TXWindowErrors: uint64(stats32.TXWindowErrors),
88+
RXCompressed: uint64(stats32.RXCompressed),
89+
TXCompressed: uint64(stats32.TXCompressed),
90+
RXNoHandler: uint64(stats32.RXNoHandler),
91+
RXOtherhostDropped: 0,
92+
}
93+
}
6194

6295
if filter.ignored(name) {
6396
level.Debug(logger).Log("msg", "Ignoring device", "device", name)
6497
continue
6598
}
6699

100+
// Make sure we don't panic when accessing `stats` attributes below.
101+
if stats == nil {
102+
level.Debug(logger).Log("msg", "No netlink stats, skipping")
103+
continue
104+
}
105+
67106
// https://github.com/torvalds/linux/blob/master/include/uapi/linux/if_link.h#L42-L246
68107
metrics[name] = map[string]uint64{
69108
"receive_packets": stats.RXPackets,

0 commit comments

Comments
 (0)