diff --git a/pkg/util/metric/v2/dashboard/grafana_dashboard_logtail.go b/pkg/util/metric/v2/dashboard/grafana_dashboard_logtail.go index b85a97c47eec8..2eb47ad1f5391 100644 --- a/pkg/util/metric/v2/dashboard/grafana_dashboard_logtail.go +++ b/pkg/util/metric/v2/dashboard/grafana_dashboard_logtail.go @@ -70,6 +70,20 @@ func (c *DashboardCreator) initLogtailCollectRow() dashboard.Option { 4, axis.Unit("s"), axis.Min(0)), + + c.getHistogram( + "pull scan row count", + c.getMetricWithFilter("mo_logtail_pull_scan_txn_count_bucket", `type="scan-row"`), + []float64{0.50, 0.8, 0.90, 0.99}, + 6, + axis.Min(0)), + + c.getHistogram( + "pull scan row count", + c.getMetricWithFilter("mo_logtail_pull_scan_txn_count_bucket", `type="skip-blk"`), + []float64{0.50, 0.8, 0.90, 0.99}, + 6, + axis.Min(0)), ) } diff --git a/pkg/util/metric/v2/logtail.go b/pkg/util/metric/v2/logtail.go index 9d95eb23de323..ff92607baeb69 100644 --- a/pkg/util/metric/v2/logtail.go +++ b/pkg/util/metric/v2/logtail.go @@ -119,6 +119,18 @@ var ( LogtailSendLatencyHistogram = logTailSendDurationHistogram.WithLabelValues("latency") LogtailSendNetworkHistogram = logTailSendDurationHistogram.WithLabelValues("network") + LogtailPullScanTxnCountHistogram = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: "mo", + Subsystem: "logtail", + Name: "pull_scan_txn_count", + Help: "Bucketed histogram of pull scan txn count.", + Buckets: prometheus.ExponentialBuckets(1, 2.0, 20), + }, []string{"type"}) + + LogTailPullScanSkipBlkCountHistogram = LogtailPullScanTxnCountHistogram.WithLabelValues("skip-blk") + LogTailPullScanScanRowCountHistogram = LogtailPullScanTxnCountHistogram.WithLabelValues("scan-row") + LogTailLoadCheckpointDurationHistogram = prometheus.NewHistogram( prometheus.HistogramOpts{ Namespace: "mo", diff --git a/pkg/util/metric/v2/metrics.go b/pkg/util/metric/v2/metrics.go index 700c63efdfb19..56c6a672f87dc 100644 --- a/pkg/util/metric/v2/metrics.go +++ b/pkg/util/metric/v2/metrics.go @@ -109,6 +109,7 @@ func initLogtailMetrics() { registry.MustRegister(logTailSendDurationHistogram) registry.MustRegister(LogTailLoadCheckpointDurationHistogram) + registry.MustRegister(LogtailPullScanTxnCountHistogram) registry.MustRegister(LogTailPushCollectionDurationHistogram) registry.MustRegister(LogTailPullCollectionPhase1DurationHistogram) registry.MustRegister(LogTailPullCollectionPhase2DurationHistogram) diff --git a/pkg/vm/engine/tae/logtail/reader.go b/pkg/vm/engine/tae/logtail/reader.go index 7e8f6ed1de538..27e32681bb7ca 100644 --- a/pkg/vm/engine/tae/logtail/reader.go +++ b/pkg/vm/engine/tae/logtail/reader.go @@ -16,6 +16,7 @@ package logtail import ( "github.com/matrixorigin/matrixone/pkg/container/types" + v2 "github.com/matrixorigin/matrixone/pkg/util/metric/v2" "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/iface/txnif" "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/model" ) @@ -77,7 +78,9 @@ func (r *Reader) GetDirtyByTable( dbID, id uint64, ) (tree *model.TableTree) { tree = model.NewTableTree(dbID, id) + var rowScan, blkSkip int op := func(row RowT) (moveOn bool) { + rowScan++ if memo := row.GetMemo(); memo.HasTableDataChanges(id) { tree.Merge(memo.GetDirtyTableByID(id)) } @@ -89,8 +92,13 @@ func (r *Reader) GetDirtyByTable( return false } _, exist := summary.tids[id] + if !exist { + blkSkip++ + } return !exist } + v2.LogTailPullScanSkipBlkCountHistogram.Observe(float64(blkSkip)) + v2.LogTailPullScanScanRowCountHistogram.Observe(float64(rowScan)) r.table.ForeachRowInBetween(r.from, r.to, skipFn, op) return }