Forráskód Böngészése

add gauges support

Nicolas FRADIN 12 éve
szülő
commit
8182596608
3 módosított fájl, 145 hozzáadás és 31 törlés
  1. 45 0
      engines/gaugesEngine.js
  2. 92 31
      mysql-backend.js
  3. 8 0
      tables/gauges_statistics.sql

+ 45 - 0
engines/gaugesEngine.js

@@ -0,0 +1,45 @@
+/**
+ *
+ *
+ */
+function MySQLBackendGaugesEngine() {
+	var self = this;
+}
+
+
+/**
+ *
+ *
+ */
+MySQLBackendGaugesEngine.prototype.buildQuerries = function(gauges, time_stamp) {
+
+	var querries = [];
+	 // Iterate on each gauge
+    for(var gaugeName in gauges) {
+      var gaugeValue = gauges[gaugeName];
+      if(gaugeValue === 0) {
+        continue;
+      } else {
+        /**********************************************************************
+         * Edit following line to custumize where statsd datas are inserted
+         *
+         * Parameters :
+         *    - userCounterName: Counter name
+         *    - counterValue: Counter value
+         */
+        querries.push("insert into `gauges_statistics` values ("+time_stamp+", '"+gaugeName+"', "+gaugeValue+") on duplicate key update value = " + gaugeValue + ", timestamp = " + time_stamp);
+      }
+    }
+
+    return querries;
+}
+
+
+/**
+ *
+ *
+ */
+exports.init = function() {
+	var instance = new MySQLBackendGaugesEngine();
+  return instance;
+};

+ 92 - 31
mysql-backend.js

@@ -64,14 +64,14 @@ function StatdMySQLBackend(startupTime, config, emitter) {
 
   //Default tables
   if(!this.config.tables) {
-    this.config.tables = {counters: ["counters_statistics"]};
+    this.config.tables = {counters: ["counters_statistics"], gauges: ["gauges_statistics"]};
   }
 
   // Default engines
   if(!self.config.engines) {
     self.config.engines = {
       counters: ["engines/countersEngine.js"],
-      gauges: [],
+      gauges: ["engines/gaugesEngine.js"],
       timers: [],
       sets: []
     };
@@ -113,7 +113,7 @@ StatdMySQLBackend.prototype.loadEngines = function() {
         process.exit(-1);
       }
       // Add engine to MySQL Backend engines
-      self.engines.counters.push(currentEngine);
+      self.engines[engineType].push(currentEngine);
     }
   }
 
@@ -189,9 +189,7 @@ StatdMySQLBackend.prototype.checkDatabase = function() {
         }
 
         // If table doesn't exists
-        if(results.length > 0) {
-          console.log("Table '" + table_name + "' was found !");
-        } else {
+        if(results.length == 0) {
           console.log("Table '" + table_name + "' was not found !");
 
           // Try to read SQL file for this table
@@ -247,6 +245,9 @@ StatdMySQLBackend.prototype.onFlush = function(time_stamp, metrics) {
 
   // Handle statsd counters
   self.handleCounters(counters,time_stamp);
+
+  // Handle statsd gauges
+  self.handleGauges(gauges,time_stamp);
   
 }
 
@@ -268,47 +269,107 @@ StatdMySQLBackend.prototype.handleCounters = function(_counters, time_stamp) {
   if(packets_received > 0) {
     // Get userCounters for this flush
     var userCounters = self.getUserCounters(_counters);
-    var querries = [];
+    var userCountersSize = 0;
+    for(var userCounterName in userCounters) { userCountersSize++; }
+   
+    if(userCountersSize > 0) {
+      console.log("Counters received !");
+
+      var querries = [];
+
+      // Open MySQL connection
+      var canExecuteQuerries = self.openMySqlConnection();
+      if(canExecuteQuerries) {
+
+        //////////////////////////////////////////////////////////////////////
+        // Call buildQuerries method on each counterEngine
+        for(var countersEngineIndex in self.engines.counters) {
+          console.log("countersEngineIndex = " + countersEngineIndex);
+          var countersEngine = self.engines.counters[countersEngineIndex];
+
+          // Add current engine querries to querries list
+          var engineQuerries = countersEngine.buildQuerries(userCounters, time_stamp);
+          querries = querries.concat(engineQuerries);
+
+          // Insert data into database every 100 query
+          if(querries.length >= 100) {
+            // Execute querries
+            self.executeQuerries(querries);
+            querries = [];
+          }
 
-    console.log("Preaparing querries...");
+        }
+
+        if(querries.length > 0) {
+          // Execute querries
+          self.executeQuerries(querries);
+          querries = [];
+        }
+      }
+
+      // Close MySQL Connection
+      self.closeMySqlConnection();
+    }
+  }
+
+}
+
+
+
+/**
+ * Handle and process received counters 
+ * 
+ * @param _counters received counters
+ * @param time_stamp flush time_stamp 
+ */
+StatdMySQLBackend.prototype.handleGauges = function(_gauges, time_stamp) {
+  var self = this;
+  
+  var gaugesSize = 0
+  for(var g in _gauges) { gaugesSize++; }
+
+  // If gauges received
+  if(gaugesSize > 0) {
+    console.log("Gauges received !");
+    console.log("Gauges = " + util.inspect(_gauges));
+    var querries = [];
 
     // Open MySQL connection
     var canExecuteQuerries = self.openMySqlConnection();
     if(canExecuteQuerries) {
+      console.log("ok");
+        //////////////////////////////////////////////////////////////////////
+        // Call buildQuerries method on each counterEngine
+        for(var gaugesEngineIndex in self.engines.gauges) {
+          console.log("gaugesEngineIndex = " + gaugesEngineIndex);
+          var gaugesEngine = self.engines.gauges[gaugesEngineIndex];
+
+          // Add current engine querries to querries list
+          var engineQuerries = gaugesEngine.buildQuerries(_gauges, time_stamp);
+          querries = querries.concat(engineQuerries);
+
+          // Insert data into database every 100 query
+          if(querries.length >= 100) {
+            // Execute querries
+            self.executeQuerries(querries);
+            querries = [];
+          }
 
-      //////////////////////////////////////////////////////////////////////
-      // Call buildQuerries method on each counterEngine
-      for(var countersEngineIndex in self.engines.counters) {
-        console.log("countersEngineIndex = " + countersEngineIndex);
-        var countersEngine = self.engines.counters[countersEngineIndex];
-
-        // Add current engine querries to querries list
-        var engineQuerries = countersEngine.buildQuerries(userCounters, time_stamp);
-        querries = querries.concat(engineQuerries);
+        }
 
-        // Insert data into database every 100 query
-        if(querries.length >= 100) {
+        if(querries.length > 0) {
           // Execute querries
           self.executeQuerries(querries);
           querries = [];
         }
-
-      }
-
-      if(querries.length > 0) {
-        // Execute querries
-        self.executeQuerries(querries);
-        querries = [];
-      }
+    } else {
+      console.log("Unable to open db connection !");
     }
 
     // Close MySQL Connection
     self.closeMySqlConnection();
-    
-  return;
-
+  }
 }
-  
 
 
 StatdMySQLBackend.prototype.executeQuerries = function(sqlQuerries) {

+ 8 - 0
tables/gauges_statistics.sql

@@ -0,0 +1,8 @@
+-- Stadard DELIMITER is $$
+
+-- Counters statistics table
+CREATE  TABLE `statsd_db`.`gauges_statistics` (
+    `timestamp` BIGINT NOT NULL ,
+    `name` VARCHAR(255) NOT NULL ,
+    `value` INT(11) NOT NULL ,
+PRIMARY KEY (`name`, `timestamp`) )$$