Skip to content

Commit

Permalink
chore: lint.
Browse files Browse the repository at this point in the history
chore: add-back kuji exporter
  • Loading branch information
PFC-developer committed Dec 21, 2023
1 parent 739c9d6 commit 94ecc46
Show file tree
Hide file tree
Showing 7 changed files with 438 additions and 7 deletions.
3 changes: 1 addition & 2 deletions cmd/cosmos-exporter/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,13 @@ import (
"net/http"
"os"

"github.com/pfc-developer/cosmos-exporter/pkg/exporter"
"github.com/rs/zerolog"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"github.com/spf13/viper"

sdk "github.com/cosmos/cosmos-sdk/types"

"github.com/pfc-developer/cosmos-exporter/pkg/exporter"
)

var (
Expand Down
104 changes: 104 additions & 0 deletions cmd/kuji-cosmos-exporter/kuji.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
// original here - https://gist.github.com/jumanzii/031cfea1b2aa3c2a43b63aa62a919285
package main

import (
"context"
"net/http"
"sync"
"time"

oracletypes "github.com/Team-Kujira/core/x/oracle/types"
"github.com/google/uuid"
"github.com/pfc-developer/cosmos-exporter/pkg/exporter"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/rs/zerolog"

sdk "github.com/cosmos/cosmos-sdk/types"
)

/*
type voteMissCounter struct {
MissCount string `json:"miss_count"`
}
*/
type KujiMetrics struct {
votePenaltyCount *prometheus.CounterVec
}

func NewKujiMetrics(reg prometheus.Registerer, config *exporter.ServiceConfig) *KujiMetrics {
m := &KujiMetrics{
votePenaltyCount: prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "cosmos_kujira_oracle_vote_miss_count",
Help: "Vote miss count",
ConstLabels: config.ConstLabels,
},
[]string{"type", "validator"},
),
}

reg.MustRegister(m.votePenaltyCount)

return m
}

func getKujiMetrics(wg *sync.WaitGroup, sublogger *zerolog.Logger, metrics *KujiMetrics, s *exporter.Service, _ *exporter.ServiceConfig, validatorAddress sdk.ValAddress) {
wg.Add(1)

go func() {
defer wg.Done()
sublogger.Debug().Msg("Started querying oracle feeder metrics")
queryStart := time.Now()

oracleClient := oracletypes.NewQueryClient(s.GrpcConn)
response, err := oracleClient.MissCounter(context.Background(), &oracletypes.QueryMissCounterRequest{ValidatorAddr: validatorAddress.String()})
if err != nil {
sublogger.Error().
Err(err).
Msg("Could not get oracle feeder metrics")
return
}

sublogger.Debug().
Float64("request-time", time.Since(queryStart).Seconds()).
Msg("Finished querying oracle feeder metrics")

missCount := float64(response.MissCounter)

metrics.votePenaltyCount.WithLabelValues("miss", validatorAddress.String()).Add(missCount)
}()
}

func KujiraMetricHandler(w http.ResponseWriter, r *http.Request, s *exporter.Service) {
requestStart := time.Now()

sublogger := s.Log.With().
Str("request-id", uuid.New().String()).
Logger()

address := r.URL.Query().Get("address")
myAddress, err := sdk.ValAddressFromBech32(address)
if err != nil {
sublogger.Error().
Str("address", address).
Err(err).
Msg("Could not get address")
return
}
registry := prometheus.NewRegistry()
kujiMetrics := NewKujiMetrics(registry, s.Config)

var wg sync.WaitGroup
getKujiMetrics(&wg, &sublogger, kujiMetrics, s, s.Config, myAddress)

wg.Wait()

h := promhttp.HandlerFor(registry, promhttp.HandlerOpts{})
h.ServeHTTP(w, r)
sublogger.Info().
Str("method", "GET").
Str("endpoint", "/metrics/kujira").
Float64("request-time", time.Since(requestStart).Seconds()).
Msg("Request processed")
}
155 changes: 155 additions & 0 deletions cmd/kuji-cosmos-exporter/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
package main

import (
"fmt"
"net/http"
"os"

"github.com/pfc-developer/cosmos-exporter/pkg/exporter"
"github.com/rs/zerolog"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"github.com/spf13/viper"

sdk "github.com/cosmos/cosmos-sdk/types"
)

var (
config exporter.ServiceConfig
log = zerolog.New(zerolog.ConsoleWriter{Out: os.Stdout}).With().Timestamp().Logger()
)

var rootCmd = &cobra.Command{
Use: "kuji-cosmos-exporter",
Long: "Scrape the data about the validators set, specific validators or wallets in the Cosmos network.",
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
if config.ConfigPath == "" {
config.SetBechPrefixes(cmd)

return nil
}

viper.SetConfigFile(config.ConfigPath)
if err := viper.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
log.Info().Err(err).Msg("Error reading config file")
return err
}
}

// Credits to https://carolynvanslyck.com/blog/2020/08/sting-of-the-viper/
cmd.Flags().VisitAll(func(f *pflag.Flag) {
if !f.Changed && viper.IsSet(f.Name) {
val := viper.Get(f.Name)
if err := cmd.Flags().Set(f.Name, fmt.Sprintf("%v", val)); err != nil {
log.Fatal().Err(err).Msg("Could not set flag")
}
}
})

config.SetBechPrefixes(cmd)

return nil
},
Run: Execute,
}

func Execute(_ *cobra.Command, _ []string) {
logLevel, err := zerolog.ParseLevel(config.LogLevel)
if err != nil {
log.Fatal().Err(err).Msg("Could not parse log level")
}

if config.JSONOutput {
log = zerolog.New(os.Stdout).With().Timestamp().Logger()
}

zerolog.SetGlobalLevel(logLevel)
config.LogConfig(log.Info()).
Str("--oracle", fmt.Sprintf("%t", config.Oracle)).
Msg("Started with following parameters")

sdkconfig := sdk.GetConfig()
sdkconfig.SetBech32PrefixForAccount(config.AccountPrefix, config.AccountPubkeyPrefix)
sdkconfig.SetBech32PrefixForValidator(config.ValidatorPrefix, config.ValidatorPubkeyPrefix)
sdkconfig.SetBech32PrefixForConsensusNode(config.ConsensusNodePrefix, config.ConsensusNodePubkeyPrefix)
sdkconfig.Seal()

s := &exporter.Service{}
s.Log = log
// Setup gRPC connection
err = s.Connect(&config)

if err != nil {
log.Fatal().Err(err).Msg("Could not connect to service")
}
defer func(service *exporter.Service) {
err := service.Close()
if err != nil {
s.Log.Fatal().Err(err).Msg("Could not close service client")
}
}(s)

s.SetChainID(&config)
s.SetDenom(&config)
/*
eventCollector, err := NewEventCollector(TendermintRPC, log, BankTransferThreshold)
if err != nil {
panic(err)
}
eventCollector.Start(cmd.Context())
*/
s.Params = config.Params
s.Wallets = config.Wallets
s.Validators = config.Validators
s.Proposals = config.Proposals
s.Oracle = config.Oracle
s.Params = config.Params
s.Upgrades = config.Upgrades
s.Config = &config

if config.SingleReq {
log.Info().Msg("Starting Single Mode")
http.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) { KujiSingleHandler(w, r, s) })
}
http.HandleFunc("/metrics/wallet", s.WalletHandler)
http.HandleFunc("/metrics/validator", s.ValidatorHandler)
http.HandleFunc("/metrics/validators", s.ValidatorsHandler)
http.HandleFunc("/metrics/params", s.ParamsHandler)
http.HandleFunc("/metrics/general", s.GeneralHandler)

http.HandleFunc("/metrics/delegator", s.DelegatorHandler)
http.HandleFunc("/metrics/proposals", s.ProposalsHandler)
http.HandleFunc("/metrics/upgrade", s.UpgradeHandler)
if config.Prefix == "kujira" {
http.HandleFunc("/metrics/kujira", func(w http.ResponseWriter, r *http.Request) { KujiraMetricHandler(w, r, s) })
}
/*
if Prefix == "sei" {
http.HandleFunc("/metrics/sei", func(w http.ResponseWriter, r *http.Request) {
OracleMetricHandler(w, r, s.grpcConn)
})
}
*/
/*
http.HandleFunc("/metrics/event", func(w http.ResponseWriter, r *http.Request) {
eventCollector.StreamHandler(w, r)
})
*/
log.Info().Str("address", config.ListenAddress).Msg("Listening")
err = http.ListenAndServe(config.ListenAddress, nil) // #nosec
if err != nil {
log.Fatal().Err(err).Msg("Could not start application")
}
}

func main() {
config.SetCommonParameters(rootCmd)

rootCmd.PersistentFlags().BoolVar(&config.Oracle, "oracle", false, "serve oracle info in the single call to /metrics")

if err := rootCmd.Execute(); err != nil {
log.Fatal().Err(err).Msg("Could not start application")
}
}
Loading

0 comments on commit 94ecc46

Please sign in to comment.