From d3741751704c84a257d461bb5ea14594cc688d7b Mon Sep 17 00:00:00 2001 From: Vsevolod Brekelov Date: Tue, 29 Oct 2019 20:51:17 +0300 Subject: [PATCH] monitoring: add prometheus monitoring add init metrics service which uses prometheus; add configuration for metrics service; add monitoring metrics for blockchain,rpc,server; --- cli/server/server.go | 4 + config/config.go | 16 +-- config/protocol.mainnet.yml | 4 +- config/protocol.privnet.docker.four.yml | 3 + config/protocol.privnet.docker.one.yml | 3 + config/protocol.privnet.docker.three.yml | 3 + config/protocol.privnet.docker.two.yml | 3 + config/protocol.privnet.yml | 3 + config/protocol.testnet.yml | 3 + config/protocol.unit_testnet.yml | 3 + go.mod | 10 +- go.sum | 85 ++++++++++++++-- pkg/core/blockchain.go | 5 + pkg/core/mem_pool.go | 3 + pkg/core/prometheus.go | 76 +++++++++++++++ pkg/network/blockqueue.go | 3 + pkg/network/discovery.go | 2 + pkg/network/metrics/metrics.go | 59 +++++++++++ pkg/network/prometheus.go | 66 +++++++++++++ pkg/network/server.go | 5 + pkg/rpc/prometheus.go | 119 +++++++++++++++++++++++ pkg/rpc/server.go | 12 +++ 22 files changed, 468 insertions(+), 22 deletions(-) create mode 100644 pkg/core/prometheus.go create mode 100644 pkg/network/metrics/metrics.go create mode 100644 pkg/network/prometheus.go create mode 100644 pkg/rpc/prometheus.go diff --git a/cli/server/server.go b/cli/server/server.go index db5a2a036..95f167eac 100644 --- a/cli/server/server.go +++ b/cli/server/server.go @@ -11,6 +11,7 @@ import ( "github.com/CityOfZion/neo-go/pkg/core/storage" "github.com/CityOfZion/neo-go/pkg/io" "github.com/CityOfZion/neo-go/pkg/network" + "github.com/CityOfZion/neo-go/pkg/network/metrics" "github.com/CityOfZion/neo-go/pkg/rpc" "github.com/pkg/errors" log "github.com/sirupsen/logrus" @@ -248,10 +249,12 @@ func startServer(ctx *cli.Context) error { server := network.NewServer(serverConfig, chain) rpcServer := rpc.NewServer(chain, cfg.ApplicationConfiguration.RPCPort, server) errChan := make(chan error) + monitoring := metrics.NewMetricsService(cfg.ApplicationConfiguration.Monitoring) go chain.Run(grace) go server.Start(errChan) go rpcServer.Start(errChan) + go monitoring.Start() fmt.Println(logo()) fmt.Println(server.UserAgent) @@ -270,6 +273,7 @@ Main: if serverErr := rpcServer.Shutdown(); serverErr != nil { shutdownErr = errors.Wrap(serverErr, "Error encountered whilst shutting down server") } + monitoring.ShutDown() break Main } } diff --git a/config/config.go b/config/config.go index d63c9f1d6..f7a3cad4d 100644 --- a/config/config.go +++ b/config/config.go @@ -8,6 +8,7 @@ import ( "github.com/CityOfZion/neo-go/pkg/core/storage" "github.com/CityOfZion/neo-go/pkg/core/transaction" + "github.com/CityOfZion/neo-go/pkg/network/metrics" "github.com/CityOfZion/neo-go/pkg/util" "github.com/go-yaml/yaml" "github.com/pkg/errors" @@ -65,13 +66,14 @@ type ( // ApplicationConfiguration config specific to the node. ApplicationConfiguration struct { - DBConfiguration storage.DBConfiguration `yaml:"DBConfiguration"` - RPCPort uint16 `yaml:"RPCPort"` - NodePort uint16 `yaml:"NodePort"` - Relay bool `yaml:"Relay"` - DialTimeout time.Duration `yaml:"DialTimeout"` - ProtoTickInterval time.Duration `yaml:"ProtoTickInterval"` - MaxPeers int `yaml:"MaxPeers"` + DBConfiguration storage.DBConfiguration `yaml:"DBConfiguration"` + RPCPort uint16 `yaml:"RPCPort"` + NodePort uint16 `yaml:"NodePort"` + Relay bool `yaml:"Relay"` + DialTimeout time.Duration `yaml:"DialTimeout"` + ProtoTickInterval time.Duration `yaml:"ProtoTickInterval"` + MaxPeers int `yaml:"MaxPeers"` + Monitoring metrics.PrometheusConfig `yaml:"Monitoring"` } // NetMode describes the mode the blockchain will operate on. diff --git a/config/protocol.mainnet.yml b/config/protocol.mainnet.yml index 87805be90..9613e13ad 100644 --- a/config/protocol.mainnet.yml +++ b/config/protocol.mainnet.yml @@ -48,4 +48,6 @@ ApplicationConfiguration: DialTimeout: 3 ProtoTickInterval: 2 MaxPeers: 50 - + Monitoring: + Enabled: true + Port: 2112 diff --git a/config/protocol.privnet.docker.four.yml b/config/protocol.privnet.docker.four.yml index b18ac83cd..1d930a45f 100644 --- a/config/protocol.privnet.docker.four.yml +++ b/config/protocol.privnet.docker.four.yml @@ -36,3 +36,6 @@ ApplicationConfiguration: DialTimeout: 3 ProtoTickInterval: 2 MaxPeers: 50 + Monitoring: + Enabled: true + Port: 2112 diff --git a/config/protocol.privnet.docker.one.yml b/config/protocol.privnet.docker.one.yml index 2637c6635..1a3731e12 100644 --- a/config/protocol.privnet.docker.one.yml +++ b/config/protocol.privnet.docker.one.yml @@ -33,3 +33,6 @@ ApplicationConfiguration: DialTimeout: 3 ProtoTickInterval: 2 MaxPeers: 50 + Monitoring: + Enabled: true + Port: 2112 diff --git a/config/protocol.privnet.docker.three.yml b/config/protocol.privnet.docker.three.yml index c2f3e237b..f8ef52f91 100644 --- a/config/protocol.privnet.docker.three.yml +++ b/config/protocol.privnet.docker.three.yml @@ -33,3 +33,6 @@ ApplicationConfiguration: DialTimeout: 3 ProtoTickInterval: 2 MaxPeers: 50 + Monitoring: + Enabled: true + Port: 2112 diff --git a/config/protocol.privnet.docker.two.yml b/config/protocol.privnet.docker.two.yml index 3f8a2b929..197d42fdd 100644 --- a/config/protocol.privnet.docker.two.yml +++ b/config/protocol.privnet.docker.two.yml @@ -33,3 +33,6 @@ ApplicationConfiguration: DialTimeout: 3 ProtoTickInterval: 2 MaxPeers: 50 + Monitoring: + Enabled: true + Port: 2112 diff --git a/config/protocol.privnet.yml b/config/protocol.privnet.yml index 2a31395fc..66ab3791d 100644 --- a/config/protocol.privnet.yml +++ b/config/protocol.privnet.yml @@ -39,3 +39,6 @@ ApplicationConfiguration: DialTimeout: 3 ProtoTickInterval: 2 MaxPeers: 50 + Monitoring: + Enabled: true + Port: 2112 diff --git a/config/protocol.testnet.yml b/config/protocol.testnet.yml index 7e3f2e332..09401bb04 100644 --- a/config/protocol.testnet.yml +++ b/config/protocol.testnet.yml @@ -48,3 +48,6 @@ ApplicationConfiguration: DialTimeout: 3 ProtoTickInterval: 2 MaxPeers: 50 + Monitoring: + Enabled: true + Port: 2112 diff --git a/config/protocol.unit_testnet.yml b/config/protocol.unit_testnet.yml index 1bf522cb3..7217d26fe 100644 --- a/config/protocol.unit_testnet.yml +++ b/config/protocol.unit_testnet.yml @@ -38,3 +38,6 @@ ApplicationConfiguration: DialTimeout: 3 ProtoTickInterval: 2 MaxPeers: 50 + Monitoring: + Enabled: false #since it's not useful for unit tests. + Port: 2112 diff --git a/go.mod b/go.mod index e90dd2587..668cc6bc4 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,6 @@ require ( github.com/abiosoft/readline v0.0.0-20180607040430-155bce2042db // indirect github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6 // indirect github.com/alicebob/miniredis v2.5.0+incompatible - github.com/davecgh/go-spew v1.1.1 // indirect github.com/etcd-io/bbolt v1.3.3 github.com/fatih/color v1.7.0 // indirect github.com/flynn-archive/go-shlex v0.0.0-20150515145356-3f9db97f8568 // indirect @@ -19,19 +18,18 @@ require ( github.com/mr-tron/base58 v1.1.2 github.com/nspcc-dev/rfc6979 v0.1.0 github.com/onsi/gomega v1.4.2 // indirect - github.com/pkg/errors v0.8.0 - github.com/sirupsen/logrus v1.0.5 + github.com/pkg/errors v0.8.1 + github.com/prometheus/client_golang v1.2.1 + github.com/sirupsen/logrus v1.4.2 github.com/stretchr/testify v1.3.0 github.com/syndtr/goleveldb v0.0.0-20180307113352-169b1b37be73 github.com/urfave/cli v1.20.0 github.com/yuin/gopher-lua v0.0.0-20190514113301-1cd887cd7036 // indirect go.etcd.io/bbolt v1.3.3 // indirect - golang.org/x/crypto v0.0.0-20180316180149-374053ea96cb + golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 golang.org/x/text v0.3.0 golang.org/x/tools v0.0.0-20180318012157-96caea41033d gopkg.in/abiosoft/ishell.v2 v2.0.0 - gopkg.in/airbrake/gobrake.v2 v2.0.9 // indirect - gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 // indirect ) go 1.12 diff --git a/go.sum b/go.sum index 3ec2e92ef..064e11c8a 100644 --- a/go.sum +++ b/go.sum @@ -4,10 +4,22 @@ github.com/abiosoft/ishell v2.0.0+incompatible h1:zpwIuEHc37EzrsIYah3cpevrIc8Oma github.com/abiosoft/ishell v2.0.0+incompatible/go.mod h1:HQR9AqF2R3P4XXpMpI0NAzgHf/aS6+zVXRj14cVk9qg= github.com/abiosoft/readline v0.0.0-20180607040430-155bce2042db h1:CjPUSXOiYptLbTdr1RceuZgSFDQ7U15ITERUGrUORx8= github.com/abiosoft/readline v0.0.0-20180607040430-155bce2042db/go.mod h1:rB3B4rKii8V21ydCbIzH5hZiCQE7f5E9SzUb/ZZx530= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4 h1:Hs82Z41s6SdL1CELW+XaDYmOH4hkBN4/N9og/AsOv7E= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6 h1:45bxf7AZMwWcqkLzDAQugVEwedisr5nRJ1r+7LYnv0U= github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= github.com/alicebob/miniredis v2.5.0+incompatible h1:yBHoLpsyjupjz3NL3MhKMVkR41j82Yjf3KFv7ApYzUI= github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/cespare/xxhash/v2 v2.1.0 h1:yTUvW7Vhb89inJ+8irsUqiWjh8iT6sQPZiQzI6ReGkA= +github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -25,25 +37,50 @@ github.com/flynn-archive/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BMXYYRWT github.com/flynn-archive/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:rZfgFAXFS/z/lEd6LJmf9HVZ1LkgYiHx5pHhV5DR16M= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-redis/redis v6.10.2+incompatible h1:SLbqrO/Ik1nhXA5/cbEs1P5MUBo1Qq4ihlNfGnnipPw= github.com/go-redis/redis v6.10.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.0-20170215233205-553a64147049 h1:K9KHZbXKpGydfDN0aZrsoHpLJlZsBrGMFWbgLDGnPZk= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0= github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nspcc-dev/rfc6979 v0.1.0 h1:Lwg7esRRoyK1Up/IN1vAef1EmvrBeMHeeEkek2fAJ6c= github.com/nspcc-dev/rfc6979 v0.1.0/go.mod h1:exhIh1PdpDC5vQmyEsGvc4YDM/lyQp/452QxGq/UEso= github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw= @@ -52,11 +89,31 @@ github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I= github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sirupsen/logrus v1.0.5 h1:8c8b5uO0zS4X6RPl/sd1ENwSkIc0/H2PaHxE3udaE8I= -github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.2.1 h1:JnMpQc6ppsNgw9QPAGF6Dod479itz7lvlsMzzNayLOI= +github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/syndtr/goleveldb v0.0.0-20180307113352-169b1b37be73 h1:I2drr5K0tykBofr74ZEGliE/Hf6fNkEbcPyFvsy7wZk= @@ -67,33 +124,45 @@ github.com/yuin/gopher-lua v0.0.0-20190514113301-1cd887cd7036 h1:1b6PAtenNyhsmo/ github.com/yuin/gopher-lua v0.0.0-20190514113301-1cd887cd7036/go.mod h1:gqRgreBUhTSL0GeU64rtZ3Uq3wtjOa/TB2YfrtkCbVQ= go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -golang.org/x/crypto v0.0.0-20180316180149-374053ea96cb h1:O6ztCaemiMr99EgJdgXrr0J7N0EQN1oky/0GxML9Avk= -golang.org/x/crypto v0.0.0-20180316180149-374053ea96cb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47 h1:/XfQ9z7ib8eEJX2hdgFTZJ/ntt0swNk5oYBziWeTCvY= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20180318012157-96caea41033d h1:Xmo0nLTRYewf0eXDvo12nMSuOgNQ4283hdbOHIUf7h8= golang.org/x/tools v0.0.0-20180318012157-96caea41033d/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/abiosoft/ishell.v2 v2.0.0 h1:/J5yh3nWYSSGFjALcitTI9CLE0Tu27vBYHX0srotqOc= gopkg.in/abiosoft/ishell.v2 v2.0.0/go.mod h1:sFp+cGtH6o4s1FtpVPTMcHq2yue+c4DGOVohJCPUzwY= -gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/pkg/core/blockchain.go b/pkg/core/blockchain.go index f29aaaeda..4427d2f08 100644 --- a/pkg/core/blockchain.go +++ b/pkg/core/blockchain.go @@ -266,6 +266,7 @@ func (bc *Blockchain) AddHeaders(headers ...*Header) (err error) { } if oldlen != headerList.Len() { + updateHeaderHeightMetric(headerList.Len()-1) if err = bc.store.PutBatch(batch); err != nil { return } @@ -482,6 +483,7 @@ func (bc *Blockchain) storeBlock(block *Block) error { } atomic.StoreUint32(&bc.blockHeight, block.Index) + updateBlockHeightMetric(block.Index) for _, tx := range block.Transactions { bc.memPool.Remove(tx.Hash()) } @@ -519,6 +521,9 @@ func (bc *Blockchain) persist() error { "blockHeight": bHeight, "took": time.Since(start), }).Info("blockchain persist completed") + + // update monitoring metrics. + updatePersistedHeightMetric(bHeight) } return nil diff --git a/pkg/core/mem_pool.go b/pkg/core/mem_pool.go index 3c675e5b7..2b710a883 100644 --- a/pkg/core/mem_pool.go +++ b/pkg/core/mem_pool.go @@ -128,6 +128,7 @@ func (mp MemPool) TryAdd(hash util.Uint256, pItem *PoolItem) bool { } mp.lock.RLock() _, ok := mp.unsortedTxn[hash] + updateMempoolMetrics(len(mp.unsortedTxn), len(mp.unverifiedTxn)) mp.lock.RUnlock() return ok } @@ -162,6 +163,7 @@ func (mp *MemPool) Remove(hash util.Uint256) { } } } + updateMempoolMetrics(len(mp.unsortedTxn), len(mp.unverifiedTxn)) mp.lock.Unlock() } @@ -197,6 +199,7 @@ func (mp *MemPool) RemoveOverCapacity() { } } + updateMempoolMetrics(len(mp.unsortedTxn), len(mp.unverifiedTxn)) mp.lock.Unlock() } diff --git a/pkg/core/prometheus.go b/pkg/core/prometheus.go new file mode 100644 index 000000000..b4bec8ca9 --- /dev/null +++ b/pkg/core/prometheus.go @@ -0,0 +1,76 @@ +package core + +import ( + "github.com/prometheus/client_golang/prometheus" +) + +// Metrics for monitoring service. +var ( + //blockHeight prometheus metric. + blockHeight = prometheus.NewGauge( + prometheus.GaugeOpts{ + Help: "Current index of processed block", + Name: "current_block_height", + Namespace: "neogo", + }, + ) + //persistedHeight prometheus metric. + persistedHeight = prometheus.NewGauge( + prometheus.GaugeOpts{ + Help: "Current persisted block count", + Name: "current_persisted_height", + Namespace: "neogo", + }, + ) + //headerHeight prometheus metric. + headerHeight = prometheus.NewGauge( + prometheus.GaugeOpts{ + Help: "Current header height", + Name: "current_header_height", + Namespace: "neogo", + }, + ) + //mempoolUnsortedTx prometheus metric. + mempoolUnsortedTx = prometheus.NewGauge( + prometheus.GaugeOpts{ + Help: "Mempool Unsorted TXs", + Name: "mempool_unsorted_tx", + Namespace: "neogo", + }, + ) + //mempoolUnverifiedTx prometheus metric. + mempoolUnverifiedTx = prometheus.NewGauge( + prometheus.GaugeOpts{ + Help: "Mempool Unverified TXs", + Name: "mempool_unverified_tx", + Namespace: "neogo", + }, + ) +) + +func init() { + prometheus.MustRegister( + blockHeight, + persistedHeight, + headerHeight, + mempoolUnsortedTx, + mempoolUnverifiedTx, + ) +} + +func updatePersistedHeightMetric(pHeight uint32) { + persistedHeight.Set(float64(pHeight)) +} + +func updateHeaderHeightMetric(hHeight int) { + headerHeight.Set(float64(hHeight)) +} + +func updateBlockHeightMetric(bHeight uint32) { + blockHeight.Set(float64(bHeight)) +} + +func updateMempoolMetrics(unsortedTxnLen int, unverifiedTxnLen int) { + mempoolUnsortedTx.Set(float64(unsortedTxnLen)) + mempoolUnverifiedTx.Set(float64(unverifiedTxnLen)) +} diff --git a/pkg/network/blockqueue.go b/pkg/network/blockqueue.go index 501ddd804..175aa7e7d 100644 --- a/pkg/network/blockqueue.go +++ b/pkg/network/blockqueue.go @@ -34,6 +34,7 @@ func (bq *blockQueue) run() { minblock := item.(*core.Block) if minblock.Index <= bq.chain.BlockHeight()+1 { _, _ = bq.queue.Get(1) + updateBlockQueueLenMetric(bq.length()) if minblock.Index == bq.chain.BlockHeight()+1 { err := bq.chain.AddBlock(minblock) if err != nil { @@ -58,6 +59,8 @@ func (bq *blockQueue) putBlock(block *core.Block) error { return nil } err := bq.queue.Put(block) + // update metrics + updateBlockQueueLenMetric(bq.length()) select { case bq.checkBlocks <- struct{}{}: // ok, signalled to goroutine processing queue diff --git a/pkg/network/discovery.go b/pkg/network/discovery.go index 7696ab77b..03340eee9 100644 --- a/pkg/network/discovery.go +++ b/pkg/network/discovery.go @@ -78,6 +78,7 @@ func (d *DefaultDiscovery) PoolCount() int { func (d *DefaultDiscovery) pushToPoolOrDrop(addr string) { select { case d.pool <- addr: + updatePoolCountMetric(d.PoolCount()) // ok, queued default: // whatever @@ -185,6 +186,7 @@ func (d *DefaultDiscovery) run() { d.lock.RLock() addrIsConnected := d.connectedAddrs[addr] d.lock.RUnlock() + updatePoolCountMetric(d.PoolCount()) if !addrIsConnected { go d.tryAddress(addr) } diff --git a/pkg/network/metrics/metrics.go b/pkg/network/metrics/metrics.go new file mode 100644 index 000000000..254bd84ba --- /dev/null +++ b/pkg/network/metrics/metrics.go @@ -0,0 +1,59 @@ +package metrics + +import ( + "context" + "net/http" + + "github.com/prometheus/client_golang/prometheus/promhttp" + log "github.com/sirupsen/logrus" +) + +// Service serves metrics provided by prometheus. +type Service struct { + *http.Server + config PrometheusConfig +} + +// PrometheusConfig config for Prometheus used for monitoring. +// Additional information about Prometheus could be found here: https://prometheus.io/docs/guides/go-application. +type PrometheusConfig struct { + Enabled bool `yaml:"Enabled"` + Port string `yaml:"Port"` +} + +// NewMetricsService created new service for gathering metrics. +func NewMetricsService(cfg PrometheusConfig) *Service { + return &Service{ + &http.Server{ + Addr: ":" + cfg.Port, + Handler: promhttp.Handler(), + }, cfg, + } +} + +// Start runs http service with exposed `/metrics` endpoint on configured port. +func (ms *Service) Start() { + if ms.config.Enabled { + err := ms.ListenAndServe() + if err != nil { + log.WithFields(log.Fields{ + "endpoint": ms.Addr, + }).Info("metrics service up and running") + } else { + log.Warn("metrics service couldn't start on configured port") + } + } else { + log.Infof("metrics service hasn't started since it's disabled") + } +} + +// ShutDown stops service. +func (ms *Service) ShutDown() { + log.WithFields(log.Fields{ + "endpoint": ms.config.Port, + }).Info("shutting down monitoring-service") + err := ms.Shutdown(context.Background()) + if err != nil { + log.Fatal("can't shut down monitoring service") + } +} diff --git a/pkg/network/prometheus.go b/pkg/network/prometheus.go new file mode 100644 index 000000000..dab35c44c --- /dev/null +++ b/pkg/network/prometheus.go @@ -0,0 +1,66 @@ +package network + +import ( + "github.com/prometheus/client_golang/prometheus" +) + +// Metric used in monitoring service. +var ( + peersConnected = prometheus.NewGauge( + prometheus.GaugeOpts{ + Help: "Number of connected peers", + Name: "peers_connected", + Namespace: "neogo", + }, + ) + + servAndNodeVersion = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Help: "Server and Node versions", + Name: "serv_node_version", + Namespace: "neogo", + }, + []string{"description", "value"}, + ) + + poolCount = prometheus.NewGauge( + prometheus.GaugeOpts{ + Help: "Number of available node addresses", + Name: "pool_count", + Namespace: "neogo", + }, + ) + + blockQueueLength = prometheus.NewGauge( + prometheus.GaugeOpts{ + Help: "Block queue length", + Name: "block_queue_length", + Namespace: "neogo", + }, + ) +) + +func init() { + prometheus.MustRegister( + peersConnected, + servAndNodeVersion, + poolCount, + blockQueueLength, + ) +} + +func updateBlockQueueLenMetric(bqLen int) { + blockQueueLength.Set(float64(bqLen)) +} + +func updatePoolCountMetric(pCount int) { + poolCount.Set(float64(pCount)) +} + +func updatePeersConnectedMetric(pConnected int) { + peersConnected.Set(float64(pConnected)) +} +func setServerAndNodeVersions(nodeVer string, serverID string) { + servAndNodeVersion.WithLabelValues("Node version: ", nodeVer).Add(0) + servAndNodeVersion.WithLabelValues("Server id: ", serverID).Add(0) +} diff --git a/pkg/network/server.go b/pkg/network/server.go index f5efc4fac..69d167613 100644 --- a/pkg/network/server.go +++ b/pkg/network/server.go @@ -5,6 +5,7 @@ import ( "fmt" "math/rand" "net" + "strconv" "sync" "time" @@ -101,6 +102,7 @@ func (s *Server) Start(errChan chan error) { go s.bQueue.run() go s.transport.Accept() + setServerAndNodeVersions(s.UserAgent, strconv.FormatUint(uint64(s.id), 10)) s.run() } @@ -157,6 +159,8 @@ func (s *Server) run() { log.WithFields(log.Fields{ "addr": p.NetAddr(), }).Info("new peer connected") + updatePeersConnectedMetric(s.PeerCount()) + case drop := <-s.unregister: if s.peers[drop.peer] { delete(s.peers, drop.peer) @@ -168,6 +172,7 @@ func (s *Server) run() { addr := drop.peer.NetAddr().String() s.discovery.UnregisterConnectedAddr(addr) s.discovery.BackFill(addr) + updatePeersConnectedMetric(s.PeerCount()) } // else the peer is already gone, which can happen // because we have two goroutines sending signals here diff --git a/pkg/rpc/prometheus.go b/pkg/rpc/prometheus.go new file mode 100644 index 000000000..7a58b8f19 --- /dev/null +++ b/pkg/rpc/prometheus.go @@ -0,0 +1,119 @@ +package rpc + +import "github.com/prometheus/client_golang/prometheus" + +// Metrics used in monitoring service. +var ( + getbestblockhashCalled = prometheus.NewCounter( + prometheus.CounterOpts{ + Help: "Number of calls to getbestblockhash rpc endpoint", + Name: "getbestblockhash_called", + Namespace: "neogo", + }, + ) + + getbestblockCalled = prometheus.NewCounter( + prometheus.CounterOpts{ + Help: "Number of calls to getbestblock rpc endpoint", + Name: "getbestblock_called", + Namespace: "neogo", + }, + ) + + getblockcountCalled = prometheus.NewCounter( + prometheus.CounterOpts{ + Help: "Number of calls to getblockcount rpc endpoint", + Name: "getblockcount_called", + Namespace: "neogo", + }, + ) + + getblockHashCalled = prometheus.NewCounter( + prometheus.CounterOpts{ + Help: "Number of calls to getblockhash rpc endpoint", + Name: "getblockhash_called", + Namespace: "neogo", + }, + ) + + getconnectioncountCalled = prometheus.NewCounter( + prometheus.CounterOpts{ + Help: "Number of calls to getconnectioncount rpc endpoint", + Name: "getconnectioncount_called", + Namespace: "neogo", + }, + ) + + getversionCalled = prometheus.NewCounter( + prometheus.CounterOpts{ + Help: "Number of calls to getversion rpc endpoint", + Name: "getversion_called", + Namespace: "neogo", + }, + ) + + getpeersCalled = prometheus.NewCounter( + prometheus.CounterOpts{ + Help: "Number of calls to getpeers rpc endpoint", + Name: "getpeers_called", + Namespace: "neogo", + }, + ) + + validateaddressCalled = prometheus.NewCounter( + prometheus.CounterOpts{ + Help: "Number of calls to validateaddress rpc endpoint", + Name: "validateaddress_called", + Namespace: "neogo", + }, + ) + + getassetstateCalled = prometheus.NewCounter( + prometheus.CounterOpts{ + Help: "Number of calls to getassetstate rpc endpoint", + Name: "getassetstate_called", + Namespace: "neogo", + }, + ) + + getaccountstateCalled = prometheus.NewCounter( + prometheus.CounterOpts{ + Help: "Number of calls to getaccountstate rpc endpoint", + Name: "getaccountstate_called", + Namespace: "neogo", + }, + ) + + getrawtransactionCalled = prometheus.NewCounter( + prometheus.CounterOpts{ + Help: "Number of calls to getrawtransaction rpc endpoint", + Name: "getrawtransaction_called", + Namespace: "neogo", + }, + ) + + sendrawtransactionCalled = prometheus.NewCounter( + prometheus.CounterOpts{ + Help: "Number of calls to sendrawtransaction rpc endpoint", + Name: "sendrawtransaction_called", + Namespace: "neogo", + }, + ) +) + +func init() { + prometheus.MustRegister( + getbestblockhashCalled, + getbestblockCalled, + getblockcountCalled, + getblockHashCalled, + getconnectioncountCalled, + getversionCalled, + getpeersCalled, + validateaddressCalled, + getassetstateCalled, + getaccountstateCalled, + getrawtransactionCalled, + sendrawtransactionCalled, + ) +} diff --git a/pkg/rpc/server.go b/pkg/rpc/server.go index f3bf7d344..24c203d30 100644 --- a/pkg/rpc/server.go +++ b/pkg/rpc/server.go @@ -107,9 +107,11 @@ func (s *Server) methodHandler(w http.ResponseWriter, req *Request, reqParams Pa Methods: switch req.Method { case "getbestblockhash": + getbestblockhashCalled.Inc() results = s.chain.CurrentBlockHash().ReverseString() case "getblock": + getbestblockCalled.Inc() var hash util.Uint256 param, err := reqParams.Value(0) @@ -145,9 +147,11 @@ Methods: results = wrappers.NewBlock(block, s.chain) case "getblockcount": + getblockcountCalled.Inc() results = s.chain.BlockHeight() case "getblockhash": + getblockHashCalled.Inc() param, err := reqParams.ValueWithType(0, "number") if err != nil { resultsErr = err @@ -160,9 +164,11 @@ Methods: results = s.chain.GetHeaderHash(param.IntVal) case "getconnectioncount": + getconnectioncountCalled.Inc() results = s.coreServer.PeerCount() case "getversion": + getversionCalled.Inc() results = result.Version{ Port: s.coreServer.ListenTCP, Nonce: s.coreServer.ID(), @@ -170,6 +176,7 @@ Methods: } case "getpeers": + getpeersCalled.Inc() peers := result.NewPeers() for _, addr := range s.coreServer.UnconnectedPeers() { peers.AddPeer("unconnected", addr) @@ -190,6 +197,7 @@ Methods: results = "TODO" case "validateaddress": + validateaddressCalled.Inc() param, err := reqParams.Value(0) if err != nil { resultsErr = err @@ -198,6 +206,7 @@ Methods: results = wrappers.ValidateAddress(param.RawValue) case "getassetstate": + getassetstateCalled.Inc() param, err := reqParams.ValueWithType(0, "string") if err != nil { resultsErr = err @@ -218,6 +227,7 @@ Methods: } case "getaccountstate": + getaccountstateCalled.Inc() param, err := reqParams.ValueWithType(0, "string") if err != nil { resultsErr = err @@ -229,9 +239,11 @@ Methods: results = "Invalid public account address" } case "getrawtransaction": + getrawtransactionCalled.Inc() results, resultsErr = s.getrawtransaction(reqParams) case "sendrawtransaction": + sendrawtransactionCalled.Inc() results, resultsErr = s.sendrawtransaction(reqParams) default: