redis: adding support for key count per database
[collectd.git] / src / redis.c
index 5b77484..4e04230 100644 (file)
@@ -237,14 +237,10 @@ __attribute__((nonnull(2))) static void
 redis_submit(char *plugin_instance, const char *type, const char *type_instance,
              value_t value) /* {{{ */
 {
-  value_t values[1];
   value_list_t vl = VALUE_LIST_INIT;
 
-  values[0] = value;
-
-  vl.values = values;
+  vl.values = &value;
   vl.values_len = 1;
-  sstrncpy(vl.host, hostname_g, sizeof(vl.host));
   sstrncpy(vl.plugin, "redis", sizeof(vl.plugin));
   if (plugin_instance != NULL)
     sstrncpy(vl.plugin_instance, plugin_instance, sizeof(vl.plugin_instance));
@@ -357,6 +353,41 @@ static int redis_handle_query(redisContext *rh, redis_node_t *rn,
   return 0;
 } /* }}} int redis_handle_query */
 
+static int redis_db_stats(char *node, char const *info_line) /* {{{ */
+{
+  unsigned char db;
+  unsigned char max_db = 16;
+  static char field_name[10];
+  static char db_id[3];
+  char *str;
+  static char buf[MAX_REDIS_VAL_SIZE];
+  value_t val;
+  int i;
+
+  for (db = 0; db < max_db; db++) {
+      sprintf(field_name, "db%d:keys", db);
+
+      str = strstr(info_line, field_name);
+      if (str) {
+                 str += strlen(field_name) + 1; /* also skip the '=' */
+                 for (i = 0; (*str && (isdigit((unsigned char)*str) || *str == '.')); i++, str++)
+                       buf[i] = *str;
+                 buf[i] = '\0';
+
+                 if (parse_value(buf, &val, DS_TYPE_GAUGE) == -1) {
+                         WARNING("redis plugin: Unable to parse field `%s'.", field_name);
+                         return (-1);
+                 }
+
+                 sprintf(db_id, "%d", db);
+                 redis_submit (node, "records", db_id, val);
+         }
+    }
+  return (0);
+
+} /* }}} int redis_db_stats */
+
+
 static int redis_read(void) /* {{{ */
 {
   for (redis_node_t *rn = nodes_head; rn != NULL; rn = rn->next) {
@@ -433,6 +464,8 @@ static int redis_read(void) /* {{{ */
     redis_handle_info(rn->name, rr->str, "total_bytes", "output",
                       "total_net_output_bytes", DS_TYPE_DERIVE);
 
+       redis_db_stats (rn->name, rr->str);
+
     for (redis_query_t *rq = rn->queries; rq != NULL; rq = rq->next)
       redis_handle_query(rh, rn, rq);
 
@@ -455,5 +488,3 @@ void module_register(void) /* {{{ */
    * X elements */
 }
 /* }}} */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */