Comparing version 0.1.0 to 0.1.1
@@ -13,7 +13,28 @@ /** | ||
/* | ||
* Haproxy check_status values | ||
UNK -> unknown | ||
INI -> initializing | ||
SOCKERR -> socket error | ||
L4OK -> check passed on layer 4, no upper layers testing enabled | ||
L4TMOUT -> layer 1-4 timeout | ||
L4CON -> layer 1-4 connection problem, for example "Connection refused" (tcp rst) or "No route to host" (icmp) | ||
L6OK -> check passed on layer 6 | ||
L6TOUT -> layer 6 (SSL) timeout | ||
L6RSP -> layer 6 invalid response - protocol error | ||
L7OK -> check passed on layer 7 | ||
L7OKC -> check conditionally passed on layer 7, for example 404 with disable-on-404 | ||
L7TOUT -> layer 7 (HTTP/SMTP) timeout | ||
L7RSP -> layer 7 invalid response - protocol error | ||
L7STS -> layer 7 response error, for example HTTP 5xx | ||
*/ | ||
/* | ||
* | ||
* Lifecycle: | ||
* | ||
* Every <interval> seconds: Fetch statistics data (csv) Run filters Handle | ||
* filter results | ||
* Every <interval> seconds: | ||
* Fetch statistics data (csv) | ||
* Run filters | ||
* Handle filter callbacks/Emit events | ||
* | ||
@@ -27,6 +48,9 @@ */ | ||
// Name of main frontend - for detecting proxy instance reloads | ||
this.mainFrontendName = typeof this.conf.frontend !== 'undefined' ? this.conf.frontend : null; | ||
// Keep track of stot - for detecting proxy instance reloads | ||
this.totalSessions = 0; | ||
this.quiet = true; | ||
this.quiet = typeof this.conf.quiet !== 'undefined' ? this.conf.quiet : true; | ||
@@ -38,3 +62,3 @@ // Event conditions | ||
{ header : 'svname', op : 'ne', value : 'FRONTEND' }, | ||
{ header : 'check_status', op : 'eq', value : 'L4OK' } | ||
{ header : 'check_status', op : 'in', value : ['L4OK','L6OK','L7OK','L7OKC','INI'] } | ||
], event : 'server_ok' }, | ||
@@ -44,3 +68,3 @@ { criteria : [ | ||
{ header : 'svname', op : 'ne', value : 'FRONTEND' }, | ||
{ header : 'check_status', op : 'ne', value : 'L4OK' } | ||
{ header : 'check_status', op : 'in', value : ['UNK','SOCKERR','L4TMOUT','L4CON','L6TOUT','L6RSP','L7TOUT','L7RSP','L7STS'] }, | ||
], event : 'server_down' }, | ||
@@ -166,46 +190,17 @@ { criteria : [ | ||
// Iterate through all filters | ||
for(var f in this.filters) { | ||
var filter = this.filters[f]; | ||
var passed = true; | ||
this.log('Applying filter: %s', filter.event); | ||
// ... and each criteria in filter | ||
for(var c in filter.criteria) { | ||
var criteria = filter.criteria[c]; | ||
var header = criteria.header; | ||
var value = typeof(criteria.value) == 'function' ? criteria.value.call(this, row) : criteria.value; | ||
this.log('\tCriteria: %s %s %s', header, criteria.op, value); | ||
this.log('\tData: %s %s %s', row[header], criteria.op, value); | ||
// Do compare operation | ||
switch(criteria.op) { | ||
case 'lt' : passed = row[header] < value; break; | ||
case 'lte' : passed = row[header] <= value; break; | ||
case 'eq' : passed = row[header] === value; break; | ||
case 'ne' : passed = row[header] !== value; break; | ||
case 'gt' : passed = row[header] > value; break; | ||
case 'gte' : passed = row[header] >= value; break; | ||
default : passed = false; break; | ||
} | ||
this.log('\tPassed: %s', passed); | ||
// Drop out of loop, if any condition fails | ||
if(false == passed) | ||
break; | ||
} | ||
// Notify listeners | ||
if(passed) { | ||
if(null != filter.event) | ||
this.emit(filter.event, row); | ||
if(null != filter.handler && typeof filter.handler == 'function') | ||
filter.handler.call(this, row); | ||
} | ||
} | ||
var passedFilters = this.applyFilters(row); | ||
// Notify listeners | ||
var self = this; | ||
passedFilters.forEach(function(filter) { | ||
if(null != filter.event) | ||
self.emit(filter.event, row); | ||
if(null != filter.handler && typeof filter.handler == 'function') | ||
filter.handler.call(this, row); | ||
}); | ||
} | ||
// Update total sessions | ||
this.totalSessions = parsedStats.map['http-in']['FRONTEND']['stot']; | ||
if(null !== this.mainFrontendName) | ||
this.totalSessions = parsedStats.map[this.mainFrontendName]['FRONTEND']['stot']; | ||
@@ -221,6 +216,60 @@ // Emit update event | ||
Hapromo.prototype.log = function(msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) { | ||
Hapromo.prototype.applyFilters = function(input) { | ||
var passedFilters = []; | ||
// Iterate through all filters, checking if they pass | ||
for(var f in this.filters) { | ||
var filter = this.filters[f]; | ||
this.log('Applying filter: %s', typeof filter.event !== 'undefined' ? filter.event : "Callback filter"); | ||
var passed = this.applyFilter(filter, input); | ||
// Add filter to filters passed if that is the case | ||
if(passed) | ||
passedFilters.push(filter); | ||
} | ||
return passedFilters; | ||
}; | ||
Hapromo.prototype.applyFilter = function(filter, input) { | ||
this.log('Applying filter: %s', filter.event); | ||
// Check each criteria for whether it holds or not | ||
for(var c in filter.criteria) { | ||
var passed = true; | ||
var criteria = filter.criteria[c]; | ||
var header = criteria.header; | ||
var value = typeof(criteria.value) == 'function' ? criteria.value.call(this, input) : criteria.value; | ||
this.log('\tCriteria: %s %s %s', header, criteria.op, value); | ||
this.log('\tData: %s %s %s', input[header], criteria.op, value); | ||
// Do compare operation | ||
switch(criteria.op) { | ||
case 'lt' : passed = input[header] < value; break; | ||
case 'lte' : passed = input[header] <= value; break; | ||
case 'eq' : passed = input[header] === value; break; | ||
case 'ne' : passed = input[header] !== value; break; | ||
case 'in' : passed = value.indexOf(input[header]) !== -1; break; | ||
case 'nin' : passed = value.indexOf(input[header]) === -1; break; | ||
case 'gt' : passed = input[header] > value; break; | ||
case 'gte' : passed = input[header] >= value; break; | ||
default : passed = false; break; | ||
} | ||
this.log('\tPassed: %s', passed); | ||
// Drop out of loop if any condition fails | ||
if(false == passed) | ||
return false; | ||
} | ||
return filter; | ||
}; | ||
Hapromo.prototype.log = function() { | ||
if(!this.quiet) | ||
console.log(msg, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); | ||
console.log.apply(this, arguments); | ||
}; |
{ | ||
"name": "hapromo", | ||
"description": "Haproxy Monitor library", | ||
"version": "0.1.0", | ||
"version": "0.1.1", | ||
"author": "Frederik Hannibal <frederik@backhand.dk>", | ||
@@ -9,8 +9,11 @@ "repository": "git://github.com/backhand/hapromo", | ||
"dependencies": { | ||
"request": "2.12.0" | ||
"request": ">=2.12.0" | ||
}, | ||
"devDependencies": { | ||
"nodeunit": ">=0.7.4" | ||
}, | ||
"scripts": { | ||
"test": "nodeunit test" | ||
"test": "node_modules/nodeunit/bin/nodeunit test" | ||
}, | ||
"engines": { "node": ">= 0.6.2" } | ||
} | ||
"engines": { "node": ">=0.6.2" } | ||
} |
HAProxy monitor library | ||
======================= | ||
[](https://travis-ci.org/backhand/hapromo) | ||
Usage: | ||
@@ -5,0 +7,0 @@ ------ |
@@ -15,4 +15,6 @@ var fs = require('fs'); | ||
var parsedReply = hapromo.parseStats(testReply); | ||
exports.testParsing = function(test) { | ||
var parsedReply = hapromo.parseStats(testReply); | ||
//var parsedReply = hapromo.parseStats(testReply); | ||
test.equal(parsedReply.map['blog-servers']['blog2'].qcur,0); | ||
@@ -68,2 +70,40 @@ test.equal(parsedReply.map['http-in']['FRONTEND'].qmax,''); | ||
test.done(); | ||
}; | ||
exports.testFilterOperatorIN = function(test) { | ||
var testfilter = { | ||
criteria : [ | ||
{ header : 'svname', op : 'ne', value : 'FRONTEND' }, | ||
{ header : 'svname', op : 'ne', value : 'BACKEND' }, | ||
{ header : 'check_status', op : 'in', value : ['L4OK','L7OK'] } | ||
] | ||
}; | ||
var row = parsedReply.map['http-servers']['webapp2']; | ||
var result = hapromo.applyFilter(testfilter, row); | ||
test.equal(testfilter, result); | ||
test.done(); | ||
}; | ||
exports.testFilterOperatorNIN = function(test) { | ||
var testfilter = { | ||
criteria : [ | ||
{ header : 'svname', op : 'ne', value : 'FRONTEND' }, | ||
{ header : 'svname', op : 'ne', value : 'BACKEND' }, | ||
{ header : 'check_status', op : 'nin', value : ['L4OK','L7OK'] } | ||
] | ||
}; | ||
var row = parsedReply.map['http-servers']['webapp2']; | ||
var result = hapromo.applyFilter(testfilter, row); | ||
test.deepEqual(false, result); | ||
test.done(); | ||
}; |
21195
12
399
55
1
+ Addedajv@6.12.6(transitive)
+ Addedasn1@0.2.6(transitive)
+ Addedassert-plus@1.0.0(transitive)
+ Addedasynckit@0.4.0(transitive)
+ Addedaws-sign2@0.7.0(transitive)
+ Addedaws4@1.13.2(transitive)
+ Addedbcrypt-pbkdf@1.0.2(transitive)
+ Addedcaseless@0.12.0(transitive)
+ Addedcombined-stream@1.0.8(transitive)
+ Addedcore-util-is@1.0.2(transitive)
+ Addeddashdash@1.14.1(transitive)
+ Addeddelayed-stream@1.0.0(transitive)
+ Addedecc-jsbn@0.1.2(transitive)
+ Addedextend@3.0.2(transitive)
+ Addedextsprintf@1.3.0(transitive)
+ Addedfast-deep-equal@3.1.3(transitive)
+ Addedfast-json-stable-stringify@2.1.0(transitive)
+ Addedforever-agent@0.6.1(transitive)
+ Addedform-data@2.3.3(transitive)
+ Addedgetpass@0.1.7(transitive)
+ Addedhar-schema@2.0.0(transitive)
+ Addedhar-validator@5.1.5(transitive)
+ Addedhttp-signature@1.2.0(transitive)
+ Addedis-typedarray@1.0.0(transitive)
+ Addedisstream@0.1.2(transitive)
+ Addedjsbn@0.1.1(transitive)
+ Addedjson-schema@0.4.0(transitive)
+ Addedjson-schema-traverse@0.4.1(transitive)
+ Addedjson-stringify-safe@5.0.1(transitive)
+ Addedjsprim@1.4.2(transitive)
+ Addedmime-db@1.52.0(transitive)
+ Addedmime-types@2.1.35(transitive)
+ Addedoauth-sign@0.9.0(transitive)
+ Addedperformance-now@2.1.0(transitive)
+ Addedpsl@1.15.0(transitive)
+ Addedpunycode@2.3.1(transitive)
+ Addedqs@6.5.3(transitive)
+ Addedrequest@2.88.2(transitive)
+ Addedsafe-buffer@5.2.1(transitive)
+ Addedsafer-buffer@2.1.2(transitive)
+ Addedsshpk@1.18.0(transitive)
+ Addedtough-cookie@2.5.0(transitive)
+ Addedtunnel-agent@0.6.0(transitive)
+ Addedtweetnacl@0.14.5(transitive)
+ Addeduri-js@4.4.1(transitive)
+ Addeduuid@3.4.0(transitive)
+ Addedverror@1.10.0(transitive)
- Removedrequest@2.12.0(transitive)
Updatedrequest@>=2.12.0