Skip to content

Commit ce69407

Browse files
committed
Adding spec tests and runner for APM
1 parent 8297289 commit ce69407

File tree

12 files changed

+1491
-4
lines changed

12 files changed

+1491
-4
lines changed

lib/apm.js

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ var basicTimestampGenerator = {
2727
current: function() {
2828
return new Date().getTime();
2929
},
30+
3031
duration: function(start, end) {
3132
return end - start;
3233
}
@@ -151,8 +152,8 @@ var Instrumentation = function(core, options, callback) {
151152
};
152153

153154
// If we have an error
154-
if(err) {
155-
command.failure = err;
155+
if(err || (r && r.result && r.result.writeErrors)) {
156+
command.failure = err || r.result.writeErrors;
156157
self.emit('failed', command);
157158
} else {
158159
command.reply = r;
@@ -320,6 +321,7 @@ var Instrumentation = function(core, options, callback) {
320321

321322
// Set up the connection
322323
var connectionId = null;
324+
323325
// Set local connection
324326
if(this.connection) connectionId = this.connection;
325327
if(!connectionId && this.server && this.server.getConnection) connectionId = this.server.getConnection();
@@ -350,10 +352,30 @@ var Instrumentation = function(core, options, callback) {
350352
var callback = args.pop();
351353

352354
// We do not have a callback but a Promise
353-
if(typeof callback == 'function') {
355+
if(typeof callback == 'function' || command.commandName == 'killCursors') {
354356
var startTime = timestampGenerator.current();
355357
// Emit the started event
356358
self.emit('started', command)
359+
360+
// Emit succeeded event with killcursor if we have a legacy protocol
361+
if(command.commandName == 'killCursors'
362+
&& this.server.lastIsMaster()
363+
&& this.server.lastIsMaster().maxWireVersion < 4) {
364+
// Emit the succeeded command
365+
var command = {
366+
duration: timestampGenerator.duration(startTime, timestampGenerator.current()),
367+
commandName: commandTranslation[x],
368+
requestId: requestId,
369+
operationId: cursor.operationId,
370+
connectionId: cursor.server.getConnection(),
371+
reply: [{ok:1}]
372+
};
373+
374+
// Emit the command
375+
return self.emit('succeeded', command)
376+
}
377+
378+
357379
// Add our callback handler
358380
args.push(function(err, r) {
359381
if(err) {

test/functional/apm/command.json

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
{
2+
"data": [
3+
{
4+
"_id": 1,
5+
"x": 11
6+
}
7+
],
8+
"collection_name": "test",
9+
"database_name": "command-monitoring-tests",
10+
"tests": [
11+
{
12+
"description": "A successful command",
13+
"operation": {
14+
"name": "count",
15+
"arguments": {
16+
"filter": {
17+
"_id": 1
18+
}
19+
}
20+
},
21+
"expectations": [
22+
{
23+
"command_started_event": {
24+
"command": {
25+
"count": "test",
26+
"query": {
27+
"_id": 1
28+
}
29+
},
30+
"command_name": "count",
31+
"database_name": "command-monitoring-tests"
32+
}
33+
},
34+
{
35+
"command_succeeded_event": {
36+
"reply": [
37+
{
38+
"ok": 1,
39+
"n": 1
40+
}
41+
],
42+
"command_name": "count",
43+
"database_name": "command-monitoring-tests"
44+
}
45+
}
46+
]
47+
},
48+
{
49+
"description": "A failed command event",
50+
"operation": {
51+
"name": "count",
52+
"arguments": {
53+
"filter": {
54+
"$or": true
55+
}
56+
}
57+
},
58+
"expectations": [
59+
{
60+
"command_started_event": {
61+
"command": {
62+
"count": "test",
63+
"query": {
64+
"$or": true
65+
}
66+
},
67+
"command_name": "count",
68+
"database_name": "command-monitoring-tests"
69+
}
70+
},
71+
{
72+
"command_failed_event": {
73+
"command_name": "count",
74+
"database_name": "command-monitoring-tests"
75+
}
76+
}
77+
]
78+
}
79+
]
80+
}

test/functional/apm/command.yml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
data:
2+
- { _id: 1, x: 11 }
3+
4+
collection_name: &collection_name "test"
5+
database_name: &database_name "command-monitoring-tests"
6+
7+
tests:
8+
-
9+
description: "A successful command"
10+
operation:
11+
name: "count"
12+
arguments:
13+
filter: { _id: 1 }
14+
expectations:
15+
-
16+
command_started_event:
17+
command:
18+
count: *collection_name
19+
query: { _id: 1 }
20+
command_name: "count"
21+
database_name: *database_name
22+
-
23+
command_succeeded_event:
24+
reply:
25+
- { ok: 1, n: 1 }
26+
command_name: "count"
27+
database_name: *database_name
28+
-
29+
description: "A failed command event"
30+
operation:
31+
name: "count"
32+
arguments:
33+
filter: { $or: true }
34+
expectations:
35+
-
36+
command_started_event:
37+
command:
38+
count: *collection_name
39+
query: { $or: true }
40+
command_name: "count"
41+
database_name: *database_name
42+
-
43+
command_failed_event:
44+
command_name: "count"
45+
database_name: *database_name

test/functional/apm/deleteOne.json

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
{
2+
"data": [
3+
{
4+
"_id": 1,
5+
"x": 11
6+
},
7+
{
8+
"_id": 2,
9+
"x": 22
10+
},
11+
{
12+
"_id": 3,
13+
"x": 33
14+
}
15+
],
16+
"collection_name": "test",
17+
"database_name": "command-monitoring-tests",
18+
"tests": [
19+
{
20+
"description": "A successful delete one",
21+
"operation": {
22+
"name": "deleteOne",
23+
"arguments": {
24+
"filter": {
25+
"_id": {
26+
"$gt": 1
27+
}
28+
}
29+
}
30+
},
31+
"expectations": [
32+
{
33+
"command_started_event": {
34+
"command": {
35+
"delete": "test",
36+
"deletes": [
37+
{
38+
"q": {
39+
"_id": {
40+
"$gt": 1
41+
}
42+
},
43+
"limit": 1
44+
}
45+
],
46+
"writeConcern": {
47+
"w": 1
48+
},
49+
"ordered": true
50+
},
51+
"command_name": "delete",
52+
"database_name": "command-monitoring-tests"
53+
}
54+
},
55+
{
56+
"command_succeeded_event": {
57+
"reply": [
58+
{
59+
"ok": 1, "n": 1
60+
}
61+
],
62+
"command_name": "delete",
63+
"database_name": "command-monitoring-tests"
64+
}
65+
}
66+
]
67+
},
68+
{
69+
"description": "A failed delete event",
70+
"operation": {
71+
"name": "deleteOne",
72+
"arguments": {
73+
"filter": {
74+
"_id": {
75+
"$nothing": 1
76+
}
77+
}
78+
}
79+
},
80+
"expectations": [
81+
{
82+
"command_started_event": {
83+
"command": {
84+
"delete": "test",
85+
"deletes": {
86+
"q": {
87+
"_id": {
88+
"$nothing": 1
89+
}
90+
}
91+
}
92+
},
93+
"command_name": "delete",
94+
"database_name": "command-monitoring-tests"
95+
}
96+
},
97+
{
98+
"command_failed_event": {
99+
"command_name": "delete",
100+
"database_name": "command-monitoring-tests"
101+
}
102+
}
103+
]
104+
}
105+
]
106+
}

test/functional/apm/deleteOne.yml

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
data:
2+
- { _id: 1, x: 11 }
3+
- { _id: 2, x: 22 }
4+
- { _id: 3, x: 33 }
5+
6+
collection_name: &collection_name "test"
7+
database_name: &database_name "command-monitoring-tests"
8+
9+
tests:
10+
-
11+
description: "A successful delete one"
12+
operation:
13+
name: "deleteOne"
14+
arguments:
15+
filter:
16+
_id: { $gt: 1 }
17+
expectations:
18+
-
19+
command_started_event:
20+
command:
21+
delete: *collection_name
22+
deletes:
23+
- { q: { _id: { $gt: 1 }}, limit: 1 }
24+
writeConcern: { w: 1 }
25+
ordered: true
26+
command_name: "delete"
27+
database_name: *database_name
28+
-
29+
command_succeeded_event:
30+
reply:
31+
- { ok: 1 }
32+
command_name: "delete"
33+
database_name: *database_name
34+
-
35+
description: "A failed delete event"
36+
operation:
37+
name: "deleteOne"
38+
arguments:
39+
filter:
40+
_id: { $nothing: 1 }
41+
expectations:
42+
-
43+
command_started_event:
44+
command:
45+
delete: *collection_name
46+
deletes:
47+
q: { _id: { $nothing: 1 }}
48+
command_name: "delete"
49+
database_name: *database_name
50+
-
51+
command_failed_event:
52+
command_name: "delete"
53+
database_name: *database_name

0 commit comments

Comments
 (0)