From 031836f45fc43a4acf8ccf64c14004225064cc85 Mon Sep 17 00:00:00 2001 From: zhangzhiqiang <745124335@aa.com> Date: Fri, 6 Jul 2018 18:33:24 +0800 Subject: [PATCH] =?UTF-8?q?IRISHUB-34=EF=BC=9Airishub=E6=B7=BB=E5=8A=A0pro?= =?UTF-8?q?metheus=E7=9B=91=E6=8E=A7=E5=8A=9F=E8=83=BD(=E6=B7=BB=E5=8A=A0p?= =?UTF-8?q?2p,memo=E7=9B=91=E6=8E=A7=EF=BC=8C=E7=B3=BB=E7=BB=9F=E7=9B=91?= =?UTF-8?q?=E6=8E=A7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gopkg.lock | 48 +++++++++++++- tools/context.go | 90 +++++++++++++++++++++++++++ tools/prometheus/consensus/metrics.go | 18 +++--- tools/prometheus/mempool/metrics.go | 6 ++ tools/prometheus/p2p/metrics.go | 6 ++ tools/prometheus/server.go | 23 ++++--- 6 files changed, 172 insertions(+), 19 deletions(-) create mode 100644 tools/context.go diff --git a/Gopkg.lock b/Gopkg.lock index 92e47b418..bc0d3f0f9 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -1,6 +1,12 @@ # This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. +[[projects]] + name = "github.com/StackExchange/wmi" + packages = ["."] + revision = "5d049714c4a64225c3c79a7cf7d02f7fb5b96338" + version = "1.0.0" + [[projects]] branch = "master" name = "github.com/beorn7/perks" @@ -95,6 +101,15 @@ revision = "390ab7935ee28ec6b286364bba9b4dd6410cb3d5" version = "v0.3.0" +[[projects]] + name = "github.com/go-ole/go-ole" + packages = [ + ".", + "oleutil" + ] + revision = "a41e3c4b706f6ae8dfbff342b06e40fa4d2d0506" + version = "v1.2.1" + [[projects]] name = "github.com/go-stack/stack" packages = ["."] @@ -236,6 +251,12 @@ revision = "792786c7400a136282c1664665ae0a8db921c6c2" version = "v1.0.0" +[[projects]] + branch = "feature/prometheus" + name = "github.com/programokey/irishub" + packages = ["tools/prometheus/system"] + revision = "0c610311c5e650b1f6bd11b7daca20d830db0dee" + [[projects]] name = "github.com/prometheus/client_golang" packages = [ @@ -278,6 +299,26 @@ packages = ["."] revision = "e2704e165165ec55d062f5919b4b29494e9fa790" +[[projects]] + name = "github.com/shirou/gopsutil" + packages = [ + "cpu", + "disk", + "host", + "internal/common", + "mem", + "net", + "process" + ] + revision = "4a180b209f5f494e5923cfce81ea30ba23915877" + version = "v2.18.06" + +[[projects]] + branch = "master" + name = "github.com/shirou/w32" + packages = ["."] + revision = "bb4de0191aa41b5507caa14b0650cdbddcd9280b" + [[projects]] name = "github.com/spf13/afero" packages = [ @@ -489,7 +530,10 @@ [[projects]] branch = "master" name = "golang.org/x/sys" - packages = ["unix"] + packages = [ + "unix", + "windows" + ] revision = "151529c776cdc58ddbe7963ba9af779f3577b419" [[projects]] @@ -551,6 +595,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "d1273093894dceda82a36f80e217187acee7f2f34b020c05fb89352ff249c850" + inputs-digest = "d1bbcb679276fc124a31c41805c73016c0954c40a2b153966695d188b41b09f1" solver-name = "gps-cdcl" solver-version = 1 diff --git a/tools/context.go b/tools/context.go new file mode 100644 index 000000000..b6f93136a --- /dev/null +++ b/tools/context.go @@ -0,0 +1,90 @@ +package tools + +import ( + "github.com/cosmos/cosmos-sdk/client/context" + "fmt" + "io/ioutil" + "encoding/json" + "strings" + "net/http" + ctypes "github.com/tendermint/tendermint/rpc/core/types" + +) + +type Context struct { + context.CoreContext +} + +func NewContext() Context { + ctx := context.NewCoreContextFromViper() + return Context{ + ctx, + } +} + +type JsonRpc interface { + NetInfo() *ctypes.ResultNetInfo + NumUnconfirmedTxs() *ctypes.ResultUnconfirmedTxs +} + +func (rpc Context) NetInfo() *ctypes.ResultNetInfo{ + client := &http.Client{} + + reqUri := tcpToHttpUrl(rpc.NodeURI) + "/net_info" + + resp, err := client.Get(reqUri) + if err != nil { + fmt.Println(err) + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + } + + var res = struct { + JsonRpc string `json:"jsonrpc"` + Id string `json:"id"` + Result ctypes.ResultNetInfo `json:"result"` + }{} + if err := json.Unmarshal(body,&res); err != nil { + fmt.Println(err) + } + + return &res.Result +} + +func (rpc Context) NumUnconfirmedTxs() *ctypes.ResultUnconfirmedTxs{ + client := &http.Client{} + reqUri := tcpToHttpUrl(rpc.NodeURI) + "/num_unconfirmed_txs" + + resp, err := client.Get(reqUri) + if err != nil { + fmt.Println(err) + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + fmt.Println(err) + } + + var res = struct { + JsonRpc string `json:"jsonrpc"` + Id string `json:"id"` + Result ctypes.ResultUnconfirmedTxs `json:"result"` + }{} + if err := json.Unmarshal(body,&res); err != nil { + fmt.Println(err) + } + + return &res.Result +} + +func tcpToHttpUrl(url string) string{ + urls := strings.Replace(url,"tcp","http",1) + return urls +} + + diff --git a/tools/prometheus/consensus/metrics.go b/tools/prometheus/consensus/metrics.go index 81a01e163..e8250e1b2 100644 --- a/tools/prometheus/consensus/metrics.go +++ b/tools/prometheus/consensus/metrics.go @@ -5,7 +5,6 @@ import ( "github.com/go-kit/kit/metrics/prometheus" stdprometheus "github.com/prometheus/client_golang/prometheus" "github.com/tendermint/tendermint/types" - "github.com/cosmos/cosmos-sdk/client/context" "github.com/cosmos/cosmos-sdk/x/stake" "github.com/cosmos/cosmos-sdk/wire" // XXX fix "fmt" @@ -14,6 +13,7 @@ import ( "time" "log" cctx "context" + tools "github.com/irisnet/irishub/tools" ) // Metrics contains metrics exposed by this package. @@ -118,8 +118,7 @@ func PrometheusMetrics() *Metrics { } } - -func Monitor(ctx context.CoreContext,csMetrics Metrics,cdc *wire.Codec,storeName string){ +func (cs *Metrics)Monitor(ctx tools.Context,cdc *wire.Codec,storeName string){ context, _ := cctx.WithTimeout(cctx.Background(), 10*time.Second) var client = ctx.Client @@ -137,17 +136,18 @@ func Monitor(ctx context.CoreContext,csMetrics Metrics,cdc *wire.Codec,storeName go func() { for e := range blockC { block := e.(types.TMEventData).(types.EventDataNewBlock) - csMetrics.RecordMetrics(ctx,cdc,block.Block,storeName) + cs.RecordMetrics(ctx,cdc,block.Block,storeName) } }() } -func (cs Metrics) RecordMetrics(ctx context.CoreContext,cdc *wire.Codec,block *types.Block,storeName string) { +func (cs Metrics) RecordMetrics(ctx tools.Context,cdc *wire.Codec,block *types.Block,storeName string) { cs.Height.Set(float64(block.Height)) cs.ByzantineValidators.Set(float64(len(block.Evidence.Evidence))) missingValidators := 0 missingValidatorsPower := int64(0) + validatorsPower := int64(0) validators := getValidators(cdc,ctx,storeName) valMap := make(map[string]stake.Validator,len(validators)) @@ -162,10 +162,12 @@ func (cs Metrics) RecordMetrics(ctx context.CoreContext,cdc *wire.Codec,block *t } valMap[val.Owner.String()] = val + validatorsPower += val.GetPower().Evaluate() } cs.MissingValidators.Set(float64(missingValidators)) cs.MissingValidatorsPower.Set(float64(missingValidatorsPower)) + cs.ValidatorsPower.Set(float64(validatorsPower)) byzantineValidatorsPower := int64(0) for _, ev := range block.Evidence.Evidence { @@ -178,9 +180,9 @@ func (cs Metrics) RecordMetrics(ctx context.CoreContext,cdc *wire.Codec,block *t if block.Height > 1 { lastBlockHight := block.Height -1 - resultBlock,_ := ctx.Client.Block(&lastBlockHight) + lastBlock,_ := ctx.Client.Block(&lastBlockHight) cs.BlockIntervalSeconds.Observe( - block.Time.Sub(resultBlock.BlockMeta.Header.Time).Seconds(), + block.Time.Sub(lastBlock.BlockMeta.Header.Time).Seconds(), ) } @@ -192,7 +194,7 @@ func (cs Metrics) RecordMetrics(ctx context.CoreContext,cdc *wire.Codec,block *t } -func getValidators(cdc *wire.Codec,ctx context.CoreContext,storeName string) (validators []stake.Validator){ +func getValidators(cdc *wire.Codec,ctx tools.Context,storeName string) (validators []stake.Validator){ key := stake.ValidatorsKey resKVs, err := ctx.QuerySubspace(cdc, key, storeName) if err != nil { diff --git a/tools/prometheus/mempool/metrics.go b/tools/prometheus/mempool/metrics.go index 80f877c5f..011ea3a03 100644 --- a/tools/prometheus/mempool/metrics.go +++ b/tools/prometheus/mempool/metrics.go @@ -4,6 +4,7 @@ import ( "github.com/go-kit/kit/metrics" "github.com/go-kit/kit/metrics/prometheus" stdprometheus "github.com/prometheus/client_golang/prometheus" + tools "github.com/irisnet/irishub/tools" ) // Metrics contains metrics exposed by this package. @@ -23,3 +24,8 @@ func PrometheusMetrics() *Metrics { }, []string{}), } } + +func (m *Metrics )Monitor(rpc tools.Context){ + result := rpc.NumUnconfirmedTxs() + m.Size.Set(float64(result.N)) +} \ No newline at end of file diff --git a/tools/prometheus/p2p/metrics.go b/tools/prometheus/p2p/metrics.go index 2c56b4b56..dedda14a0 100644 --- a/tools/prometheus/p2p/metrics.go +++ b/tools/prometheus/p2p/metrics.go @@ -4,6 +4,7 @@ import ( "github.com/go-kit/kit/metrics" "github.com/go-kit/kit/metrics/prometheus" stdprometheus "github.com/prometheus/client_golang/prometheus" + tools "github.com/irisnet/irishub/tools" ) // Metrics contains metrics exposed by this package. @@ -22,3 +23,8 @@ func PrometheusMetrics() *Metrics { }, []string{}), } } + +func (m *Metrics) Monitor(ctx tools.Context){ + result := ctx.NetInfo() + m.Peers.Set(float64(result.NPeers)) +} diff --git a/tools/prometheus/server.go b/tools/prometheus/server.go index 618259546..34b38cfbc 100644 --- a/tools/prometheus/server.go +++ b/tools/prometheus/server.go @@ -6,10 +6,9 @@ import ( "github.com/prometheus/client_golang/prometheus/promhttp" "net/http" cmn "github.com/tendermint/tmlibs/common" - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/wire" // XXX fix - "github.com/irisnet/irishub/tools/prometheus/consensus" - sys "github.com/programokey/irishub/tools/prometheus/system" + "github.com/cosmos/cosmos-sdk/wire" + "github.com/irisnet/irishub/tools" + "github.com/spf13/viper" ) @@ -19,15 +18,20 @@ func MonitorCommand(storeName string, cdc *wire.Codec) *cobra.Command { Short: "irishub monitor", RunE: func(cmd *cobra.Command, args []string) error { //TODO - csMetrics,_,_ , sysMertrics:= DefaultMetricsProvider() - ctx := context.NewCoreContextFromViper() + csMetrics,p2pMetrics,memMetrics, sysMertrics:= DefaultMetricsProvider() + ctx := tools.NewContext() //监控共识参数 - consensus.Monitor(ctx,*csMetrics,cdc,storeName) + csMetrics.Monitor(ctx,cdc,storeName) + //监控p2p参数 + p2pMetrics.Monitor(ctx) + //监控mempool参数 + memMetrics.Monitor(ctx) //monitor system info, first parameter is the command of the process to be monitor // and the second parameter is the directory that you want to get total size of its' files - sys.Monitor("irishub", "/", sysMertrics) + path := viper.GetString("home") + sysMertrics.Monitor("iris", path) srv := &http.Server{ Addr: ":26660", @@ -48,6 +52,7 @@ func MonitorCommand(storeName string, cdc *wire.Codec) *cobra.Command { }, } cmd.Flags().StringP("node", "n", "tcp://localhost:46657", "Node to connect to") - cmd.Flags().String("chain-id", "", "Chain ID of tendermint node") + cmd.Flags().String("chain-id", "fuxi", "Chain ID of tendermint node") + cmd.Flags().StringP("home", "", "", "directory for config and data") return cmd }