Merge pull request #1592 from rpv-tomsk/mysql-plugin-sort
authorRuben Kerkhof <ruben@rubenkerkhof.com>
Sat, 26 Mar 2016 20:24:13 +0000 (21:24 +0100)
committerRuben Kerkhof <ruben@rubenkerkhof.com>
Sat, 26 Mar 2016 20:24:13 +0000 (21:24 +0100)
mysql plugin: Split 'mysql_sort' type into several types.

1  2 
src/mysql.c
src/types.db

diff --combined src/mysql.c
@@@ -65,6 -65,9 +65,6 @@@ typedef struct mysql_database_s mysql_d
  
  static int mysql_read (user_data_t *ud);
  
 -void mysql_read_default_options(struct st_mysql_options *options,
 -              const char *filename,const char *group);
 -
  static void mysql_database_free (void *arg) /* {{{ */
  {
        mysql_database_t *db;
@@@ -400,8 -403,8 +400,8 @@@ static int mysql_read_master_stats (mys
        MYSQL_RES *res;
        MYSQL_ROW  row;
  
 -      char *query;
 -      int   field_num;
 +      const char *query;
 +      int         field_num;
        unsigned long long position;
  
        query = "SHOW MASTER STATUS";
@@@ -446,8 -449,8 +446,8 @@@ static int mysql_read_slave_stats (mysq
        MYSQL_RES *res;
        MYSQL_ROW  row;
  
 -      char *query;
 -      int   field_num;
 +      const char *query;
 +      int         field_num;
  
        /* WTF? libmysqlclient does not seem to provide any means to
         * translate a column name to a column index ... :-/ */
@@@ -569,84 -572,84 +569,84 @@@ static int mysql_read_innodb_stats (mys
        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}
 -    };
 +      const char *query;
 +      struct {
 +              const char *key;
 +              const 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'";
  
  
        while ((row = mysql_fetch_row (res)))
        {
 -        int i;
 +              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);
 +              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 int mysql_read (user_data_t *ud)
  {
        mysql_database_t *db;
 -      MYSQL     *con;
 -      MYSQL_RES *res;
 -      MYSQL_ROW  row;
 -      char      *query;
 +      MYSQL      *con;
 +      MYSQL_RES  *res;
 +      MYSQL_ROW   row;
 +      const char *query;
  
        derive_t qcache_hits          = 0;
        derive_t qcache_inserts       = 0;
  
        unsigned long long traffic_incoming = 0ULL;
        unsigned long long traffic_outgoing = 0ULL;
 -    unsigned long mysql_version = 0ULL;
 +      unsigned long mysql_version = 0ULL;
  
        if ((ud == NULL) || (ud->data == NULL))
        {
        if ((con = getconnection (db)) == NULL)
                return (-1);
  
 -  mysql_version = mysql_get_server_version(con);
 +      mysql_version = mysql_get_server_version(con);
  
        query = "SHOW STATUS";
        if (mysql_version >= 50002)
                }
                else if (strncmp (key, "Sort_", strlen ("Sort_")) == 0)
                {
-                       counter_submit ("mysql_sort", key + strlen ("Sort_"),
-                                       val, db);
+                       if (strcmp (key, "Sort_merge_passes") == 0)
+                               counter_submit ("mysql_sort_merge_passes", NULL, val, db);
+                       else if (strcmp (key, "Sort_rows") == 0)
+                               counter_submit ("mysql_sort_rows", NULL, val, db);
+                       else if (strcmp (key, "Sort_range") == 0)
+                               counter_submit ("mysql_sort", "range", val, db);
+                       else if (strcmp (key, "Sort_scan") == 0)
+                               counter_submit ("mysql_sort", "scan", val, db);
+                       
                }
        }
        mysql_free_result (res); res = NULL;
        traffic_submit  (traffic_incoming, traffic_outgoing, db);
  
        if (mysql_version >= 50600 && db->innodb_stats)
 -        mysql_read_innodb_stats (db, con);
 +              mysql_read_innodb_stats (db, con);
  
        if (db->master_stats)
                mysql_read_master_stats (db, con);
diff --combined src/types.db
@@@ -67,8 -67,7 +67,8 @@@ email_check           value:GAUGE:0:
  email_count           value:GAUGE:0:U
  email_size            value:GAUGE:0:U
  entropy                       value:GAUGE:0:4294967295
 -expired_keys    value:GAUGE:0:U
 +expired_keys    value:DERIVE:0:U
 +evicted_keys    value:DERIVE:0:U
  fanspeed              value:GAUGE:0:U
  file_handles          value:GAUGE:0:U
  file_size             value:GAUGE:0:U
@@@ -129,6 -128,8 +129,8 @@@ mysql_innodb_row_lock      value:DERIVE:0:
  mysql_innodb_rows     value:DERIVE:0:U
  mysql_select          value:DERIVE:0:U
  mysql_sort            value:DERIVE:0:U
+ mysql_sort_merge_passes       value:DERIVE:0:U
+ mysql_sort_rows               value:DERIVE:0:U
  nfs_procedure         value:DERIVE:0:U
  nginx_connections     value:GAUGE:0:U
  nginx_requests                value:DERIVE:0:U