diff --git a/node/cmd/transfer-verifier/transfer-verifier-evm.go b/node/cmd/transfer-verifier/transfer-verifier-evm.go index dbda36f76f..76ec5a2f5d 100644 --- a/node/cmd/transfer-verifier/transfer-verifier-evm.go +++ b/node/cmd/transfer-verifier/transfer-verifier-evm.go @@ -5,7 +5,9 @@ import ( "fmt" "os" + "github.com/certusone/wormhole/node/pkg/telemetry" txverifier "github.com/certusone/wormhole/node/pkg/transfer-verifier" + "github.com/certusone/wormhole/node/pkg/version" "github.com/certusone/wormhole/node/pkg/watchers/evm/connectors" "github.com/ethereum/go-ethereum/common" ipfslog "github.com/ipfs/go-log/v2" @@ -36,11 +38,12 @@ func init() { evmRpc = TransferVerifierCmdEvm.Flags().String("rpcUrl", "ws://localhost:8546", "RPC url") evmCoreContract = TransferVerifierCmdEvm.Flags().String("coreContract", "", "core bridge address") evmTokenBridgeContract = TransferVerifierCmdEvm.Flags().String("tokenContract", "", "token bridge") + pruneHeightDelta = TransferVerifierCmdEvm.Flags().Uint64("pruneHeightDelta", 10, "The number of blocks for which to retain transaction receipts. Defaults to 10 blocks.") TransferVerifierCmd.MarkFlagRequired("rpcUrl") TransferVerifierCmd.MarkFlagRequired("coreContract") TransferVerifierCmd.MarkFlagRequired("tokenContract") - pruneHeightDelta = TransferVerifierCmdEvm.Flags().Uint64("pruneHeightDelta", 10, "The number of blocks for which to retain transaction receipts. Defaults to 10 blocks.") + } // Note: logger.Error should be reserved only for conditions that break the @@ -55,8 +58,37 @@ func runTransferVerifierEvm(cmd *cobra.Command, args []string) { } logger := ipfslog.Logger("wormhole-transfer-verifier").Desugar() - ipfslog.SetAllLoggers(lvl) + + // Setup logging to Loki if configured + if *telemetryLokiUrl != "" && *telemetryNodeName != "" { + labels := map[string]string{ + // Is this required? + // "network": *p2pNetworkID, + "node_name": *telemetryNodeName, + "version": version.Version(), + } + + tm, err := telemetry.NewLokiCloudLogger( + context.Background(), + logger, + *telemetryLokiUrl, + // Note: the product name parameter here is representing a per-chain configuration, so 'eth' is used + // rather than 'evm'. This allows us to distinguish this instance from other EVM chains that may be added in + // the future. + "transfer-verifier-eth", + // Private logs are not used in this code + false, + labels, + ) + if err != nil { + logger.Fatal("Failed to initialize telemetry", zap.Error(err)) + } + + defer tm.Close() + logger = tm.WrapLogger(logger) // Wrap logger with telemetry logger + } + logger.Info("Starting EVM transfer verifier") // Verify CLI parameters diff --git a/node/cmd/transfer-verifier/transfer-verifier-sui.go b/node/cmd/transfer-verifier/transfer-verifier-sui.go index 6fda81ba70..dee4b49b1f 100644 --- a/node/cmd/transfer-verifier/transfer-verifier-sui.go +++ b/node/cmd/transfer-verifier/transfer-verifier-sui.go @@ -7,7 +7,9 @@ import ( "strconv" "time" + "github.com/certusone/wormhole/node/pkg/telemetry" txverifier "github.com/certusone/wormhole/node/pkg/transfer-verifier" + "github.com/certusone/wormhole/node/pkg/version" ipfslog "github.com/ipfs/go-log/v2" "github.com/spf13/cobra" @@ -57,6 +59,33 @@ func runTransferVerifierSui(cmd *cobra.Command, args []string) { logger := ipfslog.Logger("wormhole-transfer-verifier-sui").Desugar() ipfslog.SetAllLoggers(lvl) + + // Setup logging to Loki if configured + if *telemetryLokiUrl != "" && *telemetryNodeName != "" { + labels := map[string]string{ + // Is this required? + // "network": *p2pNetworkID, + "node_name": *telemetryNodeName, + "version": version.Version(), + } + + tm, err := telemetry.NewLokiCloudLogger( + context.Background(), + logger, + *telemetryLokiUrl, + "transfer-verifier-sui", + // Private logs are not used in this code + false, + labels, + ) + if err != nil { + logger.Fatal("Failed to initialize telemetry", zap.Error(err)) + } + + defer tm.Close() + logger = tm.WrapLogger(logger) // Wrap logger with telemetry logger + } + logger.Info("Starting Sui transfer verifier") logger.Debug("Sui rpc connection", zap.String("url", *suiRPC)) logger.Debug("Sui core contract", zap.String("address", *suiCoreContract)) diff --git a/node/cmd/transfer-verifier/transfer-verifier.go b/node/cmd/transfer-verifier/transfer-verifier.go index ea4c520e31..db0a3a218c 100644 --- a/node/cmd/transfer-verifier/transfer-verifier.go +++ b/node/cmd/transfer-verifier/transfer-verifier.go @@ -1,9 +1,5 @@ package transferverifier -/* - TODOs: -*/ - import ( "github.com/spf13/cobra" ) @@ -16,6 +12,10 @@ var TransferVerifierCmd = &cobra.Command{ var ( // logLevel is a global flag that is used to set the logging level for the TransferVerifierCmd logLevel *string + // telemetryLokiUrl is a global flag that is used to set the Loki cloud logging URL for the TransferVerifierCmd. + telemetryLokiUrl *string + // telemetryNodeName is a global flag that is used to set the node name used in telemetry for the TransferVerifierCmd. + telemetryNodeName *string ) // init initializes the global flags and subcommands for the TransferVerifierCmd. @@ -24,8 +24,13 @@ var ( func init() { // Global flags logLevel = TransferVerifierCmd.PersistentFlags().String("logLevel", "info", "Logging level (debug, info, warn, error, dpanic, panic, fatal)") + telemetryLokiUrl = TransferVerifierCmd.PersistentFlags().String("telemetryLokiUrl", "", "Loki cloud logging URL") + telemetryNodeName = TransferVerifierCmd.PersistentFlags().String("telemetryNodeName", "", "Node name used in telemetry") + + // Either both loki flags should be present or neither of them. + TransferVerifierCmd.MarkFlagsRequiredTogether("telemetryLokiUrl", "telemetryNodeName") - // Subcommands + // Subcommands corresponding to chains supported by the Transfer Verifier. TransferVerifierCmd.AddCommand(TransferVerifierCmdEvm) TransferVerifierCmd.AddCommand(TransferVerifierCmdSui) } diff --git a/scripts/transfer-verifier-localnet.sh b/scripts/transfer-verifier-localnet.sh index 2d6cfc91f0..b35a419991 100755 --- a/scripts/transfer-verifier-localnet.sh +++ b/scripts/transfer-verifier-localnet.sh @@ -20,7 +20,7 @@ RPC="${ETH_RPC_DEVNET}" LOG_LEVEL="debug" -# Do `make node` first to compile transfer-verifier into guardiand +# Do `make node` first to compile transfer-verifier into guardiand. Note that the telemetry parameters are omitted here. ./build/bin/guardiand transfer-verifier evm \ --rpcUrl "${RPC}" \ --coreContract "${CORE_CONTRACT}" \