// Meter configures the database metrics collectors and func (self *LDBDatabase) Meter(prefix string) { // Initialize all the metrics collector at the requested prefix self.getTimer = metrics.NewTimer(prefix + "user/gets") self.putTimer = metrics.NewTimer(prefix + "user/puts") self.delTimer = metrics.NewTimer(prefix + "user/dels") self.missMeter = metrics.NewMeter(prefix + "user/misses") self.readMeter = metrics.NewMeter(prefix + "user/reads") self.writeMeter = metrics.NewMeter(prefix + "user/writes") self.compTimeMeter = metrics.NewMeter(prefix + "compact/time") self.compReadMeter = metrics.NewMeter(prefix + "compact/input") self.compWriteMeter = metrics.NewMeter(prefix + "compact/output") // Create a quit channel for the periodic collector and run it self.quitLock.Lock() self.quitChan = make(chan chan error) self.quitLock.Unlock() go self.meter(3 * time.Second) }
// but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. package eth import ( "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/p2p" ) var ( propTxnInPacketsMeter = metrics.NewMeter("eth/prop/txns/in/packets") propTxnInTrafficMeter = metrics.NewMeter("eth/prop/txns/in/traffic") propTxnOutPacketsMeter = metrics.NewMeter("eth/prop/txns/out/packets") propTxnOutTrafficMeter = metrics.NewMeter("eth/prop/txns/out/traffic") propHashInPacketsMeter = metrics.NewMeter("eth/prop/hashes/in/packets") propHashInTrafficMeter = metrics.NewMeter("eth/prop/hashes/in/traffic") propHashOutPacketsMeter = metrics.NewMeter("eth/prop/hashes/out/packets") propHashOutTrafficMeter = metrics.NewMeter("eth/prop/hashes/out/traffic") propBlockInPacketsMeter = metrics.NewMeter("eth/prop/blocks/in/packets") propBlockInTrafficMeter = metrics.NewMeter("eth/prop/blocks/in/traffic") propBlockOutPacketsMeter = metrics.NewMeter("eth/prop/blocks/out/packets") propBlockOutTrafficMeter = metrics.NewMeter("eth/prop/blocks/out/traffic") reqHashInPacketsMeter = metrics.NewMeter("eth/req/hashes/in/packets") reqHashInTrafficMeter = metrics.NewMeter("eth/req/hashes/in/traffic") reqHashOutPacketsMeter = metrics.NewMeter("eth/req/hashes/out/packets") reqHashOutTrafficMeter = metrics.NewMeter("eth/req/hashes/out/traffic")
func New(config *Config) (*Ethereum, error) { // Bootstrap database logger.New(config.DataDir, config.LogFile, config.Verbosity) if len(config.LogJSON) > 0 { logger.NewJSONsystem(config.DataDir, config.LogJSON) } // Let the database take 3/4 of the max open files (TODO figure out a way to get the actual limit of the open files) const dbCount = 3 ethdb.OpenFileLimit = 128 / (dbCount + 1) newdb := config.NewDB if newdb == nil { newdb = func(path string) (common.Database, error) { return ethdb.NewLDBDatabase(path) } } blockDb, err := newdb(filepath.Join(config.DataDir, "blockchain")) if err != nil { return nil, fmt.Errorf("blockchain db err: %v", err) } if db, ok := blockDb.(*ethdb.LDBDatabase); ok { db.GetTimer = metrics.NewTimer("eth/db/block/user/gets") db.PutTimer = metrics.NewTimer("eth/db/block/user/puts") db.MissMeter = metrics.NewMeter("eth/db/block/user/misses") db.ReadMeter = metrics.NewMeter("eth/db/block/user/reads") db.WriteMeter = metrics.NewMeter("eth/db/block/user/writes") db.CompTimeMeter = metrics.NewMeter("eth/db/block/compact/time") db.CompReadMeter = metrics.NewMeter("eth/db/block/compact/input") db.CompWriteMeter = metrics.NewMeter("eth/db/block/compact/output") } stateDb, err := newdb(filepath.Join(config.DataDir, "state")) if err != nil { return nil, fmt.Errorf("state db err: %v", err) } if db, ok := stateDb.(*ethdb.LDBDatabase); ok { db.GetTimer = metrics.NewTimer("eth/db/state/user/gets") db.PutTimer = metrics.NewTimer("eth/db/state/user/puts") db.MissMeter = metrics.NewMeter("eth/db/state/user/misses") db.ReadMeter = metrics.NewMeter("eth/db/state/user/reads") db.WriteMeter = metrics.NewMeter("eth/db/state/user/writes") db.CompTimeMeter = metrics.NewMeter("eth/db/state/compact/time") db.CompReadMeter = metrics.NewMeter("eth/db/state/compact/input") db.CompWriteMeter = metrics.NewMeter("eth/db/state/compact/output") } extraDb, err := newdb(filepath.Join(config.DataDir, "extra")) if err != nil { return nil, fmt.Errorf("extra db err: %v", err) } if db, ok := extraDb.(*ethdb.LDBDatabase); ok { db.GetTimer = metrics.NewTimer("eth/db/extra/user/gets") db.PutTimer = metrics.NewTimer("eth/db/extra/user/puts") db.MissMeter = metrics.NewMeter("eth/db/extra/user/misses") db.ReadMeter = metrics.NewMeter("eth/db/extra/user/reads") db.WriteMeter = metrics.NewMeter("eth/db/extra/user/writes") db.CompTimeMeter = metrics.NewMeter("eth/db/extra/compact/time") db.CompReadMeter = metrics.NewMeter("eth/db/extra/compact/input") db.CompWriteMeter = metrics.NewMeter("eth/db/extra/compact/output") } nodeDb := filepath.Join(config.DataDir, "nodes") // Perform database sanity checks d, _ := blockDb.Get([]byte("ProtocolVersion")) protov := int(common.NewValue(d).Uint()) if protov != config.ProtocolVersion && protov != 0 { path := filepath.Join(config.DataDir, "blockchain") return nil, fmt.Errorf("Database version mismatch. Protocol(%d / %d). `rm -rf %s`", protov, config.ProtocolVersion, path) } saveProtocolVersion(blockDb, config.ProtocolVersion) glog.V(logger.Info).Infof("Protocol Version: %v, Network Id: %v", config.ProtocolVersion, config.NetworkId) if !config.SkipBcVersionCheck { b, _ := blockDb.Get([]byte("BlockchainVersion")) bcVersion := int(common.NewValue(b).Uint()) if bcVersion != config.BlockChainVersion && bcVersion != 0 { return nil, fmt.Errorf("Blockchain DB version mismatch (%d / %d). Run geth upgradedb.\n", bcVersion, config.BlockChainVersion) } saveBlockchainVersion(blockDb, config.BlockChainVersion) } glog.V(logger.Info).Infof("Blockchain DB Version: %d", config.BlockChainVersion) eth := &Ethereum{ shutdownChan: make(chan bool), databasesClosed: make(chan bool), blockDb: blockDb, stateDb: stateDb, extraDb: extraDb, eventMux: &event.TypeMux{}, accountManager: config.AccountManager, DataDir: config.DataDir, etherbase: common.HexToAddress(config.Etherbase), clientVersion: config.Name, // TODO should separate from Name ethVersionId: config.ProtocolVersion, netVersionId: config.NetworkId, NatSpec: config.NatSpec, MinerThreads: config.MinerThreads, SolcPath: config.SolcPath, AutoDAG: config.AutoDAG, GpoMinGasPrice: config.GpoMinGasPrice, GpoMaxGasPrice: config.GpoMaxGasPrice, GpoFullBlockRatio: config.GpoFullBlockRatio, GpobaseStepDown: config.GpobaseStepDown, GpobaseStepUp: config.GpobaseStepUp, GpobaseCorrectionFactor: config.GpobaseCorrectionFactor, } eth.pow = ethash.New() genesis := core.GenesisBlock(uint64(config.GenesisNonce), stateDb) eth.chainManager, err = core.NewChainManager(genesis, blockDb, stateDb, eth.pow, eth.EventMux()) if err != nil { return nil, err } eth.txPool = core.NewTxPool(eth.EventMux(), eth.chainManager.State, eth.chainManager.GasLimit) eth.blockProcessor = core.NewBlockProcessor(stateDb, extraDb, eth.pow, eth.chainManager, eth.EventMux()) eth.chainManager.SetProcessor(eth.blockProcessor) eth.protocolManager = NewProtocolManager(config.ProtocolVersion, config.NetworkId, eth.eventMux, eth.txPool, eth.pow, eth.chainManager) eth.miner = miner.New(eth, eth.EventMux(), eth.pow) eth.miner.SetGasPrice(config.GasPrice) if config.Shh { eth.whisper = whisper.New() eth.shhVersionId = int(eth.whisper.Version()) } netprv, err := config.nodeKey() if err != nil { return nil, err } protocols := []p2p.Protocol{eth.protocolManager.SubProtocol} if config.Shh { protocols = append(protocols, eth.whisper.Protocol()) } eth.net = &p2p.Server{ PrivateKey: netprv, Name: config.Name, MaxPeers: config.MaxPeers, MaxPendingPeers: config.MaxPendingPeers, Discovery: config.Discovery, Protocols: protocols, NAT: config.NAT, NoDial: !config.Dial, BootstrapNodes: config.parseBootNodes(), StaticNodes: config.parseNodes(staticNodes), TrustedNodes: config.parseNodes(trustedNodes), NodeDatabase: nodeDb, } if len(config.Port) > 0 { eth.net.ListenAddr = ":" + config.Port } vm.Debug = config.VmDebug return eth, nil }
// // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. // Contains the meters and timers used by the networking layer. package p2p import ( "net" "github.com/ethereum/go-ethereum/metrics" ) var ( ingressConnectMeter = metrics.NewMeter("p2p/InboundConnects") ingressTrafficMeter = metrics.NewMeter("p2p/InboundTraffic") egressConnectMeter = metrics.NewMeter("p2p/OutboundConnects") egressTrafficMeter = metrics.NewMeter("p2p/OutboundTraffic") ) // meteredConn is a wrapper around a network TCP connection that meters both the // inbound and outbound network traffic. type meteredConn struct { *net.TCPConn // Network connection to wrap with metering } // newMeteredConn creates a new metered connection, also bumping the ingress or // egress connection meter. func newMeteredConn(conn net.Conn, ingress bool) net.Conn { if ingress {
// go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. package eth import ( "github.com/ethereum/go-ethereum/metrics" ) var ( propTxnInPacketsMeter = metrics.NewMeter("eth/prop/txns/in/packets") propTxnInTrafficMeter = metrics.NewMeter("eth/prop/txns/in/traffic") propTxnOutPacketsMeter = metrics.NewMeter("eth/prop/txns/out/packets") propTxnOutTrafficMeter = metrics.NewMeter("eth/prop/txns/out/traffic") propHashInPacketsMeter = metrics.NewMeter("eth/prop/hashes/in/packets") propHashInTrafficMeter = metrics.NewMeter("eth/prop/hashes/in/traffic") propHashOutPacketsMeter = metrics.NewMeter("eth/prop/hashes/out/packets") propHashOutTrafficMeter = metrics.NewMeter("eth/prop/hashes/out/traffic") propBlockInPacketsMeter = metrics.NewMeter("eth/prop/blocks/in/packets") propBlockInTrafficMeter = metrics.NewMeter("eth/prop/blocks/in/traffic") propBlockOutPacketsMeter = metrics.NewMeter("eth/prop/blocks/out/packets") propBlockOutTrafficMeter = metrics.NewMeter("eth/prop/blocks/out/traffic") reqHashInPacketsMeter = metrics.NewMeter("eth/req/hashes/in/packets") reqHashInTrafficMeter = metrics.NewMeter("eth/req/hashes/in/traffic") reqHashOutPacketsMeter = metrics.NewMeter("eth/req/hashes/out/packets") reqHashOutTrafficMeter = metrics.NewMeter("eth/req/hashes/out/traffic")
// // go-ethereum is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // go-ethereum is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. // Contains the metrics collected by the fetcher. package fetcher import ( "github.com/ethereum/go-ethereum/metrics" ) var ( announceMeter = metrics.NewMeter("eth/sync/RemoteAnnounces") announceTimer = metrics.NewTimer("eth/sync/LocalAnnounces") broadcastMeter = metrics.NewMeter("eth/sync/RemoteBroadcasts") broadcastTimer = metrics.NewTimer("eth/sync/LocalBroadcasts") discardMeter = metrics.NewMeter("eth/sync/DiscardedBlocks") futureMeter = metrics.NewMeter("eth/sync/FutureBlocks") )
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. // Contains the metrics collected by the downloader. package downloader import ( "github.com/ethereum/go-ethereum/metrics" ) var ( hashInMeter = metrics.NewMeter("eth/downloader/hashes/in") hashReqTimer = metrics.NewTimer("eth/downloader/hashes/req") hashDropMeter = metrics.NewMeter("eth/downloader/hashes/drop") hashTimeoutMeter = metrics.NewMeter("eth/downloader/hashes/timeout") blockInMeter = metrics.NewMeter("eth/downloader/blocks/in") blockReqTimer = metrics.NewTimer("eth/downloader/blocks/req") blockDropMeter = metrics.NewMeter("eth/downloader/blocks/drop") blockTimeoutMeter = metrics.NewMeter("eth/downloader/blocks/timeout") headerInMeter = metrics.NewMeter("eth/downloader/headers/in") headerReqTimer = metrics.NewTimer("eth/downloader/headers/req") headerDropMeter = metrics.NewMeter("eth/downloader/headers/drop") headerTimeoutMeter = metrics.NewMeter("eth/downloader/headers/timeout") bodyInMeter = metrics.NewMeter("eth/downloader/bodies/in")
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. // Contains the metrics collected by the fetcher. package fetcher import ( "github.com/ethereum/go-ethereum/metrics" ) var ( propAnnounceInMeter = metrics.NewMeter("eth/fetcher/prop/announces/in") propAnnounceOutTimer = metrics.NewTimer("eth/fetcher/prop/announces/out") propAnnounceDropMeter = metrics.NewMeter("eth/fetcher/prop/announces/drop") propAnnounceDOSMeter = metrics.NewMeter("eth/fetcher/prop/announces/dos") propBroadcastInMeter = metrics.NewMeter("eth/fetcher/prop/broadcasts/in") propBroadcastOutTimer = metrics.NewTimer("eth/fetcher/prop/broadcasts/out") propBroadcastDropMeter = metrics.NewMeter("eth/fetcher/prop/broadcasts/drop") propBroadcastDOSMeter = metrics.NewMeter("eth/fetcher/prop/broadcasts/dos") blockFetchMeter = metrics.NewMeter("eth/fetcher/fetch/blocks") headerFetchMeter = metrics.NewMeter("eth/fetcher/fetch/headers") bodyFetchMeter = metrics.NewMeter("eth/fetcher/fetch/bodies") blockFilterInMeter = metrics.NewMeter("eth/fetcher/filter/blocks/in") blockFilterOutMeter = metrics.NewMeter("eth/fetcher/filter/blocks/out")