File: //home/arjun/.pm2/modules/pm2-logrotate/node_modules/deep-metrics/probes/memcached-probe.js
/*******************************************************************************
* Copyright 2015 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 request = require('../lib/request.js');
var util = require('util');
var am = require('..');
function MemcachedProbe() {
Probe.call(this, 'memcached');
}
util.inherits(MemcachedProbe, Probe);
MemcachedProbe.prototype.attach = function(name, target) {
var that = this;
if (name != 'memcached') return target;
target.__ddProbeAttached__ = true;
var methods = [
// args: key, callback
'get',
'gets',
'getMulti',
// args: key, value, lifetime, callback
'set',
'replace',
'add',
// args: key, value, lifetime, cas, callback
'cas',
// args: key, value, callback
'append',
'prepend',
// args: key, amount, callback
'increment',
'decrement',
'incr',
'decr',
// args: key, callback
'touch',
// args: key, lifetime, callback
'del',
'delete',
// args: callback
// 'version', 'flush', 'samples', 'slabs', 'items'
];
aspect.around(
target.prototype,
methods,
function(target, methodName, methodArgs, context) {
that.metricsProbeStart(context, methodName, methodArgs);
that.requestProbeStart(context, methodName, methodArgs);
aspect.aroundCallback(methodArgs, context, function(target, callbackArgs, context) {
that.metricsProbeEnd(context, methodName, methodArgs);
that.requestProbeEnd(context, methodName, methodArgs);
});
},
function(target, methodName, methodArgs, context, rc) {
if (aspect.findCallbackArg(methodArgs) == undefined) {
that.metricsProbeEnd(context, methodName, methodArgs);
that.requestProbeEnd(context, methodName, methodArgs);
}
return rc;
}
);
return target;
};
/*
* Lightweight metrics probe for Memcached data store
*
* These provide:
* time: time event started
* method: the API method/function being used
* key: The data key being used
* duration: the time for the request to respond
*/
MemcachedProbe.prototype.metricsEnd = function(context, method, methodArgs) {
if (context && context.timer) {
context.timer.stop();
am.emit('memcached', {
time: context.timer.startTimeMillis,
method: method,
key: methodArgs[0],
duration: context.timer.timeDelta,
});
}
};
/*
* Heavyweight request probes for Memcached data store
*/
MemcachedProbe.prototype.requestStart = function(context, methodName, methodArgs) {
context.req = request.startRequest('memcached', methodName, false, context.timer);
};
MemcachedProbe.prototype.requestEnd = function(context, methodName, methodArgs) {
if (context && context.req) context.req.stop({ key: methodArgs[0] });
};
module.exports = MemcachedProbe;