Formatting

This commit is contained in:
Thomas Roehl 2021-12-21 14:04:31 +01:00
parent 988cea381e
commit a6feb16ec1
30 changed files with 775 additions and 793 deletions

View File

@ -16,5 +16,6 @@ fmt:
go fmt sinks/*.go
go fmt receivers/*.go
go fmt metric-collector.go
find . -name "*.go" -exec go fmt {} \;
.PHONY: clean

View File

@ -1,16 +1,15 @@
package collectors
import (
"encoding/json"
lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric"
"sync"
"time"
mct "github.com/ClusterCockpit/cc-metric-collector/internal/multiChanTicker"
"log"
"os"
"encoding/json"
mct "github.com/ClusterCockpit/cc-metric-collector/internal/multiChanTicker"
"sync"
"time"
)
var AvailableCollectors = map[string]MetricCollector{
"likwid": &LikwidCollector{},
"loadavg": &LoadavgCollector{},
@ -27,7 +26,6 @@ var AvailableCollectors = map[string]MetricCollector{
"ipmistat": &IpmiCollector{},
}
type collectorManager struct {
collectors []MetricCollector
output chan lp.CCMetric
@ -45,7 +43,6 @@ type CollectorManager interface {
Close()
}
func (cm *collectorManager) Init(ticker mct.MultiChanTicker, duration time.Duration, wg *sync.WaitGroup, collectConfigFile string) error {
cm.collectors = make([]MetricCollector, 0)
cm.output = nil
@ -89,20 +86,20 @@ func (cm *collectorManager) Start() {
cm.ticker.AddChannel(tick)
go func() {
for {
CollectorManagerLoop:
CollectorManagerLoop:
select {
case <- cm.done:
case <-cm.done:
for _, c := range cm.collectors {
c.Close()
}
cm.wg.Done()
log.Print("[CollectorManager] DONE\n")
break CollectorManagerLoop
case t := <- tick:
case t := <-tick:
for _, c := range cm.collectors {
CollectorManagerInputLoop:
CollectorManagerInputLoop:
select {
case <- cm.done:
case <-cm.done:
for _, c := range cm.collectors {
c.Close()
}

View File

@ -24,7 +24,7 @@ type CpustatCollector struct {
func (m *CpustatCollector) Init(config json.RawMessage) error {
m.name = "CpustatCollector"
m.setup()
m.meta = map[string]string{"source" : m.name, "group" : "CPU"}
m.meta = map[string]string{"source": m.name, "group": "CPU"}
if len(config) > 0 {
err := json.Unmarshal(config, &m.config)
if err != nil {

View File

@ -32,7 +32,7 @@ type CustomCmdCollector struct {
func (m *CustomCmdCollector) Init(config json.RawMessage) error {
var err error
m.name = "CustomCmdCollector"
m.meta = map[string]string{"source" : m.name, "group" : "Custom"}
m.meta = map[string]string{"source": m.name, "group": "Custom"}
if len(config) > 0 {
err = json.Unmarshal(config, &m.config)
if err != nil {

View File

@ -27,7 +27,7 @@ type DiskstatCollector struct {
func (m *DiskstatCollector) Init(config json.RawMessage) error {
var err error
m.name = "DiskstatCollector"
m.meta = map[string]string{"source" : m.name, "group" : "Disk"}
m.meta = map[string]string{"source": m.name, "group": "Disk"}
m.setup()
if len(config) > 0 {
err = json.Unmarshal(config, &m.config)

View File

@ -54,7 +54,7 @@ func (m *InfinibandCollector) Init(config json.RawMessage) error {
m.name = "InfinibandCollector"
m.use_perfquery = false
m.setup()
m.meta = map[string]string{"source" : m.name, "group" : "Network"}
m.meta = map[string]string{"source": m.name, "group": "Network"}
m.tags = map[string]string{"type": "node"}
if len(config) > 0 {
err = json.Unmarshal(config, &m.config)

View File

@ -31,7 +31,7 @@ type IpmiCollector struct {
func (m *IpmiCollector) Init(config json.RawMessage) error {
m.name = "IpmiCollector"
m.setup()
m.meta = map[string]string{"source" : m.name, "group" : "IPMI"}
m.meta = map[string]string{"source": m.name, "group": "IPMI"}
if len(config) > 0 {
err := json.Unmarshal(config, &m.config)
if err != nil {

View File

@ -127,13 +127,13 @@ func (m *LikwidCollector) Init(config json.RawMessage) error {
}
}
m.setup()
m.meta = map[string]string{"source" : m.name, "group" : "PerfCounter"}
m.meta = map[string]string{"source": m.name, "group": "PerfCounter"}
cpulist := CpuList()
m.cpulist = make([]C.int, len(cpulist))
slist := getSocketCpus()
m.sock2tid = make(map[int]int)
// m.numa2tid = make(map[int]int)
// m.numa2tid = make(map[int]int)
for i, c := range cpulist {
m.cpulist[i] = C.int(c)
if sid, found := slist[m.cpulist[i]]; found {

View File

@ -32,7 +32,7 @@ func (m *LoadavgCollector) Init(config json.RawMessage) error {
return err
}
}
m.meta = map[string]string{"source" : m.name, "group" : "LOAD"}
m.meta = map[string]string{"source": m.name, "group": "LOAD"}
m.tags = map[string]string{"type": "node"}
m.load_matches = []string{"load_one", "load_five", "load_fifteen"}
m.proc_matches = []string{"proc_run", "proc_total"}

View File

@ -37,7 +37,7 @@ func (m *LustreCollector) Init(config json.RawMessage) error {
}
m.setup()
m.tags = map[string]string{"type": "node"}
m.meta = map[string]string{"source" : m.name, "group" : "Lustre"}
m.meta = map[string]string{"source": m.name, "group": "Lustre"}
m.matches = map[string]map[string]int{"read_bytes": {"read_bytes": 6, "read_requests": 1},
"write_bytes": {"write_bytes": 6, "write_requests": 1},
"open": {"open": 1},

View File

@ -35,7 +35,7 @@ func (m *MemstatCollector) Init(config json.RawMessage) error {
return err
}
}
m.meta = map[string]string{"source" : m.name, "group" : "Memory", "unit": "kByte"}
m.meta = map[string]string{"source": m.name, "group": "Memory", "unit": "kByte"}
m.stats = make(map[string]int64)
m.matches = make(map[string]string)
m.tags = map[string]string{"type": "node"}

View File

@ -1,6 +1,7 @@
package collectors
import (
"encoding/json"
"errors"
lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric"
influx "github.com/influxdata/line-protocol"
@ -9,7 +10,6 @@ import (
"strconv"
"strings"
"time"
"encoding/json"
)
type MetricCollector interface {

View File

@ -25,7 +25,7 @@ type NetstatCollector struct {
func (m *NetstatCollector) Init(config json.RawMessage) error {
m.name = "NetstatCollector"
m.setup()
m.meta = map[string]string{"source" : m.name, "group" : "Memory"}
m.meta = map[string]string{"source": m.name, "group": "Memory"}
m.matches = map[int]string{
1: "bytes_in",
9: "bytes_out",

View File

@ -4,8 +4,8 @@ import (
"encoding/json"
"errors"
"fmt"
"github.com/NVIDIA/go-nvml/pkg/nvml"
lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric"
"github.com/NVIDIA/go-nvml/pkg/nvml"
"log"
"time"
)
@ -32,7 +32,7 @@ func (m *NvidiaCollector) Init(config json.RawMessage) error {
var err error
m.name = "NvidiaCollector"
m.setup()
m.meta = map[string]string{"source" : m.name, "group" : "Nvidia"}
m.meta = map[string]string{"source": m.name, "group": "Nvidia"}
if len(config) > 0 {
err = json.Unmarshal(config, &m.config)
if err != nil {

View File

@ -5,12 +5,12 @@ import (
"fmt"
lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric"
"io/ioutil"
"log"
"os"
"path/filepath"
"strconv"
"strings"
"time"
"log"
)
const HWMON_PATH = `/sys/class/hwmon`
@ -28,7 +28,7 @@ type TempCollector struct {
func (m *TempCollector) Init(config json.RawMessage) error {
m.name = "TempCollector"
m.setup()
m.meta = map[string]string{"source" : m.name, "group" : "IPMI", "unit": "degC"}
m.meta = map[string]string{"source": m.name, "group": "IPMI", "unit": "degC"}
if len(config) > 0 {
err := json.Unmarshal(config, &m.config)
if err != nil {
@ -102,7 +102,7 @@ func (m *TempCollector) Read(interval time.Duration, output chan lp.CCMetric) {
if err == nil {
y, err := lp.New(strings.ToLower(mname), tags, m.meta, map[string]interface{}{"value": int(float64(x) / 1000)}, time.Now())
if err == nil {
log.Print("[", m.name, "] ",y)
log.Print("[", m.name, "] ", y)
output <- y
}
}

View File

@ -28,7 +28,7 @@ func (m *TopProcsCollector) Init(config json.RawMessage) error {
var err error
m.name = "TopProcsCollector"
m.tags = map[string]string{"type": "node"}
m.meta = map[string]string{"source" : m.name, "group" : "TopProcs"}
m.meta = map[string]string{"source": m.name, "group": "TopProcs"}
if len(config) > 0 {
err = json.Unmarshal(config, &m.config)
if err != nil {

1
go.sum
View File

@ -1,7 +1,6 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
github.com/NVIDIA/go-nvml v0.11.1-0 h1:XHSz3zZKC4NCP2ja1rI7++DXFhA+uDhdYa3MykCTGHY=
github.com/NVIDIA/go-nvml v0.11.1-0/go.mod h1:hy7HYeQy335x6nEss0Ne3PYqleRa6Ct+VKD9RQ4nyFs=
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=

View File

@ -1,10 +1,10 @@
package ccmetric
import (
lp "github.com/influxdata/line-protocol" // MIT license
"time"
"sort"
"fmt"
lp "github.com/influxdata/line-protocol" // MIT license
"sort"
"time"
)
// Most functions are derived from github.com/influxdata/line-protocol/metric.go
@ -187,9 +187,6 @@ func (m *ccMetric) AddField(key string, value interface{}) {
m.fields = append(m.fields, &lp.Field{Key: key, Value: convertField(value)})
}
func New(
name string,
tags map[string]string,

View File

@ -1,14 +1,14 @@
package metricRouter
import (
lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric"
"sync"
"log"
"encoding/json"
"os"
"time"
"gopkg.in/Knetic/govaluate.v2"
lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric"
mct "github.com/ClusterCockpit/cc-metric-collector/internal/multiChanTicker"
"gopkg.in/Knetic/govaluate.v2"
"log"
"os"
"sync"
"time"
)
type metricRounterTagConfig struct {
@ -41,7 +41,6 @@ type MetricRouter interface {
Close()
}
func (r *metricRouter) Init(ticker mct.MultiChanTicker, wg *sync.WaitGroup, routerConfigFile string) error {
r.inputs = make([]chan lp.CCMetric, 0)
r.outputs = make([]chan lp.CCMetric, 0)
@ -69,14 +68,14 @@ func (r *metricRouter) StartTimer() {
go func() {
for {
select {
case t := <- m:
case t := <-m:
r.timestamp = t
}
}
}()
}
func (r *metricRouter) EvalCondition(Cond string, point lp.CCMetric) (bool, error){
func (r *metricRouter) EvalCondition(Cond string, point lp.CCMetric) (bool, error) {
expression, err := govaluate.NewEvaluableExpression(Cond)
if err != nil {
log.Print(Cond, " = ", err.Error())
@ -84,13 +83,13 @@ func (r *metricRouter) EvalCondition(Cond string, point lp.CCMetric) (bool, erro
}
params := make(map[string]interface{})
params["name"] = point.Name()
for _,t := range point.TagList() {
for _, t := range point.TagList() {
params[t.Key] = t.Value
}
for _,m := range point.MetaList() {
for _, m := range point.MetaList() {
params[m.Key] = m.Value
}
for _,f := range point.FieldList() {
for _, f := range point.FieldList() {
params[f.Key] = f.Value
}
params["timestamp"] = point.Time()
@ -152,22 +151,22 @@ func (r *metricRouter) Start() {
}
go func() {
for {
RouterLoop:
RouterLoop:
select {
case <- r.done:
case <-r.done:
log.Print("[MetricRouter] DONE\n")
r.wg.Done()
break RouterLoop
default:
for _, c := range r.inputs {
RouterInputLoop:
RouterInputLoop:
select {
case <- r.done:
case <-r.done:
log.Print("[MetricRouter] DONE\n")
r.wg.Done()
break RouterInputLoop
case p := <- c:
log.Print("[MetricRouter] FORWARD ",p)
case p := <-c:
log.Print("[MetricRouter] FORWARD ", p)
r.DoAddTags(p)
r.DoDelTags(p)
if r.config.IntervalStamp == true {

View File

@ -10,12 +10,12 @@ import (
"log"
"os"
"os/signal"
// "strings"
// "strings"
lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric"
mr "github.com/ClusterCockpit/cc-metric-collector/internal/metricRouter"
mct "github.com/ClusterCockpit/cc-metric-collector/internal/multiChanTicker"
"sync"
"time"
mr "github.com/ClusterCockpit/cc-metric-collector/internal/metricRouter"
lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric"
mct "github.com/ClusterCockpit/cc-metric-collector/internal/multiChanTicker"
)
// List of provided collectors. Which collector should be run can be
@ -193,10 +193,10 @@ func shutdown(config *RuntimeConfig) {
config.SinkManager.Close()
}
// pidfile := config.ConfigFile.Pidfile
// RemovePidfile(pidfile)
// pidfile = config.CliArgs["pidfile"]
// RemovePidfile(pidfile)
// pidfile := config.ConfigFile.Pidfile
// RemovePidfile(pidfile)
// pidfile = config.CliArgs["pidfile"]
// RemovePidfile(pidfile)
config.Sync.Done()
}
@ -231,25 +231,24 @@ func main() {
log.Print("Configuration value 'interval' must be greater than zero")
return
}
rcfg.Interval = time.Duration(rcfg.ConfigFile.Interval)*time.Second
rcfg.Interval = time.Duration(rcfg.ConfigFile.Interval) * time.Second
if rcfg.ConfigFile.Duration <= 0 || time.Duration(rcfg.ConfigFile.Duration)*time.Second <= 0 {
log.Print("Configuration value 'duration' must be greater than zero")
return
}
rcfg.Duration = time.Duration(rcfg.ConfigFile.Duration)*time.Second
rcfg.Duration = time.Duration(rcfg.ConfigFile.Duration) * time.Second
rcfg.Hostname, err = os.Hostname()
if err != nil {
log.Print(err.Error())
return
}
// err = CreatePidfile(rcfg.CliArgs["pidfile"])
// err = SetLogging(rcfg.CliArgs["logfile"])
// if err != nil {
// log.Print("Error setting up logging system to ", rcfg.CliArgs["logfile"], " on ", rcfg.Hostname)
// return
// }
// err = CreatePidfile(rcfg.CliArgs["pidfile"])
// err = SetLogging(rcfg.CliArgs["logfile"])
// if err != nil {
// log.Print("Error setting up logging system to ", rcfg.CliArgs["logfile"], " on ", rcfg.Hostname)
// return
// }
rcfg.Ticker = mct.NewTicker(rcfg.Interval)
if len(rcfg.ConfigFile.RouterConfigFile) > 0 {
rcfg.Router, err = mr.New(rcfg.Ticker, &rcfg.Sync, rcfg.ConfigFile.RouterConfigFile)
@ -298,127 +297,127 @@ func main() {
if use_recv {
rcfg.ReceiveManager.Start()
}
// if len(config.Collectors) == 0 {
// var keys []string
// for k := range Collectors {
// keys = append(keys, k)
// }
// log.Print("Configuration value 'collectors' does not contain any collector. Available: ", strings.Join(keys, ", "))
// return
// }
// for _, name := range config.Collectors {
// if _, found := Collectors[name]; !found {
// log.Print("Invalid collector '", name, "' in configuration")
// return
// }
// }
// if _, found := Sinks[config.Sink.Type]; !found {
// log.Print("Invalid sink type '", config.Sink.Type, "' in configuration")
// return
// }
// // Setup sink
// sink := Sinks[config.Sink.Type]
// err = sink.Init(config.Sink)
// if err != nil {
// log.Print(err)
// return
// }
// sinkChannel := make(chan bool)
// mproxy.Init(sinkChannel, &wg)
// // Setup receiver
// if len(config.Receiver.Type) > 0 && config.Receiver.Type != "none" {
// if _, found := Receivers[config.Receiver.Type]; !found {
// log.Print("Invalid receiver type '", config.Receiver.Type, "' in configuration")
// return
// } else {
// recv = Receivers[config.Receiver.Type]
// err = recv.Init(config.Receiver, sink)
// if err == nil {
// use_recv = true
// } else {
// log.Print(err)
// }
// }
// }
// if len(config.Collectors) == 0 {
// var keys []string
// for k := range Collectors {
// keys = append(keys, k)
// }
// log.Print("Configuration value 'collectors' does not contain any collector. Available: ", strings.Join(keys, ", "))
// return
// }
// for _, name := range config.Collectors {
// if _, found := Collectors[name]; !found {
// log.Print("Invalid collector '", name, "' in configuration")
// return
// }
// }
// if _, found := Sinks[config.Sink.Type]; !found {
// log.Print("Invalid sink type '", config.Sink.Type, "' in configuration")
// return
// }
// // Setup sink
// sink := Sinks[config.Sink.Type]
// err = sink.Init(config.Sink)
// if err != nil {
// log.Print(err)
// return
// }
// sinkChannel := make(chan bool)
// mproxy.Init(sinkChannel, &wg)
// // Setup receiver
// if len(config.Receiver.Type) > 0 && config.Receiver.Type != "none" {
// if _, found := Receivers[config.Receiver.Type]; !found {
// log.Print("Invalid receiver type '", config.Receiver.Type, "' in configuration")
// return
// } else {
// recv = Receivers[config.Receiver.Type]
// err = recv.Init(config.Receiver, sink)
// if err == nil {
// use_recv = true
// } else {
// log.Print(err)
// }
// }
// }
// // Register interrupt handler
// prepare_shutdown(&wg, &config, sink, recv, clicfg["pidfile"])
// // Register interrupt handler
// prepare_shutdown(&wg, &config, sink, recv, clicfg["pidfile"])
// // Initialize all collectors
// tmp := make([]string, 0)
// for _, c := range config.Collectors {
// col := Collectors[c]
// conf, found := config.CollectConfigs[c]
// if !found {
// conf = json.RawMessage("")
// }
// err = col.Init([]byte(conf))
// if err != nil {
// log.Print("SKIP ", col.Name(), " (", err.Error(), ")")
// } else if !col.Initialized() {
// log.Print("SKIP ", col.Name(), " (Not initialized)")
// } else {
// log.Print("Start ", col.Name())
// tmp = append(tmp, c)
// }
// }
// config.Collectors = tmp
// config.DefTags["hostname"] = host
// // Initialize all collectors
// tmp := make([]string, 0)
// for _, c := range config.Collectors {
// col := Collectors[c]
// conf, found := config.CollectConfigs[c]
// if !found {
// conf = json.RawMessage("")
// }
// err = col.Init([]byte(conf))
// if err != nil {
// log.Print("SKIP ", col.Name(), " (", err.Error(), ")")
// } else if !col.Initialized() {
// log.Print("SKIP ", col.Name(), " (Not initialized)")
// } else {
// log.Print("Start ", col.Name())
// tmp = append(tmp, c)
// }
// }
// config.Collectors = tmp
// config.DefTags["hostname"] = host
// // Setup up ticker loop
// if clicfg["once"] != "true" {
// log.Print("Running loop every ", time.Duration(config.Interval)*time.Second)
// } else {
// log.Print("Running loop only once")
// }
// ticker := time.NewTicker(time.Duration(config.Interval) * time.Second)
// done := make(chan bool)
// // Setup up ticker loop
// if clicfg["once"] != "true" {
// log.Print("Running loop every ", time.Duration(config.Interval)*time.Second)
// } else {
// log.Print("Running loop only once")
// }
// ticker := time.NewTicker(time.Duration(config.Interval) * time.Second)
// done := make(chan bool)
// // Storage for all node metrics
// tmpPoints := make([]lp.MutableMetric, 0)
// // Storage for all node metrics
// tmpPoints := make([]lp.MutableMetric, 0)
// // Start receiver
// if use_recv {
// recv.Start()
// }
// // Start receiver
// if use_recv {
// recv.Start()
// }
// go func() {
// for {
// select {
// case <-done:
// return
// case t := <-ticker.C:
// go func() {
// for {
// select {
// case <-done:
// return
// case t := <-ticker.C:
// // Read all collectors are sort the results in the right
// // storage locations
// for _, c := range config.Collectors {
// col := Collectors[c]
// col.Read(time.Duration(config.Duration), &tmpPoints)
// // Read all collectors are sort the results in the right
// // storage locations
// for _, c := range config.Collectors {
// col := Collectors[c]
// col.Read(time.Duration(config.Duration), &tmpPoints)
// for {
// if len(tmpPoints) == 0 {
// break
// }
// p := tmpPoints[0]
// for k, v := range config.DefTags {
// p.AddTag(k, v)
// p.SetTime(t)
// }
// sink.Write(p)
// tmpPoints = tmpPoints[1:]
// }
// }
// for {
// if len(tmpPoints) == 0 {
// break
// }
// p := tmpPoints[0]
// for k, v := range config.DefTags {
// p.AddTag(k, v)
// p.SetTime(t)
// }
// sink.Write(p)
// tmpPoints = tmpPoints[1:]
// }
// }
// if err := sink.Flush(); err != nil {
// log.Printf("sink error: %s\n", err)
// }
// if clicfg["once"] == "true" {
// shutdown(&wg, config.Collectors, sink, recv, clicfg["pidfile"])
// return
// }
// }
// }
// }()
// if err := sink.Flush(); err != nil {
// log.Printf("sink error: %s\n", err)
// }
// if clicfg["once"] == "true" {
// shutdown(&wg, config.Collectors, sink, recv, clicfg["pidfile"])
// return
// }
// }
// }
// }()
// Wait until receiving an interrupt
rcfg.Sync.Wait()

View File

@ -2,9 +2,8 @@ package receivers
import (
// "time"
influx "github.com/influxdata/line-protocol"
lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric"
influx "github.com/influxdata/line-protocol"
)
type ReceiverConfig struct {

View File

@ -2,12 +2,12 @@ package receivers
import (
"errors"
influx "github.com/influxdata/line-protocol"
"fmt"
lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric"
influx "github.com/influxdata/line-protocol"
nats "github.com/nats-io/nats.go"
"log"
"time"
"fmt"
)
type NatsReceiverConfig struct {
@ -37,7 +37,7 @@ func (r *NatsReceiver) Init(config ReceiverConfig) error {
len(r.config.Database) == 0 {
return errors.New("Not all configuration variables set required by NatsReceiver")
}
r.meta = map[string]string{"source" : r.name}
r.meta = map[string]string{"source": r.name}
r.addr = r.config.Addr
if len(r.addr) == 0 {
r.addr = nats.DefaultURL
@ -89,4 +89,3 @@ func (r *NatsReceiver) Close() {
r.nc.Close()
}
}

View File

@ -1,18 +1,17 @@
package receivers
import (
"encoding/json"
lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric"
"sync"
"log"
"os"
"encoding/json"
"sync"
)
var AvailableReceivers = map[string]Receiver{
"nats": &NatsReceiver{},
}
type receiveManager struct {
inputs []Receiver
output chan lp.CCMetric
@ -29,7 +28,6 @@ type ReceiveManager interface {
Close()
}
func (rm *receiveManager) Init(wg *sync.WaitGroup, receiverConfigFile string) error {
rm.inputs = make([]Receiver, 0)
rm.output = nil
@ -52,22 +50,21 @@ func (rm *receiveManager) Init(wg *sync.WaitGroup, receiverConfigFile string) er
for _, raw := range rawConfigs {
log.Print("[ReceiveManager] ", string(raw))
rm.AddInput(raw)
// if _, found := AvailableReceivers[k.Type]; !found {
// log.Print("[ReceiveManager] SKIP Config specifies unknown receiver 'type': ", k.Type)
// continue
// }
// r := AvailableReceivers[k.Type]
// err = r.Init(k)
// if err != nil {
// log.Print("[ReceiveManager] SKIP Receiver ", k.Type, " cannot be initialized: ", err.Error())
// continue
// }
// rm.inputs = append(rm.inputs, r)
// if _, found := AvailableReceivers[k.Type]; !found {
// log.Print("[ReceiveManager] SKIP Config specifies unknown receiver 'type': ", k.Type)
// continue
// }
// r := AvailableReceivers[k.Type]
// err = r.Init(k)
// if err != nil {
// log.Print("[ReceiveManager] SKIP Receiver ", k.Type, " cannot be initialized: ", err.Error())
// continue
// }
// rm.inputs = append(rm.inputs, r)
}
return nil
}
func (rm *receiveManager) Start() {
rm.wg.Add(1)
@ -76,34 +73,34 @@ func (rm *receiveManager) Start() {
r.Start()
}
log.Print("[ReceiveManager] STARTED\n")
// go func() {
// for {
//ReceiveManagerLoop:
// select {
// case <- rm.done:
// log.Print("ReceiveManager done\n")
// rm.wg.Done()
// break ReceiveManagerLoop
// default:
// for _, c := range rm.inputs {
//ReceiveManagerInputLoop:
// select {
// case <- rm.done:
// log.Print("ReceiveManager done\n")
// rm.wg.Done()
// break ReceiveManagerInputLoop
// case p := <- c:
// log.Print("ReceiveManager: ", p)
// rm.output <- p
// default:
// }
// }
// }
// }
// }()
// for _, r := range rm.inputs {
// r.Close()
// }
// go func() {
// for {
//ReceiveManagerLoop:
// select {
// case <- rm.done:
// log.Print("ReceiveManager done\n")
// rm.wg.Done()
// break ReceiveManagerLoop
// default:
// for _, c := range rm.inputs {
//ReceiveManagerInputLoop:
// select {
// case <- rm.done:
// log.Print("ReceiveManager done\n")
// rm.wg.Done()
// break ReceiveManagerInputLoop
// case p := <- c:
// log.Print("ReceiveManager: ", p)
// rm.output <- p
// default:
// }
// }
// }
// }
// }()
// for _, r := range rm.inputs {
// r.Close()
// }
}
func (rm *receiveManager) AddInput(rawConfig json.RawMessage) error {

View File

@ -7,8 +7,8 @@ import (
"net/http"
"time"
influx "github.com/influxdata/line-protocol"
lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric"
influx "github.com/influxdata/line-protocol"
)
type HttpSink struct {

View File

@ -4,8 +4,8 @@ import (
"bytes"
"errors"
"fmt"
influx "github.com/influxdata/line-protocol"
lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric"
influx "github.com/influxdata/line-protocol"
nats "github.com/nats-io/nats.go"
"log"
"time"

View File

@ -1,14 +1,13 @@
package sinks
import (
"encoding/json"
lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric"
"sync"
"log"
"os"
"encoding/json"
"sync"
)
type SinkEntity struct {
config json.RawMessage
output Sink
@ -21,7 +20,6 @@ var AvailableSinks = map[string]Sink{
"http": &HttpSink{},
}
type sinkManager struct {
input chan lp.CCMetric
outputs []Sink
@ -38,7 +36,6 @@ type SinkManager interface {
Close()
}
func (sm *sinkManager) Init(wg *sync.WaitGroup, sinkConfigFile string) error {
sm.input = nil
sm.outputs = make([]Sink, 0)
@ -69,28 +66,26 @@ func (sm *sinkManager) Init(wg *sync.WaitGroup, sinkConfigFile string) error {
return nil
}
func (sm *sinkManager) Start() {
sm.wg.Add(1)
batchcount := 20
go func() {
for {
SinkManagerLoop:
SinkManagerLoop:
select {
case <- sm.done:
case <-sm.done:
for _, s := range sm.outputs {
s.Close()
}
log.Print("[SinkManager] DONE\n")
sm.wg.Done()
break SinkManagerLoop
case p := <- sm.input:
case p := <-sm.input:
log.Print("[SinkManager] WRITE ", p)
for _, s := range sm.outputs {
s.Write(p)
}
if (batchcount == 0) {
if batchcount == 0 {
log.Print("[SinkManager] FLUSH")
for _, s := range sm.outputs {
s.Flush()