mirror of
				https://github.com/ClusterCockpit/cc-metric-collector.git
				synced 2025-10-31 09:05:05 +01:00 
			
		
		
		
	* Add cpu_used (all-cpu_idle) to CpustatCollector * Update cc-metric-collector.init * Allow selection of timestamp precision in HttpSink * Add comment about precision requirement for cc-metric-store * Fix for API changes in gofish@v0.15.0 * Update requirements to latest version * Read sensors through redfish * Update golang toolchain to 1.21 * Remove stray error check * Update main config in configuration.md * Update Release action to use golang 1.22 stable release, no golang RPMs anymore * Update runonce action to use golang 1.22 stable release, no golang RPMs anymore * Update README.md Use right JSON type in configuration * Update sink's README * Test whether ipmitool or ipmi-sensors can be executed without errors * Little fixes to the prometheus sink (#115) * Add uint64 to float64 cast option * Add prometheus sink to the list of available sinks * Add aggregated counters by gpu for nvlink errors --------- Co-authored-by: Michael Schwarz <schwarz@uni-paderborn.de> * Ccmessage migration (#119) * Add cpu_used (all-cpu_idle) to CpustatCollector * Update cc-metric-collector.init * Allow selection of timestamp precision in HttpSink * Add comment about precision requirement for cc-metric-store * Fix for API changes in gofish@v0.15.0 * Update requirements to latest version * Read sensors through redfish * Update golang toolchain to 1.21 * Remove stray error check * Update main config in configuration.md * Update Release action to use golang 1.22 stable release, no golang RPMs anymore * Update runonce action to use golang 1.22 stable release, no golang RPMs anymore * Switch to CCMessage for all files. --------- Co-authored-by: Holger Obermaier <Holger.Obermaier@kit.edu> Co-authored-by: Holger Obermaier <40787752+ho-ob@users.noreply.github.com> * Switch to ccmessage also for latest additions in nvidiaMetric * New Message processor (#118) * Add cpu_used (all-cpu_idle) to CpustatCollector * Update cc-metric-collector.init * Allow selection of timestamp precision in HttpSink * Add comment about precision requirement for cc-metric-store * Fix for API changes in gofish@v0.15.0 * Update requirements to latest version * Read sensors through redfish * Update golang toolchain to 1.21 * Remove stray error check * Update main config in configuration.md * Update Release action to use golang 1.22 stable release, no golang RPMs anymore * Update runonce action to use golang 1.22 stable release, no golang RPMs anymore * New message processor to check whether a message should be dropped or manipulate it in flight * Create a copy of message before manipulation --------- Co-authored-by: Holger Obermaier <Holger.Obermaier@kit.edu> Co-authored-by: Holger Obermaier <40787752+ho-ob@users.noreply.github.com> * Update collector's Makefile and go.mod/sum files * Use message processor in router, all sinks and all receivers * Add support for credential file (NKEY) to NATS sink and receiver * Fix JSON keys in message processor configuration * Update docs for message processor, router and the default router config file * Add link to expr syntax and fix regex matching docs * Update sample collectors * Minor style change in collector manager * Some helpers for ccTopology * LIKWID collector: write log owner change only once * Fix for metrics without units and reduce debugging messages for messageProcessor * Use shorted hostname for hostname added by router * Define default port for NATS * CPUstat collector: only add unit for applicable metrics * Add precision option to all sinks using Influx's encoder * Add message processor to all sink documentation * Add units to documentation of cpustat collector --------- Co-authored-by: Holger Obermaier <Holger.Obermaier@kit.edu> Co-authored-by: Holger Obermaier <40787752+ho-ob@users.noreply.github.com> Co-authored-by: oscarminus <me@oscarminus.de> Co-authored-by: Michael Schwarz <schwarz@uni-paderborn.de>
		
			
				
	
	
		
			123 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package receivers
 | |
| 
 | |
| import (
 | |
| 	"bufio"
 | |
| 	"encoding/json"
 | |
| 	"errors"
 | |
| 	"fmt"
 | |
| 	"log"
 | |
| 	"net/http"
 | |
| 	"strconv"
 | |
| 	"strings"
 | |
| 	"sync"
 | |
| 	"time"
 | |
| 
 | |
| 	cclog "github.com/ClusterCockpit/cc-metric-collector/pkg/ccLogger"
 | |
| 	lp "github.com/ClusterCockpit/cc-energy-manager/pkg/cc-message"
 | |
| )
 | |
| 
 | |
| type PrometheusReceiverConfig struct {
 | |
| 	defaultReceiverConfig
 | |
| 	Addr     string `json:"address"`
 | |
| 	Port     string `json:"port"`
 | |
| 	Path     string `json:"path"`
 | |
| 	Interval string `json:"interval"`
 | |
| 	SSL      bool   `json:"ssl"`
 | |
| }
 | |
| 
 | |
| type PrometheusReceiver struct {
 | |
| 	receiver
 | |
| 	meta     map[string]string
 | |
| 	config   PrometheusReceiverConfig
 | |
| 	interval time.Duration
 | |
| 	done     chan bool
 | |
| 	wg       sync.WaitGroup
 | |
| 	ticker   *time.Ticker
 | |
| 	uri      string
 | |
| }
 | |
| 
 | |
| func (r *PrometheusReceiver) Start() {
 | |
| 	cclog.ComponentDebug(r.name, "START", r.uri)
 | |
| 	r.wg.Add(1)
 | |
| 
 | |
| 	r.ticker = time.NewTicker(r.interval)
 | |
| 	go func() {
 | |
| 		for {
 | |
| 			select {
 | |
| 			case <-r.done:
 | |
| 				r.wg.Done()
 | |
| 				return
 | |
| 			case t := <-r.ticker.C:
 | |
| 				resp, err := http.Get(r.uri)
 | |
| 				if err != nil {
 | |
| 					log.Fatal(err)
 | |
| 				}
 | |
| 				defer resp.Body.Close()
 | |
| 
 | |
| 				scanner := bufio.NewScanner(resp.Body)
 | |
| 				for scanner.Scan() {
 | |
| 					line := scanner.Text()
 | |
| 					if strings.HasPrefix(line, "#") {
 | |
| 						continue
 | |
| 					}
 | |
| 					lineSplit := strings.Fields(line)
 | |
| 					// separate metric name from tags (labels in Prometheus)
 | |
| 					tags := map[string]string{}
 | |
| 					name := lineSplit[0]
 | |
| 					if sindex := strings.Index(name, "{"); sindex >= 0 {
 | |
| 						eindex := strings.Index(name, "}")
 | |
| 						for _, kv := range strings.Split(name[sindex+1:eindex], ",") {
 | |
| 							eq := strings.Index(kv, "=")
 | |
| 							tags[kv[0:eq]] = strings.Trim(kv[eq+1:], "\"")
 | |
| 						}
 | |
| 						name = lineSplit[0][0:sindex]
 | |
| 					}
 | |
| 					value, err := strconv.ParseFloat(lineSplit[1], 64)
 | |
| 					if err == nil {
 | |
| 						y, err := lp.NewMessage(name, tags, r.meta, map[string]interface{}{"value": value}, t)
 | |
| 						if err == nil {
 | |
| 							r.sink <- y
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}()
 | |
| }
 | |
| 
 | |
| func (r *PrometheusReceiver) Close() {
 | |
| 	cclog.ComponentDebug(r.name, "CLOSE")
 | |
| 	r.done <- true
 | |
| 	r.wg.Wait()
 | |
| }
 | |
| 
 | |
| func NewPrometheusReceiver(name string, config json.RawMessage) (Receiver, error) {
 | |
| 	r := new(PrometheusReceiver)
 | |
| 	r.name = fmt.Sprintf("PrometheusReceiver(%s)", name)
 | |
| 	if len(config) > 0 {
 | |
| 		err := json.Unmarshal(config, &r.config)
 | |
| 		if err != nil {
 | |
| 			cclog.ComponentError(r.name, "Error reading config:", err.Error())
 | |
| 			return nil, err
 | |
| 		}
 | |
| 	}
 | |
| 	if len(r.config.Addr) == 0 ||
 | |
| 		len(r.config.Port) == 0 ||
 | |
| 		len(r.config.Interval) == 0 {
 | |
| 		return nil, errors.New("not all configuration variables set required by PrometheusReceiver (address and port)")
 | |
| 	}
 | |
| 	if len(r.config.Interval) > 0 {
 | |
| 		t, err := time.ParseDuration(r.config.Interval)
 | |
| 		if err == nil {
 | |
| 			r.interval = t
 | |
| 		}
 | |
| 	}
 | |
| 	r.meta = map[string]string{"source": r.name}
 | |
| 	proto := "http"
 | |
| 	if r.config.SSL {
 | |
| 		proto = "https"
 | |
| 	}
 | |
| 	r.uri = fmt.Sprintf("%s://%s:%s/%s", proto, r.config.Addr, r.config.Port, r.config.Path)
 | |
| 	return r, nil
 | |
| }
 |