Added `qcache'-support to the MySQL plugin
authorocto <octo>
Fri, 27 Jan 2006 19:35:59 +0000 (19:35 +0000)
committerocto <octo>
Fri, 27 Jan 2006 19:35:59 +0000 (19:35 +0000)
src/mysql.c

index 222c02a..8400a56 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * collectd - src/mysql.c
- * Copyright (C) 2005  Florian octo Forster
+ * Copyright (C) 2006  Florian octo Forster
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
@@ -48,9 +48,14 @@ static char *db = NULL;
 static char  init_suceeded = 0;
 #endif
 
+/* TODO
+ * understand `Select_*' and possibly do that stuff as well..
+ */
+
 static char *commands_file = "mysql/mysql_commands-%s.rrd";
-static char *handler_file = "mysql/mysql_handler-%s.rrd";
-static char *threads_file = "mysql/mysql_threads.rrd";
+static char *handler_file  = "mysql/mysql_handler-%s.rrd";
+static char *qcache_file   = "mysql/mysql_qcache.rrd";
+static char *threads_file  = "mysql/mysql_threads.rrd";
 static char *traffic_file  = "traffic-mysql.rrd";
 
 static char *commands_ds_def[] =
@@ -67,14 +72,25 @@ static char *handler_ds_def[] =
 };
 static int handler_ds_num = 1;
 
+static char *qcache_ds_def[] =
+{
+       "DS:hits:COUNTER:25:0:U",
+       "DS:inserts:COUNTER:25:0:U",
+       "DS:not_cached:COUNTER:25:0:U",
+       "DS:queries_in_cache:GAUGE:25:0:U",
+       NULL
+};
+static int qcache_ds_num = 4;
+
 static char *threads_ds_def[] =
 {
        "DS:running:GAUGE:25:0:U",
        "DS:connected:GAUGE:25:0:U",
        "DS:cached:GAUGE:25:0:U",
+       "DS:created:COUNTER:25:0:u",
        NULL
 };
-static int threads_ds_num = 3;
+static int threads_ds_num = 4;
 
 static char *traffic_ds_def[] =
 {
@@ -197,6 +213,12 @@ static void traffic_write (char *host, char *inst, char *val)
                        traffic_ds_def, traffic_ds_num);
 }
 
+static void qcache_write (char *host, char *inst, char *val)
+{
+       rrd_update_file (host, qcache_file, val,
+                       qcache_ds_def, qcache_ds_num);
+}
+
 #if MYSQL_HAVE_READ
 static void commands_submit (char *inst, unsigned long long value)
 {
@@ -240,13 +262,39 @@ static void handler_submit (char *inst, unsigned long long value)
        plugin_submit ("mysql_handler", inst, buf);
 }
 
-static void threads_submit (int running, int connected, int cached)
+static void qcache_submit (unsigned long long hits, unsigned long long inserts,
+               unsigned long long not_cached, int queries_in_cache)
+{
+       char buf[BUFSIZE];
+       int  status;
+
+       status = snprintf (buf, BUFSIZE, "%u:%llu:%llu:%llu:%i",
+                       (unsigned int) curtime, hits, inserts, not_cached,
+                       queries_in_cache);
+
+       if (status < 0)
+       {
+               syslog (LOG_ERR, "snprintf failed");
+               return;
+       }
+       else if (status >= BUFSIZE)
+       {
+               syslog (LOG_WARNING, "snprintf was truncated");
+               return;
+       }
+
+       plugin_submit ("mysql_qcache", "-", buf);
+}
+
+static void threads_submit (int running, int connected, int cached,
+               unsigned long long created)
 {
        char buf[BUFSIZE];
        int  status;
 
-       status = snprintf (buf, BUFSIZE, "%u:%i:%i:%i", (unsigned int) curtime,
-                       running, connected, cached);
+       status = snprintf (buf, BUFSIZE, "%u:%i:%i:%i:%llu",
+                       (unsigned int) curtime,
+                       running, connected, cached, created);
 
        if (status < 0)
        {
@@ -294,12 +342,18 @@ static void mysql_read (void)
        int        query_len;
        int        field_num;
 
+       unsigned long long qcache_hits       = 0ULL;
+       unsigned long long qcache_inserts    = 0ULL;
+       unsigned long long qcache_not_cached = 0ULL;
+       int qcache_queries_in_cache = -1;
+
        int threads_running   = -1;
        int threads_connected = -1;
        int threads_cached    = -1;
+       unsigned long long threads_created = 0ULL;
 
-       unsigned long long traffic_incoming = 0LL;
-       unsigned long long traffic_outgoing = 0LL;
+       unsigned long long traffic_incoming = 0ULL;
+       unsigned long long traffic_outgoing = 0ULL;
 
        if (init_suceeded == 0)
                return;
@@ -334,19 +388,33 @@ static void mysql_read (void)
                key = row[0];
                val = atoll (row[1]);
 
-               if (val == 0ULL)
-                       continue;
-
                if (strncmp (key, "Com_", 4) == 0)
                {
+                       if (val == 0ULL)
+                               continue;
+
                        /* Ignore `prepared statements' */
                        if (strncmp (key, "Com_stmt_", 9) != 0)
                                commands_submit (key + 4, val);
                }
                else if (strncmp (key, "Handler_", 8) == 0)
                {
+                       if (val == 0ULL)
+                               continue;
+
                        handler_submit (key + 8, val);
                }
+               else if (strncmp (key, "Qcache_", 7) == 0)
+               {
+                       if (strcmp (key, "Qcache_hits") == 0)
+                               qcache_hits = val;
+                       else if (strcmp (key, "Qcache_inserts") == 0)
+                               qcache_inserts = val;
+                       else if (strcmp (key, "Qcache_not_cached") == 0)
+                               qcache_not_cached = val;
+                       else if (strcmp (key, "Qcache_queries_in_cache") == 0)
+                               qcache_queries_in_cache = (int) val;
+               }
                else if (strncmp (key, "Bytes_", 6) == 0)
                {
                        if (strcmp (key, "Bytes_received") == 0)
@@ -362,11 +430,22 @@ static void mysql_read (void)
                                threads_connected = (int) val;
                        else if (strcmp (key, "Threads_cached") == 0)
                                threads_cached = (int) val;
+                       else if (strcmp (key, "Threads_created") == 0)
+                               threads_created = val;
                }
        }
        mysql_free_result (res); res = NULL;
 
-       threads_submit  (threads_running, threads_connected, threads_cached);
+       if ((qcache_hits != 0ULL)
+                       || (qcache_inserts != 0ULL)
+                       || (qcache_not_cached != 0ULL))
+               qcache_submit (qcache_hits, qcache_inserts, qcache_not_cached,
+                               qcache_queries_in_cache);
+
+       if (threads_created != 0ULL)
+               threads_submit (threads_running, threads_connected,
+                               threads_cached, threads_created);
+
        traffic_submit  (traffic_incoming, traffic_outgoing);
 
        /* mysql_close (con); */
@@ -381,9 +460,10 @@ void module_register (void)
 {
        plugin_register (MODULE_NAME, init, mysql_read, NULL);
        plugin_register ("mysql_commands", NULL, NULL, commands_write);
-       plugin_register ("mysql_handler", NULL, NULL, handler_write);
-       plugin_register ("mysql_threads", NULL, NULL, threads_write);
-       plugin_register ("mysql_traffic", NULL, NULL, traffic_write);
+       plugin_register ("mysql_handler",  NULL, NULL, handler_write);
+       plugin_register ("mysql_qcache",   NULL, NULL, qcache_write);
+       plugin_register ("mysql_threads",  NULL, NULL, threads_write);
+       plugin_register ("mysql_traffic",  NULL, NULL, traffic_write);
        cf_register (MODULE_NAME, config, config_keys, config_keys_num);
 }