From b7408dfcb06e207a5019f4c0c6b5b8403b2e4279 Mon Sep 17 00:00:00 2001 From: Alex Hauser Date: Thu, 2 Jul 2015 11:26:28 -0700 Subject: [PATCH] Added TChannel version, Ringpop version, timestamp, and uptime stats to the /admin/stats endpoint --- index.js | 24 ++++++++++++++++++++++-- lib/util.js | 21 +++++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 9065e620..310a1e53 100644 --- a/index.js +++ b/index.js @@ -25,6 +25,7 @@ var fs = require('fs'); var globalSetTimeout = require('timers').setTimeout; var hammock = require('uber-hammock'); var metrics = require('metrics'); +var packageJSON = require('./package.json'); var Gossip = require('./lib/swim/gossip'); var sendPing = require('./lib/swim/ping-sender.js'); @@ -37,6 +38,7 @@ var createMembershipUpdateListener = require('./lib/membership-update-listener.j var createServer = require('./server'); var Dissemination = require('./lib/dissemination.js'); var errors = require('./lib/errors.js'); +var getTChannelVersion = require('./lib/util.js').getTChannelVersion; var HashRing = require('./lib/ring'); var Membership = require('./lib/membership.js'); var MembershipIterator = require('./lib/membership-iterator.js'); @@ -143,6 +145,11 @@ function RingPop(options) { this.destroyed = false; this.joiner = null; + + this.startTime = Date.now(); //used for calculating uptime + + this.tchannelVersion = getTChannelVersion(); + this.ringpopVersion = packageJSON.version; } require('util').inherits(RingPop, EventEmitter); @@ -356,7 +363,11 @@ RingPop.prototype.getStatsHooksStats = function getStatsHooksStats() { }; RingPop.prototype.getStats = function getStats() { - return { + var timestamp = Date.now(); + var uptime = timestamp - this.startTime; + + + var stats = { hooks: this.getStatsHooksStats(), membership: this.membership.getStats(), process: { @@ -370,8 +381,17 @@ RingPop.prototype.getStats = function getStats() { serverRate: this.serverRate.printObj().m1, totalRate: this.totalRate.printObj().m1 }, - ring: Object.keys(this.ring.servers) + ring: Object.keys(this.ring.servers), + version: this.ringpopVersion, + timestamp: timestamp, + uptime: uptime }; + + if (this.tchannelVersion !== null) { + stats.tchannelVersion = this.tchannelVersion; + } + + return stats; }; RingPop.prototype.handleTick = function handleTick(cb) { diff --git a/lib/util.js b/lib/util.js index f8ffaab2..98e9511f 100644 --- a/lib/util.js +++ b/lib/util.js @@ -17,6 +17,11 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. +'use strict'; + +var fs = require('fs'); +var path = require('path'); + var HOST_CAPTURE = /(\d+\.\d+\.\d+\.\d+):\d+/; function captureHost(hostPort) { @@ -24,6 +29,21 @@ function captureHost(hostPort) { return match && match[1]; } +function getTChannelVersion() { + try { + var modulePath = require.resolve('tchannel'); + var dirName = path.dirname(modulePath); + var packageJsonPath = path.join(dirName, 'package.json'); + + if (fs.existsSync(packageJsonPath)) { + return require(packageJsonPath).version; + } + } + catch (e) { + return null; + } +} + function isEmptyArray(array) { return !Array.isArray(array) || array.length === 0; } @@ -61,6 +81,7 @@ function safeParse(str) { module.exports = { captureHost: captureHost, + getTChannelVersion: getTChannelVersion, isEmptyArray: isEmptyArray, mapUniq: mapUniq, numOrDefault: numOrDefault,