00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <config.h>
00031
00032 #include "analysis_table.h"
00033 #include "sysvar_holder.h"
00034
00035 #include <drizzled/error.h>
00036
00037 #include <libmemcached/memcached.h>
00038 #include <libmemcached/server.h>
00039
00040 namespace drizzle_plugin
00041 {
00042
00043 AnalysisTableTool::AnalysisTableTool() :
00044 plugin::TableFunction("DATA_DICTIONARY", "MEMCACHED_ANALYSIS")
00045 {
00046 add_field("SERVERS_ANALYZED", plugin::TableFunction::NUMBER);
00047 add_field("AVERAGE_ITEM_SIZE", plugin::TableFunction::NUMBER);
00048 add_field("NODE_WITH_MOST_MEM_CONSUMPTION");
00049 add_field("USED_BYTES", plugin::TableFunction::NUMBER);
00050 add_field("NODE_WITH_LEAST_FREE_SPACE");
00051 add_field("FREE_BYTES", plugin::TableFunction::NUMBER);
00052 add_field("NODE_WITH_LONGEST_UPTIME");
00053 add_field("LONGEST_UPTIME", plugin::TableFunction::NUMBER);
00054 add_field("POOL_WIDE_HIT_RATIO", plugin::TableFunction::NUMBER);
00055 }
00056
00057 AnalysisTableTool::Generator::Generator(Field **arg) :
00058 plugin::TableFunction::Generator(arg)
00059 {
00060 is_done= false;
00061 }
00062
00063 bool AnalysisTableTool::Generator::populate()
00064 {
00065 if (is_done)
00066 {
00067 return false;
00068 }
00069 is_done= true;
00070
00071 drizzled::sys_var *servers_var= drizzled::find_sys_var("memcached_stats_servers");
00072 assert(servers_var != NULL);
00073
00074 const string servers_string(static_cast<char *>(servers_var.value_ptr(NULL, 0, NULL)));
00075
00076 if (servers_string.empty())
00077 {
00078 my_printf_error(ER_UNKNOWN_ERROR, _("No value in MEMCACHED_STATS_SERVERS variable."), MYF(0));
00079 return false;
00080 }
00081
00082 memcached_return rc;
00083 memcached_st *serv= memcached_create(NULL);
00084 memcached_server_st *tmp_serv=
00085 memcached_servers_parse(servers_string.c_str());
00086 memcached_server_push(serv, tmp_serv);
00087 memcached_server_list_free(tmp_serv);
00088 memcached_stat_st *stats= memcached_stat(serv, NULL, &rc);
00089 memcached_server_st *servers= memcached_server_list(serv);
00090
00091 uint32_t server_count= memcached_server_count(serv);
00092
00093 if (server_count > 1)
00094 {
00095 memcached_analysis_st *report= memcached_analyze(serv, stats, &rc);
00096
00097 push(static_cast<uint64_t>(server_count));
00098 push(static_cast<uint64_t>(report->average_item_size));
00099 push(memcached_server_name(serv, servers[report->most_consumed_server]));
00100 push(report->most_used_bytes);
00101 push(memcached_server_name(serv, servers[report->least_free_server]));
00102 push(report->least_remaining_bytes);
00103 push(memcached_server_name(serv, servers[report->oldest_server]));
00104 push(static_cast<uint64_t>(report->longest_uptime));
00105 push(static_cast<int64_t>(report->pool_hit_ratio));
00106 free(report);
00107 }
00108
00109 memcached_stat_free(serv, stats);
00110 memcached_free(serv);
00111
00112 return true;
00113 }
00114
00115 }