metrics.go 3.95 KB
Newer Older
Hamdi Allam's avatar
Hamdi Allam committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
package etl

import (
	"math/big"

	"github.com/ethereum-optimism/optimism/op-service/metrics"
	"github.com/ethereum/go-ethereum/common"
	"github.com/prometheus/client_golang/prometheus"
)

var (
	MetricsNamespace string = "etl"
)

type Metricer interface {
	RecordInterval() (done func(err error))

	// Batch Extraction
	RecordBatchFailure()
	RecordBatchLatestHeight(height *big.Int)
	RecordBatchHeaders(size int)
	RecordBatchLog(contractAddress common.Address)

	// Indexed Batches
	RecordIndexedLatestHeight(height *big.Int)
	RecordIndexedHeaders(size int)
	RecordIndexedLogs(size int)
}

type etlMetrics struct {
Hamdi Allam's avatar
Hamdi Allam committed
31 32
	intervalTick     prometheus.Counter
	intervalDuration prometheus.Histogram
Hamdi Allam's avatar
Hamdi Allam committed
33

Hamdi Allam's avatar
Hamdi Allam committed
34 35 36
	batchFailures     prometheus.Counter
	batchLatestHeight prometheus.Gauge
	batchHeaders      prometheus.Counter
Hamdi Allam's avatar
Hamdi Allam committed
37 38
	batchLogs         *prometheus.CounterVec

Hamdi Allam's avatar
Hamdi Allam committed
39 40 41
	indexedLatestHeight prometheus.Gauge
	indexedHeaders      prometheus.Counter
	indexedLogs         prometheus.Counter
Hamdi Allam's avatar
Hamdi Allam committed
42 43
}

Hamdi Allam's avatar
Hamdi Allam committed
44
func NewMetrics(registry *prometheus.Registry, subsystem string) Metricer {
Hamdi Allam's avatar
Hamdi Allam committed
45 46
	factory := metrics.With(registry)
	return &etlMetrics{
Hamdi Allam's avatar
Hamdi Allam committed
47
		intervalTick: factory.NewCounter(prometheus.CounterOpts{
Hamdi Allam's avatar
Hamdi Allam committed
48
			Namespace: MetricsNamespace,
Hamdi Allam's avatar
Hamdi Allam committed
49
			Subsystem: subsystem,
Hamdi Allam's avatar
Hamdi Allam committed
50 51 52
			Name:      "intervals_total",
			Help:      "number of times the etl has run its extraction loop",
		}),
Hamdi Allam's avatar
Hamdi Allam committed
53
		intervalDuration: factory.NewHistogram(prometheus.HistogramOpts{
Hamdi Allam's avatar
Hamdi Allam committed
54
			Namespace: MetricsNamespace,
Hamdi Allam's avatar
Hamdi Allam committed
55
			Subsystem: subsystem,
Hamdi Allam's avatar
Hamdi Allam committed
56 57 58
			Name:      "interval_seconds",
			Help:      "duration elapsed for during the processing loop",
		}),
Hamdi Allam's avatar
Hamdi Allam committed
59
		batchFailures: factory.NewCounter(prometheus.CounterOpts{
Hamdi Allam's avatar
Hamdi Allam committed
60
			Namespace: MetricsNamespace,
Hamdi Allam's avatar
Hamdi Allam committed
61
			Subsystem: subsystem,
Hamdi Allam's avatar
Hamdi Allam committed
62 63 64
			Name:      "failures_total",
			Help:      "number of times the etl encountered a failure to extract a batch",
		}),
Hamdi Allam's avatar
Hamdi Allam committed
65
		batchLatestHeight: factory.NewGauge(prometheus.GaugeOpts{
Hamdi Allam's avatar
Hamdi Allam committed
66
			Namespace: MetricsNamespace,
Hamdi Allam's avatar
Hamdi Allam committed
67
			Subsystem: subsystem,
Hamdi Allam's avatar
Hamdi Allam committed
68 69 70
			Name:      "height",
			Help:      "the latest block height observed by an etl interval",
		}),
Hamdi Allam's avatar
Hamdi Allam committed
71
		batchHeaders: factory.NewCounter(prometheus.CounterOpts{
Hamdi Allam's avatar
Hamdi Allam committed
72
			Namespace: MetricsNamespace,
Hamdi Allam's avatar
Hamdi Allam committed
73
			Subsystem: subsystem,
Hamdi Allam's avatar
Hamdi Allam committed
74 75 76 77 78
			Name:      "headers_total",
			Help:      "number of headers observed by the etl",
		}),
		batchLogs: factory.NewCounterVec(prometheus.CounterOpts{
			Namespace: MetricsNamespace,
Hamdi Allam's avatar
Hamdi Allam committed
79
			Subsystem: subsystem,
Hamdi Allam's avatar
Hamdi Allam committed
80 81 82 83 84
			Name:      "logs_total",
			Help:      "number of logs observed by the etl",
		}, []string{
			"contract",
		}),
Hamdi Allam's avatar
Hamdi Allam committed
85
		indexedLatestHeight: factory.NewGauge(prometheus.GaugeOpts{
Hamdi Allam's avatar
Hamdi Allam committed
86
			Namespace: MetricsNamespace,
Hamdi Allam's avatar
Hamdi Allam committed
87
			Subsystem: subsystem,
Hamdi Allam's avatar
Hamdi Allam committed
88 89 90
			Name:      "indexed_height",
			Help:      "the latest block height indexed into the database",
		}),
Hamdi Allam's avatar
Hamdi Allam committed
91
		indexedHeaders: factory.NewCounter(prometheus.CounterOpts{
Hamdi Allam's avatar
Hamdi Allam committed
92
			Namespace: MetricsNamespace,
Hamdi Allam's avatar
Hamdi Allam committed
93
			Subsystem: subsystem,
Hamdi Allam's avatar
Hamdi Allam committed
94 95 96
			Name:      "indexed_headers_total",
			Help:      "number of headers indexed by the etl",
		}),
Hamdi Allam's avatar
Hamdi Allam committed
97
		indexedLogs: factory.NewCounter(prometheus.CounterOpts{
Hamdi Allam's avatar
Hamdi Allam committed
98
			Namespace: MetricsNamespace,
Hamdi Allam's avatar
Hamdi Allam committed
99
			Subsystem: subsystem,
Hamdi Allam's avatar
Hamdi Allam committed
100 101 102 103 104 105
			Name:      "indexed_logs_total",
			Help:      "number of logs indexed by the etl",
		}),
	}
}

Hamdi Allam's avatar
Hamdi Allam committed
106 107 108
func (m *etlMetrics) RecordInterval() func(error) {
	m.intervalTick.Inc()
	timer := prometheus.NewTimer(m.intervalDuration)
Hamdi Allam's avatar
Hamdi Allam committed
109 110
	return func(err error) {
		if err != nil {
Hamdi Allam's avatar
Hamdi Allam committed
111
			m.RecordBatchFailure()
Hamdi Allam's avatar
Hamdi Allam committed
112 113 114 115 116 117
		}

		timer.ObserveDuration()
	}
}

Hamdi Allam's avatar
Hamdi Allam committed
118 119
func (m *etlMetrics) RecordBatchFailure() {
	m.batchFailures.Inc()
Hamdi Allam's avatar
Hamdi Allam committed
120 121
}

Hamdi Allam's avatar
Hamdi Allam committed
122 123
func (m *etlMetrics) RecordBatchLatestHeight(height *big.Int) {
	m.batchLatestHeight.Set(float64(height.Uint64()))
Hamdi Allam's avatar
Hamdi Allam committed
124 125
}

Hamdi Allam's avatar
Hamdi Allam committed
126 127
func (m *etlMetrics) RecordBatchHeaders(size int) {
	m.batchHeaders.Add(float64(size))
Hamdi Allam's avatar
Hamdi Allam committed
128 129
}

Hamdi Allam's avatar
Hamdi Allam committed
130 131
func (m *etlMetrics) RecordBatchLog(contractAddress common.Address) {
	m.batchLogs.WithLabelValues(contractAddress.String()).Inc()
Hamdi Allam's avatar
Hamdi Allam committed
132 133
}

Hamdi Allam's avatar
Hamdi Allam committed
134 135
func (m *etlMetrics) RecordIndexedLatestHeight(height *big.Int) {
	m.indexedLatestHeight.Set(float64(height.Uint64()))
Hamdi Allam's avatar
Hamdi Allam committed
136 137
}

Hamdi Allam's avatar
Hamdi Allam committed
138 139
func (m *etlMetrics) RecordIndexedHeaders(size int) {
	m.indexedHeaders.Add(float64(size))
Hamdi Allam's avatar
Hamdi Allam committed
140 141
}

Hamdi Allam's avatar
Hamdi Allam committed
142 143
func (m *etlMetrics) RecordIndexedLogs(size int) {
	m.indexedLogs.Add(float64(size))
Hamdi Allam's avatar
Hamdi Allam committed
144
}