mirror of
				https://github.com/ClusterCockpit/cc-metric-collector.git
				synced 2025-11-04 02:35:07 +01:00 
			
		
		
		
	Collector-specific configuration. LIKWID collector derives metrics itself, Run once CLI option
This commit is contained in:
		@@ -7,18 +7,34 @@ import (
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const LUSTREFILE = `/proc/fs/lustre/llite/lnec-XXXXXX/stats`
 | 
			
		||||
 | 
			
		||||
type LustreCollectorConfig struct {
 | 
			
		||||
    procfiles []string `json:"procfiles"`
 | 
			
		||||
    ExcludeMetrics []string                 `json:"exclude_metrics"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type LustreCollector struct {
 | 
			
		||||
	MetricCollector
 | 
			
		||||
	tags    map[string]string
 | 
			
		||||
	matches map[string]map[string]int
 | 
			
		||||
	devices []string
 | 
			
		||||
	config LustreCollectorConfig
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *LustreCollector) Init() error {
 | 
			
		||||
func (m *LustreCollector) Init(config []byte) error {
 | 
			
		||||
    var err error
 | 
			
		||||
	m.name = "LustreCollector"
 | 
			
		||||
	if len(config) > 0 {
 | 
			
		||||
	    err = json.Unmarshal(config, &m.config)
 | 
			
		||||
	    if err != nil {
 | 
			
		||||
	        return err
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
	m.setup()
 | 
			
		||||
	m.tags = map[string]string{"type": "node"}
 | 
			
		||||
	m.matches = map[string]map[string]int{"read_bytes": {"read_bytes": 6, "read_requests": 1},
 | 
			
		||||
@@ -29,38 +45,58 @@ func (m *LustreCollector) Init() error {
 | 
			
		||||
		"getattr":          {"getattr": 1},
 | 
			
		||||
		"statfs":           {"statfs": 1},
 | 
			
		||||
		"inode_permission": {"inode_permission": 1}}
 | 
			
		||||
	_, err := ioutil.ReadFile(string(LUSTREFILE))
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		m.init = true
 | 
			
		||||
	m.devices = make([]string, 0)
 | 
			
		||||
	for _, p := range m.config.procfiles {
 | 
			
		||||
	    _, err := ioutil.ReadFile(p)
 | 
			
		||||
	    if err == nil {
 | 
			
		||||
	        m.devices = append(m.devices, p)
 | 
			
		||||
	    } else {
 | 
			
		||||
	        log.Print(err.Error())
 | 
			
		||||
	        continue
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
	return err
 | 
			
		||||
	
 | 
			
		||||
	if len(m.devices) == 0 {
 | 
			
		||||
		return errors.New("No metrics to collect")
 | 
			
		||||
	}
 | 
			
		||||
	m.init = true
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *LustreCollector) Read(interval time.Duration, out *[]lp.MutableMetric) {
 | 
			
		||||
	buffer, err := ioutil.ReadFile(string(LUSTREFILE))
 | 
			
		||||
    if !m.init {
 | 
			
		||||
        return
 | 
			
		||||
    }
 | 
			
		||||
    for _, p := range m.devices {
 | 
			
		||||
	    buffer, err := ioutil.ReadFile(p)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Print(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	    if err != nil {
 | 
			
		||||
		    log.Print(err)
 | 
			
		||||
		    return
 | 
			
		||||
	    }
 | 
			
		||||
 | 
			
		||||
	for _, line := range strings.Split(string(buffer), "\n") {
 | 
			
		||||
		lf := strings.Fields(line)
 | 
			
		||||
		if len(lf) > 1 {
 | 
			
		||||
			for match, fields := range m.matches {
 | 
			
		||||
				if lf[0] == match {
 | 
			
		||||
					for name, idx := range fields {
 | 
			
		||||
						x, err := strconv.ParseInt(lf[idx], 0, 64)
 | 
			
		||||
						if err == nil {
 | 
			
		||||
							y, err := lp.New(name, m.tags, map[string]interface{}{"value": x}, time.Now())
 | 
			
		||||
							if err == nil {
 | 
			
		||||
								*out = append(*out, y)
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	    for _, line := range strings.Split(string(buffer), "\n") {
 | 
			
		||||
		    lf := strings.Fields(line)
 | 
			
		||||
		    if len(lf) > 1 {
 | 
			
		||||
			    for match, fields := range m.matches {
 | 
			
		||||
				    if lf[0] == match {
 | 
			
		||||
					    for name, idx := range fields {
 | 
			
		||||
					        _, skip := stringArrayContains(m.config.ExcludeMetrics, name)
 | 
			
		||||
					        if skip {
 | 
			
		||||
					            continue
 | 
			
		||||
					        }
 | 
			
		||||
						    x, err := strconv.ParseInt(lf[idx], 0, 64)
 | 
			
		||||
						    if err == nil {
 | 
			
		||||
							    y, err := lp.New(name, m.tags, map[string]interface{}{"value": x}, time.Now())
 | 
			
		||||
							    if err == nil {
 | 
			
		||||
								    *out = append(*out, y)
 | 
			
		||||
							    }
 | 
			
		||||
						    }
 | 
			
		||||
					    }
 | 
			
		||||
				    }
 | 
			
		||||
			    }
 | 
			
		||||
		    }
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user