PMM-9288 Changes.

This commit is contained in:
Jiří Čtvrtka
2025-02-18 13:59:25 +01:00
parent 71a164c272
commit cf11056f98
3 changed files with 95 additions and 92 deletions

View File

@@ -13,7 +13,6 @@ type SystemProfile struct {
AllUsers []interface{} `bson:"allUsers"` AllUsers []interface{} `bson:"allUsers"`
Client string `bson:"client"` Client string `bson:"client"`
CursorExhausted bool `bson:"cursorExhausted"` CursorExhausted bool `bson:"cursorExhausted"`
NscannedObjects int `bson:"nscannedObjects"`
ExecStats struct { ExecStats struct {
Advanced int `bson:"advanced"` Advanced int `bson:"advanced"`
ExecutionTimeMillisEstimate int `bson:"executionTimeMillisEstimate"` ExecutionTimeMillisEstimate int `bson:"executionTimeMillisEstimate"`
@@ -54,30 +53,30 @@ type SystemProfile struct {
Locks struct { Locks struct {
Collection struct { Collection struct {
AcquireCount struct { AcquireCount struct {
R int `bson:"R"` Read int `bson:"R"`
RShared int `bson:"r"` ReadShared int `bson:"r"`
} `bson:"acquireCount"` } `bson:"acquireCount"`
} `bson:"Collection"` } `bson:"Collection"`
Database struct { Database struct {
AcquireCount struct { AcquireCount struct {
RShared int `bson:"r"` ReadShared int `bson:"r"`
} `bson:"acquireCount"` } `bson:"acquireCount"`
AcquireWaitCount struct { AcquireWaitCount struct {
RShared int `bson:"r"` ReadShared int `bson:"r"`
} `bson:"acquireWaitCount"` } `bson:"acquireWaitCount"`
TimeAcquiringMicros struct { TimeAcquiringMicros struct {
RShared int64 `bson:"r"` ReadShared int64 `bson:"r"`
} `bson:"timeAcquiringMicros"` } `bson:"timeAcquiringMicros"`
} `bson:"Database"` } `bson:"Database"`
Global struct { Global struct {
AcquireCount struct { AcquireCount struct {
RShared int `bson:"r"` ReadShared int `bson:"r"`
WShared int `bson:"w"` WriteShared int `bson:"w"`
} `bson:"acquireCount"` } `bson:"acquireCount"`
} `bson:"Global"` } `bson:"Global"`
MMAPV1Journal struct { MMAPV1Journal struct {
AcquireCount struct { AcquireCount struct {
RShared int `bson:"r"` ReadShared int `bson:"r"`
} `bson:"acquireCount"` } `bson:"acquireCount"`
} `bson:"MMAPV1Journal"` } `bson:"MMAPV1Journal"`
} `bson:"locks"` } `bson:"locks"`

View File

@@ -98,7 +98,6 @@ func (s *Stats) Add(doc proto.SystemProfile) error {
Client: doc.Client, Client: doc.Client,
User: doc.User, User: doc.User,
Comments: doc.Comments, Comments: doc.Comments,
TimeStamp: doc.Ts,
} }
s.setQueryInfoAndCounters(key, qiac) s.setQueryInfoAndCounters(key, qiac)
} }
@@ -106,13 +105,11 @@ func (s *Stats) Add(doc proto.SystemProfile) error {
s.Lock() s.Lock()
if qiac.PlanSummary == planSummaryCollScan { if qiac.PlanSummary == planSummaryCollScan {
qiac.CollScanCount++ qiac.CollScanCount++
qiac.CollScanSum += int64(doc.Millis)
} }
if strings.HasPrefix(qiac.PlanSummary, planSummaryIXScan) { if strings.HasPrefix(qiac.PlanSummary, planSummaryIXScan) {
qiac.PlanSummary = planSummaryIXScan qiac.PlanSummary = planSummaryIXScan
} }
qiac.NScanned = append(qiac.NScanned, float64(doc.NscannedObjects))
qiac.NReturned = append(qiac.NReturned, float64(doc.Nreturned)) qiac.NReturned = append(qiac.NReturned, float64(doc.Nreturned))
qiac.QueryTime = append(qiac.QueryTime, float64(doc.Millis)) qiac.QueryTime = append(qiac.QueryTime, float64(doc.Millis))
qiac.ResponseLength = append(qiac.ResponseLength, float64(doc.ResponseLength)) qiac.ResponseLength = append(qiac.ResponseLength, float64(doc.ResponseLength))
@@ -123,18 +120,28 @@ func (s *Stats) Add(doc proto.SystemProfile) error {
qiac.LastSeen = doc.Ts qiac.LastSeen = doc.Ts
} }
qiac.StorageBytesRead += doc.Storage.Data.BytesRead if doc.Storage.Data.BytesRead > 0 {
qiac.StorageTimeReadingMicros += doc.Storage.Data.TimeReadingMicros qiac.StorageBytesRead = append(qiac.StorageBytesRead, float64(doc.Storage.Data.BytesRead))
}
if doc.Storage.Data.TimeReadingMicros > 0 {
qiac.StorageTimeReadingMicros = append(qiac.StorageTimeReadingMicros, float64(doc.Storage.Data.TimeReadingMicros))
}
qiac.LGlobalAcquireCountRShared += doc.Locks.Global.AcquireCount.RShared qiac.LocksGlobalAcquireCountReadShared += doc.Locks.Global.AcquireCount.ReadShared
qiac.LGlobalAcquireCountWShared += doc.Locks.Global.AcquireCount.WShared qiac.LocksGlobalAcquireCountWriteShared += doc.Locks.Global.AcquireCount.WriteShared
qiac.LDatabaseAcquireCountRShared += doc.Locks.Database.AcquireCount.RShared qiac.LocksDatabaseAcquireCountReadShared += doc.Locks.Database.AcquireCount.ReadShared
qiac.LDatabaseAcquireWaitCountRShared += doc.Locks.Database.AcquireWaitCount.RShared qiac.LocksDatabaseAcquireWaitCountReadShared += doc.Locks.Database.AcquireWaitCount.ReadShared
qiac.LDatabaseTimeAcquiringMicrosRShared += doc.Locks.Database.TimeAcquiringMicros.RShared if doc.Locks.Database.TimeAcquiringMicros.ReadShared > 0 {
qiac.LCollectionAcquireCountRShared += doc.Locks.Collection.AcquireCount.RShared qiac.LocksDatabaseTimeAcquiringMicrosReadShared = append(qiac.LocksDatabaseTimeAcquiringMicrosReadShared, float64(doc.Locks.Database.TimeAcquiringMicros.ReadShared))
}
qiac.LocksCollectionAcquireCountReadShared += doc.Locks.Collection.AcquireCount.ReadShared
if doc.DocsExamined > 0 {
qiac.DocsExamined = append(qiac.DocsExamined, float64(doc.DocsExamined)) qiac.DocsExamined = append(qiac.DocsExamined, float64(doc.DocsExamined))
}
if doc.KeysExamined > 0 {
qiac.KeysExamined = append(qiac.KeysExamined, float64(doc.KeysExamined)) qiac.KeysExamined = append(qiac.KeysExamined, float64(doc.KeysExamined))
}
s.Unlock() s.Unlock()
return nil return nil
@@ -213,32 +220,29 @@ type QueryInfoAndCounters struct {
BlockedTime Times BlockedTime Times
LockTime Times LockTime Times
NReturned []float64 NReturned []float64
NScanned []float64
QueryTime []float64 // in milliseconds QueryTime []float64 // in milliseconds
ResponseLength []float64 ResponseLength []float64
PlanSummary string PlanSummary string
CollScanCount int CollScanCount int
CollScanSum int64 // in milliseconds
DocsExamined []float64 DocsExamined []float64
KeysExamined []float64 KeysExamined []float64
TimeStamp time.Time
QueryHash string QueryHash string
AppName string AppName string
Client string Client string
User string User string
Comments string Comments string
LGlobalAcquireCountRShared int LocksGlobalAcquireCountReadShared int
LGlobalAcquireCountWShared int LocksGlobalAcquireCountWriteShared int
LDatabaseAcquireCountRShared int LocksDatabaseAcquireCountReadShared int
LDatabaseAcquireWaitCountRShared int LocksDatabaseAcquireWaitCountReadShared int
LDatabaseTimeAcquiringMicrosRShared int64 // in microseconds LocksDatabaseTimeAcquiringMicrosReadShared []float64 // in microseconds
LCollectionAcquireCountRShared int LocksCollectionAcquireCountReadShared int
StorageBytesRead int64 StorageBytesRead []float64
StorageTimeReadingMicros int64 // in microseconds StorageTimeReadingMicros []float64 // in microseconds
} }
// times is an array of time.Time that implements the Sorter interface // times is an array of time.Time that implements the Sorter interface
@@ -294,26 +298,28 @@ type QueryStats struct {
PlanSummary string PlanSummary string
CollScanCount int CollScanCount int
CollScanSum int64 // in milliseconds DocsExaminedCount int
DocsExamined Statistics DocsExamined Statistics
KeysExaminedCount int
KeysExamined Statistics KeysExamined Statistics
TimeStamp time.Time
QueryHash string QueryHash string
AppName string AppName string
Client string Client string
User string User string
Comments string Comments string
LGlobalAcquireCountRShared int LocksGlobalAcquireCountReadShared int
LGlobalAcquireCountWShared int LocksGlobalAcquireCountWriteShared int
LDatabaseAcquireCountRShared int LocksDatabaseAcquireCountReadShared int
LDatabaseAcquireWaitCountRShared int LocksDatabaseAcquireWaitCountReadShared int
LDatabaseTimeAcquiringMicrosRShared int64 // in microseconds LocksDatabaseTimeAcquiringMicrosReadSharedCount int
LCollectionAcquireCountRShared int LocksDatabaseTimeAcquiringMicrosReadShared Statistics // in microseconds
LocksCollectionAcquireCountReadShared int
StorageBytesRead int64 StorageBytesReadCount int
StorageTimeReadingMicros int64 // in microseconds StorageBytesRead Statistics
StorageTimeReadingMicrosCount int
StorageTimeReadingMicros Statistics // in microseconds
} }
type Statistics struct { type Statistics struct {
@@ -335,7 +341,6 @@ func countersToStats(query QueryInfoAndCounters, uptime int64, tc totalCounters)
Operation: query.Operation, Operation: query.Operation,
Query: query.Query, Query: query.Query,
Fingerprint: query.Fingerprint, Fingerprint: query.Fingerprint,
Scanned: calcStats(query.NScanned),
Returned: calcStats(query.NReturned), Returned: calcStats(query.NReturned),
QueryTime: calcStats(query.QueryTime), QueryTime: calcStats(query.QueryTime),
ResponseLength: calcStats(query.ResponseLength), ResponseLength: calcStats(query.ResponseLength),
@@ -345,23 +350,26 @@ func countersToStats(query QueryInfoAndCounters, uptime int64, tc totalCounters)
QPS: float64(query.Count) / float64(uptime), QPS: float64(query.Count) / float64(uptime),
PlanSummary: query.PlanSummary, PlanSummary: query.PlanSummary,
CollScanCount: query.CollScanCount, CollScanCount: query.CollScanCount,
CollScanSum: query.CollScanSum, DocsExaminedCount: len(query.DocsExamined),
DocsExamined: calcStats(query.DocsExamined), DocsExamined: calcStats(query.DocsExamined),
KeysExaminedCount: len(query.KeysExamined),
KeysExamined: calcStats(query.KeysExamined), KeysExamined: calcStats(query.KeysExamined),
TimeStamp: query.TimeStamp,
QueryHash: query.QueryHash, QueryHash: query.QueryHash,
AppName: query.AppName, AppName: query.AppName,
Client: query.Client, Client: query.Client,
User: query.User, User: query.User,
Comments: query.Comments, Comments: query.Comments,
LGlobalAcquireCountRShared: query.LGlobalAcquireCountRShared, LocksGlobalAcquireCountReadShared: query.LocksGlobalAcquireCountReadShared,
LGlobalAcquireCountWShared: query.LGlobalAcquireCountWShared, LocksGlobalAcquireCountWriteShared: query.LocksGlobalAcquireCountWriteShared,
LDatabaseAcquireCountRShared: query.LDatabaseAcquireCountRShared, LocksDatabaseAcquireCountReadShared: query.LocksDatabaseAcquireCountReadShared,
LDatabaseAcquireWaitCountRShared: query.LDatabaseAcquireWaitCountRShared, LocksDatabaseAcquireWaitCountReadShared: query.LocksDatabaseAcquireWaitCountReadShared,
LDatabaseTimeAcquiringMicrosRShared: query.LDatabaseTimeAcquiringMicrosRShared, LocksDatabaseTimeAcquiringMicrosReadSharedCount: len(query.LocksDatabaseTimeAcquiringMicrosReadShared),
LCollectionAcquireCountRShared: query.LCollectionAcquireCountRShared, LocksDatabaseTimeAcquiringMicrosReadShared: calcStats(query.LocksDatabaseTimeAcquiringMicrosReadShared),
StorageBytesRead: query.StorageBytesRead, LocksCollectionAcquireCountReadShared: query.LocksCollectionAcquireCountReadShared,
StorageTimeReadingMicros: query.StorageTimeReadingMicros, StorageBytesReadCount: len(query.StorageBytesRead),
StorageBytesRead: calcStats(query.StorageBytesRead),
StorageTimeReadingMicrosCount: len(query.StorageTimeReadingMicros),
StorageTimeReadingMicros: calcStats(query.StorageTimeReadingMicros),
} }
if tc.Scanned > 0 { if tc.Scanned > 0 {
queryStats.Scanned.Pct = queryStats.Scanned.Total * 100 / tc.Scanned queryStats.Scanned.Pct = queryStats.Scanned.Total * 100 / tc.Scanned
@@ -378,10 +386,10 @@ func countersToStats(query QueryInfoAndCounters, uptime int64, tc totalCounters)
if queryStats.Returned.Total > 0 { if queryStats.Returned.Total > 0 {
queryStats.Ratio = queryStats.Scanned.Total / queryStats.Returned.Total queryStats.Ratio = queryStats.Scanned.Total / queryStats.Returned.Total
} }
if queryStats.DocsExamined.Total > 0 { if tc.DocsExamined > 0 {
queryStats.DocsExamined.Pct = queryStats.DocsExamined.Total / tc.DocsExamined queryStats.DocsExamined.Pct = queryStats.DocsExamined.Total / tc.DocsExamined
} }
if queryStats.KeysExamined.Total > 0 { if tc.KeysExamined > 0 {
queryStats.KeysExamined.Pct = queryStats.KeysExamined.Total / tc.KeysExamined queryStats.KeysExamined.Pct = queryStats.KeysExamined.Total / tc.KeysExamined
} }
@@ -392,7 +400,6 @@ func aggregateCounters(queries []QueryInfoAndCounters) QueryInfoAndCounters {
qt := QueryInfoAndCounters{} qt := QueryInfoAndCounters{}
for _, query := range queries { for _, query := range queries {
qt.Count += query.Count qt.Count += query.Count
qt.NScanned = append(qt.NScanned, query.NScanned...)
qt.NReturned = append(qt.NReturned, query.NReturned...) qt.NReturned = append(qt.NReturned, query.NReturned...)
qt.QueryTime = append(qt.QueryTime, query.QueryTime...) qt.QueryTime = append(qt.QueryTime, query.QueryTime...)
qt.ResponseLength = append(qt.ResponseLength, query.ResponseLength...) qt.ResponseLength = append(qt.ResponseLength, query.ResponseLength...)
@@ -408,9 +415,6 @@ func calcTotalCounters(queries []QueryInfoAndCounters) totalCounters {
for _, query := range queries { for _, query := range queries {
tc.Count += query.Count tc.Count += query.Count
scanned, _ := stats.Sum(query.NScanned)
tc.Scanned += scanned
returned, _ := stats.Sum(query.NReturned) returned, _ := stats.Sum(query.NReturned)
tc.Returned += returned tc.Returned += returned

View File

@@ -159,9 +159,9 @@ func TestStats(t *testing.T) {
BlockedTime: nil, BlockedTime: nil,
LockTime: nil, LockTime: nil,
NReturned: []float64{0}, NReturned: []float64{0},
NScanned: []float64{10000},
QueryTime: []float64{7}, QueryTime: []float64{7},
ResponseLength: []float64{215}, ResponseLength: []float64{215},
DocsExamined: []float64{10000},
} }
want := Queries{ want := Queries{