Skip to content

Commit e896cab

Browse files
committed
Merge pull request #1360 from obscuren/peter-metrics
Rebased peter's PR
2 parents 7c4ed80 + 5f3792c commit e896cab

File tree

13 files changed

+326
-83
lines changed

13 files changed

+326
-83
lines changed

cmd/geth/main.go

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@ import (
3939
"github.com/ethereum/go-ethereum/common"
4040
"github.com/ethereum/go-ethereum/eth"
4141
"github.com/ethereum/go-ethereum/logger"
42+
"github.com/ethereum/go-ethereum/metrics"
4243
"github.com/ethereum/go-ethereum/rpc/codec"
4344
"github.com/ethereum/go-ethereum/rpc/comms"
4445
"github.com/mattn/go-colorable"
4546
"github.com/mattn/go-isatty"
46-
"github.com/rcrowley/go-metrics"
4747
)
4848

4949
const (
@@ -272,6 +272,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso
272272
utils.LogJSONFlag,
273273
utils.PProfEanbledFlag,
274274
utils.PProfPortFlag,
275+
utils.MetricsEnabledFlag,
275276
utils.SolcPathFlag,
276277
utils.GpoMinGasPriceFlag,
277278
utils.GpoMaxGasPriceFlag,
@@ -288,27 +289,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso
288289
return nil
289290
}
290291
// Start system runtime metrics collection
291-
go func() {
292-
allocs := metrics.GetOrRegisterMeter("system/memory/allocs", metrics.DefaultRegistry)
293-
frees := metrics.GetOrRegisterMeter("system/memory/frees", metrics.DefaultRegistry)
294-
inuse := metrics.GetOrRegisterMeter("system/memory/inuse", metrics.DefaultRegistry)
295-
pauses := metrics.GetOrRegisterMeter("system/memory/pauses", metrics.DefaultRegistry)
296-
297-
stats := make([]*runtime.MemStats, 2)
298-
for i := 0; i < len(stats); i++ {
299-
stats[i] = new(runtime.MemStats)
300-
}
301-
for i := 1; ; i++ {
302-
runtime.ReadMemStats(stats[i%2])
303-
304-
allocs.Mark(int64(stats[i%2].Mallocs - stats[(i-1)%2].Mallocs))
305-
frees.Mark(int64(stats[i%2].Frees - stats[(i-1)%2].Frees))
306-
inuse.Mark(int64(stats[i%2].Alloc - stats[(i-1)%2].Alloc))
307-
pauses.Mark(int64(stats[i%2].PauseTotalNs - stats[(i-1)%2].PauseTotalNs))
308-
309-
time.Sleep(3 * time.Second)
310-
}
311-
}()
292+
go metrics.CollectProcessMetrics(3 * time.Second)
312293
}
313294

314295
func main() {

cmd/geth/monitorcmd.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,12 @@ func monitor(ctx *cli.Context) {
7575
if len(monitored) == 0 {
7676
list := expandMetrics(metrics, "")
7777
sort.Strings(list)
78-
utils.Fatalf("No metrics specified.\n\nAvailable:\n - %s", strings.Join(list, "\n - "))
78+
79+
if len(list) > 0 {
80+
utils.Fatalf("No metrics specified.\n\nAvailable:\n - %s", strings.Join(list, "\n - "))
81+
} else {
82+
utils.Fatalf("No metrics collected by geth (--%s).\n", utils.MetricsEnabledFlag.Name)
83+
}
7984
}
8085
sort.Strings(monitored)
8186
if cols := len(monitored) / ctx.Int(monitorCommandRowsFlag.Name); cols > 6 {
@@ -285,7 +290,7 @@ func updateChart(metric string, data []float64, base *int, chart *termui.LineCha
285290
}
286291
// Update the chart's label with the scale units
287292
units := dataUnits
288-
if strings.Contains(metric, "/Percentiles/") || strings.Contains(metric, "/pauses/") {
293+
if strings.Contains(metric, "/Percentiles/") || strings.Contains(metric, "/pauses/") || strings.Contains(metric, "/time/") {
289294
units = timeUnits
290295
}
291296
chart.Border.Label = metric

cmd/utils/flags.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import (
1010
"path/filepath"
1111
"runtime"
1212

13+
"github.com/ethereum/go-ethereum/metrics"
14+
1315
"github.com/codegangsta/cli"
1416
"github.com/ethereum/ethash"
1517
"github.com/ethereum/go-ethereum/accounts"
@@ -187,6 +189,10 @@ var (
187189
Usage: "Port on which the profiler should listen",
188190
Value: 6060,
189191
}
192+
MetricsEnabledFlag = cli.BoolFlag{
193+
Name: metrics.MetricsEnabledFlag,
194+
Usage: "Enables metrics collection and reporting",
195+
}
190196

191197
// RPC settings
192198
RPCEnabledFlag = cli.BoolFlag{

core/chain_manager.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ import (
1818
"github.com/ethereum/go-ethereum/event"
1919
"github.com/ethereum/go-ethereum/logger"
2020
"github.com/ethereum/go-ethereum/logger/glog"
21+
"github.com/ethereum/go-ethereum/metrics"
2122
"github.com/ethereum/go-ethereum/params"
2223
"github.com/ethereum/go-ethereum/pow"
2324
"github.com/ethereum/go-ethereum/rlp"
2425
"github.com/hashicorp/golang-lru"
25-
"github.com/rcrowley/go-metrics"
2626
"github.com/syndtr/goleveldb/leveldb"
2727
)
2828

@@ -33,7 +33,7 @@ var (
3333
blockHashPre = []byte("block-hash-")
3434
blockNumPre = []byte("block-num-")
3535

36-
blockInsertTimer = metrics.GetOrRegisterTimer("core/BlockInsertions", metrics.DefaultRegistry)
36+
blockInsertTimer = metrics.NewTimer("chain/inserts")
3737
)
3838

3939
const (

eth/backend.go

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
"strings"
1212
"time"
1313

14+
"github.com/ethereum/go-ethereum/metrics"
15+
1416
"github.com/ethereum/ethash"
1517
"github.com/ethereum/go-ethereum/accounts"
1618
"github.com/ethereum/go-ethereum/common"
@@ -29,7 +31,6 @@ import (
2931
"github.com/ethereum/go-ethereum/p2p/discover"
3032
"github.com/ethereum/go-ethereum/p2p/nat"
3133
"github.com/ethereum/go-ethereum/whisper"
32-
"github.com/rcrowley/go-metrics"
3334
)
3435

3536
const (
@@ -250,33 +251,42 @@ func New(config *Config) (*Ethereum, error) {
250251
return nil, fmt.Errorf("blockchain db err: %v", err)
251252
}
252253
if db, ok := blockDb.(*ethdb.LDBDatabase); ok {
253-
db.GetTimer = metrics.GetOrRegisterTimer("eth/db/block/Gets", metrics.DefaultRegistry)
254-
db.PutTimer = metrics.GetOrRegisterTimer("eth/db/block/Puts", metrics.DefaultRegistry)
255-
db.MissMeter = metrics.GetOrRegisterMeter("eth/db/block/Misses", metrics.DefaultRegistry)
256-
db.ReadMeter = metrics.GetOrRegisterMeter("eth/db/block/Reads", metrics.DefaultRegistry)
257-
db.WriteMeter = metrics.GetOrRegisterMeter("eth/db/block/Writes", metrics.DefaultRegistry)
254+
db.GetTimer = metrics.NewTimer("eth/db/block/user/gets")
255+
db.PutTimer = metrics.NewTimer("eth/db/block/user/puts")
256+
db.MissMeter = metrics.NewMeter("eth/db/block/user/misses")
257+
db.ReadMeter = metrics.NewMeter("eth/db/block/user/reads")
258+
db.WriteMeter = metrics.NewMeter("eth/db/block/user/writes")
259+
db.CompTimeMeter = metrics.NewMeter("eth/db/block/compact/time")
260+
db.CompReadMeter = metrics.NewMeter("eth/db/block/compact/input")
261+
db.CompWriteMeter = metrics.NewMeter("eth/db/block/compact/output")
258262
}
259263
stateDb, err := newdb(filepath.Join(config.DataDir, "state"))
260264
if err != nil {
261265
return nil, fmt.Errorf("state db err: %v", err)
262266
}
263267
if db, ok := stateDb.(*ethdb.LDBDatabase); ok {
264-
db.GetTimer = metrics.GetOrRegisterTimer("eth/db/state/Gets", metrics.DefaultRegistry)
265-
db.PutTimer = metrics.GetOrRegisterTimer("eth/db/state/Puts", metrics.DefaultRegistry)
266-
db.MissMeter = metrics.GetOrRegisterMeter("eth/db/state/Misses", metrics.DefaultRegistry)
267-
db.ReadMeter = metrics.GetOrRegisterMeter("eth/db/state/Reads", metrics.DefaultRegistry)
268-
db.WriteMeter = metrics.GetOrRegisterMeter("eth/db/state/Writes", metrics.DefaultRegistry)
268+
db.GetTimer = metrics.NewTimer("eth/db/state/user/gets")
269+
db.PutTimer = metrics.NewTimer("eth/db/state/user/puts")
270+
db.MissMeter = metrics.NewMeter("eth/db/state/user/misses")
271+
db.ReadMeter = metrics.NewMeter("eth/db/state/user/reads")
272+
db.WriteMeter = metrics.NewMeter("eth/db/state/user/writes")
273+
db.CompTimeMeter = metrics.NewMeter("eth/db/state/compact/time")
274+
db.CompReadMeter = metrics.NewMeter("eth/db/state/compact/input")
275+
db.CompWriteMeter = metrics.NewMeter("eth/db/state/compact/output")
269276
}
270277
extraDb, err := newdb(filepath.Join(config.DataDir, "extra"))
271278
if err != nil {
272279
return nil, fmt.Errorf("extra db err: %v", err)
273280
}
274281
if db, ok := extraDb.(*ethdb.LDBDatabase); ok {
275-
db.GetTimer = metrics.GetOrRegisterTimer("eth/db/extra/Gets", metrics.DefaultRegistry)
276-
db.PutTimer = metrics.GetOrRegisterTimer("eth/db/extra/Puts", metrics.DefaultRegistry)
277-
db.MissMeter = metrics.GetOrRegisterMeter("eth/db/extra/Misses", metrics.DefaultRegistry)
278-
db.ReadMeter = metrics.GetOrRegisterMeter("eth/db/extra/Reads", metrics.DefaultRegistry)
279-
db.WriteMeter = metrics.GetOrRegisterMeter("eth/db/extra/Writes", metrics.DefaultRegistry)
282+
db.GetTimer = metrics.NewTimer("eth/db/extra/user/gets")
283+
db.PutTimer = metrics.NewTimer("eth/db/extra/user/puts")
284+
db.MissMeter = metrics.NewMeter("eth/db/extra/user/misses")
285+
db.ReadMeter = metrics.NewMeter("eth/db/extra/user/reads")
286+
db.WriteMeter = metrics.NewMeter("eth/db/extra/user/writes")
287+
db.CompTimeMeter = metrics.NewMeter("eth/db/extra/compact/time")
288+
db.CompReadMeter = metrics.NewMeter("eth/db/extra/compact/input")
289+
db.CompWriteMeter = metrics.NewMeter("eth/db/extra/compact/output")
280290
}
281291
nodeDb := filepath.Join(config.DataDir, "nodes")
282292

eth/fetcher/fetcher.go

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,11 @@ import (
77
"math/rand"
88
"time"
99

10-
"github.com/ethereum/go-ethereum/core"
11-
1210
"github.com/ethereum/go-ethereum/common"
11+
"github.com/ethereum/go-ethereum/core"
1312
"github.com/ethereum/go-ethereum/core/types"
1413
"github.com/ethereum/go-ethereum/logger"
1514
"github.com/ethereum/go-ethereum/logger/glog"
16-
"github.com/rcrowley/go-metrics"
1715
"gopkg.in/karalabe/cookiejar.v2/collections/prque"
1816
)
1917

@@ -99,14 +97,6 @@ type Fetcher struct {
9997
// Testing hooks
10098
fetchingHook func([]common.Hash) // Method to call upon starting a block fetch
10199
importedHook func(*types.Block) // Method to call upon successful block import
102-
103-
// Runtime metrics
104-
announceMeter metrics.Meter // Counter for metering the inbound announcements
105-
announceTimer metrics.Timer // Counter and timer for metering the announce forwarding
106-
broadcastMeter metrics.Meter // Counter for metering the inbound propagations
107-
broadcastTimer metrics.Timer // Counter and timer for metering the block forwarding
108-
discardMeter metrics.Meter // Counter for metering the discarded blocks
109-
futureMeter metrics.Meter // Counter for metering future blocks
110100
}
111101

112102
// New creates a block fetcher to retrieve blocks based on hash announcements.
@@ -129,12 +119,6 @@ func New(getBlock blockRetrievalFn, validateBlock blockValidatorFn, broadcastBlo
129119
chainHeight: chainHeight,
130120
insertChain: insertChain,
131121
dropPeer: dropPeer,
132-
announceMeter: metrics.GetOrRegisterMeter("eth/sync/RemoteAnnounces", metrics.DefaultRegistry),
133-
announceTimer: metrics.GetOrRegisterTimer("eth/sync/LocalAnnounces", metrics.DefaultRegistry),
134-
broadcastMeter: metrics.GetOrRegisterMeter("eth/sync/RemoteBroadcasts", metrics.DefaultRegistry),
135-
broadcastTimer: metrics.GetOrRegisterTimer("eth/sync/LocalBroadcasts", metrics.DefaultRegistry),
136-
discardMeter: metrics.GetOrRegisterMeter("eth/sync/DiscardedBlocks", metrics.DefaultRegistry),
137-
futureMeter: metrics.GetOrRegisterMeter("eth/sync/FutureBlocks", metrics.DefaultRegistry),
138122
}
139123
}
140124

@@ -246,7 +230,7 @@ func (f *Fetcher) loop() {
246230

247231
case notification := <-f.notify:
248232
// A block was announced, make sure the peer isn't DOSing us
249-
f.announceMeter.Mark(1)
233+
announceMeter.Mark(1)
250234

251235
count := f.announces[notification.origin] + 1
252236
if count > hashLimit {
@@ -265,7 +249,7 @@ func (f *Fetcher) loop() {
265249

266250
case op := <-f.inject:
267251
// A direct block insertion was requested, try and fill any pending gaps
268-
f.broadcastMeter.Mark(1)
252+
broadcastMeter.Mark(1)
269253
f.enqueue(op.origin, op.block)
270254

271255
case hash := <-f.done:
@@ -384,7 +368,7 @@ func (f *Fetcher) enqueue(peer string, block *types.Block) {
384368
// Discard any past or too distant blocks
385369
if dist := int64(block.NumberU64()) - int64(f.chainHeight()); dist < -maxUncleDist || dist > maxQueueDist {
386370
glog.V(logger.Debug).Infof("Peer %s: discarded block #%d [%x], distance %d", peer, block.NumberU64(), hash.Bytes()[:4], dist)
387-
f.discardMeter.Mark(1)
371+
discardMeter.Mark(1)
388372
return
389373
}
390374
// Schedule the block for future importing
@@ -423,11 +407,11 @@ func (f *Fetcher) insert(peer string, block *types.Block) {
423407
switch err := f.validateBlock(block, parent); err {
424408
case nil:
425409
// All ok, quickly propagate to our peers
426-
f.broadcastTimer.UpdateSince(block.ReceivedAt)
410+
broadcastTimer.UpdateSince(block.ReceivedAt)
427411
go f.broadcastBlock(block, true)
428412

429413
case core.BlockFutureErr:
430-
f.futureMeter.Mark(1)
414+
futureMeter.Mark(1)
431415
// Weird future block, don't fail, but neither propagate
432416

433417
default:
@@ -442,7 +426,7 @@ func (f *Fetcher) insert(peer string, block *types.Block) {
442426
return
443427
}
444428
// If import succeeded, broadcast the block
445-
f.announceTimer.UpdateSince(block.ReceivedAt)
429+
announceTimer.UpdateSince(block.ReceivedAt)
446430
go f.broadcastBlock(block, false)
447431

448432
// Invoke the testing hook if needed

eth/fetcher/metrics.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Contains the metrics collected by the fetcher.
2+
3+
package fetcher
4+
5+
import (
6+
"github.com/ethereum/go-ethereum/metrics"
7+
)
8+
9+
var (
10+
announceMeter = metrics.NewMeter("eth/sync/RemoteAnnounces")
11+
announceTimer = metrics.NewTimer("eth/sync/LocalAnnounces")
12+
broadcastMeter = metrics.NewMeter("eth/sync/RemoteBroadcasts")
13+
broadcastTimer = metrics.NewTimer("eth/sync/LocalBroadcasts")
14+
discardMeter = metrics.NewMeter("eth/sync/DiscardedBlocks")
15+
futureMeter = metrics.NewMeter("eth/sync/FutureBlocks")
16+
)

0 commit comments

Comments
 (0)