Example #1
0
static int mysql_read_slave_stats (mysql_database_t *db, MYSQL *con)
{
	MYSQL_RES *res;
	MYSQL_ROW  row;

	char *query;
	int   field_num;

	/* WTF? libmysqlclient does not seem to provide any means to
	 * translate a column name to a column index ... :-/ */
	const int READ_MASTER_LOG_POS_IDX   = 6;
	const int SLAVE_IO_RUNNING_IDX      = 10;
	const int SLAVE_SQL_RUNNING_IDX     = 11;
	const int EXEC_MASTER_LOG_POS_IDX   = 21;
	const int SECONDS_BEHIND_MASTER_IDX = 32;

	query = "SHOW SLAVE STATUS";

	res = exec_query (con, query);
	if (res == NULL)
		return (-1);

	row = mysql_fetch_row (res);
	if (row == NULL)
	{
		ERROR ("mysql plugin: Failed to get slave statistics: "
				"`%s' did not return any rows.", query);
		return (-1);
	}

	field_num = mysql_num_fields (res);
	if (field_num < 33)
	{
		ERROR ("mysql plugin: Failed to get slave statistics: "
				"`%s' returned less than 33 columns.", query);
		return (-1);
	}

	if (db->slave_stats)
	{
		unsigned long long counter;
		double gauge;

		counter = atoll (row[READ_MASTER_LOG_POS_IDX]);
		counter_submit ("mysql_log_position", "slave-read", counter, db);

		counter = atoll (row[EXEC_MASTER_LOG_POS_IDX]);
		counter_submit ("mysql_log_position", "slave-exec", counter, db);

		if (row[SECONDS_BEHIND_MASTER_IDX] != NULL)
		{
			gauge = atof (row[SECONDS_BEHIND_MASTER_IDX]);
			gauge_submit ("time_offset", NULL, gauge, db);
		}
	}

	if (db->slave_notif)
	{
		notification_t n = { 0, time (NULL), "", "",
			"mysql", "", "time_offset", "", NULL };

		char *io, *sql;

		io  = row[SLAVE_IO_RUNNING_IDX];
		sql = row[SLAVE_SQL_RUNNING_IDX];

		set_host (db, n.host, sizeof (n.host));
		set_plugin_instance (db,
				n.plugin_instance, sizeof (n.plugin_instance));

		if (((io == NULL) || (strcasecmp (io, "yes") != 0))
				&& (db->slave_io_running))
		{
			n.severity = NOTIF_WARNING;
			ssnprintf (n.message, sizeof (n.message),
					"slave I/O thread not started or not connected to master");
			plugin_dispatch_notification (&n);
			db->slave_io_running = 0;
		}
		else if (((io != NULL) && (strcasecmp (io, "yes") == 0))
				&& (! db->slave_io_running))
		{
			n.severity = NOTIF_OKAY;
			ssnprintf (n.message, sizeof (n.message),
					"slave I/O thread started and connected to master");
			plugin_dispatch_notification (&n);
			db->slave_io_running = 1;
		}

		if (((sql == NULL) || (strcasecmp (sql, "yes") != 0))
				&& (db->slave_sql_running))
		{
			n.severity = NOTIF_WARNING;
			ssnprintf (n.message, sizeof (n.message),
					"slave SQL thread not started");
			plugin_dispatch_notification (&n);
			db->slave_sql_running = 0;
		}
		else if (((sql != NULL) && (strcasecmp (sql, "yes") == 0))
				&& (! db->slave_sql_running))
		{
			n.severity = NOTIF_OKAY;
			ssnprintf (n.message, sizeof (n.message),
					"slave SQL thread started");
			plugin_dispatch_notification (&n);
			db->slave_sql_running = 0;
		}
	}

	row = mysql_fetch_row (res);
	if (row != NULL)
		WARNING ("mysql plugin: `%s' returned more than one row - "
				"ignoring further results.", query);

	mysql_free_result (res);

	return (0);
} /* mysql_read_slave_stats */
Example #2
0
static int mysql_read (user_data_t *ud)
{
	mysql_database_t *db;
	MYSQL     *con;
	MYSQL_RES *res;
	MYSQL_ROW  row;
	char      *query;
	int        field_num;

	unsigned long long qcache_hits          = 0ULL;
	unsigned long long qcache_inserts       = 0ULL;
	unsigned long long qcache_not_cached    = 0ULL;
	unsigned long long qcache_lowmem_prunes = 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 = 0ULL;
	unsigned long long traffic_outgoing = 0ULL;

	if ((ud == NULL) || (ud->data == NULL))
	{
		ERROR ("mysql plugin: mysql_database_read: Invalid user data.");
		return (-1);
	}

	db = (mysql_database_t *) ud->data;

	/* An error message will have been printed in this case */
	if ((con = getconnection (db)) == NULL)
		return (-1);

	query = "SHOW STATUS";
	if (mysql_get_server_version (con) >= 50002)
		query = "SHOW GLOBAL STATUS";

	res = exec_query (con, query);
	if (res == NULL)
		return (-1);

	field_num = mysql_num_fields (res);
	while ((row = mysql_fetch_row (res)))
	{
		char *key;
		unsigned long long val;

		key = row[0];
		val = atoll (row[1]);

		if (strncmp (key, "Com_", 4) == 0)
		{
			if (val == 0ULL)
				continue;

			/* Ignore `prepared statements' */
			if (strncmp (key, "Com_stmt_", 9) != 0)
				counter_submit ("mysql_commands", key + 4, val, db);
		}
		else if (strncmp (key, "Handler_", 8) == 0)
		{
			if (val == 0ULL)
				continue;

			counter_submit ("mysql_handler", key + 8, val, db);
		}
		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_lowmem_prunes") == 0)
				qcache_lowmem_prunes = 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)
				traffic_incoming += val;
			else if (strcmp (key, "Bytes_sent") == 0)
				traffic_outgoing += val;
		}
		else if (strncmp (key, "Threads_", 8) == 0)
		{
			if (strcmp (key, "Threads_running") == 0)
				threads_running = (int) val;
			else if (strcmp (key, "Threads_connected") == 0)
				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;

	if ((qcache_hits != 0ULL)
			|| (qcache_inserts != 0ULL)
			|| (qcache_not_cached != 0ULL)
			|| (qcache_lowmem_prunes != 0ULL))
		qcache_submit (qcache_hits, qcache_inserts, qcache_not_cached,
			       qcache_lowmem_prunes, qcache_queries_in_cache, db);

	if (threads_created != 0ULL)
		threads_submit (threads_running, threads_connected,
				threads_cached, threads_created, db);

	traffic_submit  (traffic_incoming, traffic_outgoing, db);

	if (db->master_stats)
		mysql_read_master_stats (db, con);

	if ((db->slave_stats) || (db->slave_notif))
		mysql_read_slave_stats (db, con);

	return (0);
} /* int mysql_read */
Example #3
0
static void
test0(const char *type, ...)
{
	char buf[512];
	CONV_RESULT cr;
	int rc;
	TDS_INT result_type;
	int done_flags;
	va_list ap;
	struct {
		const char *value;
		const char *result;
	} data[10];
	int num_data = 0, i_row;

	sprintf(buf, "CREATE TABLE #tmp(a %s)", type);
	exec_query(buf);

        va_start(ap, type);
	for (;;) {
		const char * value = va_arg(ap, const char *);
		const char * result;
		if (!value)
			break;
		result = va_arg(ap, const char *);
		if (!result)
			result = value;
		data[num_data].value = value;
		data[num_data].result = result;
		sprintf(buf, "INSERT INTO #tmp VALUES(CONVERT(%s,'%s'))", type, value);
		exec_query(buf);
		++num_data;
	}
        va_end(ap);

	assert(num_data > 0);

	/* execute it */
	rc = tds_submit_query(tds, "SELECT * FROM #tmp");
	if (rc != TDS_SUCCEED) {
		fprintf(stderr, "tds_submit_query() failed\n");
		exit(1);
	}

	if (tds_process_tokens(tds, &result_type, NULL, TDS_TOKEN_RESULTS) != TDS_SUCCEED) {
		fprintf(stderr, "tds_process_tokens() failed\n");
		exit(1);
	}

	if (result_type != TDS_ROWFMT_RESULT) {
		fprintf(stderr, "expected row fmt() failed\n");
		exit(1);
	}

	if (tds_process_tokens(tds, &result_type, NULL, TDS_TOKEN_RESULTS) != TDS_SUCCEED) {
		fprintf(stderr, "tds_process_tokens() failed\n");
		exit(1);
	}

	if (result_type != TDS_ROW_RESULT) {
		fprintf(stderr, "expected row result() failed\n");
		exit(1);
	}

	i_row = 0;
	while ((rc = tds_process_tokens(tds, &result_type, NULL, TDS_STOPAT_ROWFMT|TDS_RETURN_DONE|TDS_RETURN_ROW|TDS_RETURN_COMPUTE)) == TDS_SUCCEED && (result_type == TDS_ROW_RESULT || result_type == TDS_COMPUTE_RESULT)) {

		TDSCOLUMN *curcol = tds->current_results->columns[0];
		TDS_CHAR *src = (TDS_CHAR *) curcol->column_data;
		int conv_type = tds_get_conversion_type(curcol->column_type, curcol->column_size);

		assert(i_row < num_data);

		if (is_blob_type(curcol->column_type)) {
			TDSBLOB *blob = (TDSBLOB *) src;

			src = blob->textvalue;
		}

		if (tds_convert(test_context, conv_type, src, curcol->column_cur_size, SYBVARCHAR, &cr) < 0) {
			fprintf(stderr, "Error converting\n");
			g_result = 1;
		} else {
			if (strcmp(data[i_row].result, cr.c) != 0) {
				fprintf(stderr, "Failed! Is \n%s\nShould be\n%s\n", cr.c, data[i_row].result);
				g_result = 1;
			}
			free(cr.c);
		}
		++i_row;
	}

	if (rc != TDS_NO_MORE_RESULTS && rc != TDS_SUCCEED) {
		fprintf(stderr, "tds_process_tokens() unexpected return\n");
		exit(1);
	}

	while ((rc = tds_process_tokens(tds, &result_type, &done_flags, TDS_TOKEN_RESULTS)) == TDS_SUCCEED) {
		switch (result_type) {
		case TDS_NO_MORE_RESULTS:
			return;

		case TDS_DONE_RESULT:
		case TDS_DONEPROC_RESULT:
		case TDS_DONEINPROC_RESULT:
			if (!(done_flags & TDS_DONE_ERROR))
				break;

		default:
			fprintf(stderr, "tds_process_tokens() unexpected result_type\n");
			exit(1);
			break;
		}
	}

	exec_query("DROP TABLE #tmp");
}
Example #4
0
int main(int argc, char *argv[])
{
	plan(8*6 + 4); /* exec_query = 6 TAP tests */

	knot_mm_t mm;
	mm_ctx_mempool(&mm, MM_DEFAULT_BLKSIZE);

	/* Create processing context. */
	knot_layer_t proc;
	memset(&proc, 0, sizeof(knot_layer_t));
	proc.mm = &mm;

	/* Create fake server environment. */
	server_t server;
	int ret = create_fake_server(&server, proc.mm);
	ok(ret == KNOT_EOK, "ns: fake server initialization");

	zone_t *zone = knot_zonedb_find(server.zone_db, ROOT_DNAME);

	/* Prepare. */
	knot_pkt_t *query = knot_pkt_new(NULL, KNOT_WIRE_MAX_PKTSIZE, proc.mm);

	/* Create query processing parameter. */
	struct sockaddr_storage ss;
	memset(&ss, 0, sizeof(struct sockaddr_storage));
	sockaddr_set(&ss, AF_INET, "127.0.0.1", 53);
	struct process_query_param param = {0};
	param.remote = &ss;
	param.server = &server;

	/* Query processor (CH zone) */
	knot_layer_begin(&proc, NS_PROC_QUERY, &param);
	knot_pkt_clear(query);
	knot_pkt_put_question(query, IDSERVER_DNAME, KNOT_CLASS_CH, KNOT_RRTYPE_TXT);
	exec_query(&proc, "CH TXT", query, KNOT_RCODE_NOERROR);

	/* Query processor (valid input). */
	knot_layer_reset(&proc);
	knot_pkt_clear(query);
	knot_pkt_put_question(query, ROOT_DNAME, KNOT_CLASS_IN, KNOT_RRTYPE_SOA);
	exec_query(&proc, "IN/root", query, KNOT_RCODE_NOERROR);

	/* Query processor (-1 bytes, not enough data). */
	knot_layer_reset(&proc);
	query->size -= 1;
	exec_query(&proc, "IN/few-data", query, KNOT_RCODE_FORMERR);
	query->size += 1;

	/* Query processor (+1 bytes trailing). */
	knot_layer_reset(&proc);
	query->wire[query->size] = '\1'; /* Initialize the "garbage" value. */
	query->size += 1;
	exec_query(&proc, "IN/trail-garbage", query, KNOT_RCODE_FORMERR);
	query->size -= 1;

	/* Forge NOTIFY query from SOA query. */
	knot_layer_reset(&proc);
	knot_wire_set_opcode(query->wire, KNOT_OPCODE_NOTIFY);
	exec_query(&proc, "IN/notify", query, KNOT_RCODE_NOTAUTH);

	/* Forge AXFR query. */
	knot_layer_reset(&proc);
	knot_pkt_clear(query);
	knot_pkt_put_question(query, ROOT_DNAME, KNOT_CLASS_IN, KNOT_RRTYPE_AXFR);
	exec_query(&proc, "IN/axfr", query, KNOT_RCODE_NOTAUTH);

	/* Forge IXFR query (badly formed, no SOA in AUTHORITY section). */
	knot_layer_reset(&proc);
	knot_pkt_clear(query);
	knot_pkt_put_question(query, ROOT_DNAME, KNOT_CLASS_IN, KNOT_RRTYPE_IXFR);
	exec_query(&proc, "IN/ixfr-formerr", query, KNOT_RCODE_FORMERR);

	/* Forge IXFR query (well formed). */
	knot_layer_reset(&proc);
	knot_pkt_clear(query);
	knot_pkt_put_question(query, ROOT_DNAME, KNOT_CLASS_IN, KNOT_RRTYPE_IXFR);
	/* Append SOA RR. */
	knot_rrset_t soa_rr = node_rrset(zone->contents->apex, KNOT_RRTYPE_SOA);
	knot_pkt_begin(query, KNOT_AUTHORITY);
	knot_pkt_put(query, KNOT_COMPR_HINT_NONE, &soa_rr, 0);
	exec_query(&proc, "IN/ixfr", query, KNOT_RCODE_NOTAUTH);

	/* \note Tests below are not possible without proper zone and zone data. */
	/* #189 Process UPDATE query. */
	/* #189 Process AXFR client. */
	/* #189 Process IXFR client. */

	/* Query processor (smaller than DNS header, ignore). */
	knot_layer_reset(&proc);
	knot_pkt_clear(query);
	knot_pkt_put_question(query, ROOT_DNAME, KNOT_CLASS_IN, KNOT_RRTYPE_SOA);
	size_t orig_query_size = query->size;
	query->size = KNOT_WIRE_HEADER_SIZE - 1;
	int state = knot_layer_consume(&proc, query);
	ok(state == KNOT_STATE_NOOP, "ns: IN/less-than-header query ignored");
	query->size = orig_query_size;

	/* Query processor (response, ignore). */
	knot_layer_reset(&proc);
	knot_wire_set_qr(query->wire);
	state = knot_layer_consume(&proc, query);
	ok(state == KNOT_STATE_NOOP, "ns: IN/less-than-header query ignored");

	/* Finish. */
	state = knot_layer_finish(&proc);
	ok(state == KNOT_STATE_NOOP, "ns: processing end" );

	/* Cleanup. */
	mp_delete((struct mempool *)mm.ctx);
	server_deinit(&server);
	conf_free(conf());

	return 0;
}
Example #5
0
static int mysql_read (user_data_t *ud)
{
	mysql_database_t *db;
	MYSQL     *con;
	MYSQL_RES *res;
	MYSQL_ROW  row;
	char      *query;

	derive_t qcache_hits          = 0;
	derive_t qcache_inserts       = 0;
	derive_t qcache_not_cached    = 0;
	derive_t qcache_lowmem_prunes = 0;
	gauge_t qcache_queries_in_cache = NAN;

	gauge_t threads_running   = NAN;
	gauge_t threads_connected = NAN;
	gauge_t threads_cached    = NAN;
	derive_t threads_created = 0;

	unsigned long long traffic_incoming = 0ULL;
	unsigned long long traffic_outgoing = 0ULL;
    unsigned long mysql_version = 0ULL;

	if ((ud == NULL) || (ud->data == NULL))
	{
		ERROR ("mysql plugin: mysql_database_read: Invalid user data.");
		return (-1);
	}

	db = (mysql_database_t *) ud->data;

	/* An error message will have been printed in this case */
	if ((con = getconnection (db)) == NULL)
		return (-1);

  mysql_version = mysql_get_server_version(con);

	query = "SHOW STATUS";
	if (mysql_version >= 50002)
		query = "SHOW GLOBAL STATUS";

	res = exec_query (con, query);
	if (res == NULL)
		return (-1);

	while ((row = mysql_fetch_row (res)))
	{
		char *key;
		unsigned long long val;

		key = row[0];
		val = atoll (row[1]);

		if (strncmp (key, "Com_", 
			          strlen ("Com_")) == 0)
		{
			if (val == 0ULL)
				continue;

			/* Ignore `prepared statements' */
			if (strncmp (key, "Com_stmt_", strlen ("Com_stmt_")) != 0)
				counter_submit ("mysql_commands", 
						key + strlen ("Com_"), 
						val, db);
		}
		else if (strncmp (key, "Handler_", 
				        strlen ("Handler_")) == 0)
		{
			if (val == 0ULL)
				continue;

			counter_submit ("mysql_handler", 
					key + strlen ("Handler_"), 
					val, db);
		}
		else if (strncmp (key, "Qcache_",
       				        strlen ("Qcache_")) == 0)
		{
			if (strcmp (key, "Qcache_hits") == 0)
				qcache_hits = (derive_t) val;
			else if (strcmp (key, "Qcache_inserts") == 0)
				qcache_inserts = (derive_t) val;
			else if (strcmp (key, "Qcache_not_cached") == 0)
				qcache_not_cached = (derive_t) val;
			else if (strcmp (key, "Qcache_lowmem_prunes") == 0)
				qcache_lowmem_prunes = (derive_t) val;
			else if (strcmp (key, "Qcache_queries_in_cache") == 0)
				qcache_queries_in_cache = (gauge_t) val;
		}
		else if (strncmp (key, "Bytes_", 
				        strlen ("Bytes_")) == 0)
		{
			if (strcmp (key, "Bytes_received") == 0)
				traffic_incoming += val;
			else if (strcmp (key, "Bytes_sent") == 0)
				traffic_outgoing += val;
		}
		else if (strncmp (key, "Threads_", 
       				        strlen ("Threads_")) == 0)
		{
			if (strcmp (key, "Threads_running") == 0)
				threads_running = (gauge_t) val;
			else if (strcmp (key, "Threads_connected") == 0)
				threads_connected = (gauge_t) val;
			else if (strcmp (key, "Threads_cached") == 0)
				threads_cached = (gauge_t) val;
			else if (strcmp (key, "Threads_created") == 0)
				threads_created = (derive_t) val;
		}
		else if (strncmp (key, "Table_locks_",
					strlen ("Table_locks_")) == 0)
		{
			counter_submit ("mysql_locks",
					key + strlen ("Table_locks_"),
					val, db);
		}
		else if (db->innodb_stats && strncmp (key, "Innodb_", strlen ("Innodb_")) == 0)
		{
			/* buffer pool */
			if (strcmp (key, "Innodb_buffer_pool_pages_data") == 0)
				gauge_submit ("mysql_bpool_pages", "data", val, db);
			else if (strcmp (key, "Innodb_buffer_pool_pages_dirty") == 0)
				gauge_submit ("mysql_bpool_pages", "dirty", val, db);
			else if (strcmp (key, "Innodb_buffer_pool_pages_flushed") == 0)
				counter_submit ("mysql_bpool_pages", "flushed", val, db);
			else if (strcmp (key, "Innodb_buffer_pool_pages_free") == 0)
				gauge_submit ("mysql_bpool_pages", "free", val, db);
			else if (strcmp (key, "Innodb_buffer_pool_pages_misc") == 0)
				gauge_submit ("mysql_bpool_pages", "misc", val, db);
			else if (strcmp (key, "Innodb_buffer_pool_pages_total") == 0)
				gauge_submit ("mysql_bpool_pages", "total", val, db);
			else if (strcmp (key, "Innodb_buffer_pool_read_ahead_rnd") == 0)
				counter_submit ("mysql_bpool_counters", "read_ahead_rnd", val, db);
			else if (strcmp (key, "Innodb_buffer_pool_read_ahead") == 0)
				counter_submit ("mysql_bpool_counters", "read_ahead", val, db);
			else if (strcmp (key, "Innodb_buffer_pool_read_ahead_evicted") == 0)
				counter_submit ("mysql_bpool_counters", "read_ahead_evicted", val, db);
			else if (strcmp (key, "Innodb_buffer_pool_read_requests") == 0)
				counter_submit ("mysql_bpool_counters", "read_requests", val, db);
			else if (strcmp (key, "Innodb_buffer_pool_reads") == 0)
				counter_submit ("mysql_bpool_counters", "reads", val, db);
			else if (strcmp (key, "Innodb_buffer_pool_write_requests") == 0)
				counter_submit ("mysql_bpool_counters", "write_requests", val, db);
			else if (strcmp (key, "Innodb_buffer_pool_bytes_data") == 0)
				gauge_submit ("mysql_bpool_bytes", "data", val, db);
			else if (strcmp (key, "Innodb_buffer_pool_bytes_dirty") == 0)
				gauge_submit ("mysql_bpool_bytes", "dirty", val, db);

			/* data */
			if (strcmp (key, "Innodb_data_fsyncs") == 0)
				counter_submit ("mysql_innodb_data", "fsyncs", val, db);
			else if (strcmp (key, "Innodb_data_read") == 0)
				counter_submit ("mysql_innodb_data", "read", val, db);
			else if (strcmp (key, "Innodb_data_reads") == 0)
				counter_submit ("mysql_innodb_data", "reads", val, db);
			else if (strcmp (key, "Innodb_data_writes") == 0)
				counter_submit ("mysql_innodb_data", "writes", val, db);
			else if (strcmp (key, "Innodb_data_written") == 0)
				counter_submit ("mysql_innodb_data", "written", val, db);

			/* double write */
			else if (strcmp (key, "Innodb_dblwr_writes") == 0)
				counter_submit ("mysql_innodb_dblwr", "writes", val, db);
			else if (strcmp (key, "Innodb_dblwr_pages_written") == 0)
				counter_submit ("mysql_innodb_dblwr", "written", val, db);

			/* log */
			else if (strcmp (key, "Innodb_log_waits") == 0)
				counter_submit ("mysql_innodb_log", "waits", val, db);
			else if (strcmp (key, "Innodb_log_write_requests") == 0)
				counter_submit ("mysql_innodb_log", "write_requests", val, db);
			else if (strcmp (key, "Innodb_log_writes") == 0)
				counter_submit ("mysql_innodb_log", "writes", val, db);
			else if (strcmp (key, "Innodb_os_log_fsyncs") == 0)
				counter_submit ("mysql_innodb_log", "fsyncs", val, db);
			else if (strcmp (key, "Innodb_os_log_written") == 0)
				counter_submit ("mysql_innodb_log", "written", val, db);

			/* pages */
			else if (strcmp (key, "Innodb_pages_created") == 0)
				counter_submit ("mysql_innodb_pages", "created", val, db);
			else if (strcmp (key, "Innodb_pages_read") == 0)
				counter_submit ("mysql_innodb_pages", "read", val, db);
			else if (strcmp (key, "Innodb_pages_written") == 0)
				counter_submit ("mysql_innodb_pages", "written", val, db);

			/* row lock */
			else if (strcmp (key, "Innodb_row_lock_time") == 0)
				counter_submit ("mysql_innodb_row_lock", "time", val, db);
			else if (strcmp (key, "Innodb_row_lock_waits") == 0)
				counter_submit ("mysql_innodb_row_lock", "waits", val, db);

			/* rows */
			else if (strcmp (key, "Innodb_rows_deleted") == 0)
				counter_submit ("mysql_innodb_rows", "deleted", val, db);
			else if (strcmp (key, "Innodb_rows_inserted") == 0)
				counter_submit ("mysql_innodb_rows", "inserted", val, db);
			else if (strcmp (key, "Innodb_rows_read") == 0)
				counter_submit ("mysql_innodb_rows", "read", val, db);
			else if (strcmp (key, "Innodb_rows_updated") == 0)
				counter_submit ("mysql_innodb_rows", "updated", val, db);
		}
		else if (strncmp (key, "Select_", strlen ("Select_")) == 0)
		{
			counter_submit ("mysql_select", key + strlen ("Select_"),
					val, db);
		}
		else if (strncmp (key, "Sort_", strlen ("Sort_")) == 0)
		{
			counter_submit ("mysql_sort", key + strlen ("Sort_"),
					val, db);
		}
	}
	mysql_free_result (res); res = NULL;

	if ((qcache_hits != 0)
			|| (qcache_inserts != 0)
			|| (qcache_not_cached != 0)
			|| (qcache_lowmem_prunes != 0))
	{
		derive_submit ("cache_result", "qcache-hits",
				qcache_hits, db);
		derive_submit ("cache_result", "qcache-inserts",
				qcache_inserts, db);
		derive_submit ("cache_result", "qcache-not_cached",
				qcache_not_cached, db);
		derive_submit ("cache_result", "qcache-prunes",
				qcache_lowmem_prunes, db);

		gauge_submit ("cache_size", "qcache",
				qcache_queries_in_cache, db);
	}

	if (threads_created != 0)
	{
		gauge_submit ("threads", "running",
				threads_running, db);
		gauge_submit ("threads", "connected",
				threads_connected, db);
		gauge_submit ("threads", "cached",
				threads_cached, db);

		derive_submit ("total_threads", "created",
				threads_created, db);
	}

	traffic_submit  (traffic_incoming, traffic_outgoing, db);

	if (mysql_version >= 50600 && db->innodb_stats)
        mysql_read_innodb_stats (db, con);

	if (db->master_stats)
		mysql_read_master_stats (db, con);

	if ((db->slave_stats) || (db->slave_notif))
		mysql_read_slave_stats (db, con);

	return (0);
} /* int mysql_read */
Example #6
0
static int mysql_read_innodb_stats (mysql_database_t *db, MYSQL *con)
{
	MYSQL_RES *res;
	MYSQL_ROW  row;

	char *query;
    struct {
        char *key;
        char *type;
        int ds_type;
    } metrics[] = {
        { "metadata_mem_pool_size",         "bytes",        DS_TYPE_GAUGE },
        { "lock_deadlocks",                 "mysql_locks",  DS_TYPE_DERIVE },
        { "lock_timeouts",                  "mysql_locks",  DS_TYPE_DERIVE },
        { "lock_row_lock_current_waits",    "mysql_locks",  DS_TYPE_DERIVE },
        { "buffer_pool_size",               "bytes",        DS_TYPE_GAUGE },

        { "buffer_pool_reads",              "operations",   DS_TYPE_DERIVE },
        { "buffer_pool_read_requests",      "operations",   DS_TYPE_DERIVE },
        { "buffer_pool_write_requests",     "operations",   DS_TYPE_DERIVE },
        { "buffer_pool_wait_free",          "operations",   DS_TYPE_DERIVE },
        { "buffer_pool_read_ahead",         "operations",   DS_TYPE_DERIVE },
        { "buffer_pool_read_ahead_evicted", "operations",   DS_TYPE_DERIVE },

        { "buffer_pool_pages_total",        "gauge",        DS_TYPE_GAUGE },
        { "buffer_pool_pages_misc",         "gauge",        DS_TYPE_GAUGE },
        { "buffer_pool_pages_data",         "gauge",        DS_TYPE_GAUGE },
        { "buffer_pool_bytes_data",         "gauge",        DS_TYPE_GAUGE },
        { "buffer_pool_pages_dirty",        "gauge",        DS_TYPE_GAUGE },
        { "buffer_pool_bytes_dirty",        "gauge",        DS_TYPE_GAUGE },
        { "buffer_pool_pages_free",         "gauge",        DS_TYPE_GAUGE },

        { "buffer_pages_created",           "operations",   DS_TYPE_DERIVE },
        { "buffer_pages_written",           "operations",   DS_TYPE_DERIVE },
        { "buffer_pages_read",              "operations",   DS_TYPE_DERIVE },
        { "buffer_data_reads",              "operations",   DS_TYPE_DERIVE },
        { "buffer_data_written",            "operations",   DS_TYPE_DERIVE },

        { "os_data_reads",                  "operations",   DS_TYPE_DERIVE },
        { "os_data_writes",                 "operations",   DS_TYPE_DERIVE },
        { "os_data_fsyncs",                 "operations",   DS_TYPE_DERIVE },
        { "os_log_bytes_written",           "operations",   DS_TYPE_DERIVE },
        { "os_log_fsyncs",                  "operations",   DS_TYPE_DERIVE },
        { "os_log_pending_fsyncs",          "operations",   DS_TYPE_DERIVE },
        { "os_log_pending_writes",          "operations",   DS_TYPE_DERIVE },

        { "trx_rseg_history_len",           "gauge",        DS_TYPE_GAUGE },

        { "log_waits",                      "operations",   DS_TYPE_DERIVE },
        { "log_write_requests",             "operations",   DS_TYPE_DERIVE },
        { "log_writes",                     "operations",   DS_TYPE_DERIVE },
        { "adaptive_hash_searches",         "operations",   DS_TYPE_DERIVE },

        { "file_num_open_files",            "gauge",        DS_TYPE_GAUGE },

        { "ibuf_merges_insert",             "operations",   DS_TYPE_DERIVE },
        { "ibuf_merges_delete_mark",        "operations",   DS_TYPE_DERIVE },
        { "ibuf_merges_delete",             "operations",   DS_TYPE_DERIVE },
        { "ibuf_merges_discard_insert",     "operations",   DS_TYPE_DERIVE },
        { "ibuf_merges_discard_delete_mark","operations",   DS_TYPE_DERIVE },
        { "ibuf_merges_discard_delete",     "operations",   DS_TYPE_DERIVE },
        { "ibuf_merges_discard_merges",     "operations",   DS_TYPE_DERIVE },
        { "ibuf_size",                      "bytes",        DS_TYPE_GAUGE },

        { "innodb_activity_count",          "gauge",        DS_TYPE_GAUGE },
        { "innodb_dblwr_writes",            "operations",   DS_TYPE_DERIVE },
        { "innodb_dblwr_pages_written",     "operations",   DS_TYPE_DERIVE },
        { "innodb_dblwr_page_size",         "gauge",        DS_TYPE_GAUGE },

        { "innodb_rwlock_s_spin_waits",     "operations",   DS_TYPE_DERIVE },
        { "innodb_rwlock_x_spin_waits",     "operations",   DS_TYPE_DERIVE },
        { "innodb_rwlock_s_spin_rounds",    "operations",   DS_TYPE_DERIVE },
        { "innodb_rwlock_x_spin_rounds",    "operations",   DS_TYPE_DERIVE },
        { "innodb_rwlock_s_os_waits",       "operations",   DS_TYPE_DERIVE },
        { "innodb_rwlock_x_os_waits",       "operations",   DS_TYPE_DERIVE },

        { "dml_reads",                      "operations",   DS_TYPE_DERIVE },
        { "dml_inserts",                    "operations",   DS_TYPE_DERIVE },
        { "dml_deletes",                    "operations",   DS_TYPE_DERIVE },
        { "dml_updates",                    "operations",   DS_TYPE_DERIVE },

        { NULL,                     NULL,           0}
    };

	query = "SELECT name, count, type FROM information_schema.innodb_metrics WHERE status = 'enabled'";

	res = exec_query (con, query);
	if (res == NULL)
		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_COUNTER:
            counter_submit(metrics[i].type, key, (counter_t)val, db);
            break;
        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);
}
Example #7
0
static void test_select( IWbemServices *services )
{
    static const WCHAR emptyW[] = {0};
    static const WCHAR sqlW[] = {'S','Q','L',0};
    static const WCHAR query1[] =
    {   'S','E','L','E','C','T',' ','H','O','T','F','I','X','I','D',' ','F','R','O','M',' ',
        'W','i','n','3','2','_','Q','u','i','c','k','F','i','x','E','n','g','i','n','e','e','r','i','n','g',0
    };
    static const WCHAR query2[] =
    {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_','B','I','O','S',0};
    static const WCHAR query3[] =
    {   'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
        'L','o','g','i','c','a','l','D','i','s','k',' ','W','H','E','R','E',' ',
        '\"','N','T','F','S','\"',' ','=',' ','F','i','l','e','S','y','s','t','e','m',0
    };
    static const WCHAR query4[] =
    {'S','E','L','E','C','T',' ','a',' ','F','R','O','M',' ','b',0};
    static const WCHAR query5[] =
    {'S','E','L','E','C','T',' ','a',' ','F','R','O','M',' ','W','i','n','3','2','_','B','i','o','s',0};
    static const WCHAR query6[] =
    {   'S','E','L','E','C','T',' ','D','e','s','c','r','i','p','t','i','o','n',' ','F','R','O','M',' ',
        'W','i','n','3','2','_','B','i','o','s',0
    };
    static const WCHAR query7[] =
    {   'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
        'P','r','o','c','e','s','s',' ','W','H','E','R','E',' ','C','a','p','t','i','o','n',' ',
        'L','I','K','E',' ','\'','%','%','R','E','G','E','D','I','T','%','\'',0
    };
    static const WCHAR query8[] =
    {   'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
        'D','i','s','k','D','r','i','v','e',' ','W','H','E','R','E',' ','D','e','v','i','c','e','I','D','=',
        '\"','\\','\\','\\','\\','.','\\','\\','P','H','Y','S','I','C','A','L','D','R','I','V','E','0','\"',0
    };
    static const WCHAR query9[] =
    {'S','E','L','E','C','T','\n','a','\r','F','R','O','M','\t','b',0};
    static const WCHAR query10[] =
    {   'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','W','i','n','3','2','_',
        'P','r','o','c','e','s','s',' ','W','H','E','R','E',' ','C','a','p','t','i','o','n',' ',
        'L','I','K','E',' ','"','%','f','i','r','e','f','o','x','.','e','x','e','"',0
    };
    static const WCHAR query11[] =
    {   'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
        'W','i','n','3','2','_','V','i','d','e','o','C','o','n','t','r','o','l','l','e','r',' ','w','h','e','r','e',' ',
        'a','v','a','i','l','a','b','i','l','i','t','y',' ','=',' ','\'','3','\'',0
    };
    static const WCHAR *test[] = { query1, query2, query3, query4, query5, query6, query7, query8, query9, query10,
                                   query11
                                 };
    HRESULT hr;
    IEnumWbemClassObject *result;
    BSTR wql = SysAllocString( wqlW );
    BSTR sql = SysAllocString( sqlW );
    BSTR query = SysAllocString( query1 );
    UINT i;

    hr = IWbemServices_ExecQuery( services, NULL, NULL, 0, NULL, &result );
    ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );

    hr = IWbemServices_ExecQuery( services, NULL, query, 0, NULL, &result );
    ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );

    hr = IWbemServices_ExecQuery( services, wql, NULL, 0, NULL, &result );
    ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );

    hr = IWbemServices_ExecQuery( services, sql, query, 0, NULL, &result );
    ok( hr == WBEM_E_INVALID_QUERY_TYPE, "query failed %08x\n", hr );

    hr = IWbemServices_ExecQuery( services, sql, NULL, 0, NULL, &result );
    ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );

    SysFreeString( query );
    query = SysAllocString( emptyW );
    hr = IWbemServices_ExecQuery( services, wql, query, 0, NULL, &result );
    ok( hr == WBEM_E_INVALID_PARAMETER, "query failed %08x\n", hr );

    for (i = 0; i < sizeof(test)/sizeof(test[0]); i++)
    {
        hr = exec_query( services, test[i], &result );
        ok( hr == S_OK, "query %u failed: %08x\n", i, hr );
        if (result) IEnumWbemClassObject_Release( result );
    }

    SysFreeString( wql );
    SysFreeString( sql );
    SysFreeString( query );
}