package module import ( "context" "errors" "fmt" "git.hlsq.asia/mmorpg/service-common/config" "git.hlsq.asia/mmorpg/service-common/log" "github.com/prometheus/client_golang/prometheus/promhttp" "net/http" "sync" ) // Prometheus 普罗米修斯模块 type Prometheus struct { DefaultModule MetricCfg *config.MetricConfig wg *sync.WaitGroup server *http.Server } func (m *Prometheus) Init() error { m.wg = &sync.WaitGroup{} return nil } func (m *Prometheus) Start(ready *sync.WaitGroup) error { m.wg.Add(1) go func() { defer m.wg.Done() m.server = &http.Server{ Addr: fmt.Sprintf("%v:%v", m.MetricCfg.Prometheus.Address, m.MetricCfg.Prometheus.Port), Handler: promhttp.Handler(), } ready.Done() if err := m.server.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { log.Errorf("prometheus server failed: %v", err.Error()) } log.Infof("prometheus server stop.") }() return nil } func (m *Prometheus) Stop() error { if err := m.server.Shutdown(context.Background()); err != nil { log.Errorf("stop prometheus server failed: %v", err) } m.wg.Wait() return nil }