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:
		@@ -10,10 +10,15 @@ 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"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type NUMAStatsCollectorConfig struct {
 | 
			
		||||
	SendAbsoluteValues bool `json:"send_abs_values"`
 | 
			
		||||
	SendDerivedValues  bool `json:"send_derived_values"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Non-Uniform Memory Access (NUMA) policy hit/miss statistics
 | 
			
		||||
//
 | 
			
		||||
// numa_hit:
 | 
			
		||||
@@ -47,13 +52,16 @@ import (
 | 
			
		||||
//
 | 
			
		||||
// See: https://www.kernel.org/doc/html/latest/admin-guide/numastat.html
 | 
			
		||||
type NUMAStatsCollectorTopolgy struct {
 | 
			
		||||
	file   string
 | 
			
		||||
	tagSet map[string]string
 | 
			
		||||
	file           string
 | 
			
		||||
	tagSet         map[string]string
 | 
			
		||||
	previousValues map[string]int64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type NUMAStatsCollector struct {
 | 
			
		||||
	metricCollector
 | 
			
		||||
	topology []NUMAStatsCollectorTopolgy
 | 
			
		||||
	topology      []NUMAStatsCollectorTopolgy
 | 
			
		||||
	config        NUMAStatsCollectorConfig
 | 
			
		||||
	lastTimestamp time.Time
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *NUMAStatsCollector) Init(config json.RawMessage) error {
 | 
			
		||||
@@ -86,8 +94,9 @@ func (m *NUMAStatsCollector) Init(config json.RawMessage) error {
 | 
			
		||||
		file := filepath.Join(dir, "numastat")
 | 
			
		||||
		m.topology = append(m.topology,
 | 
			
		||||
			NUMAStatsCollectorTopolgy{
 | 
			
		||||
				file:   file,
 | 
			
		||||
				tagSet: map[string]string{"memoryDomain": node},
 | 
			
		||||
				file:           file,
 | 
			
		||||
				tagSet:         map[string]string{"memoryDomain": node},
 | 
			
		||||
				previousValues: make(map[string]int64),
 | 
			
		||||
			})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -102,23 +111,27 @@ func (m *NUMAStatsCollector) Read(interval time.Duration, output chan lp.CCMessa
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	now := time.Now()
 | 
			
		||||
	timeDiff := now.Sub(m.lastTimestamp).Seconds()
 | 
			
		||||
	m.lastTimestamp = now
 | 
			
		||||
 | 
			
		||||
	for i := range m.topology {
 | 
			
		||||
		// Loop for all NUMA domains
 | 
			
		||||
		t := &m.topology[i]
 | 
			
		||||
 | 
			
		||||
		now := time.Now()
 | 
			
		||||
		file, err := os.Open(t.file)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			cclog.ComponentError(
 | 
			
		||||
				m.name,
 | 
			
		||||
				fmt.Sprintf("Read(): Failed to open file '%s': %v", t.file, err))
 | 
			
		||||
			return
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		scanner := bufio.NewScanner(file)
 | 
			
		||||
 | 
			
		||||
		// Read line by line
 | 
			
		||||
		for scanner.Scan() {
 | 
			
		||||
			split := strings.Fields(scanner.Text())
 | 
			
		||||
			line := scanner.Text()
 | 
			
		||||
			split := strings.Fields(line)
 | 
			
		||||
			if len(split) != 2 {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
@@ -130,18 +143,38 @@ func (m *NUMAStatsCollector) Read(interval time.Duration, output chan lp.CCMessa
 | 
			
		||||
					fmt.Sprintf("Read(): Failed to convert %s='%s' to int64: %v", key, split[1], err))
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			y, err := lp.NewMessage(
 | 
			
		||||
				"numastats_"+key,
 | 
			
		||||
				t.tagSet,
 | 
			
		||||
				m.meta,
 | 
			
		||||
				map[string]interface{}{"value": value},
 | 
			
		||||
				now,
 | 
			
		||||
			)
 | 
			
		||||
			if err == nil {
 | 
			
		||||
				output <- y
 | 
			
		||||
 | 
			
		||||
			if m.config.SendAbsoluteValues {
 | 
			
		||||
				msg, err := lp.NewMessage(
 | 
			
		||||
					"numastats_"+key,
 | 
			
		||||
					t.tagSet,
 | 
			
		||||
					m.meta,
 | 
			
		||||
					map[string]interface{}{"value": value},
 | 
			
		||||
					now,
 | 
			
		||||
				)
 | 
			
		||||
				if err == nil {
 | 
			
		||||
					output <- msg
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if m.config.SendDerivedValues {
 | 
			
		||||
				prev, ok := t.previousValues[key]
 | 
			
		||||
				if ok {
 | 
			
		||||
					rate := float64(value-prev) / timeDiff
 | 
			
		||||
					msg, err := lp.NewMessage(
 | 
			
		||||
						"numastats_"+key+"_rate",
 | 
			
		||||
						t.tagSet,
 | 
			
		||||
						m.meta,
 | 
			
		||||
						map[string]interface{}{"value": rate},
 | 
			
		||||
						now,
 | 
			
		||||
					)
 | 
			
		||||
					if err == nil {
 | 
			
		||||
						output <- msg
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				t.previousValues[key] = value
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		file.Close()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user