From 2b78478272ee4394ce4657c3b780df4375a48d71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 17 Feb 2025 14:22:23 +0100 Subject: [PATCH] PMM-9288 Changes. --- src/go/mongolib/proto/system.profile.go | 13 +++-- src/go/mongolib/stats/stats.go | 76 ++++++++++++++++++------- 2 files changed, 64 insertions(+), 25 deletions(-) diff --git a/src/go/mongolib/proto/system.profile.go b/src/go/mongolib/proto/system.profile.go index 5c91f154..b258d219 100644 --- a/src/go/mongolib/proto/system.profile.go +++ b/src/go/mongolib/proto/system.profile.go @@ -13,7 +13,6 @@ type SystemProfile struct { AllUsers []interface{} `bson:"allUsers"` Client string `bson:"client"` CursorExhausted bool `bson:"cursorExhausted"` - DocsExamined int `bson:"docsExamined"` NscannedObjects int `bson:"nscannedObjects"` ExecStats struct { Advanced int `bson:"advanced"` @@ -67,7 +66,7 @@ type SystemProfile struct { RShared int `bson:"r"` } `bson:"acquireWaitCount"` TimeAcquiringMicros struct { - RShared int `bson:"r"` + RShared int64 `bson:"r"` } `bson:"timeAcquiringMicros"` } `bson:"Database"` Global struct { @@ -90,7 +89,6 @@ type SystemProfile struct { PlanSummary string `bson:"planSummary"` Protocol string `bson:"protocol"` Query bson.D `bson:"query"` - QueryHash string `bson:"queryHash"` UpdateObj bson.D `bson:"updateobj"` Command bson.D `bson:"command"` OriginatingCommand bson.D `bson:"originatingCommand"` @@ -98,13 +96,16 @@ type SystemProfile struct { Ts time.Time `bson:"ts"` User string `bson:"user"` WriteConflicts int `bson:"writeConflicts"` + DocsExamined int `bson:"docsExamined"` + QueryHash string `bson:"queryHash"` Storage struct { Data struct { - BytesRead int `bson:"bytesRead"` - TimeReadingMicros int `bson:"timeReadingMicros"` + BytesRead int `bson:"bytesRead"` + TimeReadingMicros int64 `bson:"timeReadingMicros"` } `bson:"data"` } `bson:"storage"` - AppName string `bson:"appName"` + AppName string `bson:"appName"` + Comments string `bson:"comments"` } func NewExampleQuery(doc SystemProfile) ExampleQuery { diff --git a/src/go/mongolib/stats/stats.go b/src/go/mongolib/stats/stats.go index 5660a160..7cfcdaf4 100644 --- a/src/go/mongolib/stats/stats.go +++ b/src/go/mongolib/stats/stats.go @@ -93,14 +93,18 @@ func (s *Stats) Add(doc proto.SystemProfile) error { TableScan: false, Query: string(queryBson), PlanSummary: doc.PlanSummary, + QueryHash: doc.QueryHash, + AppName: doc.AppName, + Client: doc.Client, + User: doc.User, + Database: strings.Split(doc.Ns, ".")[0], + Comments: doc.Comments, + TimeStamp: doc.Ts, } s.setQueryInfoAndCounters(key, qiac) } qiac.Count++ - // 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) @@ -108,11 +112,8 @@ func (s *Stats) Add(doc proto.SystemProfile) error { if strings.HasPrefix(qiac.PlanSummary, planSummaryIXScan) { qiac.PlanSummary = planSummaryIXScan } - if doc.NscannedObjects > 0 { - qiac.NScanned = append(qiac.NScanned, float64(doc.NscannedObjects)) - } else { - qiac.NScanned = append(qiac.NScanned, float64(doc.DocsExamined)) - } + + qiac.NScanned = append(qiac.NScanned, float64(doc.NscannedObjects)) qiac.NReturned = append(qiac.NReturned, float64(doc.Nreturned)) qiac.QueryTime = append(qiac.QueryTime, float64(doc.Millis)) qiac.ResponseLength = append(qiac.ResponseLength, float64(doc.ResponseLength)) @@ -122,6 +123,19 @@ func (s *Stats) Add(doc proto.SystemProfile) error { if qiac.LastSeen.IsZero() || qiac.LastSeen.Before(doc.Ts) { qiac.LastSeen = doc.Ts } + + qiac.StorageBytesRead += doc.Storage.Data.BytesRead + qiac.StorageTimeReadingMicros += doc.Storage.Data.TimeReadingMicros + + qiac.LGlobalAcquireCountRShared += doc.Locks.Global.AcquireCount.RShared + qiac.LGlobalAcquireCountWShared += doc.Locks.Global.AcquireCount.WShared + qiac.LDatabaseAcquireCountRShared += doc.Locks.Database.AcquireCount.RShared + qiac.LDatabaseAcquireWaitCountRShared += doc.Locks.Database.AcquireWaitCount.RShared + qiac.LDatabaseTimeAcquiringMicrosRShared += doc.Locks.Database.TimeAcquiringMicros.RShared + qiac.LCollectionAcquireCountRShared += doc.Locks.Collection.AcquireCount.RShared + + qiac.DocsExamined = append(qiac.DocsExamined, float64(doc.DocsExamined)) + qiac.KeysExamined = append(qiac.KeysExamined, float64(doc.KeysExamined)) s.Unlock() return nil @@ -207,6 +221,26 @@ type QueryInfoAndCounters struct { PlanSummary string CollScanCount int CollScanSum int64 // in milliseconds + + DocsExamined []float64 + KeysExamined []float64 + TimeStamp time.Time + QueryHash string + AppName string + Client string + User string + Database string + Comments string + + LGlobalAcquireCountRShared int + LGlobalAcquireCountWShared int + LDatabaseAcquireCountRShared int + LDatabaseAcquireWaitCountRShared int + LDatabaseTimeAcquiringMicrosRShared int64 // in microseconds + LCollectionAcquireCountRShared int + + StorageBytesRead int + StorageTimeReadingMicros int64 // in microseconds } // times is an array of time.Time that implements the Sorter interface @@ -233,11 +267,12 @@ func (g GroupKey) String() string { } type totalCounters struct { - Count int - Scanned float64 - Returned float64 - QueryTime float64 - Bytes float64 + Count int + Scanned float64 + Returned float64 + QueryTime float64 + Bytes float64 + DocsExamined float64 } type QueryStats struct { @@ -258,9 +293,7 @@ type QueryStats struct { Returned Statistics Scanned Statistics - PlanSummary string - CollScanCount int - CollScanSum int64 // in milliseconds + DocsExamined Statistics } type Statistics struct { @@ -283,6 +316,7 @@ func countersToStats(query QueryInfoAndCounters, uptime int64, tc totalCounters) Query: query.Query, Fingerprint: query.Fingerprint, Scanned: calcStats(query.NScanned), + DocsExamined: calcStats(query.DocsExamined), Returned: calcStats(query.NReturned), QueryTime: calcStats(query.QueryTime), ResponseLength: calcStats(query.ResponseLength), @@ -290,9 +324,6 @@ 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 @@ -309,6 +340,9 @@ func countersToStats(query QueryInfoAndCounters, uptime int64, tc totalCounters) if queryStats.Returned.Total > 0 { queryStats.Ratio = queryStats.Scanned.Total / queryStats.Returned.Total } + if queryStats.DocsExamined.Total > 0 { + queryStats.DocsExamined.Pct = queryStats.DocsExamined.Total / queryStats.DocsExamined.Total + } return queryStats } @@ -321,6 +355,7 @@ func aggregateCounters(queries []QueryInfoAndCounters) QueryInfoAndCounters { qt.NReturned = append(qt.NReturned, query.NReturned...) qt.QueryTime = append(qt.QueryTime, query.QueryTime...) qt.ResponseLength = append(qt.ResponseLength, query.ResponseLength...) + qt.DocsExamined = append(qt.DocsExamined, query.DocsExamined...) } return qt } @@ -342,6 +377,9 @@ func calcTotalCounters(queries []QueryInfoAndCounters) totalCounters { bytes, _ := stats.Sum(query.ResponseLength) tc.Bytes += bytes + + docsExamined, _ := stats.Sum(query.DocsExamined) + tc.DocsExamined += docsExamined } return tc }