summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: cd2238b)
raw | patch | inline | side by side (parent: cd2238b)
author | Rachid Zarouali <rachid.zarouali@synolia.com> | |
Thu, 4 Aug 2016 07:10:13 +0000 (09:10 +0200) | ||
committer | Rachid Zarouali <rachid.zarouali@synolia.com> | |
Fri, 5 Aug 2016 12:35:41 +0000 (14:35 +0200) |
.gitignore | patch | blob | history | |
src/collectd.conf.in | patch | blob | history | |
src/collectd.conf.pod | patch | blob | history | |
src/mysql.c | patch | blob | history |
diff --git a/.gitignore b/.gitignore
index d74238957e438cfc15b2494c58bc9c50b4451fb7..b85dc48aadc6eb0952b8104eb877b903b649c1dc 100644 (file)
--- a/.gitignore
+++ b/.gitignore
# lint stuff
*.ln
+#ide stuff
+.vscode
+
# Unit tests
src/daemon/test-suite.log
src/tests/
diff --git a/src/collectd.conf.in b/src/collectd.conf.in
index b678c4254583aa273b2b1f14b4971412edd69d0e..1e8994ee72396bc0bd7bdba18a37a91926aa0156 100644 (file)
--- a/src/collectd.conf.in
+++ b/src/collectd.conf.in
# SlaveStats true
# SlaveNotifications true
# </Database>
+# <Database galera>
+# Alias "galera"
+# Host "localhost"
+# Socket "/var/run/mysql/mysqld.sock"
+# WsrepStats true
+# </Database>
#</Plugin>
#<Plugin netapp>
diff --git a/src/collectd.conf.pod b/src/collectd.conf.pod
index ac06547f2724002ef3d4f004e4395e899631d166..3e11e0637cd57b480301e93a8af863f7c85dc3f9 100644 (file)
--- a/src/collectd.conf.pod
+++ b/src/collectd.conf.pod
SlaveStats true
SlaveNotifications true
</Database>
+
+ <Database galera>
+ Alias "galera"
+ Host "localhost"
+ Socket "/var/run/mysql/mysqld.sock"
+ WsrepStats true
+ </Database>
</Plugin>
A B<Database> block defines one connection to a MySQL database. It accepts a
If enabled, the plugin sends a notification if the replication slave I/O and /
or SQL threads are not running. Defaults to B<false>.
+=item B<WsrepStats> I<true|false>
+
+ Enable the collection of wsrep plugin statistics, used in Master-Master
+ replication setups like in MySQL Galera/Percona XtraDB Cluster.
+ User needs only privileges to execute 'SHOW GLOBAL STATUS'
+
=item B<ConnectTimeout> I<Seconds>
Sets the connect timeout for the MySQL client.
diff --git a/src/mysql.c b/src/mysql.c
index 54236dac188c0aa585a9ecf946e7d3775006afdb..20c9004c8f9382a1b0c46663fec6659d98930251 100644 (file)
--- a/src/mysql.c
+++ b/src/mysql.c
_Bool master_stats;
_Bool slave_stats;
_Bool innodb_stats;
+ _Bool wsrep_stats;
_Bool slave_notif;
_Bool slave_io_running;
status = cf_util_get_boolean (child, &db->slave_notif);
else if (strcasecmp ("InnodbStats", child->key) == 0)
status = cf_util_get_boolean (child, &db->innodb_stats);
+ else if (strcasecmp ("WsrepStats", child->key) == 0)
+ status = cf_util_get_boolean (child, &db->wsrep_stats);
else
{
WARNING ("mysql plugin: Option `%s' not allowed here.", child->key);
return (0);
}
+static int mysql_read_wsrep_stats (mysql_database_t *db, MYSQL *con)
+{
+ MYSQL_RES *res;
+ MYSQL_ROW row;
+
+ const char *query;
+ struct {
+ const char *key;
+ const char *type;
+ int ds_type;
+ } metrics[] = {
+
+ { "wsrep_apply_oooe", "operations", DS_TYPE_DERIVE },
+ { "wsrep_apply_oool", "operations", DS_TYPE_DERIVE },
+ { "wsrep_causal_reads", "operations", DS_TYPE_DERIVE },
+ { "wsrep_commit_oooe", "operations", DS_TYPE_DERIVE },
+ { "wsrep_commit_oool", "operations", DS_TYPE_DERIVE },
+ { "wsrep_flow_control_recv", "operations", DS_TYPE_DERIVE },
+ { "wsrep_flow_control_sent", "operations", DS_TYPE_DERIVE },
+ { "wsrep_flow_control_paused", "operations", DS_TYPE_DERIVE },
+ { "wsrep_local_bf_aborts", "operations", DS_TYPE_DERIVE },
+ { "wsrep_local_cert_failures", "operations", DS_TYPE_DERIVE },
+ { "wsrep_local_commits", "operations", DS_TYPE_DERIVE },
+ { "wsrep_local_replays", "operations", DS_TYPE_DERIVE },
+ { "wsrep_received", "operations", DS_TYPE_DERIVE },
+ { "wsrep_replicated", "operations", DS_TYPE_DERIVE },
+
+ { "wsrep_received_bytes", "total_bytes", DS_TYPE_DERIVE },
+ { "wsrep_replicated_bytes", "total_bytes", DS_TYPE_DERIVE },
+
+ { "wsrep_apply_window", "gauge", DS_TYPE_GAUGE },
+ { "wsrep_commit_window", "gauge", DS_TYPE_GAUGE },
+
+ { "wsrep_cluster_size", "gauge", DS_TYPE_GAUGE },
+ { "wsrep_cert_deps_distance", "gauge", DS_TYPE_GAUGE },
+
+ { "wsrep_local_recv_queue", "queue_length", DS_TYPE_GAUGE },
+ { "wsrep_local_send_queue", "queue_length", DS_TYPE_GAUGE },
+
+ { NULL, NULL, 0}
+
+ };
+
+ query = "SHOW GLOBAL STATUS LIKE 'wsrep_%'";
+
+ res = exec_query (con, query);
+ if (res == NULL)
+ return (-1);
+
+ row = mysql_fetch_row (res);
+ if (row == NULL)
+ {
+ ERROR ("mysql plugin: Failed to get wsrep statistics: "
+ "`%s' did not return any rows.", query);
+ mysql_free_result (res);
+ return (-1);
+ }
+
+ while ((row = mysql_fetch_row (res)))
+ {
+ int i;
+ char *key;
+ unsigned long long val;
+
+ key = row[0];
+ val = atoll (row[1]);
+
+ for (i = 0; metrics[i].key != NULL && strcmp(metrics[i].key, key) != 0; i++)
+ ;
+
+ if (metrics[i].key == NULL)
+ continue;
+
+ switch (metrics[i].ds_type) {
+ case DS_TYPE_GAUGE:
+ gauge_submit(metrics[i].type, key, (gauge_t)val, db);
+ break;
+ case DS_TYPE_DERIVE:
+ derive_submit(metrics[i].type, key, (derive_t)val, db);
+ break;
+ }
+ }
+
+ mysql_free_result(res);
+ return (0);
+} /* mysql_read_wsrep_stats */
+
static int mysql_read (user_data_t *ud)
{
mysql_database_t *db;
if ((db->slave_stats) || (db->slave_notif))
mysql_read_slave_stats (db, con);
+ if (db->wsrep_stats)
+ mysql_read_wsrep_stats (db, con);
+
return (0);
} /* int mysql_read */