115 lines
3.6 KiB
Go
115 lines
3.6 KiB
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
"os"
|
|
|
|
"oc-monitor/conf"
|
|
|
|
"cloud.o-forge.io/core/oc-lib/logs"
|
|
"github.com/akamensky/argparse"
|
|
"github.com/goraz/onion"
|
|
"github.com/rs/zerolog"
|
|
)
|
|
|
|
var logger zerolog.Logger
|
|
var parser argparse.Parser
|
|
|
|
const defaultConfigFile = "/etc/oc/ocmonitor_conf.json"
|
|
const localConfigFile = "./conf/ocmonitor_conf.json"
|
|
|
|
func main() {
|
|
|
|
// Test if monitor is launched outside (with parameters) or in a k8s environment (env variables sets)
|
|
if os.Getenv("KUBERNETES_SERVICE_HOST") == ""{
|
|
// Not in a k8s environment, get conf from parameters
|
|
parser = *argparse.NewParser("oc-monitor","Launch the execution of a workflow given as a parameter and sends the produced logs to a loki database")
|
|
loadConfig(false, &parser)
|
|
} else {
|
|
// Executed in a k8s environment
|
|
loadConfig(true,nil)
|
|
}
|
|
|
|
logger = logs.CreateLogger("oc-monitor", conf.GetConfig().LokiURL)
|
|
logger.Debug().Msg("Loki URL : " + conf.GetConfig().LokiURL)
|
|
logger.Debug().Msg("Filename : " + conf.GetConfig().ArgoFile)
|
|
logger.Debug().Msg("Container Name : " + conf.GetConfig().ContainerName)
|
|
|
|
// Wait for the argo file to be copied to the pod
|
|
wf_found := false
|
|
for(!wf_found){
|
|
if _, err := os.Stat("./workflows/" + conf.GetConfig().ArgoFile); err == nil {
|
|
wf_found = true
|
|
}
|
|
}
|
|
logger.Debug().Msg("Submitting the argo workflow : " + conf.GetConfig().ArgoFile)
|
|
// // Initialize LokiLogger
|
|
// lokiLogger := NewLokiLogger("http://localhost:3100/loki/api/v1/push") // Replace with your Loki URL
|
|
|
|
// Run the Argo command
|
|
// cmd := exec.Command("argo", "submit", "your-workflow.yaml")
|
|
// output, err := cmd.CombinedOutput()
|
|
// if err != nil {
|
|
// log.Fatalf("failed to run Argo command: %v", err)
|
|
// }
|
|
|
|
// logger.Info().Msg(string(output))
|
|
// // Send logs to Loki
|
|
// if err := lokiLogger.Log(`{job="argo"}`, string(output)); err != nil {
|
|
// log.Fatalf("failed to send logs to Loki: %v", err)
|
|
// }
|
|
|
|
log.Println("Logs sent to Loki successfully.")
|
|
}
|
|
|
|
func loadConfig(is_k8s bool, parser *argparse.Parser){
|
|
|
|
var o *onion.Onion
|
|
|
|
logger = logs.CreateLogger("oc-monitor","")
|
|
configFile := ""
|
|
|
|
l3 := onion.NewEnvLayerPrefix("_", "OCMONITOR")
|
|
l2, err := onion.NewFileLayer(defaultConfigFile, nil)
|
|
if err == nil {
|
|
logger.Info().Msg("Config file found : " + defaultConfigFile)
|
|
configFile = defaultConfigFile
|
|
}
|
|
l1, err := onion.NewFileLayer(localConfigFile, nil)
|
|
if err == nil {
|
|
logger.Info().Msg("Local config file found " + localConfigFile + ", overriding default file")
|
|
configFile = localConfigFile
|
|
}
|
|
if configFile == "" {
|
|
logger.Info().Msg("No config file found, using env")
|
|
o = onion.New(l3)
|
|
} else if l1 == nil && l2 == nil {
|
|
o = onion.New(l1, l2, l3)
|
|
} else if l1 == nil {
|
|
o = onion.New(l2, l3)
|
|
} else if l2 == nil {
|
|
o = onion.New(l1, l3)
|
|
}
|
|
|
|
// These variables can only be retrieved in the onion
|
|
// Variables that don't depend on the environmen (from conf file), can be loaded after
|
|
if (is_k8s){
|
|
// We can't use underscore in the env variable names because it's the delimitor with OCMONITOR too
|
|
conf.GetConfig().LokiURL = o.GetStringDefault("lokiurl", "http://127.0.0.1:3100")
|
|
conf.GetConfig().ArgoFile = o.GetString("argofile")
|
|
conf.GetConfig().ContainerName = o.GetString("containername")
|
|
} else{
|
|
url := parser.String("u", "url", &argparse.Options{Required: true,Default: "http://127.0.0.1:3100"})
|
|
conf.GetConfig().LokiURL = *url
|
|
file := parser.String("f", "file", &argparse.Options{Required: true})
|
|
conf.GetConfig().ArgoFile = *file
|
|
name := parser.String("n", "name", &argparse.Options{Required: true})
|
|
conf.GetConfig().ContainerName = *name
|
|
|
|
err := parser.Parse(os.Args)
|
|
if err != nil {
|
|
logger.Fatal().Msg(parser.Usage(err))
|
|
}
|
|
|
|
}
|
|
} |