OSDN Git Service

Revert "fk"
[bytom/vapor.git] / toolbar / precog / monitor / stats.go
1 package monitor
2
3 import (
4         "database/sql"
5         "fmt"
6
7         "github.com/jinzhu/gorm"
8         log "github.com/sirupsen/logrus"
9
10         "github.com/vapor/crypto/ed25519/chainkd"
11         "github.com/vapor/netsync/peers"
12         "github.com/vapor/toolbar/precog/common"
13         "github.com/vapor/toolbar/precog/config"
14         "github.com/vapor/toolbar/precog/database/orm"
15 )
16
17 // TODO: get lantency
18 // TODO: get best_height
19 // TODO: decide check_height("best best_height" - "confirmations")
20 // TODO: get blockhash by check_height, get latency
21 // TODO: update lantency, active_time and status
22
23 // create or update: https://github.com/jinzhu/gorm/issues/1307
24 func (m *monitor) upSertNode(node *config.Node) error {
25         if node.XPub != nil {
26                 node.PublicKey = fmt.Sprintf("%v", node.XPub.PublicKey().String())
27         }
28
29         ormNode := &orm.Node{PublicKey: node.PublicKey}
30         if err := m.db.Where(&orm.Node{PublicKey: node.PublicKey}).First(ormNode).Error; err != nil && err != gorm.ErrRecordNotFound {
31                 return err
32         }
33
34         if node.Alias != "" {
35                 ormNode.Alias = node.Alias
36         }
37         if node.XPub != nil {
38                 ormNode.Xpub = node.XPub.String()
39         }
40         ormNode.Host = node.Host
41         ormNode.Port = node.Port
42         return m.db.Where(&orm.Node{PublicKey: ormNode.PublicKey}).
43                 Assign(&orm.Node{
44                         Xpub:  ormNode.Xpub,
45                         Alias: ormNode.Alias,
46                         Host:  ormNode.Host,
47                         Port:  ormNode.Port,
48                 }).FirstOrCreate(ormNode).Error
49 }
50
51 func (m *monitor) savePeerInfo(peerInfo *peers.PeerInfo) error {
52         xPub := &chainkd.XPub{}
53         if err := xPub.UnmarshalText([]byte(peerInfo.ID)); err != nil {
54                 return err
55         }
56
57         ormNode := &orm.Node{}
58         if err := m.db.Model(&orm.Node{}).Where(&orm.Node{PublicKey: xPub.PublicKey().String()}).
59                 UpdateColumn(&orm.Node{
60                         Alias:      peerInfo.Moniker,
61                         Xpub:       peerInfo.ID,
62                         BestHeight: peerInfo.Height,
63                         // LatestDailyUptimeMinutes uint64
64                 }).First(ormNode).Error; err != nil {
65                 return err
66         }
67
68         log.Debug("peerInfo.Ping:", peerInfo.Ping)
69
70         ormNodeLiveness := &orm.NodeLiveness{
71                 NodeID:        ormNode.ID,
72                 BestHeight:    ormNode.BestHeight,
73                 AvgLantencyMS: sql.NullInt64{Int64: 1, Valid: true},
74                 // PingTimes     uint64
75                 // PongTimes     uint64
76         }
77         if err := m.db.Model(&orm.NodeLiveness{}).Where("node_id = ? AND status != ?", ormNode.ID, common.NodeOfflineStatus).
78                 UpdateColumn(&orm.NodeLiveness{
79                         BestHeight:    ormNodeLiveness.BestHeight,
80                         AvgLantencyMS: ormNodeLiveness.AvgLantencyMS,
81                 }).FirstOrCreate(ormNodeLiveness).Error; err != nil {
82                 return err
83         }
84
85         return nil
86 }