mirror of
				https://github.com/ClusterCockpit/cc-metric-collector.git
				synced 2025-11-04 02:35:07 +01:00 
			
		
		
		
	Merge development branch to main (#141)
* Remove go-toolkit as build requirement for RPM builds if run in CI * Remove condition around BuildRequires and use go-toolkit for RPM builds * use go-toolkit for RPM builds * Install go-toolkit to fulfill build requirements for RPM * Add golang-race for UBI9 and Alma9 * Fix wrongly named packages * Fix wrongly named packages * Fix Release part * Fix Release part * Fix documentation of RAPL collector * Mark all JSON config fields of message processor as omitempty * Generate HUGO inputs out of Markdown files * Check creation of CCMessage in NATS receiver * Use CCMessage FromBytes instead of Influx's decoder * Rename 'process_message' to 'process_messages' in metricRouter config This makes the behavior more consistent with the other modules, which have their MessageProcessor named 'process_messages'. This most likely was just a typo. * Add optional interface alias in netstat (#130) * Check creation of CCMessage in NATS receiver * add optional interface aliases for netstatMetric * small fix --------- Co-authored-by: Thomas Roehl <thomas.roehl@fau.de> Co-authored-by: exterr2f <Robert.Externbrink@rub.de> Co-authored-by: Thomas Gruber <Thomas.Roehl@googlemail.com> * Fix excluded metrics for diskstat and add exclude_mounts (#131) * Check creation of CCMessage in NATS receiver * fix excluded metrics and add optional mountpoint exclude --------- Co-authored-by: Thomas Roehl <thomas.roehl@fau.de> Co-authored-by: exterr2f <Robert.Externbrink@rub.de> Co-authored-by: Thomas Gruber <Thomas.Roehl@googlemail.com> * Add derived values for nfsiostat (#132) * Check creation of CCMessage in NATS receiver * add derived_values for nfsiostatMetric --------- Co-authored-by: Thomas Roehl <thomas.roehl@fau.de> Co-authored-by: exterr2f <Robert.Externbrink@rub.de> Co-authored-by: Thomas Gruber <Thomas.Roehl@googlemail.com> * Add exclude_devices to iostat (#133) * Check creation of CCMessage in NATS receiver * add exclude_device for iostatMetric * add md file --------- Co-authored-by: Thomas Roehl <thomas.roehl@fau.de> Co-authored-by: exterr2f <Robert.Externbrink@rub.de> Co-authored-by: Thomas Gruber <Thomas.Roehl@googlemail.com> * Add derived_values for numastats (#134) * Check creation of CCMessage in NATS receiver * add derived_values for numastats * change to ccMessage * remove vim command artefact --------- Co-authored-by: Thomas Roehl <thomas.roehl@fau.de> Co-authored-by: exterr2f <Robert.Externbrink@rub.de> Co-authored-by: Thomas Gruber <Thomas.Roehl@googlemail.com> * Fix artifacts of not done cc-lib switch * Fix artifacts in netstat collector of not done cc-lib switch * Change to cc-lib (#135) * Change to ccMessage from cc-lib * Remove local development path * Use receiver, sinks, ccLogger and ccConfig from cc-lib * Fix ccLogger import path * Update CI * Delete mountpoint when it vanishes, not just its data (#137) --------- Co-authored-by: Michael Panzlaff <michael.panzlaff@fau.de> Co-authored-by: brinkcoder <Robert.Externbrink@ruhr-uni-bochum.de> Co-authored-by: exterr2f <Robert.Externbrink@rub.de>
This commit is contained in:
		@@ -9,16 +9,17 @@ import (
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	cclog "github.com/ClusterCockpit/cc-metric-collector/pkg/ccLogger"
 | 
			
		||||
	lp "github.com/ClusterCockpit/cc-energy-manager/pkg/cc-message"
 | 
			
		||||
	cclog "github.com/ClusterCockpit/cc-lib/ccLogger"
 | 
			
		||||
	lp "github.com/ClusterCockpit/cc-lib/ccMessage"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const NETSTATFILE = "/proc/net/dev"
 | 
			
		||||
 | 
			
		||||
type NetstatCollectorConfig struct {
 | 
			
		||||
	IncludeDevices     []string `json:"include_devices"`
 | 
			
		||||
	SendAbsoluteValues bool     `json:"send_abs_values"`
 | 
			
		||||
	SendDerivedValues  bool     `json:"send_derived_values"`
 | 
			
		||||
	IncludeDevices     []string            `json:"include_devices"`
 | 
			
		||||
	SendAbsoluteValues bool                `json:"send_abs_values"`
 | 
			
		||||
	SendDerivedValues  bool                `json:"send_derived_values"`
 | 
			
		||||
	InterfaceAliases   map[string][]string `json:"interface_aliases,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type NetstatCollectorMetric struct {
 | 
			
		||||
@@ -32,9 +33,26 @@ type NetstatCollectorMetric struct {
 | 
			
		||||
 | 
			
		||||
type NetstatCollector struct {
 | 
			
		||||
	metricCollector
 | 
			
		||||
	config        NetstatCollectorConfig
 | 
			
		||||
	matches       map[string][]NetstatCollectorMetric
 | 
			
		||||
	lastTimestamp time.Time
 | 
			
		||||
	config           NetstatCollectorConfig
 | 
			
		||||
	aliasToCanonical map[string]string
 | 
			
		||||
	matches          map[string][]NetstatCollectorMetric
 | 
			
		||||
	lastTimestamp    time.Time
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *NetstatCollector) buildAliasMapping() {
 | 
			
		||||
	m.aliasToCanonical = make(map[string]string)
 | 
			
		||||
	for canon, aliases := range m.config.InterfaceAliases {
 | 
			
		||||
		for _, alias := range aliases {
 | 
			
		||||
			m.aliasToCanonical[alias] = canon
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getCanonicalName(raw string, aliasToCanonical map[string]string) string {
 | 
			
		||||
	if canon, ok := aliasToCanonical[raw]; ok {
 | 
			
		||||
		return canon
 | 
			
		||||
	}
 | 
			
		||||
	return raw
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *NetstatCollector) Init(config json.RawMessage) error {
 | 
			
		||||
@@ -77,6 +95,8 @@ func (m *NetstatCollector) Init(config json.RawMessage) error {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	m.buildAliasMapping()
 | 
			
		||||
 | 
			
		||||
	// Check access to net statistic file
 | 
			
		||||
	file, err := os.Open(NETSTATFILE)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -97,18 +117,20 @@ func (m *NetstatCollector) Init(config json.RawMessage) error {
 | 
			
		||||
		// Split line into fields
 | 
			
		||||
		f := strings.Fields(l)
 | 
			
		||||
 | 
			
		||||
		// Get net device entry
 | 
			
		||||
		dev := strings.Trim(f[0], ": ")
 | 
			
		||||
		// Get raw and canonical names
 | 
			
		||||
		raw := strings.Trim(f[0], ": ")
 | 
			
		||||
		canonical := getCanonicalName(raw, m.aliasToCanonical)
 | 
			
		||||
 | 
			
		||||
		// Check if device is a included device
 | 
			
		||||
		if _, ok := stringArrayContains(m.config.IncludeDevices, dev); ok {
 | 
			
		||||
			tags := map[string]string{"stype": "network", "stype-id": dev, "type": "node"}
 | 
			
		||||
		if _, ok := stringArrayContains(m.config.IncludeDevices, canonical); ok {
 | 
			
		||||
			// Tag will contain original device name (raw).
 | 
			
		||||
			tags := map[string]string{"stype": "network", "stype-id": raw, "type": "node"}
 | 
			
		||||
			meta_unit_byte := map[string]string{"source": m.name, "group": "Network", "unit": "bytes"}
 | 
			
		||||
			meta_unit_byte_per_sec := map[string]string{"source": m.name, "group": "Network", "unit": "bytes/sec"}
 | 
			
		||||
			meta_unit_pkts := map[string]string{"source": m.name, "group": "Network", "unit": "packets"}
 | 
			
		||||
			meta_unit_pkts_per_sec := map[string]string{"source": m.name, "group": "Network", "unit": "packets/sec"}
 | 
			
		||||
 | 
			
		||||
			m.matches[dev] = []NetstatCollectorMetric{
 | 
			
		||||
			m.matches[canonical] = []NetstatCollectorMetric{
 | 
			
		||||
				{
 | 
			
		||||
					name:       "net_bytes_in",
 | 
			
		||||
					index:      fieldReceiveBytes,
 | 
			
		||||
@@ -143,7 +165,6 @@ func (m *NetstatCollector) Init(config json.RawMessage) error {
 | 
			
		||||
				},
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(m.matches) == 0 {
 | 
			
		||||
@@ -164,7 +185,7 @@ func (m *NetstatCollector) Read(interval time.Duration, output chan lp.CCMessage
 | 
			
		||||
	// Save current timestamp
 | 
			
		||||
	m.lastTimestamp = now
 | 
			
		||||
 | 
			
		||||
	file, err := os.Open(string(NETSTATFILE))
 | 
			
		||||
	file, err := os.Open(NETSTATFILE)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		cclog.ComponentError(m.name, err.Error())
 | 
			
		||||
		return
 | 
			
		||||
@@ -183,11 +204,12 @@ func (m *NetstatCollector) Read(interval time.Duration, output chan lp.CCMessage
 | 
			
		||||
		// Split line into fields
 | 
			
		||||
		f := strings.Fields(l)
 | 
			
		||||
 | 
			
		||||
		// Get net device entry
 | 
			
		||||
		dev := strings.Trim(f[0], ":")
 | 
			
		||||
		// Get raw and canonical names
 | 
			
		||||
		raw := strings.Trim(f[0], ":")
 | 
			
		||||
		canonical := getCanonicalName(raw, m.aliasToCanonical)
 | 
			
		||||
 | 
			
		||||
		// Check if device is a included device
 | 
			
		||||
		if devmetrics, ok := m.matches[dev]; ok {
 | 
			
		||||
		if devmetrics, ok := m.matches[canonical]; ok {
 | 
			
		||||
			for i := range devmetrics {
 | 
			
		||||
				metric := &devmetrics[i]
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user