package receivers import ( "encoding/json" "fmt" cclog "github.com/ClusterCockpit/cc-metric-collector/internal/ccLogger" ) // SampleReceiver configuration: receiver type, listen address, port type SampleReceiverConfig struct { Type string `json:"type"` Addr string `json:"address"` Port string `json:"port"` } type SampleReceiver struct { receiver config SampleReceiverConfig // Storage for static information meta map[string]string // Use in case of own go routine // done chan bool // wg sync.WaitGroup } // Implement functions required for Receiver interface // Start(), Close() // See: metricReceiver.go func (r *SampleReceiver) Start() { cclog.ComponentDebug(r.name, "START") // Start server process like http.ListenAndServe() // or use own go routine but always make sure it exits // as soon as it gets the signal of the r.done channel // r.wg.Add(1) // go func() { // for { // select { // case <-r.done: // r.wg.Done() // return // } // } // r.wg.Done() // }() } // Close receiver: close network connection, close files, close libraries, ... func (r *SampleReceiver) Close() { cclog.ComponentDebug(r.name, "CLOSE") // Close server like http.Shutdown() // in case of own go routine, send the signal and wait // r.done <- true // r.wg.Wait() } // New function to create a new instance of the receiver // Initialize the receiver by giving it a name and reading in the config JSON func NewSampleReceiver(name string, config json.RawMessage) (Receiver, error) { r := new(SampleReceiver) // Set name of SampleReceiver // The name should be chosen in such a way that different instances of SampleReceiver can be distinguished r.name = fmt.Sprintf("SampleReceiver(%s)", name) // Set static information r.meta = map[string]string{"source": r.name} // Set defaults in r.config // Allow overwriting these defaults by reading config JSON // Read the sample receiver specific JSON config 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 } } // Check that all required fields in the configuration are set // Use 'if len(r.config.Option) > 0' for strings return r, nil }