diff options
author | Jess Balint <jbalint@gmail.com> | 2022-04-08 23:31:18 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-04-09 00:23:49 +0000 |
commit | 43434627e89822b7e19e3a9d3aeb341be331aae6 (patch) | |
tree | 141b28e6d6d597ff6d79c3a55a90bfbc5ac5ed21 /jstests/noPassthrough/server_status_multiplanner.js | |
parent | 86efc4be5f8921af9e8b89ef4219b089ef0c67cd (diff) | |
download | mongo-43434627e89822b7e19e3a9d3aeb341be331aae6.tar.gz |
SERVER-63642 Add serverStatus histogram metrics to measure multi-planning performance
Diffstat (limited to 'jstests/noPassthrough/server_status_multiplanner.js')
-rw-r--r-- | jstests/noPassthrough/server_status_multiplanner.js | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/jstests/noPassthrough/server_status_multiplanner.js b/jstests/noPassthrough/server_status_multiplanner.js new file mode 100644 index 00000000000..f185cdb7841 --- /dev/null +++ b/jstests/noPassthrough/server_status_multiplanner.js @@ -0,0 +1,104 @@ +/** + * Tests the serverStatus and FTDC metrics for multi planner execution (both classic and SBE). + */ +(function() { +"use strict"; + +function sumHistogramBucketCounts(histogram) { + let sum = 0; + for (const bucket of histogram) { + sum += bucket.count; + } + return sum; +} + +load("jstests/libs/ftdc.js"); + +const collName = jsTestName(); +const dbName = jsTestName(); + +// Use an isolated server instance to obtain predictible serverStatus planning metrics. +const conn = MongoRunner.runMongod({}); +assert.neq(conn, null, "mongod failed to start"); +const db = conn.getDB(dbName); + +let coll = db.getCollection(collName); +coll.drop(); + +assert.commandWorked(coll.insert({_id: 3, a: 1, b: 1})); +assert.commandWorked(coll.insert({_id: 5, a: 1, b: 1})); +assert.commandWorked(coll.createIndex({a: 1})); +assert.commandWorked(coll.createIndex({b: 1})); + +let multiPlannerMetrics = db.serverStatus().metrics.query.multiPlanner; + +// Verify initial metrics. +assert.eq(sumHistogramBucketCounts(multiPlannerMetrics.histograms.classicMicros), 0); +assert.eq(sumHistogramBucketCounts(multiPlannerMetrics.histograms.classicNumPlans), 0); +assert.eq(sumHistogramBucketCounts(multiPlannerMetrics.histograms.classicWorks), 0); +assert.eq(multiPlannerMetrics.classicCount, 0); +assert.eq(multiPlannerMetrics.classicMicros, 0); +assert.eq(multiPlannerMetrics.classicWorks, 0); + +assert.eq(multiPlannerMetrics.histograms.classicMicros[0].lowerBound, 0); + +// Run with classic engine and verify metrics. +{ + assert.commandWorked(db.adminCommand({setParameter: 1, internalQueryForceClassicEngine: true})); + assert.commandWorked(coll.find({a: 1, b: 1, c: 1}).explain()); + + multiPlannerMetrics = db.serverStatus().metrics.query.multiPlanner; + assert.eq(sumHistogramBucketCounts(multiPlannerMetrics.histograms.sbeMicros), 0); + assert.eq(sumHistogramBucketCounts(multiPlannerMetrics.histograms.sbeNumReads), 0); + assert.eq(sumHistogramBucketCounts(multiPlannerMetrics.histograms.sbeNumPlans), 0); + assert.eq(multiPlannerMetrics.sbeMicros, 0); + assert.eq(multiPlannerMetrics.sbeNumReads, 0); + assert.eq(multiPlannerMetrics.sbeCount, 0); + + assert.eq(sumHistogramBucketCounts(multiPlannerMetrics.histograms.classicMicros), 1); + assert.eq(sumHistogramBucketCounts(multiPlannerMetrics.histograms.classicNumPlans), 1); + assert.eq(sumHistogramBucketCounts(multiPlannerMetrics.histograms.classicWorks), 1); + assert.eq(multiPlannerMetrics.classicCount, 1); + assert.gt(multiPlannerMetrics.classicMicros, 0); + assert.gt(multiPlannerMetrics.classicWorks, 0); +} + +// Run with SBE and verify metrics. +{ + assert.commandWorked( + db.adminCommand({setParameter: 1, internalQueryForceClassicEngine: false})); + assert.commandWorked(coll.find({a: 1, b: 1, c: 1}).explain()); + + multiPlannerMetrics = db.serverStatus().metrics.query.multiPlanner; + assert.eq(sumHistogramBucketCounts(multiPlannerMetrics.histograms.sbeMicros), 1); + assert.eq(sumHistogramBucketCounts(multiPlannerMetrics.histograms.sbeNumReads), 1); + assert.eq(sumHistogramBucketCounts(multiPlannerMetrics.histograms.sbeNumPlans), 1); + assert.gt(multiPlannerMetrics.sbeMicros, 0); + assert.gt(multiPlannerMetrics.sbeNumReads, 0); + assert.eq(multiPlannerMetrics.sbeCount, 1); + + // Sanity check. + assert.eq(multiPlannerMetrics.classicCount, 1); +} + +assert.soon(() => { + // Verify FTDC includes aggregate metrics. + const multiPlannerMetricsFtdc = + verifyGetDiagnosticData(conn.getDB("admin")).serverStatus.metrics.query.multiPlanner; + if (multiPlannerMetricsFtdc.classicCount == 0 || multiPlannerMetricsFtdc.sbeCount == 0) { + // This is an indication we haven't retrieve the expected serverStatus metrics yet. + return false; + } + assert.eq(multiPlannerMetricsFtdc.classicCount, 1); + assert.gt(multiPlannerMetricsFtdc.classicMicros, 0); + assert.gt(multiPlannerMetricsFtdc.classicWorks, 0); + assert.eq(multiPlannerMetricsFtdc.sbeCount, 1); + assert.gt(multiPlannerMetricsFtdc.sbeMicros, 0); + assert.gt(multiPlannerMetricsFtdc.sbeNumReads, 0); + // Verify FTDC omits detailed histograms. + assert(!multiPlannerMetricsFtdc.hasOwnProperty("histograms")); + return true; +}, "FTDC output should eventually reflect observed serverStatus metrics."); + +MongoRunner.stopMongod(conn); +}()); |