learning_go/rbd_exporter/main.go
a.pivkin e125ead164 sss
2025-12-22 09:17:21 +03:00

82 lines
1.9 KiB
Go

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 {}
}