From c36cdac880d7ab3b165dacc33bd837b178b19349 Mon Sep 17 00:00:00 2001 From: bingyuyap Date: Thu, 1 Feb 2024 09:17:14 +0800 Subject: [PATCH] fly: address comments Signed-off-by: bingyuyap --- .../main.go | 117 ++++++++++-------- fly/common/getGuardianName.go | 2 - 2 files changed, 65 insertions(+), 54 deletions(-) rename fly/cmd/{prometheus_metrics => historical_uptime}/main.go (76%) diff --git a/fly/cmd/prometheus_metrics/main.go b/fly/cmd/historical_uptime/main.go similarity index 76% rename from fly/cmd/prometheus_metrics/main.go rename to fly/cmd/historical_uptime/main.go index ce6c06aa..09058010 100644 --- a/fly/cmd/prometheus_metrics/main.go +++ b/fly/cmd/historical_uptime/main.go @@ -2,8 +2,8 @@ package main import ( "context" - "flag" "fmt" + "log" "os" "strconv" "strings" @@ -16,8 +16,10 @@ import ( promremotew "github.com/certusone/wormhole/node/pkg/telemetry/prom_remote_write" eth_common "github.com/ethereum/go-ethereum/common" ipfslog "github.com/ipfs/go-log/v2" + "github.com/joho/godotenv" "github.com/libp2p/go-libp2p/core/crypto" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/wormhole-foundation/wormhole-monitor/fly/common" "github.com/wormhole-foundation/wormhole-monitor/fly/utils" "github.com/wormhole-foundation/wormhole/sdk/vaa" @@ -27,45 +29,71 @@ import ( var ( rootCtx context.Context rootCtxCancel context.CancelFunc + + p2pNetworkID string + p2pPort uint + p2pBootstrap string + nodeKeyPath string + logLevel string + ethRpcUrl string + coreBridgeAddr string + promRemoteURL string ) var ( - p2pNetworkID string - p2pPort uint - p2pBootstrap string - nodeKeyPath string - logLevel string + guardianObservations = promauto.NewCounterVec( + prometheus.CounterOpts{ + Name: "guardian_observations_total", + Help: "Total number of observations received from each guardian on each chain", + }, + []string{"guardian", "chain"}, + ) + + guardianChainHeight = promauto.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "guardian_chain_height", + Help: "Current height of each guardian on each chain over time", + }, + []string{"guardian", "chain"}, + ) ) -var guardianObservations = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "guardian_observations_total", - Help: "Total number of observations received from each guardian on each chain", - }, - []string{"guardian", "chain"}, -) +const PYTHNET_CHAIN_ID = int(vaa.ChainIDPythNet) -var guardianChainHeight = prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Name: "guardian_chain_height", - Help: "Current height of each guardian on each chain over time", - }, - []string{"guardian", "chain"}, -) +func loadEnvVars() { + err := godotenv.Load() // By default loads .env + if err != nil { + log.Fatal("Error loading .env file") + } + p2pNetworkID = verifyEnvVar("P2P_NETWORK_ID") + port, err := strconv.ParseUint(verifyEnvVar("P2P_PORT"), 10, 32) + if err != nil { + log.Fatal("Error parsing P2P_PORT") + } + p2pPort = uint(port) + nodeKeyPath = verifyEnvVar("NODE_KEY_PATH") + logLevel = verifyEnvVar("LOG_LEVEL") + ethRpcUrl = verifyEnvVar("ETH_RPC_URL") + coreBridgeAddr = verifyEnvVar("CORE_BRIDGE_ADDR") + promRemoteURL = verifyEnvVar("PROM_REMOTE_URL") +} -func init() { - // Register the Prometheus counter vector. - prometheus.MustRegister(guardianObservations) - prometheus.MustRegister(guardianChainHeight) +func verifyEnvVar(key string) string { + value := os.Getenv(key) + if value == "" { + log.Fatalf("%s must be specified", key) + } + return value } -func initPromScraper(promRemoteURL *string, logger *zap.Logger) { - usingPromRemoteWrite := *promRemoteURL != "" +func initPromScraper(promRemoteURL string, logger *zap.Logger) { + usingPromRemoteWrite := promRemoteURL != "" if usingPromRemoteWrite { var info promremotew.PromTelemetryInfo - info.PromRemoteURL = *promRemoteURL + info.PromRemoteURL = promRemoteURL info.Labels = map[string]string{ - "product": "wormhole-fly", + "network": p2pNetworkID, + "product": "historical_uptime", } promLogger := logger.With(zap.String("component", "prometheus_scraper")) @@ -79,7 +107,7 @@ func initPromScraper(promRemoteURL *string, logger *zap.Logger) { return nil case <-t.C: for i := 1; i < 36; i++ { - if i == 26 { + if i == PYTHNET_CHAIN_ID { continue } chainName := vaa.ChainID(i).String() @@ -104,36 +132,19 @@ func initPromScraper(promRemoteURL *string, logger *zap.Logger) { } func main() { - // TODO: pass in config instead of hard-coding it - p2pNetworkID = "/wormhole/mainnet/2" + loadEnvVars() p2pBootstrap = "/dns4/wormhole-v2-mainnet-bootstrap.xlabs.xyz/udp/8999/quic/p2p/12D3KooWNQ9tVrcb64tw6bNs2CaNrUGPM7yRrKvBBheQ5yCyPHKC,/dns4/wormhole.mcf.rocks/udp/8999/quic/p2p/12D3KooWDZVv7BhZ8yFLkarNdaSWaB43D6UbQwExJ8nnGAEmfHcU,/dns4/wormhole-v2-mainnet-bootstrap.staking.fund/udp/8999/quic/p2p/12D3KooWG8obDX9DNi1KUwZNu9xkGwfKqTp2GFwuuHpWZ3nQruS1" - p2pPort = 8999 - nodeKeyPath = "/tmp/node.key" - logLevel = "info" - rpcUrl := flag.String("rpcUrl", "https://rpc.ankr.com/eth", "RPC URL for fetching current guardian set") - coreBridgeAddr := flag.String("coreBridgeAddr", "0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B", "Core bridge address for fetching guardian set") - promRemoteWriteUrl := flag.String("promRemoteWriteUrl", "http://localhost:9090/api/v1/write", "Prometheus remote write URL") - flag.Parse() - if *rpcUrl == "" { - fmt.Println("rpcUrl must be specified") - os.Exit(1) - } - if *coreBridgeAddr == "" { - fmt.Println("coreBridgeAddr must be specified") - os.Exit(1) - } + lvl, err := ipfslog.LevelFromString(logLevel) if err != nil { fmt.Println("Invalid log level") os.Exit(1) } - logger := ipfslog.Logger("wormhole-fly").Desugar() + logger := ipfslog.Logger("historical-uptime").Desugar() ipfslog.SetAllLoggers(lvl) - // ctx := context.Background() - // Node's main lifecycle context. rootCtx, rootCtxCancel = context.WithCancel(context.Background()) defer rootCtxCancel() @@ -162,7 +173,7 @@ func main() { // Governor status govStatusC := make(chan *gossipv1.SignedChainGovernorStatus, 50) // Bootstrap guardian set, otherwise heartbeats would be skipped - idx, sgs, err := utils.FetchCurrentGuardianSet(*rpcUrl, *coreBridgeAddr) + idx, sgs, err := utils.FetchCurrentGuardianSet(ethRpcUrl, coreBridgeAddr) if err != nil { logger.Fatal("Failed to fetch guardian set", zap.Error(err)) } @@ -174,7 +185,7 @@ func main() { gst.Set(&gs) // Start Prometheus scraper - initPromScraper(promRemoteWriteUrl, logger) + initPromScraper(promRemoteURL, logger) // WIP(bing): add metrics for guardian observations go func() { @@ -185,7 +196,7 @@ func main() { case o := <-obsvC: // Ignore observations from pythnnet // Pythnet sends too many observations that could deteriorate the performance of the fly node - if o.Msg.MessageId[:3] != "26/" { + if o.Msg.MessageId[:3] != strconv.Itoa(PYTHNET_CHAIN_ID) + "/" { ga := eth_common.BytesToAddress(o.Msg.Addr).String() chainID := strings.Split(o.Msg.MessageId, "/")[0] ui64, err := strconv.ParseUint(chainID, 10, 16) @@ -196,6 +207,7 @@ func main() { guardianName, ok := common.GetGuardianName(ga) if !ok { logger.Error("guardian name not found", zap.String("guardian", ga)) + continue // Skip setting the metric if guardianName is not found } guardianObservations.WithLabelValues(guardianName, chainName).Inc() } @@ -237,6 +249,7 @@ func main() { guardianName, ok := common.GetGuardianName(hb.GuardianAddr) if !ok { logger.Error("guardian name not found", zap.String("guardian", hb.GuardianAddr)) + continue // Skip setting the metric if guardianName is not found } guardianChainHeight.With( diff --git a/fly/common/getGuardianName.go b/fly/common/getGuardianName.go index 4488a8a5..2aa7f7db 100644 --- a/fly/common/getGuardianName.go +++ b/fly/common/getGuardianName.go @@ -4,7 +4,6 @@ import "strings" // Guardian address to index map var guardianIndexMap = map[string]int{ - strings.ToLower("0x58CC3AE5C097b213cE3c81979e1B9f9570746AA5"): 0, strings.ToLower("0xfF6CB952589BDE862c25Ef4392132fb9D4A42157"): 1, strings.ToLower("0x114De8460193bdf3A2fCf81f86a09765F4762fD1"): 2, strings.ToLower("0x107A0086b32d7A0977926A205131d8731D39cbEB"): 3, @@ -26,7 +25,6 @@ var guardianIndexMap = map[string]int{ } var guardianIndexToNameMap = map[int]string{ - 0: "Jump Crypto", 1: "Staked", 2: "Figment", 3: "ChainodeTech",