From 6c2dec8502c1a5c95f721f92f8f7dba5b8a66ff1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 29 Jan 2025 12:40:07 +0100 Subject: [PATCH 1/2] PMM-12468 Plan summary, COLLSCAN. --- src/go/mongolib/proto/system.profile.go | 1 + src/go/mongolib/stats/stats.go | 26 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/go/mongolib/proto/system.profile.go b/src/go/mongolib/proto/system.profile.go index de20a6cfe..99796d1fa 100644 --- a/src/go/mongolib/proto/system.profile.go +++ b/src/go/mongolib/proto/system.profile.go @@ -78,6 +78,7 @@ type SystemProfile struct { Ns string `bson:"ns"` NumYield int `bson:"numYield"` Op string `bson:"op"` + PlanSummary string `bson:"planSummary"` Protocol string `bson:"protocol"` Query bson.D `bson:"query"` UpdateObj bson.D `bson:"updateobj"` diff --git a/src/go/mongolib/stats/stats.go b/src/go/mongolib/stats/stats.go index 34cb9f216..5660a160c 100644 --- a/src/go/mongolib/stats/stats.go +++ b/src/go/mongolib/stats/stats.go @@ -4,6 +4,7 @@ import ( "crypto/md5" "fmt" "sort" + "strings" "sync" "time" @@ -13,6 +14,11 @@ import ( "github.com/percona/percona-toolkit/src/go/mongolib/proto" ) +const ( + planSummaryCollScan = "COLLSCAN" + planSummaryIXScan = "IXSCAN" +) + type StatsError struct { error } @@ -86,6 +92,7 @@ func (s *Stats) Add(doc proto.SystemProfile) error { Namespace: fp.Namespace, TableScan: false, Query: string(queryBson), + PlanSummary: doc.PlanSummary, } s.setQueryInfoAndCounters(key, qiac) } @@ -93,6 +100,14 @@ func (s *Stats) Add(doc proto.SystemProfile) error { // docsExamined is renamed from nscannedObjects in 3.2.0. // https://docs.mongodb.com/manual/reference/database-profiler/#system.profile.docsExamined s.Lock() + qiac.PlanSummary = doc.PlanSummary + if qiac.PlanSummary == planSummaryCollScan { + qiac.CollScanCount++ + qiac.CollScanSum += int64(doc.Millis) + } + if strings.HasPrefix(qiac.PlanSummary, planSummaryIXScan) { + qiac.PlanSummary = planSummaryIXScan + } if doc.NscannedObjects > 0 { qiac.NScanned = append(qiac.NScanned, float64(doc.NscannedObjects)) } else { @@ -188,6 +203,10 @@ type QueryInfoAndCounters struct { NScanned []float64 QueryTime []float64 // in milliseconds ResponseLength []float64 + + PlanSummary string + CollScanCount int + CollScanSum int64 // in milliseconds } // times is an array of time.Time that implements the Sorter interface @@ -238,6 +257,10 @@ type QueryStats struct { ResponseLength Statistics Returned Statistics Scanned Statistics + + PlanSummary string + CollScanCount int + CollScanSum int64 // in milliseconds } type Statistics struct { @@ -267,6 +290,9 @@ func countersToStats(query QueryInfoAndCounters, uptime int64, tc totalCounters) LastSeen: query.LastSeen, Namespace: query.Namespace, QPS: float64(query.Count) / float64(uptime), + PlanSummary: query.PlanSummary, + CollScanCount: query.CollScanCount, + CollScanSum: query.CollScanSum, } if tc.Scanned > 0 { queryStats.Scanned.Pct = queryStats.Scanned.Total * 100 / tc.Scanned From 5972093d8793aa201550ffccc3f9fc07cb460203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 3 Feb 2025 14:14:53 +0100 Subject: [PATCH 2/2] PMM-12468 Fix to run stats tests and other tests with testing.M. --- src/go/mongolib/fingerprinter/fingerprinter_test.go | 8 +++++--- src/go/mongolib/profiler/profiler_test.go | 10 ++++++---- src/go/mongolib/stats/stats_test.go | 5 +++-- src/go/pt-pg-summary/main_test.go | 3 ++- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/go/mongolib/fingerprinter/fingerprinter_test.go b/src/go/mongolib/fingerprinter/fingerprinter_test.go index 7cba1d804..45ec0d670 100644 --- a/src/go/mongolib/fingerprinter/fingerprinter_test.go +++ b/src/go/mongolib/fingerprinter/fingerprinter_test.go @@ -10,11 +10,12 @@ import ( "strings" "testing" - "github.com/percona/percona-toolkit/src/go/lib/tutil" - "github.com/percona/percona-toolkit/src/go/mongolib/proto" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.mongodb.org/mongo-driver/bson" + + "github.com/percona/percona-toolkit/src/go/lib/tutil" + "github.com/percona/percona-toolkit/src/go/mongolib/proto" ) const ( @@ -33,7 +34,8 @@ func TestMain(m *testing.M) { log.Printf("cannot get root path: %s", err.Error()) os.Exit(1) } - os.Exit(m.Run()) + code := m.Run() + os.Exit(code) } func TestSingleFingerprint(t *testing.T) { diff --git a/src/go/mongolib/profiler/profiler_test.go b/src/go/mongolib/profiler/profiler_test.go index b16796d8c..9b1dc4ab3 100644 --- a/src/go/mongolib/profiler/profiler_test.go +++ b/src/go/mongolib/profiler/profiler_test.go @@ -7,14 +7,15 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson/primitive" + tu "github.com/percona/percona-toolkit/src/go/internal/testutils" "github.com/percona/percona-toolkit/src/go/lib/tutil" "github.com/percona/percona-toolkit/src/go/mongolib/fingerprinter" "github.com/percona/percona-toolkit/src/go/mongolib/stats" "github.com/percona/percona-toolkit/src/go/pt-mongodb-query-digest/filter" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.mongodb.org/mongo-driver/bson/primitive" ) const ( @@ -38,7 +39,8 @@ func TestMain(m *testing.M) { log.Printf("cannot get root path: %s", err.Error()) os.Exit(1) } - os.Exit(m.Run()) + code := m.Run() + os.Exit(code) } func TestRegularIterator(t *testing.T) { diff --git a/src/go/mongolib/stats/stats_test.go b/src/go/mongolib/stats/stats_test.go index 2ebe78907..90afa0389 100644 --- a/src/go/mongolib/stats/stats_test.go +++ b/src/go/mongolib/stats/stats_test.go @@ -14,6 +14,7 @@ import ( "time" "github.com/golang/mock/gomock" + "github.com/percona/percona-toolkit/src/go/lib/tutil" "github.com/percona/percona-toolkit/src/go/mongolib/fingerprinter" "github.com/percona/percona-toolkit/src/go/mongolib/proto" @@ -40,8 +41,8 @@ func TestMain(m *testing.M) { log.Printf("cannot get root path: %s", err.Error()) os.Exit(1) } - // TODO: Review with the new sandbox - // os.Exit(m.Run()) + code := m.Run() + os.Exit(code) } func TestTimesLen(t *testing.T) { diff --git a/src/go/pt-pg-summary/main_test.go b/src/go/pt-pg-summary/main_test.go index 5319ecd50..cfc0a02a9 100644 --- a/src/go/pt-pg-summary/main_test.go +++ b/src/go/pt-pg-summary/main_test.go @@ -32,7 +32,8 @@ var logger = logrus.New() func TestMain(m *testing.M) { logger.SetLevel(logrus.WarnLevel) - os.Exit(m.Run()) + code := m.Run() + os.Exit(code) } func TestConnection(t *testing.T) {