| 
									
										
										
										
											2016-12-29 09:23:34 -08:00
										 |  |  | // Copyright 2015 The Prometheus Authors
 | 
					
						
							|  |  |  | // Licensed under the Apache License, Version 2.0 (the "License");
 | 
					
						
							|  |  |  | // you may not use this file except in compliance with the License.
 | 
					
						
							|  |  |  | // You may obtain a copy of the License at
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Unless required by applicable law or agreed to in writing, software
 | 
					
						
							|  |  |  | // distributed under the License is distributed on an "AS IS" BASIS,
 | 
					
						
							|  |  |  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					
						
							|  |  |  | // See the License for the specific language governing permissions and
 | 
					
						
							|  |  |  | // limitations under the License.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-03 04:35:24 -07:00
										 |  |  | //go:build !nonetdev
 | 
					
						
							| 
									
										
										
										
											2016-12-29 09:23:34 -08:00
										 |  |  | // +build !nonetdev
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package collector | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2019-04-25 01:07:56 -07:00
										 |  |  | 	"bytes" | 
					
						
							|  |  |  | 	"encoding/binary" | 
					
						
							| 
									
										
										
										
											2019-11-29 07:14:18 -08:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2024-09-11 01:51:28 -07:00
										 |  |  | 	"log/slog" | 
					
						
							| 
									
										
										
										
											2019-04-25 01:07:56 -07:00
										 |  |  | 	"net" | 
					
						
							| 
									
										
										
										
											2016-12-29 09:23:34 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-25 01:07:56 -07:00
										 |  |  | 	"golang.org/x/sys/unix" | 
					
						
							| 
									
										
										
										
											2016-12-29 09:23:34 -08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-11 01:51:28 -07:00
										 |  |  | func getNetDevStats(filter *deviceFilter, logger *slog.Logger) (netDevStats, error) { | 
					
						
							| 
									
										
										
										
											2020-08-24 08:43:27 -07:00
										 |  |  | 	netDev := netDevStats{} | 
					
						
							| 
									
										
										
										
											2016-12-29 09:23:34 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-25 01:07:56 -07:00
										 |  |  | 	ifs, err := net.Interfaces() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2019-11-29 07:14:18 -08:00
										 |  |  | 		return nil, fmt.Errorf("net.Interfaces() failed: %w", err) | 
					
						
							| 
									
										
										
										
											2016-12-29 09:23:34 -08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-25 01:07:56 -07:00
										 |  |  | 	for _, iface := range ifs { | 
					
						
							| 
									
										
										
										
											2019-12-02 06:16:00 -08:00
										 |  |  | 		if filter.ignored(iface.Name) { | 
					
						
							| 
									
										
										
										
											2024-09-11 01:51:28 -07:00
										 |  |  | 			logger.Debug("Ignoring device", "device", iface.Name) | 
					
						
							| 
									
										
										
										
											2019-05-31 08:55:50 -07:00
										 |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-04-25 01:07:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-24 08:43:27 -07:00
										 |  |  | 		ifaceData, err := getIfaceData(iface.Index) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							| 
									
										
										
										
											2024-09-11 01:51:28 -07:00
										 |  |  | 			logger.Debug("failed to load data for interface", "device", iface.Name, "err", err) | 
					
						
							| 
									
										
										
										
											2020-08-24 08:43:27 -07:00
										 |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		netDev[iface.Name] = map[string]uint64{ | 
					
						
							|  |  |  | 			"receive_packets":    ifaceData.Data.Ipackets, | 
					
						
							|  |  |  | 			"transmit_packets":   ifaceData.Data.Opackets, | 
					
						
							|  |  |  | 			"receive_bytes":      ifaceData.Data.Ibytes, | 
					
						
							|  |  |  | 			"transmit_bytes":     ifaceData.Data.Obytes, | 
					
						
							| 
									
										
										
										
											2021-07-09 02:44:03 -07:00
										 |  |  | 			"receive_errors":     ifaceData.Data.Ierrors, | 
					
						
							|  |  |  | 			"transmit_errors":    ifaceData.Data.Oerrors, | 
					
						
							|  |  |  | 			"receive_dropped":    ifaceData.Data.Iqdrops, | 
					
						
							| 
									
										
										
										
											2020-08-24 08:43:27 -07:00
										 |  |  | 			"receive_multicast":  ifaceData.Data.Imcasts, | 
					
						
							|  |  |  | 			"transmit_multicast": ifaceData.Data.Omcasts, | 
					
						
							| 
									
										
										
										
											2021-07-09 02:44:03 -07:00
										 |  |  | 			"collisions":         ifaceData.Data.Collisions, | 
					
						
							|  |  |  | 			"noproto":            ifaceData.Data.Noproto, | 
					
						
							| 
									
										
										
										
											2020-08-24 08:43:27 -07:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-12-29 09:23:34 -08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return netDev, nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-04-25 01:07:56 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | func getIfaceData(index int) (*ifMsghdr2, error) { | 
					
						
							|  |  |  | 	var data ifMsghdr2 | 
					
						
							|  |  |  | 	rawData, err := unix.SysctlRaw("net", unix.AF_ROUTE, 0, 0, unix.NET_RT_IFLIST2, index) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	err = binary.Read(bytes.NewReader(rawData), binary.LittleEndian, &data) | 
					
						
							|  |  |  | 	return &data, err | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type ifMsghdr2 struct { | 
					
						
							|  |  |  | 	Msglen    uint16 | 
					
						
							|  |  |  | 	Version   uint8 | 
					
						
							|  |  |  | 	Type      uint8 | 
					
						
							|  |  |  | 	Addrs     int32 | 
					
						
							|  |  |  | 	Flags     int32 | 
					
						
							|  |  |  | 	Index     uint16 | 
					
						
							|  |  |  | 	_         [2]byte | 
					
						
							|  |  |  | 	SndLen    int32 | 
					
						
							|  |  |  | 	SndMaxlen int32 | 
					
						
							|  |  |  | 	SndDrops  int32 | 
					
						
							|  |  |  | 	Timer     int32 | 
					
						
							|  |  |  | 	Data      ifData64 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-09 02:44:03 -07:00
										 |  |  | // https://github.com/apple/darwin-xnu/blob/main/bsd/net/if_var.h#L199-L231
 | 
					
						
							| 
									
										
										
										
											2019-04-25 01:07:56 -07:00
										 |  |  | type ifData64 struct { | 
					
						
							|  |  |  | 	Type       uint8 | 
					
						
							|  |  |  | 	Typelen    uint8 | 
					
						
							|  |  |  | 	Physical   uint8 | 
					
						
							|  |  |  | 	Addrlen    uint8 | 
					
						
							|  |  |  | 	Hdrlen     uint8 | 
					
						
							|  |  |  | 	Recvquota  uint8 | 
					
						
							|  |  |  | 	Xmitquota  uint8 | 
					
						
							|  |  |  | 	Unused1    uint8 | 
					
						
							|  |  |  | 	Mtu        uint32 | 
					
						
							|  |  |  | 	Metric     uint32 | 
					
						
							|  |  |  | 	Baudrate   uint64 | 
					
						
							|  |  |  | 	Ipackets   uint64 | 
					
						
							|  |  |  | 	Ierrors    uint64 | 
					
						
							|  |  |  | 	Opackets   uint64 | 
					
						
							|  |  |  | 	Oerrors    uint64 | 
					
						
							|  |  |  | 	Collisions uint64 | 
					
						
							|  |  |  | 	Ibytes     uint64 | 
					
						
							|  |  |  | 	Obytes     uint64 | 
					
						
							|  |  |  | 	Imcasts    uint64 | 
					
						
							|  |  |  | 	Omcasts    uint64 | 
					
						
							|  |  |  | 	Iqdrops    uint64 | 
					
						
							|  |  |  | 	Noproto    uint64 | 
					
						
							|  |  |  | 	Recvtiming uint32 | 
					
						
							|  |  |  | 	Xmittiming uint32 | 
					
						
							|  |  |  | 	Lastchange unix.Timeval32 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-09-11 00:26:34 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | func getNetDevLabels() (map[string]map[string]string, error) { | 
					
						
							|  |  |  | 	// to be implemented if needed
 | 
					
						
							|  |  |  | 	return nil, nil | 
					
						
							|  |  |  | } |