diff --git a/cmd/mount.go b/cmd/mount.go index 915dd5dcc9d5..0481dd7e119d 100644 --- a/cmd/mount.go +++ b/cmd/mount.go @@ -360,6 +360,8 @@ func initBackgroundTasks(c *cli.Context, vfsConf *vfs.Config, metaConf *meta.Con vfsConf.Port.ConsulAddr = c.String("consul") } if !metaConf.ReadOnly && !metaConf.NoBGJob && vfsConf.BackupMeta > 0 { + registerer.MustRegister(vfs.LastBackupTimeG) + registerer.MustRegister(vfs.LastBackupDurationG) go vfs.Backup(m, blob, vfsConf.BackupMeta) } if !c.Bool("no-usage-report") { diff --git a/pkg/vfs/backup.go b/pkg/vfs/backup.go index c31ee5f6cd88..33bb5342e5ff 100644 --- a/pkg/vfs/backup.go +++ b/pkg/vfs/backup.go @@ -27,6 +27,18 @@ import ( "github.com/juicedata/juicefs/pkg/object" osync "github.com/juicedata/juicefs/pkg/sync" "github.com/juicedata/juicefs/pkg/utils" + "github.com/prometheus/client_golang/prometheus" +) + +var ( + LastBackupTimeG = prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "last_successful_backup", + Help: "Last successful backup.", + }) + LastBackupDurationG = prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "last_backup_duration", + Help: "Last backup duration.", + }) ) // Backup metadata periodically in the object storage @@ -66,10 +78,12 @@ func Backup(m meta.Meta, blob object.ObjectStorage, interval time.Duration) { go cleanupBackups(blob, now) logger.Debugf("backup metadata started") if err = backup(m, blob, now); err == nil { + LastBackupTimeG.Set(float64(now.UnixNano()) / 1e9) logger.Infof("backup metadata succeed, used %s", time.Since(now)) } else { logger.Warnf("backup metadata failed: %s", err) } + LastBackupDurationG.Set(time.Since(now).Seconds()) } } }