Fixed compiler warning for wrong printf placeholder in memstat
[m6w6/libmemcached] / clients / memstat.c
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <sys/types.h>
5 #include <sys/mman.h>
6 #include <fcntl.h>
7 #include <string.h>
8 #include <getopt.h>
9
10 #include <libmemcached/memcached.h>
11
12 #include "client_options.h"
13 #include "utilities.h"
14
15 #define PROGRAM_NAME "memstat"
16 #define PROGRAM_DESCRIPTION "Output the state of a memcached cluster."
17
18 /* Prototypes */
19 static void options_parse(int argc, char *argv[]);
20 static void print_server_listing(memcached_st *memc, memcached_stat_st *stat,
21 memcached_server_st *server_list);
22 static void print_analysis_report(memcached_st *memc,
23 memcached_analysis_st *report,
24 memcached_server_st *server_list);
25
26 static int opt_verbose= 0;
27 static int opt_displayflag= 0;
28 static int opt_analyze= 0;
29 static char *opt_servers= NULL;
30
31 static struct option long_options[]=
32 {
33 {"version", no_argument, NULL, OPT_VERSION},
34 {"help", no_argument, NULL, OPT_HELP},
35 {"verbose", no_argument, &opt_verbose, OPT_VERBOSE},
36 {"debug", no_argument, &opt_verbose, OPT_DEBUG},
37 {"servers", required_argument, NULL, OPT_SERVERS},
38 {"flag", no_argument, &opt_displayflag, OPT_FLAG},
39 {"analyze", no_argument, NULL, OPT_ANALYZE},
40 {0, 0, 0, 0},
41 };
42
43 int main(int argc, char *argv[])
44 {
45 memcached_return rc;
46 memcached_st *memc;
47 memcached_stat_st *stat;
48 memcached_server_st *servers;
49 memcached_server_st *server_list;
50 memcached_analysis_st *report;
51
52 options_parse(argc, argv);
53
54 if (!opt_servers)
55 {
56 char *temp;
57
58 if ((temp= getenv("MEMCACHED_SERVERS")))
59 opt_servers= strdup(temp);
60 else
61 {
62 fprintf(stderr, "No Servers provided\n\n");
63 help_command(PROGRAM_NAME, PROGRAM_DESCRIPTION, long_options, 0);
64 exit(1);
65 }
66 }
67
68 memc= memcached_create(NULL);
69
70 servers= memcached_servers_parse(opt_servers);
71 memcached_server_push(memc, servers);
72 memcached_server_list_free(servers);
73
74 stat= memcached_stat(memc, NULL, &rc);
75
76 if (rc != MEMCACHED_SUCCESS && rc != MEMCACHED_SOME_ERRORS)
77 {
78 printf("Failure to communicate with servers (%s)\n",
79 memcached_strerror(memc, rc));
80 exit(1);
81 }
82
83 server_list= memcached_server_list(memc);
84
85 if (opt_analyze)
86 {
87 report= memcached_analyze(memc, stat, &rc);
88 if (rc != MEMCACHED_SUCCESS || report == NULL)
89 {
90 printf("Failure to analyze servers (%s)\n",
91 memcached_strerror(memc, rc));
92 exit(1);
93 }
94 print_analysis_report(memc, report, server_list);
95 free(report);
96 }
97 else
98 print_server_listing(memc, stat, server_list);
99
100 free(stat);
101 free(opt_servers);
102
103 memcached_free(memc);
104
105 return 0;
106 }
107
108 static void print_server_listing(memcached_st *memc, memcached_stat_st *stat,
109 memcached_server_st *server_list)
110 {
111 unsigned int x;
112 memcached_return rc;
113
114 printf("Listing %u Server\n\n", memcached_server_count(memc));
115 for (x= 0; x < memcached_server_count(memc); x++)
116 {
117 char **list;
118 char **ptr;
119
120 list= memcached_stat_get_keys(memc, &stat[x], &rc);
121
122 printf("Server: %s (%u)\n", memcached_server_name(memc, server_list[x]),
123 memcached_server_port(memc, server_list[x]));
124 for (ptr= list; *ptr; ptr++)
125 {
126 memcached_return rc;
127 char *value= memcached_stat_get_value(memc, &stat[x], *ptr, &rc);
128
129 printf("\t %s: %s\n", *ptr, value);
130 free(value);
131 }
132
133 free(list);
134 printf("\n");
135 }
136 }
137
138 static void print_analysis_report(memcached_st *memc,
139 memcached_analysis_st *report,
140 memcached_server_st *server_list)
141 {
142 uint32_t server_count= memcached_server_count(memc);
143
144 printf("Memcached Cluster Analysis Report\n\n");
145
146 printf("\tNumber of Servers Analyzed : %d\n", server_count);
147 printf("\tAverage Item Size (incl/overhead) : %u bytes\n",
148 report->average_item_size);
149
150 if (server_count == 1)
151 {
152 printf("\nFor a detailed report, you must supply multiple servers.\n");
153 return;
154 }
155
156 printf("\n");
157 printf("\tNode with most memory consumption : %s:%u (%llu bytes)\n",
158 memcached_server_name(memc, server_list[report->most_consumed_server]),
159 memcached_server_port(memc, server_list[report->most_consumed_server]),
160 (unsigned long long)report->most_used_bytes);
161 printf("\tNode with least free space : %s:%u (%llu bytes remaining)\n",
162 memcached_server_name(memc, server_list[report->least_free_server]),
163 memcached_server_port(memc, server_list[report->least_free_server]),
164 (unsigned long long)report->least_remaining_bytes);
165 printf("\tNode with longest uptime : %s:%u (%us)\n",
166 memcached_server_name(memc, server_list[report->oldest_server]),
167 memcached_server_port(memc, server_list[report->oldest_server]),
168 report->longest_uptime);
169 printf("\tPool-wide Hit Ratio : %1.f%%\n", report->pool_hit_ratio);
170 printf("\n");
171 }
172
173 static void options_parse(int argc, char *argv[])
174 {
175 memcached_programs_help_st help_options[]=
176 {
177 {0},
178 };
179
180 int option_index= 0;
181 int option_rv;
182
183 while (1)
184 {
185 option_rv= getopt_long(argc, argv, "Vhvds:a", long_options, &option_index);
186 if (option_rv == -1) break;
187 switch (option_rv)
188 {
189 case 0:
190 break;
191 case OPT_VERBOSE: /* --verbose or -v */
192 opt_verbose = OPT_VERBOSE;
193 break;
194 case OPT_DEBUG: /* --debug or -d */
195 opt_verbose = OPT_DEBUG;
196 break;
197 case OPT_VERSION: /* --version or -V */
198 version_command(PROGRAM_NAME);
199 break;
200 case OPT_HELP: /* --help or -h */
201 help_command(PROGRAM_NAME, PROGRAM_DESCRIPTION, long_options, help_options);
202 break;
203 case OPT_SERVERS: /* --servers or -s */
204 opt_servers= strdup(optarg);
205 break;
206 case OPT_ANALYZE: /* --analyze or -a */
207 opt_analyze= OPT_ANALYZE;
208 break;
209 case '?':
210 /* getopt_long already printed an error message. */
211 exit(1);
212 default:
213 abort();
214 }
215 }
216 }