-
Notifications
You must be signed in to change notification settings - Fork 126
Expand file tree
/
Copy pathcouchbase-probe.js
More file actions
96 lines (84 loc) · 3.03 KB
/
couchbase-probe.js
File metadata and controls
96 lines (84 loc) · 3.03 KB
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*******************************************************************************
* Copyright 2017 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
'use strict';
var Probe = require('../lib/probe.js');
var aspect = require('../lib/aspect.js');
var util = require('util');
var am = require('../');
function CouchbaseProbe() {
Probe.call(this, 'couchbase');
}
util.inherits(CouchbaseProbe, Probe);
CouchbaseProbe.prototype.aspectBucketMethod = function(bucket, method) {
var that = this;
aspect.before(bucket, method, function(target, methodName, methodArgs, probeData) {
that.metricsProbeStart(probeData, method, methodArgs);
if (aspect.findCallbackArg(methodArgs) != undefined) {
aspect.aroundCallback(methodArgs, probeData, function(target, args) {
that.metricsProbeEnd(probeData, methodName, bucket._name, args[0]);
});
}
});
};
// Most used couchbase bucket methods
const bucketMethods = ['query', 'upsert', 'insert', 'replace', 'remove', 'get', 'getMulti'];
CouchbaseProbe.prototype.attach = function(name, target) {
var that = this;
if (name != 'couchbase') return target;
if (target.__ddProbeAttached__) return target;
target.__ddProbeAttached__ = true;
var mock = target['Mock']['Cluster'].prototype;
var cluster = target['Cluster'].prototype;
var data = {};
// couchbase mock cluster
aspect.after(mock, 'openBucket', data, function(target, methodName, args, probeData, bucket) {
for(key in bucketMethods) {
that.aspectBucketMethod(bucket, bucketMethods[key]);
}
return bucket;
});
// couchbase cluster
aspect.after(cluster, 'openBucket', data, function(target, methodName, args, probeData, bucket) {
for(key in bucketMethods) {
that.aspectBucketMethod(bucket, bucketMethods[key]);
}
return bucket;
});
return target;
};
/*
* Lightweight metrics probe for couchbase queries
*
* These provide:
* time: time event started
* bucket: The bucket executed on
* method: the method called on the bucket
* duration: the time for the request to respond
*/
CouchbaseProbe.prototype.metricsEnd = function(probeData, method, bucketName, err) {
if (probeData && probeData.timer) {
probeData.timer.stop();
var eventTimer = probeData.timer;
am.emit('couchbase', {
time: eventTimer.startTimeMillis,
bucket: bucketName,
method: method,
duration: eventTimer.timeDelta,
error: err
});
}
};
module.exports = CouchbaseProbe;