You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
188 lines
4.6 KiB
188 lines
4.6 KiB
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"net/url"
|
|
"os"
|
|
"reflect"
|
|
"time"
|
|
|
|
httptransport "github.com/go-openapi/runtime/client"
|
|
"github.com/spf13/viper"
|
|
cusClient "github.com/Cyclops-Labs/cyclops-4-hpc.git/services/customerdb/client"
|
|
eeClient "github.com/Cyclops-Labs/cyclops-4-hpc.git/services/eventsengine/client"
|
|
eeModels "github.com/Cyclops-Labs/cyclops-4-hpc.git/services/eventsengine/models"
|
|
udrModels "github.com/Cyclops-Labs/cyclops-4-hpc.git/services/udr/models"
|
|
l "gitlab.com/cyclops-utilities/logging"
|
|
)
|
|
|
|
var (
|
|
version string
|
|
cfg configuration
|
|
pipeU chan interface{}
|
|
pipeE chan interface{}
|
|
reportClient *eeClient.EventEngineManagementAPI
|
|
zombiesClient *cusClient.CustomerDatabaseManagement
|
|
)
|
|
|
|
// kafkaStart handles the initialization of the kafka service.
|
|
// This is a sample function with the most basic usage of the kafka service, it
|
|
// should be redefined to match the needs of the service.
|
|
// Returns:
|
|
// - ch: a interface{} channel to be able to send things through the kafka topic
|
|
// generated.
|
|
func kafkaStart() (chUDR, chEvents chan interface{}) {
|
|
|
|
l.Trace.Printf("[MAIN] Intializing Kafka\n")
|
|
|
|
chUDR = make(chan interface{}, 1000)
|
|
chEvents = make(chan interface{}, 1000)
|
|
|
|
handler := kafkaHandlerConf{
|
|
out: []kafkaPackage{
|
|
{
|
|
topic: cfg.Kafka.TopicUDR,
|
|
channel: chUDR,
|
|
},
|
|
{
|
|
topic: cfg.Kafka.TopicEEngine,
|
|
channel: chEvents,
|
|
},
|
|
},
|
|
}
|
|
|
|
kafkaHandler(handler)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
// report handles the process of sending the event or usage to the respective
|
|
// service.
|
|
// Parameters:
|
|
// - object: an interface{} reference with the event/usage to be sent.
|
|
func report(object interface{}) {
|
|
|
|
l.Trace.Printf("[REPORT] The reporting process has been started.\n")
|
|
|
|
if reflect.TypeOf(object) == reflect.TypeOf(udrModels.Usage{}) {
|
|
|
|
l.Trace.Printf("[REPORT] UDR Object detected. Sending through kafka.\n")
|
|
|
|
pipeU <- object
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if reflect.TypeOf(object) == reflect.TypeOf(eeModels.Event{}) {
|
|
|
|
l.Trace.Printf("[REPORT] Event Object detected. Sending through kafka.\n")
|
|
|
|
pipeE <- object
|
|
|
|
return
|
|
|
|
}
|
|
|
|
fail := "the provided object doesn't belong to UDR or EE models"
|
|
|
|
l.Warning.Printf("[REPORT] Something went wrong while processing the object, check with the administrator. Error: %v.\n", fail)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
func init() {
|
|
|
|
confFile := flag.String("conf", "./config", "configuration file path (without toml extension)")
|
|
|
|
flag.Parse()
|
|
|
|
//placeholder code as the default value will ensure this situation will never arise
|
|
if len(*confFile) == 0 {
|
|
|
|
fmt.Printf("Usage: Collector-TYPE -conf=/path/to/configuration/file\n")
|
|
|
|
os.Exit(0)
|
|
|
|
}
|
|
|
|
// err := gcfg.ReadFileInto(&cfg, *confFile)
|
|
viper.SetConfigName(*confFile) // name of config file (without extension)
|
|
viper.SetConfigType("toml")
|
|
viper.AddConfigPath(".") // path to look for the config file in
|
|
|
|
err := viper.ReadInConfig() // Find and read the config file
|
|
|
|
if err != nil {
|
|
|
|
// TODO(murp) - differentiate between file not found and formatting error in
|
|
// config file)
|
|
fmt.Printf("[MAIN] Failed to parse configuration data: %s\nCorrect usage: Collector-TYPE -conf=/path/to/configuration/file\n", err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
cfg = parseConfig()
|
|
|
|
e := l.InitLogger(cfg.General.LogFile, cfg.General.LogLevel, cfg.General.LogToConsole)
|
|
|
|
if e != nil {
|
|
|
|
fmt.Printf("[MAIN] Initialization of the logger failed. Error: %v\n", e)
|
|
|
|
}
|
|
|
|
l.Info.Printf("Cyclops Labs Collector TYPE version %v initialized\n", version)
|
|
|
|
dumpConfig(cfg)
|
|
|
|
// Let's start the HTTP Server and Gauges for Prometheus
|
|
prometheusStart()
|
|
|
|
}
|
|
|
|
func main() {
|
|
|
|
// If needed here is the initialization for the kafka sender:
|
|
pipeU, pipeE = kafkaStart()
|
|
|
|
// Here we start the client instantiation to send reports to the EventsEngine.
|
|
eeConfig := eeClient.Config{
|
|
URL: &url.URL{
|
|
Host: cfg.Services["eventsengine"],
|
|
Path: eeClient.DefaultBasePath,
|
|
Scheme: "http",
|
|
},
|
|
AuthInfo: httptransport.APIKeyAuth(cfg.APIKey.Key, cfg.APIKey.Place, cfg.APIKey.Token),
|
|
}
|
|
|
|
reportClient = eeClient.New(eeConfig)
|
|
|
|
// Here we start the client instantiation to get the canceled customers to check for zombies.
|
|
cusConfig := cusClient.Config{
|
|
URL: &url.URL{
|
|
Host: cfg.Services["customerdb"],
|
|
Path: cusClient.DefaultBasePath,
|
|
Scheme: "http",
|
|
},
|
|
AuthInfo: httptransport.APIKeyAuth(cfg.APIKey.Key, cfg.APIKey.Place, cfg.APIKey.Token),
|
|
}
|
|
|
|
zombiesClient = cusClient.New(cusConfig)
|
|
|
|
// Let's lunch the first collection process..
|
|
go collect()
|
|
|
|
// cfg.General.Periodicity should be changed to cfg.General.ObjectPeriodicity
|
|
// in the case you need the long (8h) periodicity.
|
|
for range time.NewTicker(time.Duration(cfg.General.Periodicity) * time.Minute).C {
|
|
|
|
go collect()
|
|
|
|
}
|
|
|
|
}
|
|
|