package main import ( "flag" "fmt" "log" "net/http" "os" "os/signal" "syscall" "github.com/prometheus/client_golang/prometheus/promhttp" ) func main() { cfgFile := flag.String("config", "config.yaml", "path to config file") flag.Parse() cfg, err := LoadConfig(*cfgFile) if err != nil { log.Fatalf("error loading config: %v", err) } // HTTP server für Prometheus http.Handle("/metrics", promhttp.Handler()) go func() { log.Printf("listening on %s", cfg.ListenAddr) if err := http.ListenAndServe(cfg.ListenAddr, nil); err != nil { log.Fatalf("http server error: %v", err) } }() // Targets starten stop := make(chan struct{}) for _, t := range cfg.Targets { settings := mergeSettings(cfg.Defaults, t) r := NewTargetRunner(t.Name, t.Host, settings) go r.Run(stop) } // sauber beenden sig := make(chan os.Signal, 1) signal.Notify(sig, os.Interrupt, syscall.SIGTERM) <-sig close(stop) fmt.Println("shutting down...") } func mergeSettings(def TargetSettings, t TargetConfig) TargetSettings { out := def if t.Interval != nil { out.Interval = *t.Interval } if t.Timeout != nil { out.Timeout = *t.Timeout } if t.Size != nil { out.Size = *t.Size } if t.HistorySize != nil { out.HistorySize = *t.HistorySize } if t.DNSServer != nil { out.DNSServer = *t.DNSServer } if t.DisableIPv6 != nil { out.DisableIPv6 = *t.DisableIPv6 } return out }