package main import ( "errors" "flag" "fmt" "net/http" "os" "rbd_exporter/mytypes" "rbd_exporter/metrics" "rbd_exporter/logger" "rbd_exporter/connection" "github.com/prometheus/client_golang/prometheus/promhttp" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) var params mytypes.Params var mainlogger *zap.SugaredLogger // Here I initialize logger func loggerInit() *zap.SugaredLogger { config := zap.NewDevelopmentConfig() config.EncoderConfig.TimeKey = "timestamp" config.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder logger, err := config.Build() if err != nil { panic(fmt.Sprintf("Logger set up failed: %v", err)) } defer logger.Sync() return logger.Sugar() } // This func runs even before main() func init() { config_file := flag.String("config", "/etc/ceph/ceph.conf", "placement of ceph config file") _keyring := flag.String("keyring", "/etc/ceph/ceph.client.admin.keyring", "placement of ceph keyring file") flag.Parse() params.Config = *config_file params.Keyring = *_keyring mainlogger = loggerInit() logger.SetLogger(mainlogger) mainlogger.Info("Setting up logger is complete successfully") mainlogger.Info("Registering prom metrics") } func main() { cephConn, err := connection.Connect(params) if err != nil { fmt.Println(err) if wrapped := errors.Unwrap(err); wrapped != nil { fmt.Println(wrapped) } os.Exit(1) } defer cephConn.Conn.Shutdown() mainlogger.Info("Successfully connected to a cluster") http.Handle("/metrics", promhttp.Handler()) // HTTP runs in separate thread cuz it blocks futher execution of main go func() { mainlogger.Info("Starting http server") // Here I check for errors if HTTP fails if err := http.ListenAndServe(":9040", nil); err != nil { mainlogger.Fatalf("HTTP server failed to start %v", err) } mainlogger.Info("HTTP server started") }() go metrics.GetMetrics(cephConn) select {} }