chain_exporter/alerter/main.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
}