Skip to content

Commit

Permalink
feat: now exports information about active votes, and if your vote on…
Browse files Browse the repository at this point in the history
… them (or haven't voted yet)
  • Loading branch information
PFC-developer committed Nov 16, 2023
1 parent 54aed26 commit 47daeb5
Show file tree
Hide file tree
Showing 6 changed files with 381 additions and 17 deletions.
60 changes: 59 additions & 1 deletion cmd/inj-cosmos-exporter/single.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ func InjSingleHandler(w http.ResponseWriter, r *http.Request, s *exporter.Servic
var injMetrics *InjMetrics

var proposalMetrics *exporter.ProposalsMetrics
var validatorVotingMetrics *exporter.ValidatorVotingMetrics

if len(s.Validators) > 0 {
validatorMetrics = exporter.NewValidatorMetrics(registry, s.Config)
Expand All @@ -47,7 +48,9 @@ func InjSingleHandler(w http.ResponseWriter, r *http.Request, s *exporter.Servic
if Peggo && Orchestrator != "" {
injMetrics = NewInjMetrics(registry, s.Config)
}

if s.Config.Votes && len(s.Validators) > 0 {
validatorVotingMetrics = exporter.NewValidatorVotingMetrics(registry, s.Config)
}
var wg sync.WaitGroup

exporter.GetGeneralMetrics(&wg, &sublogger, generalMetrics, s, s.Config)
Expand Down Expand Up @@ -112,6 +115,61 @@ func InjSingleHandler(w http.ResponseWriter, r *http.Request, s *exporter.Servic
}
val_wg.Wait()
}
if s.Config.Votes && len(s.Validators) > 0 {
// use 2 groups.
// the first group "prop_wg" allows us to batch the call to get the active props
// the 'BasicMetrics' will then add a request to the outer wait 'wg'.
// we ensure that all the requests are added by waiting for the 'val_wg' to finish before waiting on the 'wg'
var prop_wg sync.WaitGroup
prop_wg.Add(1)
var activeProps []uint64

go func() {
defer prop_wg.Done()
var err error
if s.Config.PropV1 {
activeProps, err = s.GetActiveProposalsV1(&sublogger)
if err != nil {
sublogger.Error().
Err(err).
Msg("Could not get active proposals V1")
}
} else {
activeProps, err = s.GetActiveProposals(&sublogger)
if err != nil {
sublogger.Error().
Err(err).
Msg("Could not get active proposals")
}
}
}()

prop_wg.Wait()

for _, validator := range s.Validators {
valAddress, err := sdk.ValAddressFromBech32(validator)
if err != nil {
sublogger.Error().
Str("address", validator).
Err(err).
Msg("Could not get validator address")

} else {
var accAddress sdk.AccAddress
err := accAddress.Unmarshal(valAddress.Bytes())
if err != nil {
sublogger.Error().
Str("address", validator).
Err(err).
Msg("Could not get acc address")

}
for _, propId := range activeProps {
exporter.GetProposalsVoteMetrics(&wg, &sublogger, validatorVotingMetrics, s, s.Config, propId, valAddress, accAddress)
}
}
}
}
wg.Wait()

h := promhttp.HandlerFor(registry, promhttp.HandlerOpts{})
Expand Down
59 changes: 59 additions & 0 deletions cmd/kuji-cosmos-exporter/single.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ func KujiSingleHandler(w http.ResponseWriter, r *http.Request, s *exporter.Servi
var walletMetrics *exporter.WalletMetrics
var kujiOracleMetrics *KujiMetrics
var proposalMetrics *exporter.ProposalsMetrics
var validatorVotingMetrics *exporter.ValidatorVotingMetrics

if len(s.Validators) > 0 {
validatorMetrics = exporter.NewValidatorMetrics(registry, s.Config)
Expand All @@ -45,6 +46,9 @@ func KujiSingleHandler(w http.ResponseWriter, r *http.Request, s *exporter.Servi
if s.Proposals {
proposalMetrics = exporter.NewProposalsMetrics(registry, s.Config)
}
if s.Config.Votes && len(s.Validators) > 0 {
validatorVotingMetrics = exporter.NewValidatorVotingMetrics(registry, s.Config)
}

var wg sync.WaitGroup

Expand Down Expand Up @@ -104,6 +108,61 @@ func KujiSingleHandler(w http.ResponseWriter, r *http.Request, s *exporter.Servi
if s.Proposals {
exporter.GetProposalsMetrics(&wg, &sublogger, proposalMetrics, s, s.Config, true)
}
if s.Config.Votes && len(s.Validators) > 0 {
// use 2 groups.
// the first group "prop_wg" allows us to batch the call to get the active props
// the 'BasicMetrics' will then add a request to the outer wait 'wg'.
// we ensure that all the requests are added by waiting for the 'val_wg' to finish before waiting on the 'wg'
var prop_wg sync.WaitGroup
prop_wg.Add(1)
var activeProps []uint64

go func() {
defer prop_wg.Done()
var err error
if s.Config.PropV1 {
activeProps, err = s.GetActiveProposalsV1(&sublogger)
if err != nil {
sublogger.Error().
Err(err).
Msg("Could not get active proposals V1")
}
} else {
activeProps, err = s.GetActiveProposals(&sublogger)
if err != nil {
sublogger.Error().
Err(err).
Msg("Could not get active proposals")
}
}
}()

prop_wg.Wait()

for _, validator := range s.Validators {
valAddress, err := sdk.ValAddressFromBech32(validator)
if err != nil {
sublogger.Error().
Str("address", validator).
Err(err).
Msg("Could not get validator address")

} else {
var accAddress sdk.AccAddress
err := accAddress.Unmarshal(valAddress.Bytes())
if err != nil {
sublogger.Error().
Str("address", validator).
Err(err).
Msg("Could not get acc address")

}
for _, propId := range activeProps {
exporter.GetProposalsVoteMetrics(&wg, &sublogger, validatorVotingMetrics, s, s.Config, propId, valAddress, accAddress)
}
}
}
}
wg.Wait()

h := promhttp.HandlerFor(registry, promhttp.HandlerOpts{})
Expand Down
59 changes: 58 additions & 1 deletion cmd/sei-cosmos-exporter/single.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ func SeiSingleHandler(w http.ResponseWriter, r *http.Request, s *exporter.Servic
var seiMetrics *SeiMetrics

var proposalMetrics *exporter.ProposalsMetrics
var validatorVotingMetrics *exporter.ValidatorVotingMetrics

if len(s.Validators) > 0 {
validatorMetrics = exporter.NewValidatorMetrics(registry, s.Config)
Expand All @@ -46,7 +47,9 @@ func SeiSingleHandler(w http.ResponseWriter, r *http.Request, s *exporter.Servic
if s.Oracle {
seiMetrics = NewSeiMetrics(registry, s.Config)
}

if s.Config.Votes && len(s.Validators) > 0 {
validatorVotingMetrics = exporter.NewValidatorVotingMetrics(registry, s.Config)
}
var wg sync.WaitGroup

exporter.GetGeneralMetrics(&wg, &sublogger, generalMetrics, s, s.Config)
Expand Down Expand Up @@ -104,7 +107,61 @@ func SeiSingleHandler(w http.ResponseWriter, r *http.Request, s *exporter.Servic
if s.Proposals {
exporter.GetProposalsMetrics(&wg, &sublogger, proposalMetrics, s, s.Config, true)
}
if s.Config.Votes && len(s.Validators) > 0 {
// use 2 groups.
// the first group "prop_wg" allows us to batch the call to get the active props
// the 'BasicMetrics' will then add a request to the outer wait 'wg'.
// we ensure that all the requests are added by waiting for the 'val_wg' to finish before waiting on the 'wg'
var prop_wg sync.WaitGroup
prop_wg.Add(1)
var activeProps []uint64

go func() {
defer prop_wg.Done()
var err error
if s.Config.PropV1 {
activeProps, err = s.GetActiveProposalsV1(&sublogger)
if err != nil {
sublogger.Error().
Err(err).
Msg("Could not get active proposals V1")
}
} else {
activeProps, err = s.GetActiveProposals(&sublogger)
if err != nil {
sublogger.Error().
Err(err).
Msg("Could not get active proposals")
}
}
}()

prop_wg.Wait()

for _, validator := range s.Validators {
valAddress, err := sdk.ValAddressFromBech32(validator)
if err != nil {
sublogger.Error().
Str("address", validator).
Err(err).
Msg("Could not get validator address")

} else {
var accAddress sdk.AccAddress
err := accAddress.Unmarshal(valAddress.Bytes())
if err != nil {
sublogger.Error().
Str("address", validator).
Err(err).
Msg("Could not get acc address")

}
for _, propId := range activeProps {
exporter.GetProposalsVoteMetrics(&wg, &sublogger, validatorVotingMetrics, s, s.Config, propId, valAddress, accAddress)
}
}
}
}
wg.Wait()

h := promhttp.HandlerFor(registry, promhttp.HandlerOpts{})
Expand Down
Loading

0 comments on commit 47daeb5

Please sign in to comment.