summaryrefslogtreecommitdiff
path: root/jstests/noPassthrough/explain_operation_metrics.js
blob: 741d286451ce9820943e5fceeeae6fef24293e6b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/**
 * Tests explain when profileOperationResourceConsumptionMetrics is set to true and explain
 * verbosity is "executionStats" or "allPlansExecution".
 * @tags: [
 *   requires_replication,
 *   requires_sharding,
 *   requires_wiredtiger
 * ]
 */
(function() {
"use strict";
const dbName = jsTestName();
const collName = 'coll';

const runTest = (db) => {
    for (const verbosity of ["executionStats", "allPlansExecution"]) {
        jsTestLog("Testing with verbosity: " + verbosity);
        const coll = db[collName];
        coll.drop();
        const docs = [{a: 0, b: 0}, {a: 0, b: 0}, {a: 0, b: 0}];
        assert.commandWorked(coll.insertMany(docs));

        const result = assert.commandWorked(coll.find().explain(verbosity));
        assert(result.hasOwnProperty("executionStats"), result);
        const execStats = result.executionStats;
        assert(execStats.hasOwnProperty("operationMetrics"), execStats);
        const operationMetrics = execStats.operationMetrics;
        assert.eq(132, operationMetrics.docBytesRead, result);
        assert.eq(3, operationMetrics.docUnitsRead, result);

        const aggResult =
            assert.commandWorked(coll.explain(verbosity).aggregate({$project: {a: "$a"}}));
        assert(aggResult.hasOwnProperty("executionStats"), aggResult);
        const aggExecStats = aggResult.executionStats;
        assert(aggExecStats.hasOwnProperty("operationMetrics"), aggExecStats);
        const aggOperationMetrics = aggExecStats.operationMetrics;
        assert.eq(132, aggOperationMetrics.docBytesRead, aggResult);
        assert.eq(3, aggOperationMetrics.docUnitsRead, aggResult);

        assert.commandWorked(coll.createIndex({a: 1}));
        const idxFindResult = assert.commandWorked(coll.find({a: 0}).explain(verbosity));
        assert(idxFindResult.hasOwnProperty("executionStats"), idxFindResult);
        const idxFindExecutionStats = idxFindResult.executionStats;
        assert(idxFindExecutionStats.hasOwnProperty("operationMetrics"), idxFindExecutionStats);
        const idxFindOperationMetrics = idxFindExecutionStats.operationMetrics;
        assert.eq(132, idxFindOperationMetrics.docBytesRead, idxFindResult);
        assert.eq(3, idxFindOperationMetrics.docUnitsRead, idxFindResult);
        assert.eq(12, idxFindOperationMetrics.idxEntryBytesRead, idxFindResult);
        assert.eq(3, idxFindOperationMetrics.idxEntryUnitsRead, idxFindResult);

        // The number of cursorSeeks can change depending on whether a yield has occurred. We
        // account for this by incrementing the expected value by the number of calls to
        // 'restoreState'.
        const numAdditionalCursorSeeks = idxFindExecutionStats.executionStages.restoreState;
        assert.eq(4 + numAdditionalCursorSeeks, idxFindOperationMetrics.cursorSeeks, idxFindResult);
    }
};

const setParams = {
    profileOperationResourceConsumptionMetrics: true
};

jsTestLog("Testing standalone");
(function testStandalone() {
    const conn = MongoRunner.runMongod({setParameter: setParams});
    const db = conn.getDB(dbName);
    runTest(db);
    MongoRunner.stopMongod(conn);
})();

jsTestLog("Testing replica set");
(function testReplicaSet() {
    const rst = new ReplSetTest({nodes: 2, nodeOptions: {setParameter: setParams}});
    rst.startSet();
    rst.initiate();
    const db = rst.getPrimary().getDB(dbName);
    runTest(db);
    rst.stopSet();
})();
})();