5 unsigned long long value;
9 struct nfs_procs nfs_proc2_values[] = {
11 { "getattr", 0ULL, 0 },
12 { "setattr", 0ULL, 0 },
14 { "lookup", 0ULL, 0 },
15 { "readlink", 0ULL, 0 },
17 { "wrcache", 0ULL, 0 },
19 { "create", 0ULL, 0 },
20 { "remove", 0ULL, 0 },
21 { "rename", 0ULL, 0 },
23 { "symlink", 0ULL, 0 },
26 { "readdir", 0ULL, 0 },
27 { "fsstat", 0ULL, 0 },
33 struct nfs_procs nfs_proc3_values[] = {
35 { "getattr", 0ULL, 0 },
36 { "setattr", 0ULL, 0 },
37 { "lookup", 0ULL, 0 },
38 { "access", 0ULL, 0 },
39 { "readlink", 0ULL, 0 },
42 { "create", 0ULL, 0 },
44 { "symlink", 0ULL, 0 },
46 { "remove", 0ULL, 0 },
48 { "rename", 0ULL, 0 },
50 { "readdir", 0ULL, 0 },
51 { "readdirplus", 0ULL, 0 },
52 { "fsstat", 0ULL, 0 },
53 { "fsinfo", 0ULL, 0 },
54 { "pathconf", 0ULL, 0 },
55 { "commit", 0ULL, 0 },
61 struct nfs_procs nfs_proc4_values[] = {
65 { "commit", 0ULL, 0 },
67 { "open_conf", 0ULL, 0 },
68 { "open_noat", 0ULL, 0 },
69 { "open_dgrd", 0ULL, 0 },
71 { "setattr", 0ULL, 0 },
72 { "fsinfo", 0ULL, 0 },
74 { "setclntid", 0ULL, 0 },
75 { "confirm", 0ULL, 0 },
79 { "access", 0ULL, 0 },
80 { "getattr", 0ULL, 0 },
81 { "lookup", 0ULL, 0 },
82 { "lookup_root", 0ULL, 0 },
83 { "remove", 0ULL, 0 },
84 { "rename", 0ULL, 0 },
86 { "symlink", 0ULL, 0 },
87 { "create", 0ULL, 0 },
88 { "pathconf", 0ULL, 0 },
89 { "statfs", 0ULL, 0 },
90 { "readlink", 0ULL, 0 },
91 { "readdir", 0ULL, 0 },
92 { "server_caps", 0ULL, 0 },
93 { "delegreturn", 0ULL, 0 },
94 { "getacl", 0ULL, 0 },
95 { "setacl", 0ULL, 0 },
96 { "fs_locations", 0ULL, 0 },
97 { "rel_lkowner", 0ULL, 0 },
98 { "secinfo", 0ULL, 0 },
99 { "fsid_present", 0ULL, 0 },
101 /* nfsv4.1 client ops */
102 { "exchange_id", 0ULL, 0 },
103 { "create_session", 0ULL, 0 },
104 { "destroy_session", 0ULL, 0 },
105 { "sequence", 0ULL, 0 },
106 { "get_lease_time", 0ULL, 0 },
107 { "reclaim_comp", 0ULL, 0 },
108 { "layoutget", 0ULL, 0 },
109 { "getdevinfo", 0ULL, 0 },
110 { "layoutcommit", 0ULL, 0 },
111 { "layoutreturn", 0ULL, 0 },
112 { "secinfo_no", 0ULL, 0 },
113 { "test_stateid", 0ULL, 0 },
114 { "free_stateid", 0ULL, 0 },
115 { "getdevicelist", 0ULL, 0 },
116 { "bind_conn_to_ses", 0ULL, 0 },
117 { "destroy_clientid", 0ULL, 0 },
119 /* nfsv4.2 client ops */
121 { "allocate", 0ULL, 0 },
122 { "deallocate", 0ULL, 0 },
123 { "layoutstats", 0ULL, 0 },
124 { "clone", 0ULL, 0 },
130 int do_proc_net_rpc_nfs(int update_every, unsigned long long dt) {
133 static procfile *ff = NULL;
134 static int do_net = -1, do_rpc = -1, do_proc2 = -1, do_proc3 = -1, do_proc4 = -1;
135 static int proc2_warning = 0, proc3_warning = 0, proc4_warning = 0;
138 char filename[FILENAME_MAX + 1];
139 snprintfz(filename, FILENAME_MAX, "%s%s", global_host_prefix, "/proc/net/rpc/nfs");
140 ff = procfile_open(config_get("plugin:proc:/proc/net/rpc/nfs", "filename to monitor", filename), " \t", PROCFILE_FLAG_DEFAULT);
144 ff = procfile_readall(ff);
145 if(!ff) return 0; // we return 0, so that we will retry to open it next time
147 if(do_net == -1) do_net = config_get_boolean("plugin:proc:/proc/net/rpc/nfs", "network", 1);
148 if(do_rpc == -1) do_rpc = config_get_boolean("plugin:proc:/proc/net/rpc/nfs", "rpc", 1);
149 if(do_proc2 == -1) do_proc2 = config_get_boolean("plugin:proc:/proc/net/rpc/nfs", "NFS v2 procedures", 1);
150 if(do_proc3 == -1) do_proc3 = config_get_boolean("plugin:proc:/proc/net/rpc/nfs", "NFS v3 procedures", 1);
151 if(do_proc4 == -1) do_proc4 = config_get_boolean("plugin:proc:/proc/net/rpc/nfs", "NFS v4 procedures", 1);
153 // if they are enabled, reset them to 1
154 // later we do them =2 to avoid doing strcmp for all lines
155 if(do_net) do_net = 1;
156 if(do_rpc) do_rpc = 1;
157 if(do_proc2) do_proc2 = 1;
158 if(do_proc3) do_proc3 = 1;
159 if(do_proc4) do_proc4 = 1;
161 uint32_t lines = procfile_lines(ff), l;
165 unsigned long long net_count = 0, net_udp_count = 0, net_tcp_count = 0, net_tcp_connections = 0;
166 unsigned long long rpc_calls = 0, rpc_retransmits = 0, rpc_auth_refresh = 0;
168 for(l = 0; l < lines ;l++) {
169 words = procfile_linewords(ff, l);
172 type = procfile_lineword(ff, l, 0);
174 if(do_net == 1 && strcmp(type, "net") == 0) {
176 error("%s line of /proc/net/rpc/nfs has %u words, expected %d", type, words, 5);
180 net_count = strtoull(procfile_lineword(ff, l, 1), NULL, 10);
181 net_udp_count = strtoull(procfile_lineword(ff, l, 2), NULL, 10);
182 net_tcp_count = strtoull(procfile_lineword(ff, l, 3), NULL, 10);
183 net_tcp_connections = strtoull(procfile_lineword(ff, l, 4), NULL, 10);
185 unsigned long long sum = net_count + net_udp_count + net_tcp_count + net_tcp_connections;
186 if(sum == 0ULL) do_net = -1;
189 else if(do_rpc == 1 && strcmp(type, "rpc") == 0) {
191 error("%s line of /proc/net/rpc/nfs has %u words, expected %d", type, words, 6);
195 rpc_calls = strtoull(procfile_lineword(ff, l, 1), NULL, 10);
196 rpc_retransmits = strtoull(procfile_lineword(ff, l, 2), NULL, 10);
197 rpc_auth_refresh = strtoull(procfile_lineword(ff, l, 3), NULL, 10);
199 unsigned long long sum = rpc_calls + rpc_retransmits + rpc_auth_refresh;
200 if(sum == 0ULL) do_rpc = -1;
203 else if(do_proc2 == 1 && strcmp(type, "proc2") == 0) {
204 // the first number is the count of numbers present
205 // so we start for word 2
207 unsigned long long sum = 0;
209 for(i = 0, j = 2; j < words && nfs_proc2_values[i].name[0] ; i++, j++) {
210 nfs_proc2_values[i].value = strtoull(procfile_lineword(ff, l, j), NULL, 10);
211 nfs_proc2_values[i].present = 1;
212 sum += nfs_proc2_values[i].value;
217 error("Disabling /proc/net/rpc/nfs v2 procedure calls chart. It seems unused on this machine. It will be enabled automatically when found with data in it.");
224 else if(do_proc3 == 1 && strcmp(type, "proc3") == 0) {
225 // the first number is the count of numbers present
226 // so we start for word 2
228 unsigned long long sum = 0;
230 for(i = 0, j = 2; j < words && nfs_proc3_values[i].name[0] ; i++, j++) {
231 nfs_proc3_values[i].value = strtoull(procfile_lineword(ff, l, j), NULL, 10);
232 nfs_proc3_values[i].present = 1;
233 sum += nfs_proc3_values[i].value;
238 info("Disabling /proc/net/rpc/nfs v3 procedure calls chart. It seems unused on this machine. It will be enabled automatically when found with data in it.");
245 else if(do_proc4 == 1 && strcmp(type, "proc4") == 0) {
246 // the first number is the count of numbers present
247 // so we start for word 2
249 unsigned long long sum = 0;
251 for(i = 0, j = 2; j < words && nfs_proc4_values[i].name[0] ; i++, j++) {
252 nfs_proc4_values[i].value = strtoull(procfile_lineword(ff, l, j), NULL, 10);
253 nfs_proc4_values[i].present = 1;
254 sum += nfs_proc4_values[i].value;
259 info("Disabling /proc/net/rpc/nfs v4 procedure calls chart. It seems unused on this machine. It will be enabled automatically when found with data in it.");
270 // --------------------------------------------------------------------
273 st = rrdset_find_bytype("nfs", "net");
275 st = rrdset_create("nfs", "net", NULL, "network", NULL, "NFS Client Network", "operations/s", 5007, update_every, RRDSET_TYPE_STACKED);
278 rrddim_add(st, "udp", NULL, 1, 1, RRDDIM_INCREMENTAL);
279 rrddim_add(st, "tcp", NULL, 1, 1, RRDDIM_INCREMENTAL);
281 else rrdset_next(st);
283 // ignore net_count, net_tcp_connections
285 if(net_tcp_connections) {};
287 rrddim_set(st, "udp", net_udp_count);
288 rrddim_set(st, "tcp", net_tcp_count);
292 // --------------------------------------------------------------------
295 st = rrdset_find_bytype("nfs", "rpc");
297 st = rrdset_create("nfs", "rpc", NULL, "rpc", NULL, "NFS Client Remote Procedure Calls Statistics", "calls/s", 5008, update_every, RRDSET_TYPE_LINE);
300 rrddim_add(st, "calls", NULL, 1, 1, RRDDIM_INCREMENTAL);
301 rrddim_add(st, "retransmits", NULL, -1, 1, RRDDIM_INCREMENTAL);
302 rrddim_add(st, "auth_refresh", NULL, -1, 1, RRDDIM_INCREMENTAL);
304 else rrdset_next(st);
306 rrddim_set(st, "calls", rpc_calls);
307 rrddim_set(st, "retransmits", rpc_retransmits);
308 rrddim_set(st, "auth_refresh", rpc_auth_refresh);
312 // --------------------------------------------------------------------
316 st = rrdset_find_bytype("nfs", "proc2");
318 st = rrdset_create("nfs", "proc2", NULL, "nfsv2rpc", NULL, "NFS v2 Client Remote Procedure Calls", "calls/s", 5009, update_every, RRDSET_TYPE_STACKED);
320 for(i = 0; nfs_proc2_values[i].present ; i++)
321 rrddim_add(st, nfs_proc2_values[i].name, NULL, 1, 1, RRDDIM_INCREMENTAL);
323 else rrdset_next(st);
325 for(i = 0; nfs_proc2_values[i].present ; i++)
326 rrddim_set(st, nfs_proc2_values[i].name, nfs_proc2_values[i].value);
331 // --------------------------------------------------------------------
335 st = rrdset_find_bytype("nfs", "proc3");
337 st = rrdset_create("nfs", "proc3", NULL, "nfsv3rpc", NULL, "NFS v3 Client Remote Procedure Calls", "calls/s", 5010, update_every, RRDSET_TYPE_STACKED);
339 for(i = 0; nfs_proc3_values[i].present ; i++)
340 rrddim_add(st, nfs_proc3_values[i].name, NULL, 1, 1, RRDDIM_INCREMENTAL);
342 else rrdset_next(st);
344 for(i = 0; nfs_proc3_values[i].present ; i++)
345 rrddim_set(st, nfs_proc3_values[i].name, nfs_proc3_values[i].value);
350 // --------------------------------------------------------------------
354 st = rrdset_find_bytype("nfs", "proc4");
356 st = rrdset_create("nfs", "proc4", NULL, "nfsv4rpc", NULL, "NFS v4 Client Remote Procedure Calls", "calls/s", 5011, update_every, RRDSET_TYPE_STACKED);
358 for(i = 0; nfs_proc4_values[i].present ; i++)
359 rrddim_add(st, nfs_proc4_values[i].name, NULL, 1, 1, RRDDIM_INCREMENTAL);
361 else rrdset_next(st);
363 for(i = 0; nfs_proc4_values[i].present ; i++)
364 rrddim_set(st, nfs_proc4_values[i].name, nfs_proc4_values[i].value);