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 */
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 */
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"); }
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, ¶m); 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; }
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 */
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); }
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 ); }