Import Upstream version 1.8.5
[hcoop/debian/openafs.git] / src / libadmin / samples / rxstat_get_process.c
1 /*
2 * Copyright 2000, International Business Machines Corporation and others.
3 * All Rights Reserved.
4 *
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
8 *
9 * Portions Copyright (c) 2003 Apple Computer, Inc.
10 */
11
12 /*
13 * This file contains sample code for the rxstats interface
14 */
15
16 #include <afsconfig.h>
17 #include <afs/param.h>
18
19 #include <roken.h>
20
21 #ifdef AFS_NT40_ENV
22 #include <pthread.h>
23 #endif
24
25 #include <rx/rx.h>
26 #include <rx/rxstat.h>
27 #include <afs/afs_Admin.h>
28 #include <afs/afs_AdminErrors.h>
29 #include <afs/afs_clientAdmin.h>
30 #include <afs/afs_utilAdmin.h>
31
32 #include <afs/afsint.h>
33 #define FSINT_COMMON_XG
34 #include <afs/afscbint.h>
35 #include <afs/kauth.h>
36 #include <afs/kautils.h>
37 #include <afs/ptint.h>
38 #include <afs/ptserver.h>
39 #include <afs/vldbint.h>
40 #include <afs/bosint.h>
41 #include <afs/volint.h>
42 #include <afs/volser.h>
43 #include <afs/bosint.h>
44 #include <ubik.h>
45 #include <ubik_int.h>
46
47 void
48 Usage(void)
49 {
50 fprintf(stderr, "Usage: rxstat_get_process <cell> <host> <port>\n");
51 exit(1);
52 }
53
54 void
55 ParseArgs(int argc, char *argv[], char **srvrName, long *srvrPort)
56 {
57 char **argp = argv;
58
59 if (!*(++argp))
60 Usage();
61 *srvrName = *(argp++);
62 if (!*(argp))
63 Usage();
64 *srvrPort = strtol(*(argp++), NULL, 0);
65 if (*srvrPort <= 0 || *srvrPort >= 65536)
66 Usage();
67 if (*(argp))
68 Usage();
69 }
70
71 void
72 GetPrintStrings(afs_RPCStats_p statp, char *ifName, char *ifRole,
73 const char ***funcList, int *funcListLen)
74 {
75 if (statp->s.stats_v1.remote_is_server) {
76 strcpy(ifRole, "client");
77 } else {
78 strcpy(ifRole, "server");
79 }
80
81 switch (statp->s.stats_v1.interfaceId) {
82 case RXSTATS_STATINDEX:
83 strcpy(ifName, "rxstats interface");
84 *funcList = RXSTATS_function_names;
85 *funcListLen = RXSTATS_NO_OF_STAT_FUNCS;
86 break;
87 case RXAFS_STATINDEX:
88 strcpy(ifName, "fileserver interface");
89 *funcList = RXAFS_function_names;
90 *funcListLen = RXAFS_NO_OF_STAT_FUNCS;
91 break;
92 case RXAFSCB_STATINDEX:
93 strcpy(ifName, "callback interface");
94 *funcList = RXAFSCB_function_names;
95 *funcListLen = RXAFSCB_NO_OF_STAT_FUNCS;
96 break;
97 case PR_STATINDEX:
98 strcpy(ifName, "ptserver interface");
99 *funcList = PR_function_names;
100 *funcListLen = PR_NO_OF_STAT_FUNCS;
101 break;
102 case DISK_STATINDEX:
103 strcpy(ifName, "ubik disk interface");
104 *funcList = DISK_function_names;
105 *funcListLen = DISK_NO_OF_STAT_FUNCS;
106 break;
107 case VOTE_STATINDEX:
108 strcpy(ifName, "ubik vote interface");
109 *funcList = VOTE_function_names;
110 *funcListLen = VOTE_NO_OF_STAT_FUNCS;
111 break;
112 case VL_STATINDEX:
113 strcpy(ifName, "volserver interface");
114 *funcList = VL_function_names;
115 *funcListLen = VL_NO_OF_STAT_FUNCS;
116 break;
117 case AFSVolSTATINDEX:
118 strcpy(ifName, "volserver interface");
119 *funcList = AFSVolfunction_names;
120 *funcListLen = AFSVolNO_OF_STAT_FUNCS;
121 break;
122 case BOZO_STATINDEX:
123 strcpy(ifName, "bosserver interface");
124 *funcList = BOZO_function_names;
125 *funcListLen = BOZO_NO_OF_STAT_FUNCS;
126 break;
127 case KAA_STATINDEX:
128 strcpy(ifName, "KAA interface");
129 *funcList = KAA_function_names;
130 *funcListLen = KAA_NO_OF_STAT_FUNCS;
131 break;
132 case KAM_STATINDEX:
133 strcpy(ifName, "KAM interface");
134 *funcList = KAM_function_names;
135 *funcListLen = KAM_NO_OF_STAT_FUNCS;
136 break;
137 case KAT_STATINDEX:
138 strcpy(ifName, "KAT interface");
139 *funcList = KAT_function_names;
140 *funcListLen = KAT_NO_OF_STAT_FUNCS;
141 break;
142 default:
143 sprintf(ifName, "interface 0x%x", statp->s.stats_v1.interfaceId);
144 *funcList = NULL;
145 *funcListLen = 0;
146 break;
147 }
148 }
149
150 int
151 main(int argc, char *argv[])
152 {
153 int rc;
154 afs_status_t st = 0;
155 struct rx_connection *conn;
156 char *srvrName;
157 long srvrPort;
158 void *cellHandle;
159 void *iterator;
160 afs_RPCStats_t stats;
161 char ifName[128];
162 char role[8];
163 const char **funcList;
164 int funcListLen;
165 int index;
166
167 ParseArgs(argc, argv, &srvrName, &srvrPort);
168
169 rc = afsclient_Init(&st);
170 if (!rc) {
171 fprintf(stderr, "afsclient_Init, status %d\n", st);
172 exit(1);
173 }
174
175 rc = afsclient_NullCellOpen(&cellHandle, &st);
176 if (!rc) {
177 fprintf(stderr, "afsclient_NullCellOpen, status %d\n", st);
178 exit(1);
179 }
180
181 rc = afsclient_RPCStatOpenPort(cellHandle, srvrName, srvrPort, &conn,
182 &st);
183 if (!rc) {
184 fprintf(stderr, "afsclient_RPCStatOpenPort, status %d\n", st);
185 exit(1);
186 }
187
188 rc = util_RPCStatsGetBegin(conn, RXSTATS_RetrieveProcessRPCStats,
189 &iterator, &st);
190 if (!rc) {
191 fprintf(stderr, "util_RPCStatsGetBegin, status %d\n", st);
192 exit(1);
193 }
194
195 while (util_RPCStatsGetNext(iterator, &stats, &st)) {
196 index = stats.s.stats_v1.func_index;
197
198 if (index == 0) {
199 GetPrintStrings(&stats, ifName, role, &funcList, &funcListLen);
200 printf("\nProcess RPC stats for %s accessed as a %s\n\n", ifName,
201 role);
202 }
203
204 if (index >= funcListLen) {
205 printf(" Function index %d\n", index);
206 } else {
207 printf(" %s\n", funcList[index]);
208 }
209
210 if (stats.s.stats_v1.invocations != 0) {
211 printf("\tinvoc %"AFS_UINT64_FMT
212 " bytes_sent %"AFS_UINT64_FMT
213 " bytes_rcvd %"AFS_UINT64_FMT"\n",
214 stats.s.stats_v1.invocations,
215 stats.s.stats_v1.bytes_sent,
216 stats.s.stats_v1.bytes_rcvd);
217 printf("\tqsum %d.%06d qsqr %d.%06d"
218 " qmin %d.%06d qmax %d.%06d\n",
219 stats.s.stats_v1.queue_time_sum.sec,
220 stats.s.stats_v1.queue_time_sum.usec,
221 stats.s.stats_v1.queue_time_sum_sqr.sec,
222 stats.s.stats_v1.queue_time_sum_sqr.usec,
223 stats.s.stats_v1.queue_time_min.sec,
224 stats.s.stats_v1.queue_time_min.usec,
225 stats.s.stats_v1.queue_time_max.sec,
226 stats.s.stats_v1.queue_time_max.usec);
227 printf("\txsum %d.%06d xsqr %d.%06d"
228 " xmin %d.%06d xmax %d.%06d\n",
229 stats.s.stats_v1.execution_time_sum.sec,
230 stats.s.stats_v1.execution_time_sum.usec,
231 stats.s.stats_v1.execution_time_sum_sqr.sec,
232 stats.s.stats_v1.execution_time_sum_sqr.usec,
233 stats.s.stats_v1.execution_time_min.sec,
234 stats.s.stats_v1.execution_time_min.usec,
235 stats.s.stats_v1.execution_time_max.sec,
236 stats.s.stats_v1.execution_time_max.usec);
237 } else {
238 printf("\tNever invoked\n");
239 }
240 }
241 if (st != ADMITERATORDONE) {
242 fprintf(stderr, "util_RPCStatsGetNext, status %d\n", st);
243 exit(1);
244 }
245 printf("\n");
246
247 rc = util_RPCStatsGetDone(iterator, &st);
248 if (!rc) {
249 fprintf(stderr, "util_RPCStatsGetDone, status %d\n", st);
250 exit(1);
251 }
252
253 rc = afsclient_RPCStatClose(conn, &st);
254 if (!rc) {
255 fprintf(stderr, "afsclient_RPCStatClose, status %d\n", st);
256 exit(1);
257 }
258
259 rc = afsclient_CellClose(cellHandle, &st);
260 if (!rc) {
261 fprintf(stderr, "afsclient_CellClose, status %d\n", st);
262 exit(1);
263 }
264
265 exit(0);
266 }