UNPKG

@ca-apm/native-metrics

Version:

Monitor Native matrics like GC and Event loop stats

65 lines (55 loc) 2.8 kB
/** * 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); }