swarm: LocalStore metrics
* swarm/shed: remove metrics fields from DB struct * swarm/schunk: add String methods to modes * swarm/storage/localstore: add metrics and traces * swarm/chunk: unknown modes without spaces in String methods * swarm/storage/localstore: remove bin number from pull subscription metrics * swarm/storage/localstore: add resetting time metrics and code improvements
This commit is contained in:
committed by
Anton Evangelatov
parent
993b145f25
commit
c1213bd00c
@@ -20,10 +20,15 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/ethereum/go-ethereum/log"
|
||||
"github.com/ethereum/go-ethereum/metrics"
|
||||
"github.com/ethereum/go-ethereum/swarm/chunk"
|
||||
"github.com/ethereum/go-ethereum/swarm/shed"
|
||||
"github.com/ethereum/go-ethereum/swarm/spancontext"
|
||||
"github.com/opentracing/opentracing-go"
|
||||
olog "github.com/opentracing/opentracing-go/log"
|
||||
"github.com/syndtr/goleveldb/leveldb"
|
||||
)
|
||||
|
||||
@@ -36,6 +41,9 @@ import (
|
||||
// Make sure that you check the second returned parameter from the channel to stop iteration when its value
|
||||
// is false.
|
||||
func (db *DB) SubscribePull(ctx context.Context, bin uint8, since, until uint64) (c <-chan chunk.Descriptor, stop func()) {
|
||||
metricName := "localstore.SubscribePull"
|
||||
metrics.GetOrRegisterCounter(metricName, nil).Inc(1)
|
||||
|
||||
chunkDescriptors := make(chan chunk.Descriptor)
|
||||
trigger := make(chan struct{}, 1)
|
||||
|
||||
@@ -57,6 +65,7 @@ func (db *DB) SubscribePull(ctx context.Context, bin uint8, since, until uint64)
|
||||
var errStopSubscription = errors.New("stop subscription")
|
||||
|
||||
go func() {
|
||||
defer metrics.GetOrRegisterCounter(metricName+".stop", nil).Inc(1)
|
||||
// close the returned chunk.Descriptor channel at the end to
|
||||
// signal that the subscription is done
|
||||
defer close(chunkDescriptors)
|
||||
@@ -77,12 +86,20 @@ func (db *DB) SubscribePull(ctx context.Context, bin uint8, since, until uint64)
|
||||
// - last index Item is reached
|
||||
// - subscription stop is called
|
||||
// - context is done
|
||||
metrics.GetOrRegisterCounter(metricName+".iter", nil).Inc(1)
|
||||
|
||||
ctx, sp := spancontext.StartSpan(ctx, metricName+".iter")
|
||||
sp.LogFields(olog.Int("bin", int(bin)), olog.Uint64("since", since), olog.Uint64("until", until))
|
||||
|
||||
iterStart := time.Now()
|
||||
var count int
|
||||
err := db.pullIndex.Iterate(func(item shed.Item) (stop bool, err error) {
|
||||
select {
|
||||
case chunkDescriptors <- chunk.Descriptor{
|
||||
Address: item.Address,
|
||||
BinID: item.BinID,
|
||||
}:
|
||||
count++
|
||||
// until chunk descriptor is sent
|
||||
// break the iteration
|
||||
if until > 0 && item.BinID >= until {
|
||||
@@ -111,12 +128,25 @@ func (db *DB) SubscribePull(ctx context.Context, bin uint8, since, until uint64)
|
||||
SkipStartFromItem: !first,
|
||||
Prefix: []byte{bin},
|
||||
})
|
||||
|
||||
totalTimeMetric(metricName+".iter", iterStart)
|
||||
|
||||
sp.FinishWithOptions(opentracing.FinishOptions{
|
||||
LogRecords: []opentracing.LogRecord{
|
||||
{
|
||||
Timestamp: time.Now(),
|
||||
Fields: []olog.Field{olog.Int("count", count)},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
if err == errStopSubscription {
|
||||
// stop subscription without any errors
|
||||
// if until is reached
|
||||
return
|
||||
}
|
||||
metrics.GetOrRegisterCounter(metricName+".iter.error", nil).Inc(1)
|
||||
log.Error("localstore pull subscription iteration", "bin", bin, "since", since, "until", until, "err", err)
|
||||
return
|
||||
}
|
||||
@@ -162,6 +192,8 @@ func (db *DB) SubscribePull(ctx context.Context, bin uint8, since, until uint64)
|
||||
// in pull syncing index for a provided bin. If there are no chunks in
|
||||
// that bin, 0 value is returned.
|
||||
func (db *DB) LastPullSubscriptionBinID(bin uint8) (id uint64, err error) {
|
||||
metrics.GetOrRegisterCounter("localstore.LastPullSubscriptionBinID", nil).Inc(1)
|
||||
|
||||
item, err := db.pullIndex.Last([]byte{bin})
|
||||
if err != nil {
|
||||
if err == leveldb.ErrNotFound {
|
||||
|
Reference in New Issue
Block a user