redis plugin: [new feature] ability to select database for query
authorskob <skob@me.com>
Mon, 28 May 2018 11:47:48 +0000 (14:47 +0300)
committerPavel Rochnyak <pavel2000@ngs.ru>
Mon, 28 May 2018 11:47:48 +0000 (18:47 +0700)
Closes: #2790

src/collectd.conf.in
src/collectd.conf.pod
src/redis.c

index 662b483..715a186 100644 (file)
 #      Host "redis.example.com"
 #      Port "6379"
 #      Timeout 2000
+#      <Query "LLEN myqueue">
+#        Database 0
+#        Type "queue_length"
+#        Instance "myqueue"
+#      <Query>
 #   </Node>
 #</Plugin>
 
index 7a21ba2..c097a48 100644 (file)
@@ -7276,6 +7276,7 @@ which configures the connection parameters for this node.
         Port "6379"
         Timeout 2000
         <Query "LLEN myqueue">
+          Database 0
           Type "queue_length"
           Instance "myqueue"
         <Query>
@@ -7321,6 +7322,11 @@ than B<Interval> defined globally.
 The B<Query> block identifies a query to execute against the redis server.
 There may be an arbitrary number of queries to execute.
 
+=item B<Database> I<Index>
+
+This index selects the redis database to use for queries. Defaults
+to C<0>.
+
 =item B<Type> I<Collectd type>
 
 Within a query definition, a valid collectd type to use as when submitting
index 2d33e2d..47fa28d 100644 (file)
@@ -36,7 +36,7 @@
 #define REDIS_DEF_PASSWD ""
 #define REDIS_DEF_PORT 6379
 #define REDIS_DEF_TIMEOUT 2000
-#define REDIS_DEF_DB_COUNT 16
+#define REDIS_DEF_DB_COUNT 256
 #define MAX_REDIS_NODE_NAME 64
 #define MAX_REDIS_PASSWD_LENGTH 512
 #define MAX_REDIS_VAL_SIZE 256
@@ -60,6 +60,8 @@ struct redis_query_s {
   char query[MAX_REDIS_QUERY];
   char type[DATA_MAX_NAME_LEN];
   char instance[DATA_MAX_NAME_LEN];
+  int database;
+
   redis_query_t *next;
 };
 
@@ -137,6 +139,8 @@ static redis_query_t *redis_config_query(oconfig_item_t *ci) /* {{{ */
   (void)sstrncpy(rq->instance, rq->query, sizeof(rq->instance));
   replace_special(rq->instance, sizeof(rq->instance));
 
+  rq->database = 0;
+
   for (int i = 0; i < ci->children_num; i++) {
     oconfig_item_t *option = ci->children + i;
 
@@ -145,6 +149,13 @@ static redis_query_t *redis_config_query(oconfig_item_t *ci) /* {{{ */
     } else if (strcasecmp("Instance", option->key) == 0) {
       status =
           cf_util_get_string_buffer(option, rq->instance, sizeof(rq->instance));
+    } else if (strcasecmp("Database", option->key) == 0) {
+      status = cf_util_get_int(option, &rq->database);
+      if (rq->database < 0) {
+        WARNING("redis plugin: The \"Database\" option must be positive "
+                "integer or zero");
+        status = -1;
+      }
     } else {
       WARNING("redis plugin: unknown configuration option: %s", option->key);
       status = -1;
@@ -313,6 +324,12 @@ static int redis_handle_query(redisContext *rh, redis_node_t *rn,
     return -1;
   }
 
+  if ((rr = redisCommand(rh, "SELECT %d", rq->database)) == NULL) {
+    WARNING("redis plugin: unable to switch to database `%d' on node `%s'.",
+            rq->database, rn->name);
+    return -1;
+  }
+
   if ((rr = redisCommand(rh, rq->query)) == NULL) {
     WARNING("redis plugin: unable to carry out query `%s'.", rq->query);
     return -1;