@ca-apm/native-metrics
Version:
Monitor Native matrics like GC and Event loop stats
65 lines (55 loc) • 2.8 kB
JavaScript
/**
* Copyright (c) 2015 CA. All rights reserved.
*
* This software and all information contained therein is confidential and proprietary and
* shall not be duplicated, used, disclosed or disseminated in any way except as authorized
* by the applicable license agreement, without the express written permission of CA. All
* authorized reproductions must be marked with this language.
*
* EXCEPT AS SET FORTH IN THE APPLICABLE LICENSE AGREEMENT, TO THE EXTENT
* PERMITTED BY APPLICABLE LAW, CA PROVIDES THIS SOFTWARE WITHOUT WARRANTY
* OF ANY KIND, INCLUDING WITHOUT LIMITATION, ANY IMPLIED WARRANTIES OF
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL CA BE
* LIABLE TO THE END USER OR ANY THIRD PARTY FOR ANY LOSS OR DAMAGE, DIRECT OR
* INDIRECT, FROM THE USE OF THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, LOST
* PROFITS, BUSINESS INTERRUPTION, GOODWILL, OR LOST DATA, EVEN IF CA IS
* EXPRESSLY ADVISED OF SUCH LOSS OR DAMAGE.
*/
var gcstats = require('./lib/gcstats');
var eventloopstats = require('./lib/eventloopstats');
var agent = require('ca-apm-probe/lib/agent');
var metrics = require('ca-apm-probe/lib/metrics');
var metricsReporter = metrics.getReporter();
var logger = require("ca-apm-probe/lib/logger.js");
var commonUtil = require('ca-apm-probe/lib/utils/common-utils');
gcstats.init(agent);
agent.on('poll::start', function() {
if (data = eventloopstats.poll()) {
agent.internal.emit('loop', {loop: data});
}
});
agent.internal.on('send', function(name, value) {
var resMetricPrefix = commonUtil.getResMetricPrefix();
// FIXME(bnoordhuis) Contrary to what the name suggests, this metric is
// actually a mix of scavenges and full GCs.
if (name === 'update' && value.name === 'GC Full. V8 heap used') {
var gcHeapUsed = value.value || 0;
logUpdates('gc.heap.used', gcHeapUsed);
metricsReporter.reportFluctuatingCounterMetric(resMetricPrefix + 'GC Heap Used', gcHeapUsed);
return;
}
if (name === 'update' && typeof(value.loop) === 'object') {
logUpdates('loop.count', value.loop.count | 0);
logUpdates('loop.minimum', value.loop.fastest_ms | 0);
logUpdates('loop.maximum', value.loop.slowest_ms | 0);
logUpdates('loop.average', commonUtil.fix(value.loop.sum_ms / (value.loop.count)));
var count = value.loop.count;
var avg = value.loop.sum_ms/count; //count == 0 is handled in loop.js
metricsReporter.reportIntervalCounterMetric(resMetricPrefix + 'Event Loop Ticks Per Interval', count);
metrics.reportAvgDurationDirectMetric(resMetricPrefix + 'Event Loop Average Tick Time(ms)', avg, value.loop.fastest_ms, value.loop.slowest_ms, count);
return;
}
});
function logUpdates(name, value){
logger.debug('%s=%d', name, value);
}