OSDN Git Service

fix for https://github.com/Bytom/vapor/pull/374#discussion_r318669877
[bytom/vapor.git] / toolbar / precog / monitor / stats.go
index 684c0c6..d82f308 100644 (file)
@@ -33,13 +33,13 @@ func (m *monitor) upSertNode(node *config.Node) error {
        if node.XPub != nil {
                ormNode.Xpub = node.XPub.String()
        }
-       ormNode.Host = node.Host
+       ormNode.IP = node.IP
        ormNode.Port = node.Port
        return m.db.Where(&orm.Node{PublicKey: ormNode.PublicKey}).
                Assign(&orm.Node{
                        Xpub:  ormNode.Xpub,
                        Alias: ormNode.Alias,
-                       Host:  ormNode.Host,
+                       IP:    ormNode.IP,
                        Port:  ormNode.Port,
                }).FirstOrCreate(ormNode).Error
 }
@@ -60,7 +60,7 @@ func (m *monitor) processDialResults() error {
        for _, peer := range m.sw.GetPeers().List() {
                xPub := &chainkd.XPub{}
                if err := xPub.UnmarshalText([]byte(peer.Key)); err != nil {
-                       log.Error(err)
+                       log.WithFields(log.Fields{"xpub": peer.Key}).Error("unmarshal xpub")
                        continue
                }
 
@@ -138,49 +138,59 @@ func (m *monitor) processPeerInfo(dbTx *gorm.DB, peerInfo *peers.PeerInfo) error
                return err
        }
 
-       log.Debugf("peerInfo ping: %v", peerInfo.Ping)
+       log.WithFields(log.Fields{"ping": peerInfo.Ping}).Debug("peerInfo")
        ping, err := time.ParseDuration(peerInfo.Ping)
        if err != nil {
-               log.Debugf("parse ping time err: %v", err)
+               return err
        }
 
+       now := time.Now()
+       yesterday := now.Add(-24 * time.Hour)
        var ormNodeLivenesses []*orm.NodeLiveness
        if err := dbTx.Model(&orm.NodeLiveness{}).
-               Where("node_id = ? AND updated_at > ?", ormNode.ID, time.Now().Add(-24*time.Hour)).
-               Order(fmt.Sprintf("created_at", "DESC")).
-               Find(ormNodeLivenesses).Error; err != nil {
+               Where("node_id = ? AND updated_at >= ?", ormNode.ID, yesterday).
+               Order(fmt.Sprintf("created_at %s", "DESC")).
+               Find(&ormNodeLivenesses).Error; err != nil {
                return err
        }
 
-       lastLiveness := ormNodeLivenesses[0]
-       if lastLiveness.Status == common.NodeOfflineStatus {
+       // update latest liveness
+       latestLiveness := ormNodeLivenesses[0]
+       if latestLiveness.Status == common.NodeOfflineStatus {
                return fmt.Errorf("node %s latest liveness status error", ormNode.PublicKey)
        }
 
        lantencyMS := ping.Nanoseconds() / 1000
        if lantencyMS != 0 {
-               lastLiveness.AvgLantencyMS = sql.NullInt64{
-                       Int64: (lastLiveness.AvgLantencyMS.Int64*int64(lastLiveness.PongTimes) + lantencyMS) / int64(lastLiveness.PongTimes+1),
+               latestLiveness.AvgLantencyMS = sql.NullInt64{
+                       Int64: (latestLiveness.AvgLantencyMS.Int64*int64(latestLiveness.PongTimes) + lantencyMS) / int64(latestLiveness.PongTimes+1),
                        Valid: true,
                }
        }
-       lastLiveness.PongTimes += 1
+       latestLiveness.PongTimes += 1
        if peerInfo.Height != 0 {
-               lastLiveness.BestHeight = peerInfo.Height
+               latestLiveness.BestHeight = peerInfo.Height
        }
-       if err := dbTx.Save(lastLiveness).Error; err != nil {
+       if err := dbTx.Save(latestLiveness).Error; err != nil {
                return err
        }
 
-       if err := dbTx.Model(&orm.Node{}).Where(&orm.Node{PublicKey: xPub.PublicKey().String()}).
-               UpdateColumn(&orm.Node{
-                       Alias:      peerInfo.Moniker,
-                       Xpub:       peerInfo.ID,
-                       BestHeight: peerInfo.Height,
-                       // LatestDailyUptimeMinutes uint64
-               }).First(ormNode).Error; err != nil {
-               return err
+       // calc LatestDailyUptimeMinutes
+       total := 0 * time.Minute
+       ormNodeLivenesses[0].UpdatedAt = now
+       for _, ormNodeLiveness := range ormNodeLivenesses {
+               if ormNodeLiveness.CreatedAt.Before(yesterday) {
+                       ormNodeLiveness.CreatedAt = yesterday
+               }
+
+               total += ormNodeLiveness.UpdatedAt.Sub(ormNodeLiveness.CreatedAt)
        }
 
-       return nil
+       return dbTx.Model(&orm.Node{}).Where(&orm.Node{PublicKey: xPub.PublicKey().String()}).
+               UpdateColumn(&orm.Node{
+                       Alias:                    peerInfo.Moniker,
+                       Xpub:                     peerInfo.ID,
+                       BestHeight:               peerInfo.Height,
+                       LatestDailyUptimeMinutes: uint64(total.Minutes()),
+               }).First(ormNode).Error
 }