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:
		@@ -1,28 +1,42 @@
 | 
			
		||||
package collectors
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	//	"errors"
 | 
			
		||||
	//	"fmt"
 | 
			
		||||
	lp "github.com/influxdata/line-protocol"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"log"
 | 
			
		||||
//	"log"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const DISKSTATFILE = `/proc/diskstats`
 | 
			
		||||
const DISKSTAT_SYSFSPATH = `/sys/block`
 | 
			
		||||
 | 
			
		||||
type DiskstatCollectorConfig struct {
 | 
			
		||||
    ExcludeMetrics []string                 `json:"exclude_metrics, omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type DiskstatCollector struct {
 | 
			
		||||
	MetricCollector
 | 
			
		||||
	matches map[int]string
 | 
			
		||||
	config DiskstatCollectorConfig
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *DiskstatCollector) Init() error {
 | 
			
		||||
 | 
			
		||||
func (m *DiskstatCollector) Init(config []byte) error {
 | 
			
		||||
    var err error
 | 
			
		||||
	m.name = "DiskstatCollector"
 | 
			
		||||
	m.setup()
 | 
			
		||||
	if len(config) > 0 {
 | 
			
		||||
	    err = json.Unmarshal(config, &m.config)
 | 
			
		||||
	    if err != nil {
 | 
			
		||||
	        return err
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
	// https://www.kernel.org/doc/html/latest/admin-guide/iostats.html
 | 
			
		||||
	m.matches = map[int]string{
 | 
			
		||||
	matches := map[int]string{
 | 
			
		||||
		3:  "reads",
 | 
			
		||||
		4:  "reads_merged",
 | 
			
		||||
		5:  "read_sectors",
 | 
			
		||||
@@ -41,46 +55,60 @@ func (m *DiskstatCollector) Init() error {
 | 
			
		||||
		18: "flushes",
 | 
			
		||||
		19: "flushes_ms",
 | 
			
		||||
	}
 | 
			
		||||
	_, err := ioutil.ReadFile(string(DISKSTATFILE))
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		m.init = true
 | 
			
		||||
	m.matches = make(map[int]string)
 | 
			
		||||
	for k, v := range matches {
 | 
			
		||||
	    _, skip := stringArrayContains(m.config.ExcludeMetrics, v)
 | 
			
		||||
	    if (!skip) {
 | 
			
		||||
	        m.matches[k] = v
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
	if len(m.matches) == 0 {
 | 
			
		||||
	    return errors.New("No metrics to collect")
 | 
			
		||||
	}
 | 
			
		||||
	_, err = ioutil.ReadFile(string(DISKSTATFILE))
 | 
			
		||||
    if err == nil {
 | 
			
		||||
	    m.init = true
 | 
			
		||||
    }
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
func (m *DiskstatCollector) Read(interval time.Duration, out *[]lp.MutableMetric) {
 | 
			
		||||
    var lines []string
 | 
			
		||||
    if !m.init {
 | 
			
		||||
        return
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	buffer, err := ioutil.ReadFile(string(DISKSTATFILE))
 | 
			
		||||
    buffer, err := ioutil.ReadFile(string(DISKSTATFILE))
 | 
			
		||||
    if err != nil {
 | 
			
		||||
        return
 | 
			
		||||
    }
 | 
			
		||||
    lines = strings.Split(string(buffer), "\n")
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Print(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ll := strings.Split(string(buffer), "\n")
 | 
			
		||||
 | 
			
		||||
	for _, line := range ll {
 | 
			
		||||
		if len(line) == 0 {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		f := strings.Fields(line)
 | 
			
		||||
		if strings.Contains(f[2], "loop") {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		tags := map[string]string{
 | 
			
		||||
			"device": f[2],
 | 
			
		||||
			"type":   "node",
 | 
			
		||||
		}
 | 
			
		||||
		for idx, name := range m.matches {
 | 
			
		||||
			x, err := strconv.ParseInt(f[idx], 0, 64)
 | 
			
		||||
			if err == nil {
 | 
			
		||||
				y, err := lp.New(name, tags, map[string]interface{}{"value": int(x)}, time.Now())
 | 
			
		||||
				if err == nil {
 | 
			
		||||
					*out = append(*out, y)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
    for _, line := range lines {
 | 
			
		||||
	    if len(line) == 0 {
 | 
			
		||||
		    continue
 | 
			
		||||
	    }
 | 
			
		||||
	    f := strings.Fields(line)
 | 
			
		||||
	    if strings.Contains(f[2], "loop") {
 | 
			
		||||
		    continue
 | 
			
		||||
	    }
 | 
			
		||||
	    tags := map[string]string{
 | 
			
		||||
		    "device": f[2],
 | 
			
		||||
		    "type":   "node",
 | 
			
		||||
	    }
 | 
			
		||||
	    for idx, name := range m.matches {
 | 
			
		||||
	        if idx < len(f) {
 | 
			
		||||
		        x, err := strconv.ParseInt(f[idx], 0, 64)
 | 
			
		||||
		        if err == nil {
 | 
			
		||||
			        y, err := lp.New(name, tags, map[string]interface{}{"value": int(x)}, time.Now())
 | 
			
		||||
			        if err == nil {
 | 
			
		||||
				        *out = append(*out, y)
 | 
			
		||||
			        }
 | 
			
		||||
		        }
 | 
			
		||||
		    }
 | 
			
		||||
	    }
 | 
			
		||||
    }
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user