pkg/exporter/nettop/interface.go (88 lines of code) (raw):

package nettop import ( "fmt" "os" log "github.com/sirupsen/logrus" "github.com/vishvananda/netlink" "golang.org/x/exp/slices" ) var ( InitNetns = 0 defaultInterfaceNames = []string{"eth0", "eno0"} ) // GetEntityByNetns get entity by netns, if netns was deleted asynchrously, return nil; otherwise return error func GetEntityByNetns(nsinum int) (*Entity, error) { // if use nsinum 0, represent node level metrics if nsinum == 0 { return GetHostNetworkEntity() } v, found := nsCache.Get(fmt.Sprintf("%d", nsinum)) if found { return v.(*Entity), nil } return nil, fmt.Errorf("entity for netns %d not found", nsinum) } func GetHostNetworkEntity() (*Entity, error) { return defaultEntity, nil } func GetEntityByPid(pid int) (*Entity, error) { v, found := pidCache.Get(fmt.Sprintf("%d", pid)) if found { return v.(*Entity), nil } return nil, fmt.Errorf("entify for process %d not found", pid) } // GetAllUniqueNetnsEntity returns all entities, include host network pods func GetAllUniqueNetnsEntity() []*Entity { return getAllEntity(func(entity *Entity) bool { return entity == defaultEntity || !entity.IsHostNetwork() }) } // GetAllEntity returns all entites that have unique netns func GetAllEntity() []*Entity { return getAllEntity(nil) } func getAllEntity(filter func(entity *Entity) bool) []*Entity { var ret []*Entity ets := entities.Load() if ets == nil { log.Errorf("entities is nil") return nil } for _, entity := range *ets { if entity == nil { continue } if filter != nil && !filter(entity) { continue } ret = append(ret, entity) } return ret } func GetNodeName() string { if os.Getenv("INSPECTOR_NODENAME") != "" { return os.Getenv("INSPECTOR_NODENAME") } node, err := os.Hostname() if err != nil { return "Unknow" } return node } func GetNodeIPs() ([]string, error) { links, err := netlink.LinkList() if err != nil { return nil, err } var ret []string for _, l := range links { if slices.Contains(defaultInterfaceNames, l.Attrs().Name) { addrs, err := netlink.AddrList(l, netlink.FAMILY_V4) if err != nil { return nil, err } for _, addr := range addrs { ret = append(ret, addr.IP.String()) } break } } return ret, nil }