97 lines
2.2 KiB
Go
97 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"github.com/certusone/chain_exporter/types"
|
|
"github.com/getsentry/raven-go"
|
|
"github.com/go-pg/pg"
|
|
"github.com/pkg/errors"
|
|
"os"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
type (
|
|
Monitor struct {
|
|
db *pg.DB
|
|
}
|
|
)
|
|
|
|
func main() {
|
|
|
|
if os.Getenv("DB_HOST") == "" {
|
|
panic(errors.New("DB_HOST needs to be set"))
|
|
}
|
|
if os.Getenv("DB_USER") == "" {
|
|
panic(errors.New("DB_USER needs to be set"))
|
|
}
|
|
if os.Getenv("DB_PW") == "" {
|
|
panic(errors.New("DB_PW needs to be set"))
|
|
}
|
|
if os.Getenv("RAVEN_DSN") == "" {
|
|
panic(errors.New("RAVEN_DSN needs to be set"))
|
|
}
|
|
|
|
raven.SetDSN(os.Getenv("RAVEN_DSN"))
|
|
|
|
db := pg.Connect(&pg.Options{
|
|
Addr: os.Getenv("DB_HOST"),
|
|
User: os.Getenv("DB_USER"),
|
|
Password: os.Getenv("DB_PW"),
|
|
})
|
|
defer db.Close()
|
|
|
|
monitor := &Monitor{db}
|
|
for {
|
|
select {
|
|
case <-time.Tick(time.Second):
|
|
err := monitor.sync()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func (m *Monitor) sync() error {
|
|
println("syncing")
|
|
var misses []*types.MissInfo
|
|
err := m.db.Model(&types.MissInfo{}).Where("alerted = FALSE").Select(&misses)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
for _, miss := range misses {
|
|
raven.CaptureError(errors.New("Missed block"), map[string]string{"height": strconv.FormatInt(miss.Height, 10), "time": miss.Time.String(), "address": miss.Address})
|
|
miss.Alerted = true
|
|
_, err = m.db.Model(miss).Where("id = ?", miss.ID).Update()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
var proposals []*types.Proposal
|
|
err = m.db.Model(&types.Proposal{}).Where("alerted = FALSE").Select(&proposals)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
for _, proposal := range proposals {
|
|
if proposal.ProposalStatus == "Passed" || proposal.ProposalStatus == "Rejected" {
|
|
proposal.Alerted = true
|
|
_, err = m.db.Model(proposal).Where("id = ?", proposal.ID).Update()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
continue
|
|
}
|
|
|
|
raven.CaptureMessage("New governance proposal: "+proposal.Title+"\nDescription: "+proposal.Description+"\nStartHeight: "+proposal.VotingStartBlock, map[string]string{"height": strconv.FormatInt(proposal.Height, 10), "type": proposal.Type})
|
|
|
|
proposal.Alerted = true
|
|
_, err = m.db.Model(proposal).Where("id = ?", proposal.ID).Update()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|