From 424de840647523d1ef88a6a49667a7519d7211b5 Mon Sep 17 00:00:00 2001 From: binjip978 Date: Fri, 30 Jul 2021 07:44:18 +0300 Subject: [PATCH 1/4] add node_network_address collector emit (interface, addr, netmask, scope) labels for every network interface Signed-off-by: binjip978 --- collector/network_address.go | 103 +++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 collector/network_address.go diff --git a/collector/network_address.go b/collector/network_address.go new file mode 100644 index 0000000000..7d7e21fc27 --- /dev/null +++ b/collector/network_address.go @@ -0,0 +1,103 @@ +// Copyright 2021 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. + +package collector + +import ( + "fmt" + "github.com/go-kit/log" + "github.com/prometheus/client_golang/prometheus" + "net" + "strconv" +) + +type networkAddrCollector struct { + entries *prometheus.Desc + logger log.Logger +} + +func init() { + registerCollector("node_network_address", defaultDisabled, NewNetworkAddressCollector) +} + +// NewNetworkAddressCollector returns a new Collector exposing network address labels. +func NewNetworkAddressCollector(logger log.Logger) (Collector, error) { + return &networkAddrCollector{ + entries: prometheus.NewDesc(prometheus.BuildFQName(namespace, "node_network_address", + "entries"), "node network address by interface", + []string{"interface", "addr", "netmask", "scope"}, nil), + logger: logger, + }, nil +} + +func (c *networkAddrCollector) Update(ch chan<- prometheus.Metric) error { + interfaces, err := net.Interfaces() + if err != nil { + return fmt.Errorf("could not get network interfaces: %w", err) + } + + for _, addr := range getAddrsInfo(interfaces) { + ch <- prometheus.MustNewConstMetric(c.entries, prometheus.GaugeValue, 1, + addr.ifs, addr.addr, addr.netmask, addr.scope) + } + + return nil +} + +type addrInfo struct { + ifs string + addr string + scope string + netmask string +} + +func scope(ip net.IP) string { + if ip.IsLoopback() || ip.IsLinkLocalUnicast() || ip.IsLinkLocalMulticast() { + return "link-local" + } + + if ip.IsInterfaceLocalMulticast() { + return "interface-local" + } + + if ip.IsGlobalUnicast() { + return "global" + } + + return "" +} + +// getAddrsInfo returns interface name, address, scope and netmask for all interfaces. +func getAddrsInfo(interfaces []net.Interface) []addrInfo { + var res []addrInfo + + for _, ifs := range interfaces { + addrs, _ := ifs.Addrs() + for _, addr := range addrs { + ip, ipNet, err := net.ParseCIDR(addr.String()) + if err != nil { + continue + } + size, _ := ipNet.Mask.Size() + + res = append(res, addrInfo{ + ifs: ifs.Name, + addr: ip.String(), + scope: scope(ip), + netmask: strconv.Itoa(size), + }) + } + } + + return res +} From b8247e4211618196b9352a443281226e2b922adb Mon Sep 17 00:00:00 2001 From: binjip978 Date: Tue, 3 Aug 2021 08:54:49 +0300 Subject: [PATCH 2/4] move address-info metric to netdev_common Signed-off-by: binjip978 --- collector/netdev_common.go | 66 ++++++++++++++++++++++ collector/network_address.go | 103 ----------------------------------- 2 files changed, 66 insertions(+), 103 deletions(-) delete mode 100644 collector/network_address.go diff --git a/collector/netdev_common.go b/collector/netdev_common.go index b6748de138..7c7a61c968 100644 --- a/collector/netdev_common.go +++ b/collector/netdev_common.go @@ -19,6 +19,8 @@ package collector import ( "errors" "fmt" + "net" + "strconv" "github.com/go-kit/log" "github.com/go-kit/log/level" @@ -31,6 +33,7 @@ var ( oldNetdevDeviceInclude = kingpin.Flag("collector.netdev.device-whitelist", "DEPRECATED: Use collector.netdev.device-include").Hidden().String() netdevDeviceExclude = kingpin.Flag("collector.netdev.device-exclude", "Regexp of net devices to exclude (mutually exclusive to device-include).").String() oldNetdevDeviceExclude = kingpin.Flag("collector.netdev.device-blacklist", "DEPRECATED: Use collector.netdev.device-exclude").Hidden().String() + netdevAddressInfo = kingpin.Flag("collector.netdev.address-info", "Collect address-info for every device").Bool() ) type netDevCollector struct { @@ -106,5 +109,68 @@ func (c *netDevCollector) Update(ch chan<- prometheus.Metric) error { ch <- prometheus.MustNewConstMetric(desc, prometheus.CounterValue, float64(value), dev) } } + if *netdevAddressInfo { + interfaces, err := net.Interfaces() + if err != nil { + return fmt.Errorf("could not get network interfaces: %w", err) + } + + desc := prometheus.NewDesc(prometheus.BuildFQName(namespace, "network_address", + "entries"), "node network address by device", + []string{"device", "addr", "netmask", "scope"}, nil) + + for _, addr := range getAddrsInfo(interfaces) { + ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, 1, + addr.device, addr.addr, addr.netmask, addr.scope) + } + } return nil } + +type addrInfo struct { + device string + addr string + scope string + netmask string +} + +func scope(ip net.IP) string { + if ip.IsLoopback() || ip.IsLinkLocalUnicast() || ip.IsLinkLocalMulticast() { + return "link-local" + } + + if ip.IsInterfaceLocalMulticast() { + return "interface-local" + } + + if ip.IsGlobalUnicast() { + return "global" + } + + return "" +} + +// getAddrsInfo returns interface name, address, scope and netmask for all interfaces. +func getAddrsInfo(interfaces []net.Interface) []addrInfo { + var res []addrInfo + + for _, ifs := range interfaces { + addrs, _ := ifs.Addrs() + for _, addr := range addrs { + ip, ipNet, err := net.ParseCIDR(addr.String()) + if err != nil { + continue + } + size, _ := ipNet.Mask.Size() + + res = append(res, addrInfo{ + device: ifs.Name, + addr: ip.String(), + scope: scope(ip), + netmask: strconv.Itoa(size), + }) + } + } + + return res +} diff --git a/collector/network_address.go b/collector/network_address.go deleted file mode 100644 index 7d7e21fc27..0000000000 --- a/collector/network_address.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2021 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. - -package collector - -import ( - "fmt" - "github.com/go-kit/log" - "github.com/prometheus/client_golang/prometheus" - "net" - "strconv" -) - -type networkAddrCollector struct { - entries *prometheus.Desc - logger log.Logger -} - -func init() { - registerCollector("node_network_address", defaultDisabled, NewNetworkAddressCollector) -} - -// NewNetworkAddressCollector returns a new Collector exposing network address labels. -func NewNetworkAddressCollector(logger log.Logger) (Collector, error) { - return &networkAddrCollector{ - entries: prometheus.NewDesc(prometheus.BuildFQName(namespace, "node_network_address", - "entries"), "node network address by interface", - []string{"interface", "addr", "netmask", "scope"}, nil), - logger: logger, - }, nil -} - -func (c *networkAddrCollector) Update(ch chan<- prometheus.Metric) error { - interfaces, err := net.Interfaces() - if err != nil { - return fmt.Errorf("could not get network interfaces: %w", err) - } - - for _, addr := range getAddrsInfo(interfaces) { - ch <- prometheus.MustNewConstMetric(c.entries, prometheus.GaugeValue, 1, - addr.ifs, addr.addr, addr.netmask, addr.scope) - } - - return nil -} - -type addrInfo struct { - ifs string - addr string - scope string - netmask string -} - -func scope(ip net.IP) string { - if ip.IsLoopback() || ip.IsLinkLocalUnicast() || ip.IsLinkLocalMulticast() { - return "link-local" - } - - if ip.IsInterfaceLocalMulticast() { - return "interface-local" - } - - if ip.IsGlobalUnicast() { - return "global" - } - - return "" -} - -// getAddrsInfo returns interface name, address, scope and netmask for all interfaces. -func getAddrsInfo(interfaces []net.Interface) []addrInfo { - var res []addrInfo - - for _, ifs := range interfaces { - addrs, _ := ifs.Addrs() - for _, addr := range addrs { - ip, ipNet, err := net.ParseCIDR(addr.String()) - if err != nil { - continue - } - size, _ := ipNet.Mask.Size() - - res = append(res, addrInfo{ - ifs: ifs.Name, - addr: ip.String(), - scope: scope(ip), - netmask: strconv.Itoa(size), - }) - } - } - - return res -} From ed4598185b0c9c4999e58d3ddc12eef307f61f29 Mon Sep 17 00:00:00 2001 From: binjip978 Date: Fri, 3 Sep 2021 08:24:45 +0300 Subject: [PATCH 3/4] rename addr to address Signed-off-by: binjip978 --- collector/netdev_common.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/collector/netdev_common.go b/collector/netdev_common.go index 7c7a61c968..145c1d54c8 100644 --- a/collector/netdev_common.go +++ b/collector/netdev_common.go @@ -11,6 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !nonetdev && (linux || freebsd || openbsd || dragonfly || darwin) // +build !nonetdev // +build linux freebsd openbsd dragonfly darwin @@ -117,7 +118,7 @@ func (c *netDevCollector) Update(ch chan<- prometheus.Metric) error { desc := prometheus.NewDesc(prometheus.BuildFQName(namespace, "network_address", "entries"), "node network address by device", - []string{"device", "addr", "netmask", "scope"}, nil) + []string{"device", "address", "netmask", "scope"}, nil) for _, addr := range getAddrsInfo(interfaces) { ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, 1, From d5d44b6ccb690fef3012076ae2a022f8af5211b3 Mon Sep 17 00:00:00 2001 From: binjip978 Date: Sat, 4 Sep 2021 12:22:04 +0300 Subject: [PATCH 4/4] rename entries to info Signed-off-by: binjip978 --- collector/netdev_common.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collector/netdev_common.go b/collector/netdev_common.go index 145c1d54c8..0b40b99284 100644 --- a/collector/netdev_common.go +++ b/collector/netdev_common.go @@ -117,7 +117,7 @@ func (c *netDevCollector) Update(ch chan<- prometheus.Metric) error { } desc := prometheus.NewDesc(prometheus.BuildFQName(namespace, "network_address", - "entries"), "node network address by device", + "info"), "node network address by device", []string{"device", "address", "netmask", "scope"}, nil) for _, addr := range getAddrsInfo(interfaces) {