mirror of
				https://github.com/ClusterCockpit/cc-metric-collector.git
				synced 2025-11-04 02:35:07 +01:00 
			
		
		
		
	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>
This commit is contained in:
		@@ -2,24 +2,24 @@ package collectors
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"bufio"
 | 
						"bufio"
 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	cclog "github.com/ClusterCockpit/cc-metric-collector/pkg/ccLogger"
 | 
					 | 
				
			||||||
	lp "github.com/ClusterCockpit/cc-energy-manager/pkg/cc-message"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	//	"log"
 | 
					 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cclog "github.com/ClusterCockpit/cc-metric-collector/pkg/ccLogger"
 | 
				
			||||||
 | 
						lp "github.com/ClusterCockpit/cc-lib/ccMessage"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Konstante für den Pfad zu /proc/diskstats
 | 
				
			||||||
const IOSTATFILE = `/proc/diskstats`
 | 
					const IOSTATFILE = `/proc/diskstats`
 | 
				
			||||||
const IOSTAT_SYSFSPATH = `/sys/block`
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
type IOstatCollectorConfig struct {
 | 
					type IOstatCollectorConfig struct {
 | 
				
			||||||
	ExcludeMetrics []string `json:"exclude_metrics,omitempty"`
 | 
						ExcludeMetrics []string `json:"exclude_metrics,omitempty"`
 | 
				
			||||||
 | 
						// Neues Feld zum Ausschließen von Devices per JSON-Konfiguration
 | 
				
			||||||
 | 
						ExcludeDevices []string `json:"exclude_devices,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type IOstatCollectorEntry struct {
 | 
					type IOstatCollectorEntry struct {
 | 
				
			||||||
@@ -76,7 +76,7 @@ func (m *IOstatCollector) Init(config json.RawMessage) error {
 | 
				
			|||||||
	if len(m.matches) == 0 {
 | 
						if len(m.matches) == 0 {
 | 
				
			||||||
		return errors.New("no metrics to collect")
 | 
							return errors.New("no metrics to collect")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	file, err := os.Open(string(IOSTATFILE))
 | 
						file, err := os.Open(IOSTATFILE)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		cclog.ComponentError(m.name, err.Error())
 | 
							cclog.ComponentError(m.name, err.Error())
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
@@ -87,17 +87,24 @@ func (m *IOstatCollector) Init(config json.RawMessage) error {
 | 
				
			|||||||
	for scanner.Scan() {
 | 
						for scanner.Scan() {
 | 
				
			||||||
		line := scanner.Text()
 | 
							line := scanner.Text()
 | 
				
			||||||
		linefields := strings.Fields(line)
 | 
							linefields := strings.Fields(line)
 | 
				
			||||||
 | 
							if len(linefields) < 3 {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		device := linefields[2]
 | 
							device := linefields[2]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if strings.Contains(device, "loop") {
 | 
							if strings.Contains(device, "loop") {
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							if _, skip := stringArrayContains(m.config.ExcludeDevices, device); skip {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		values := make(map[string]int64)
 | 
							values := make(map[string]int64)
 | 
				
			||||||
		for m := range m.matches {
 | 
							for m := range m.matches {
 | 
				
			||||||
			values[m] = 0
 | 
								values[m] = 0
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		m.devices[device] = IOstatCollectorEntry{
 | 
							m.devices[device] = IOstatCollectorEntry{
 | 
				
			||||||
			tags: map[string]string{
 | 
								tags: map[string]string{
 | 
				
			||||||
				"device": linefields[2],
 | 
									"device": device,
 | 
				
			||||||
				"type":   "node",
 | 
									"type":   "node",
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			lastValues: values,
 | 
								lastValues: values,
 | 
				
			||||||
@@ -112,7 +119,7 @@ func (m *IOstatCollector) Read(interval time.Duration, output chan lp.CCMessage)
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	file, err := os.Open(string(IOSTATFILE))
 | 
						file, err := os.Open(IOSTATFILE)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		cclog.ComponentError(m.name, err.Error())
 | 
							cclog.ComponentError(m.name, err.Error())
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
@@ -126,10 +133,16 @@ func (m *IOstatCollector) Read(interval time.Duration, output chan lp.CCMessage)
 | 
				
			|||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		linefields := strings.Fields(line)
 | 
							linefields := strings.Fields(line)
 | 
				
			||||||
 | 
							if len(linefields) < 3 {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		device := linefields[2]
 | 
							device := linefields[2]
 | 
				
			||||||
		if strings.Contains(device, "loop") {
 | 
							if strings.Contains(device, "loop") {
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							if _, skip := stringArrayContains(m.config.ExcludeDevices, device); skip {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if _, ok := m.devices[device]; !ok {
 | 
							if _, ok := m.devices[device]; !ok {
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,12 +4,17 @@
 | 
				
			|||||||
```json
 | 
					```json
 | 
				
			||||||
  "iostat": {
 | 
					  "iostat": {
 | 
				
			||||||
    "exclude_metrics": [
 | 
					    "exclude_metrics": [
 | 
				
			||||||
      "read_ms"
 | 
					      "io_read_ms"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
 | 
					    "exclude_devices": [
 | 
				
			||||||
 | 
					      "nvme0n1p1",
 | 
				
			||||||
 | 
					      "nvme0n1p2",
 | 
				
			||||||
 | 
					      "md127"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The `iostat` collector reads data from `/proc/diskstats` and outputs a handful **node** metrics. If a metric is not required, it can be excluded from forwarding it to the sink.
 | 
					The `iostat` collector reads data from `/proc/diskstats` and outputs a handful **node** metrics. If a metric or device is not required, it can be excluded from forwarding it to the sink.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Metrics:
 | 
					Metrics:
 | 
				
			||||||
* `io_reads`
 | 
					* `io_reads`
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user