Skip to content

Commit

Permalink
making progress with cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
patrick-ogrady committed Jul 22, 2023
1 parent 33dafbe commit 0db6440
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 263 deletions.
139 changes: 27 additions & 112 deletions examples/basevm/cmd/base-cli/cmd/key.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,11 @@ package cmd
import (
"context"

"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/hypersdk/crypto"
"github.com/ava-labs/hypersdk/rpc"
brpc "github.com/ava-labs/hypersdk/examples/basevm/rpc"
hutils "github.com/ava-labs/hypersdk/utils"
"github.com/fatih/color"
"github.com/spf13/cobra"

"github.com/ava-labs/hypersdk/examples/basevm/consts"
trpc "github.com/ava-labs/hypersdk/examples/basevm/rpc"
"github.com/ava-labs/hypersdk/examples/basevm/utils"
)

var keyCmd = &cobra.Command{
Expand All @@ -27,23 +23,7 @@ var keyCmd = &cobra.Command{
var genKeyCmd = &cobra.Command{
Use: "generate",
RunE: func(*cobra.Command, []string) error {
// TODO: encrypt key
priv, err := crypto.GeneratePrivateKey()
if err != nil {
return err
}
if err := StoreKey(priv); err != nil {
return err
}
publicKey := priv.PublicKey()
if err := StoreDefault(defaultKeyKey, publicKey[:]); err != nil {
return err
}
color.Green(
"created address %s",
utils.Address(publicKey),
)
return nil
return handler.Root().GenerateKey()
},
}

Expand All @@ -56,106 +36,41 @@ var importKeyCmd = &cobra.Command{
return nil
},
RunE: func(_ *cobra.Command, args []string) error {
priv, err := crypto.LoadKey(args[0])
if err != nil {
return err
}
if err := StoreKey(priv); err != nil {
return err
}
publicKey := priv.PublicKey()
if err := StoreDefault(defaultKeyKey, publicKey[:]); err != nil {
return err
}
color.Green(
"imported address %s",
utils.Address(publicKey),
)
return nil
return handler.Root().ImportKey(args[0])
},
}

func lookupSetKeyBalance(choice int, address string, uri string, networkID uint32, chainID ids.ID) error {
// TODO: just load once
cli := brpc.NewJSONRPCClient(uri, networkID, chainID)
balance, err := cli.Balance(context.TODO(), address)
if err != nil {
return err
}
hutils.Outf(
"%d) {{cyan}}address:{{/}} %s {{cyan}}balance:{{/}} %s BASE\n",
choice,
address,
handler.Root().ValueString(ids.Empty, balance),
)
return nil
}

var setKeyCmd = &cobra.Command{
Use: "set",
RunE: func(*cobra.Command, []string) error {
keys, err := GetKeys()
if err != nil {
return err
}
if len(keys) == 0 {
hutils.Outf("{{red}}no stored keys{{/}}\n")
return nil
}
chainID, uris, err := GetDefaultChain()
if err != nil {
return err
}
if len(uris) == 0 {
hutils.Outf("{{red}}no available chains{{/}}\n")
return nil
}
rcli := rpc.NewJSONRPCClient(uris[0])
networkID, _, _, err := rcli.Network(context.TODO())
if err != nil {
return err
}
cli := trpc.NewJSONRPCClient(uris[0], networkID, chainID)
hutils.Outf("{{cyan}}stored keys:{{/}} %d\n", len(keys))
for i := 0; i < len(keys); i++ {
address := utils.Address(keys[i].PublicKey())
balance, err := cli.Balance(context.TODO(), address)
if err != nil {
return err
}
hutils.Outf(
"%d) {{cyan}}address:{{/}} %s {{cyan}}balance:{{/}} %s %s\n",
i,
address,
hutils.FormatBalance(balance),
consts.Symbol,
)
}

// Select key
keyIndex, err := promptChoice("set default key", len(keys))
if err != nil {
return err
}
key := keys[keyIndex]
publicKey := key.PublicKey()
return StoreDefault(defaultKeyKey, publicKey[:])
return handler.Root().SetKey(lookupSetKeyBalance)
},
}

func lookupKeyBalance(pk crypto.PublicKey, uri string, networkID uint32, chainID ids.ID, assetID ids.ID) error {
_, err := handler.GetBalance(context.TODO(), brpc.NewJSONRPCClient(uri, networkID, chainID), pk)
return err
}

var balanceKeyCmd = &cobra.Command{
Use: "balance",
RunE: func(*cobra.Command, []string) error {
ctx := context.Background()

priv, err := GetDefaultKey()
if err != nil {
return err
}
chainID, uris, err := GetDefaultChain()
if err != nil {
return err
}

max := len(uris)
if !checkAllChains {
max = 1
}
for _, uri := range uris[:max] {
hutils.Outf("{{yellow}}uri:{{/}} %s\n", uri)
rcli := rpc.NewJSONRPCClient(uris[0])
networkID, _, _, err := rcli.Network(context.TODO())
if err != nil {
return err
}
if _, err = getBalance(ctx, trpc.NewJSONRPCClient(uri, networkID, chainID), priv.PublicKey()); err != nil {
return err
}
}
return nil
return handler.Root().Balance(checkAllChains, lookupKeyBalance)
},
}
153 changes: 38 additions & 115 deletions examples/basevm/cmd/base-cli/cmd/prometheus.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,10 @@ package cmd

import (
"fmt"
"net/url"
"os"

"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/hypersdk/utils"
"github.com/spf13/cobra"
"gopkg.in/yaml.v2"
)

var prometheusCmd = &cobra.Command{
Expand All @@ -21,120 +19,45 @@ var prometheusCmd = &cobra.Command{
},
}

type PrometheusStaticConfig struct {
Targets []string `yaml:"targets"`
}

type PrometheusScrapeConfig struct {
JobName string `yaml:"job_name"`
StaticConfigs []*PrometheusStaticConfig `yaml:"static_configs"`
MetricsPath string `yaml:"metrics_path"`
}

type PrometheusConfig struct {
Global struct {
ScrapeInterval string `yaml:"scrape_interval"`
EvaluationInterval string `yaml:"evaluation_interval"`
} `yaml:"global"`
ScrapeConfigs []*PrometheusScrapeConfig `yaml:"scrape_configs"`
}

var generatePrometheusCmd = &cobra.Command{
Use: "generate",
RunE: func(_ *cobra.Command, args []string) error {
// Generate Prometheus-compatible endpoints
chainID, uris, err := promptChain("select chainID")
if err != nil {
return err
}
endpoints := make([]string, len(uris))
for i, uri := range uris {
host, err := utils.GetHost(uri)
if err != nil {
return err
}
port, err := utils.GetPort(uri)
if err != nil {
return err
}
endpoints[i] = fmt.Sprintf("%s:%s", host, port)
}

// Create Prometheus YAML
var prometheusConfig PrometheusConfig
prometheusConfig.Global.ScrapeInterval = "15s"
prometheusConfig.Global.EvaluationInterval = "15s"
prometheusConfig.ScrapeConfigs = []*PrometheusScrapeConfig{
{
JobName: "prometheus",
StaticConfigs: []*PrometheusStaticConfig{
{
Targets: endpoints,
},
},
MetricsPath: "/ext/metrics",
},
}
yamlData, err := yaml.Marshal(&prometheusConfig)
if err != nil {
return err
}
if err := os.WriteFile(prometheusFile, yamlData, fsModeWrite); err != nil {
return err
}

// Log useful queries
panels := []string{}
panels = append(panels, fmt.Sprintf("avalanche_%s_blks_processing", chainID))
utils.Outf("{{yellow}}blocks processing:{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, fmt.Sprintf("increase(avalanche_%s_blks_accepted_count[30s])/30", chainID))
utils.Outf("{{yellow}}blocks accepted per second:{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, fmt.Sprintf("increase(avalanche_%s_blks_rejected_count[30s])/30", chainID))
utils.Outf("{{yellow}}blocks rejected per second:{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, fmt.Sprintf("increase(avalanche_%s_vm_hyper_sdk_vm_txs_accepted[30s])/30", chainID))
utils.Outf("{{yellow}}transactions per second:{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, fmt.Sprintf("increase(avalanche_%s_vm_hyper_sdk_chain_state_operations[30s])/30", chainID))
utils.Outf("{{yellow}}state operations per second:{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, fmt.Sprintf("increase(avalanche_%s_vm_hyper_sdk_chain_state_changes[30s])/30", chainID))
utils.Outf("{{yellow}}state changes per second:{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, fmt.Sprintf("increase(avalanche_%s_vm_hyper_sdk_chain_root_calculated_sum[30s])/1000000/30", chainID))
utils.Outf("{{yellow}}root calcuation wait (ms/s):{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, fmt.Sprintf("increase(avalanche_%s_vm_hyper_sdk_chain_wait_signatures_sum[30s])/1000000/30", chainID))
utils.Outf("{{yellow}}signature verification wait (ms/s):{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, fmt.Sprintf("avalanche_%s_vm_hyper_sdk_chain_mempool_size", chainID))
utils.Outf("{{yellow}}mempool size:{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, "avalanche_resource_tracker_cpu_usage")
utils.Outf("{{yellow}}CPU usage:{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, fmt.Sprintf("increase(avalanche_%s_handler_chits_sum[30s])/1000000/30 + increase(avalanche_%s_handler_notify_sum[30s])/1000000/30 + increase(avalanche_%s_handler_get_sum[30s])/1000000/30 + increase(avalanche_%s_handler_push_query_sum[30s])/1000000/30 + increase(avalanche_%s_handler_put_sum[30s])/1000000/30 + increase(avalanche_%s_handler_pull_query_sum[30s])/1000000/30 + increase(avalanche_%s_handler_query_failed_sum[30s])/1000000/30", chainID, chainID, chainID, chainID, chainID, chainID, chainID))
utils.Outf("{{yellow}}consensus engine processing (ms/s):{{/}} %s\n", panels[len(panels)-1])

// Generated dashboard link
//
// We must manually encode the params because prometheus skips any panels
// that are not numerically sorted and `url.params` only sorts
// lexicographically.
dashboard := "http://localhost:9090/graph"
for i, panel := range panels {
appendChar := "&"
if i == 0 {
appendChar = "?"
}
dashboard = fmt.Sprintf("%s%sg%d.expr=%s&g%d.tab=0", dashboard, appendChar, i, url.QueryEscape(panel), i)
}
utils.Outf("{{orange}}pre-built dashboard:{{/}} %s\n", dashboard)

// Emit command to run prometheus
utils.Outf("{{green}}prometheus cmd:{{/}} /tmp/prometheus --config.file=%s --storage.tsdb.path=%s\n", prometheusFile, prometheusData)
return nil
return handler.Root().GeneratePrometheus(prometheusFile, prometheusData, func(chainID ids.ID) []string {
panels := []string{}
panels = append(panels, fmt.Sprintf("avalanche_%s_blks_processing", chainID))
utils.Outf("{{yellow}}blocks processing:{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, fmt.Sprintf("increase(avalanche_%s_blks_accepted_count[30s])/30", chainID))
utils.Outf("{{yellow}}blocks accepted per second:{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, fmt.Sprintf("increase(avalanche_%s_blks_rejected_count[30s])/30", chainID))
utils.Outf("{{yellow}}blocks rejected per second:{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, fmt.Sprintf("increase(avalanche_%s_vm_hypersdk_vm_txs_accepted[30s])/30", chainID))
utils.Outf("{{yellow}}transactions per second:{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, fmt.Sprintf("increase(avalanche_%s_vm_hypersdk_chain_state_operations[30s])/30", chainID))
utils.Outf("{{yellow}}state operations per second:{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, fmt.Sprintf("increase(avalanche_%s_vm_hypersdk_chain_state_changes[30s])/30", chainID))
utils.Outf("{{yellow}}state changes per second:{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, fmt.Sprintf("increase(avalanche_%s_vm_hypersdk_chain_root_calculated_sum[30s])/1000000/30", chainID))
utils.Outf("{{yellow}}root calcuation wait (ms/s):{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, fmt.Sprintf("increase(avalanche_%s_vm_hypersdk_chain_wait_signatures_sum[30s])/1000000/30", chainID))
utils.Outf("{{yellow}}signature verification wait (ms/s):{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, fmt.Sprintf("avalanche_%s_vm_hypersdk_chain_mempool_size", chainID))
utils.Outf("{{yellow}}mempool size:{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, "avalanche_resource_tracker_cpu_usage")
utils.Outf("{{yellow}}CPU usage:{{/}} %s\n", panels[len(panels)-1])

panels = append(panels, fmt.Sprintf("increase(avalanche_%s_handler_chits_sum[30s])/1000000/30 + increase(avalanche_%s_handler_notify_sum[30s])/1000000/30 + increase(avalanche_%s_handler_get_sum[30s])/1000000/30 + increase(avalanche_%s_handler_push_query_sum[30s])/1000000/30 + increase(avalanche_%s_handler_put_sum[30s])/1000000/30 + increase(avalanche_%s_handler_pull_query_sum[30s])/1000000/30 + increase(avalanche_%s_handler_query_failed_sum[30s])/1000000/30", chainID, chainID, chainID, chainID, chainID, chainID, chainID))
utils.Outf("{{yellow}}consensus engine processing (ms/s):{{/}} %s\n", panels[len(panels)-1])

return panels
})
},
}
7 changes: 0 additions & 7 deletions examples/basevm/cmd/base-cli/cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ var (
hideTxs bool
randomRecipient bool
maxTxBacklog int
deleteOtherChains bool
checkAllChains bool
prometheusFile string
prometheusData string
Expand Down Expand Up @@ -130,12 +129,6 @@ func init() {
false,
"hide txs",
)
importAvalancheOpsChainCmd.PersistentFlags().BoolVar(
&deleteOtherChains,
"delete-other-chains",
true,
"delete other chains",
)
chainCmd.AddCommand(
importChainCmd,
importANRChainCmd,
Expand Down
5 changes: 1 addition & 4 deletions examples/tokenvm/cmd/token-cli/cmd/key.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,7 @@ func lookupKeyBalance(pk crypto.PublicKey, uri string, networkID uint32, chainID
_, _, err := handler.GetAssetInfo(
context.TODO(), trpc.NewJSONRPCClient(uri, networkID, chainID),
pk, assetID, true)
if err != nil {
return err
}
return nil
return err
}

var balanceKeyCmd = &cobra.Command{
Expand Down
Loading

0 comments on commit 0db6440

Please sign in to comment.