create the metrics package for a better app instrumenting

This commit is contained in:
Pantani
2021-03-23 01:40:32 -03:00
parent e2f9a1d7eb
commit 3b3d96e07c
6 changed files with 211 additions and 112 deletions

View File

@@ -35,7 +35,7 @@ Symbol = "SUSHI"
Addr = "0x6b3595068778dd592e39a122f4f5a5cf09c90fe2" Addr = "0x6b3595068778dd592e39a122f4f5a5cf09c90fe2"
[Debug] [Debug]
APIAddress = "localhost:12345" APIAddress = "0.0.0.0:12345"
MeddlerLogs = true MeddlerLogs = true
GinDebugMode = true GinDebugMode = true

192
metric/metric.go Normal file
View File

@@ -0,0 +1,192 @@
package metric
import (
"time"
"github.com/hermeznetwork/hermez-node/log"
"github.com/prometheus/client_golang/prometheus"
)
type (
// Metric represents the metric type
Metric string
)
const (
namespaceError = "error"
namespaceSync = "synchronizer"
namespaceTxSelector = "txselector"
namespaceAPI = "api"
)
var (
// Errors errors count metric.
Errors = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: namespaceError,
Name: "errors",
Help: "",
}, []string{"error"})
// WaitServerProof duration time to get the calculated
// proof from the server.
WaitServerProof = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Namespace: namespaceSync,
Name: "wait_server_proof",
Help: "",
}, []string{"batch_number", "pipeline_number"})
// Reorgs block reorg count
Reorgs = prometheus.NewCounter(
prometheus.CounterOpts{
Namespace: namespaceSync,
Name: "reorgs",
Help: "",
})
// LastBlockNum last block synced
LastBlockNum = prometheus.NewGauge(
prometheus.GaugeOpts{
Namespace: namespaceSync,
Name: "synced_last_block_num",
Help: "",
})
// EthLastBlockNum last eth block synced
EthLastBlockNum = prometheus.NewGauge(
prometheus.GaugeOpts{
Namespace: namespaceSync,
Name: "eth_last_block_num",
Help: "",
})
// LastBatchNum last batch synced
LastBatchNum = prometheus.NewGauge(
prometheus.GaugeOpts{
Namespace: namespaceSync,
Name: "synced_last_batch_num",
Help: "",
})
// EthLastBatchNum last eth batch synced
EthLastBatchNum = prometheus.NewGauge(
prometheus.GaugeOpts{
Namespace: namespaceSync,
Name: "eth_last_batch_num",
Help: "",
})
// GetL2TxSelection L2 tx selection count
GetL2TxSelection = prometheus.NewCounter(
prometheus.CounterOpts{
Namespace: namespaceTxSelector,
Name: "get_l2_txselection_total",
Help: "",
})
// GetL1L2TxSelection L1L2 tx selection count
GetL1L2TxSelection = prometheus.NewCounter(
prometheus.CounterOpts{
Namespace: namespaceTxSelector,
Name: "get_l1_l2_txselection_total",
Help: "",
})
// SelectedL1CoordinatorTxs selected L1 coordinator tx count
SelectedL1CoordinatorTxs = prometheus.NewGauge(
prometheus.GaugeOpts{
Namespace: namespaceTxSelector,
Name: "selected_l1_coordinator_txs",
Help: "",
})
// SelectedL1UserTxs selected L1 user tx count
SelectedL1UserTxs = prometheus.NewGauge(
prometheus.GaugeOpts{
Namespace: namespaceTxSelector,
Name: "selected_l1_user_txs",
Help: "",
})
// SelectedL2Txs selected L2 tx count
SelectedL2Txs = prometheus.NewGauge(
prometheus.GaugeOpts{
Namespace: namespaceTxSelector,
Name: "selected_l2_txs",
Help: "",
})
// DiscardedL2Txs discarded L2 tx count
DiscardedL2Txs = prometheus.NewGauge(
prometheus.GaugeOpts{
Namespace: namespaceTxSelector,
Name: "discarded_l2_txs",
Help: "",
})
)
func init() {
if err := registerCollectors(); err != nil {
log.Error(err)
}
}
func registerCollectors() error {
if err := registerCollector(Errors); err != nil {
return err
}
if err := registerCollector(WaitServerProof); err != nil {
return err
}
if err := registerCollector(Reorgs); err != nil {
return err
}
if err := registerCollector(LastBlockNum); err != nil {
return err
}
if err := registerCollector(LastBatchNum); err != nil {
return err
}
if err := registerCollector(EthLastBlockNum); err != nil {
return err
}
if err := registerCollector(EthLastBatchNum); err != nil {
return err
}
if err := registerCollector(GetL2TxSelection); err != nil {
return err
}
if err := registerCollector(GetL1L2TxSelection); err != nil {
return err
}
if err := registerCollector(SelectedL1CoordinatorTxs); err != nil {
return err
}
if err := registerCollector(SelectedL1UserTxs); err != nil {
return err
}
return registerCollector(DiscardedL2Txs)
}
func registerCollector(collector prometheus.Collector) error {
err := prometheus.Register(collector)
if err != nil {
if _, ok := err.(prometheus.AlreadyRegisteredError); !ok {
return err
}
}
return nil
}
// MeasureDuration measure the method execution duration
// and save it into a histogram metric
func MeasureDuration(histogram *prometheus.HistogramVec, start time.Time, lvs ...string) {
duration := time.Since(start)
histogram.WithLabelValues(lvs...).Observe(float64(duration.Milliseconds()))
}
// CollectError collect the error message and increment
// the error count
func CollectError(err error) {
Errors.With(map[string]string{"error": err.Error()}).Inc()
}

View File

@@ -1,44 +0,0 @@
package synchronizer
import "github.com/prometheus/client_golang/prometheus"
var (
metricReorgsCount = prometheus.NewCounter(
prometheus.CounterOpts{
Name: "sync_reorgs",
Help: "",
},
)
metricSyncedLastBlockNum = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "sync_synced_last_block_num",
Help: "",
},
)
metricEthLastBlockNum = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "sync_eth_last_block_num",
Help: "",
},
)
metricSyncedLastBatchNum = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "sync_synced_last_batch_num",
Help: "",
},
)
metricEthLastBatchNum = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "sync_eth_last_batch_num",
Help: "",
},
)
)
func init() {
prometheus.MustRegister(metricReorgsCount)
prometheus.MustRegister(metricSyncedLastBlockNum)
prometheus.MustRegister(metricEthLastBlockNum)
prometheus.MustRegister(metricSyncedLastBatchNum)
prometheus.MustRegister(metricEthLastBatchNum)
}

View File

@@ -15,6 +15,7 @@ import (
"github.com/hermeznetwork/hermez-node/db/statedb" "github.com/hermeznetwork/hermez-node/db/statedb"
"github.com/hermeznetwork/hermez-node/eth" "github.com/hermeznetwork/hermez-node/eth"
"github.com/hermeznetwork/hermez-node/log" "github.com/hermeznetwork/hermez-node/log"
"github.com/hermeznetwork/hermez-node/metric"
"github.com/hermeznetwork/hermez-node/txprocessor" "github.com/hermeznetwork/hermez-node/txprocessor"
"github.com/hermeznetwork/tracerr" "github.com/hermeznetwork/tracerr"
) )
@@ -549,6 +550,7 @@ func (s *Synchronizer) Sync(ctx context.Context,
return nil, nil, tracerr.Wrap(err) return nil, nil, tracerr.Wrap(err)
} }
discarded := lastSavedBlock.Num - lastDBBlockNum discarded := lastSavedBlock.Num - lastDBBlockNum
metric.Reorgs.Inc()
return nil, &discarded, nil return nil, &discarded, nil
} }
} }
@@ -641,16 +643,16 @@ func (s *Synchronizer) Sync(ctx context.Context,
} }
for _, batchData := range rollupData.Batches { for _, batchData := range rollupData.Batches {
metricSyncedLastBatchNum.Set(float64(batchData.Batch.BatchNum)) metric.LastBatchNum.Set(float64(batchData.Batch.BatchNum))
metricEthLastBatchNum.Set(float64(s.stats.Eth.LastBatchNum)) metric.EthLastBatchNum.Set(float64(s.stats.Eth.LastBatchNum))
log.Debugw("Synced batch", log.Debugw("Synced batch",
"syncLastBatch", batchData.Batch.BatchNum, "syncLastBatch", batchData.Batch.BatchNum,
"syncBatchesPerc", s.stats.batchesPerc(batchData.Batch.BatchNum), "syncBatchesPerc", s.stats.batchesPerc(batchData.Batch.BatchNum),
"ethLastBatch", s.stats.Eth.LastBatchNum, "ethLastBatch", s.stats.Eth.LastBatchNum,
) )
} }
metricSyncedLastBlockNum.Set(float64(s.stats.Sync.LastBlock.Num)) metric.LastBlockNum.Set(float64(s.stats.Sync.LastBlock.Num))
metricEthLastBlockNum.Set(float64(s.stats.Eth.LastBlock.Num)) metric.EthLastBlockNum.Set(float64(s.stats.Eth.LastBlock.Num))
log.Debugw("Synced block", log.Debugw("Synced block",
"syncLastBlockNum", s.stats.Sync.LastBlock.Num, "syncLastBlockNum", s.stats.Sync.LastBlock.Num,
"syncBlocksPerc", s.stats.blocksPerc(), "syncBlocksPerc", s.stats.blocksPerc(),

View File

@@ -1,53 +0,0 @@
package txselector
import "github.com/prometheus/client_golang/prometheus"
var (
metricGetL2TxSelection = prometheus.NewCounter(
prometheus.CounterOpts{
Name: "txsel_get_l2_txselecton_total",
Help: "",
},
)
metricGetL1L2TxSelection = prometheus.NewCounter(
prometheus.CounterOpts{
Name: "txsel_get_l1_l2_txselecton_total",
Help: "",
},
)
metricSelectedL1CoordinatorTxs = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "txsel_selected_l1_coordinator_txs",
Help: "",
},
)
metricSelectedL1UserTxs = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "txsel_selected_l1_user_txs",
Help: "",
},
)
metricSelectedL2Txs = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "txsel_selected_l2_txs",
Help: "",
},
)
metricDiscardedL2Txs = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "txsel_discarded_l2_txs",
Help: "",
},
)
)
func init() {
prometheus.MustRegister(metricGetL2TxSelection)
prometheus.MustRegister(metricGetL1L2TxSelection)
prometheus.MustRegister(metricSelectedL1CoordinatorTxs)
prometheus.MustRegister(metricSelectedL1UserTxs)
prometheus.MustRegister(metricSelectedL2Txs)
prometheus.MustRegister(metricDiscardedL2Txs)
}

View File

@@ -13,6 +13,7 @@ import (
"github.com/hermeznetwork/hermez-node/db/l2db" "github.com/hermeznetwork/hermez-node/db/l2db"
"github.com/hermeznetwork/hermez-node/db/statedb" "github.com/hermeznetwork/hermez-node/db/statedb"
"github.com/hermeznetwork/hermez-node/log" "github.com/hermeznetwork/hermez-node/log"
"github.com/hermeznetwork/hermez-node/metric"
"github.com/hermeznetwork/hermez-node/txprocessor" "github.com/hermeznetwork/hermez-node/txprocessor"
"github.com/hermeznetwork/tracerr" "github.com/hermeznetwork/tracerr"
"github.com/iden3/go-iden3-crypto/babyjub" "github.com/iden3/go-iden3-crypto/babyjub"
@@ -123,7 +124,7 @@ func (txsel *TxSelector) coordAccountForTokenID(l1CoordinatorTxs []common.L1Tx,
// included in the next batch. // included in the next batch.
func (txsel *TxSelector) GetL2TxSelection(selectionConfig txprocessor.Config) ([]common.Idx, func (txsel *TxSelector) GetL2TxSelection(selectionConfig txprocessor.Config) ([]common.Idx,
[][]byte, []common.L1Tx, []common.PoolL2Tx, []common.PoolL2Tx, error) { [][]byte, []common.L1Tx, []common.PoolL2Tx, []common.PoolL2Tx, error) {
metricGetL2TxSelection.Inc() metric.GetL2TxSelection.Inc()
coordIdxs, accCreationAuths, _, l1CoordinatorTxs, l2Txs, coordIdxs, accCreationAuths, _, l1CoordinatorTxs, l2Txs,
discardedL2Txs, err := txsel.getL1L2TxSelection(selectionConfig, []common.L1Tx{}) discardedL2Txs, err := txsel.getL1L2TxSelection(selectionConfig, []common.L1Tx{})
return coordIdxs, accCreationAuths, l1CoordinatorTxs, l2Txs, return coordIdxs, accCreationAuths, l1CoordinatorTxs, l2Txs,
@@ -141,7 +142,7 @@ func (txsel *TxSelector) GetL2TxSelection(selectionConfig txprocessor.Config) ([
func (txsel *TxSelector) GetL1L2TxSelection(selectionConfig txprocessor.Config, func (txsel *TxSelector) GetL1L2TxSelection(selectionConfig txprocessor.Config,
l1UserTxs []common.L1Tx) ([]common.Idx, [][]byte, []common.L1Tx, l1UserTxs []common.L1Tx) ([]common.Idx, [][]byte, []common.L1Tx,
[]common.L1Tx, []common.PoolL2Tx, []common.PoolL2Tx, error) { []common.L1Tx, []common.PoolL2Tx, []common.PoolL2Tx, error) {
metricGetL1L2TxSelection.Inc() metric.GetL1L2TxSelection.Inc()
coordIdxs, accCreationAuths, l1UserTxs, l1CoordinatorTxs, l2Txs, coordIdxs, accCreationAuths, l1UserTxs, l1CoordinatorTxs, l2Txs,
discardedL2Txs, err := txsel.getL1L2TxSelection(selectionConfig, l1UserTxs) discardedL2Txs, err := txsel.getL1L2TxSelection(selectionConfig, l1UserTxs)
return coordIdxs, accCreationAuths, l1UserTxs, l1CoordinatorTxs, l2Txs, return coordIdxs, accCreationAuths, l1UserTxs, l1CoordinatorTxs, l2Txs,
@@ -221,10 +222,11 @@ func (txsel *TxSelector) getL1L2TxSelection(selectionConfig txprocessor.Config,
return nil, nil, nil, nil, nil, nil, tracerr.Wrap(err) return nil, nil, nil, nil, nil, nil, tracerr.Wrap(err)
} }
metricSelectedL1UserTxs.Set(float64(len(l1UserTxs))) metric.SelectedL1UserTxs.Set(float64(len(l1UserTxs)))
metricSelectedL1CoordinatorTxs.Set(0) metric.SelectedL1CoordinatorTxs.Set(0)
metricSelectedL2Txs.Set(0) metric.SelectedL2Txs.Set(0)
metricDiscardedL2Txs.Set(float64(len(discardedL2Txs))) metric.DiscardedL2Txs.Set(float64(len(discardedL2Txs)))
return nil, nil, l1UserTxs, nil, nil, discardedL2Txs, nil return nil, nil, l1UserTxs, nil, nil, discardedL2Txs, nil
} }
@@ -320,10 +322,10 @@ func (txsel *TxSelector) getL1L2TxSelection(selectionConfig txprocessor.Config,
return nil, nil, nil, nil, nil, nil, tracerr.Wrap(err) return nil, nil, nil, nil, nil, nil, tracerr.Wrap(err)
} }
metricSelectedL1UserTxs.Set(float64(len(l1UserTxs))) metric.SelectedL1CoordinatorTxs.Set(float64(len(l1CoordinatorTxs)))
metricSelectedL1CoordinatorTxs.Set(float64(len(l1CoordinatorTxs))) metric.SelectedL1UserTxs.Set(float64(len(l1UserTxs)))
metricSelectedL2Txs.Set(float64(len(validTxs))) metric.SelectedL2Txs.Set(float64(len(validTxs)))
metricDiscardedL2Txs.Set(float64(len(discardedL2Txs))) metric.DiscardedL2Txs.Set(float64(len(discardedL2Txs)))
return coordIdxs, accAuths, l1UserTxs, l1CoordinatorTxs, validTxs, discardedL2Txs, nil return coordIdxs, accAuths, l1UserTxs, l1CoordinatorTxs, validTxs, discardedL2Txs, nil
} }