diff --git a/authnode/server.go b/authnode/server.go index 2c8b1aaac..fb939ca22 100644 --- a/authnode/server.go +++ b/authnode/server.go @@ -30,6 +30,7 @@ import ( "github.com/cubefs/cubefs/util/config" "github.com/cubefs/cubefs/util/cryptoutil" "github.com/cubefs/cubefs/util/errors" + "github.com/cubefs/cubefs/util/exporter" "github.com/cubefs/cubefs/util/log" ) @@ -225,7 +226,7 @@ func (m *Server) Start(cfg *config.Config) (err error) { m.cluster.PKIKey.EnableHTTPS = false } m.authProxy = m.newAuthProxy() - + exporter.RegistConsul(m.clusterName, cfg.GetString("role"), cfg) m.cluster.scheduleTask() m.startHTTPService() m.wg.Add(1) diff --git a/client/fuse.go b/client/fuse.go index b17ad0f40..dd5c958ca 100644 --- a/client/fuse.go +++ b/client/fuse.go @@ -515,6 +515,9 @@ func main() { exporter.Init(ModuleName, cfg) exporter.RegistConsul(super.ClusterName(), ModuleName, cfg) + metric := exporter.NewVersionMetrics(ModuleName) + defer metric.Stop() + go metric.Start() err = log.OutputPid(opt.Logpath, ModuleName) if err != nil { diff --git a/cmd/cmd.go b/cmd/cmd.go index 9197951ab..19705f32f 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -41,6 +41,7 @@ import ( "github.com/cubefs/cubefs/util/auditlog" "github.com/cubefs/cubefs/util/config" "github.com/cubefs/cubefs/util/errors" + "github.com/cubefs/cubefs/util/exporter" "github.com/cubefs/cubefs/util/log" sysutil "github.com/cubefs/cubefs/util/sys" "github.com/cubefs/cubefs/util/ump" @@ -339,6 +340,10 @@ func main() { } interceptSignal(server) + exporter.Init(role, cfg) + versionMetric := exporter.NewVersionMetrics(role) + go versionMetric.Start() + defer versionMetric.Stop() err = server.Start(cfg) if err != nil { log.LogFlush() diff --git a/datanode/server.go b/datanode/server.go index 214b089fb..5906d5d43 100644 --- a/datanode/server.go +++ b/datanode/server.go @@ -232,7 +232,6 @@ func doStart(server common.Server, cfg *config.Config) (err error) { return } - exporter.Init(ModuleName, cfg) s.registerMetrics() s.register(cfg) diff --git a/lcnode/server.go b/lcnode/server.go index 3462d19f2..a4d6f1676 100644 --- a/lcnode/server.go +++ b/lcnode/server.go @@ -88,10 +88,9 @@ func doStart(s common.Server, cfg *config.Config) (err error) { return } - exporter.Init(ModuleName, cfg) exporter.RegistConsul(l.clusterID, ModuleName, cfg) - log.LogInfo("lcnode start successfully") + return } diff --git a/metanode/metanode.go b/metanode/metanode.go index cf9f3c459..6bee1e485 100644 --- a/metanode/metanode.go +++ b/metanode/metanode.go @@ -159,7 +159,6 @@ func doStart(s common.Server, cfg *config.Config) (err error) { go m.startUpdateNodeInfo() - exporter.Init(cfg.GetString("role"), cfg) m.startStat() // check local partition compare with master ,if lack,then not start diff --git a/objectnode/server.go b/objectnode/server.go index 82c2314ea..186a23643 100644 --- a/objectnode/server.go +++ b/objectnode/server.go @@ -422,7 +422,6 @@ func handleStart(s common.Server, cfg *config.Config) (err error) { return } - exporter.Init(cfg.GetString("role"), cfg) exporter.RegistConsul(ci.Cluster, cfg.GetString("role"), cfg) log.LogInfo("object subsystem start success") diff --git a/proto/version.go b/proto/version.go index 335743308..aafb5a224 100644 --- a/proto/version.go +++ b/proto/version.go @@ -24,3 +24,31 @@ func DumpVersion(role string) string { CommitID, runtime.Version(), runtime.GOOS, runtime.GOARCH, BuildTime) } + +type VersionInfo struct { + Role string + Version string + Branch string + Commit string + Build string +} + +func (v VersionInfo) ToMap() map[string]string { + return map[string]string{ + "role": v.Role, + "version": v.Version, + "branch": v.Branch, + "commit": v.Commit, + "build": v.Build, + } +} + +func GetVersion(role string) VersionInfo { + return VersionInfo{ + Role: role, + Version: Version, + Branch: BranchName, + Commit: CommitID, + Build: fmt.Sprintf("%s %s %s %s\n", runtime.Version(), runtime.GOOS, runtime.GOARCH, BuildTime), + } +} diff --git a/util/exporter/exporter.go b/util/exporter/exporter.go index 3976b030f..36426cd49 100644 --- a/util/exporter/exporter.go +++ b/util/exporter/exporter.go @@ -46,12 +46,13 @@ const ( ChSize = 1024 * 10 // collect chan size // monitor label name - Vol = "vol" - Disk = "disk" - PartId = "partid" - Op = "op" - Type = "type" - Err = "err" + Vol = "vol" + Disk = "disk" + PartId = "partid" + Op = "op" + Type = "type" + Err = "err" + Version = "version" ) var ( diff --git a/util/exporter/version.go b/util/exporter/version.go new file mode 100644 index 000000000..9852ce2b3 --- /dev/null +++ b/util/exporter/version.go @@ -0,0 +1,57 @@ +package exporter + +import ( + "time" + + "github.com/cubefs/cubefs/proto" + "github.com/cubefs/cubefs/util/log" +) + +const StatPeriod = time.Minute * time.Duration(1) + +type VersionMetrics struct { + stopC chan struct{} + Metric *Counter + moduleName string + statPeriod time.Duration +} + +func NewVersionMetrics(module string) *VersionMetrics { + return &VersionMetrics{ + moduleName: module, + Metric: NewCounter(Version), + stopC: make(chan struct{}), + statPeriod: StatPeriod, + } +} + +func (m *VersionMetrics) SetStatPeriod(period time.Duration) { + m.statPeriod = period +} + +func (m *VersionMetrics) Start() { + ticker := time.NewTicker(m.statPeriod) + for { + select { + case <-m.stopC: + ticker.Stop() + log.LogInfof("stop version metrics ticker") + return + case <-ticker.C: + m.doStat() + } + } +} + +func (m *VersionMetrics) Stop() { + close(m.stopC) + log.LogInfof("stop version metrics") +} + +func (m *VersionMetrics) doStat() { + m.setVersionMetrics() +} + +func (m *VersionMetrics) setVersionMetrics() { + m.Metric.AddWithLabels(1, proto.GetVersion(m.moduleName).ToMap()) +}