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, usec_t 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", netdata_configured_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 size_t lines = procfile_lines(ff), l;
164 unsigned long long net_count = 0, net_udp_count = 0, net_tcp_count = 0, net_tcp_connections = 0;
165 unsigned long long rpc_calls = 0, rpc_retransmits = 0, rpc_auth_refresh = 0;
167 for(l = 0; l < lines ;l++) {
168 size_t words = procfile_linewords(ff, l);
171 type = procfile_lineword(ff, l, 0);
173 if(do_net == 1 && strcmp(type, "net") == 0) {
175 error("%s line of /proc/net/rpc/nfs has %zu words, expected %d", type, words, 5);
179 net_count = str2ull(procfile_lineword(ff, l, 1));
180 net_udp_count = str2ull(procfile_lineword(ff, l, 2));
181 net_tcp_count = str2ull(procfile_lineword(ff, l, 3));
182 net_tcp_connections = str2ull(procfile_lineword(ff, l, 4));
184 unsigned long long sum = net_count + net_udp_count + net_tcp_count + net_tcp_connections;
185 if(sum == 0ULL) do_net = -1;
188 else if(do_rpc == 1 && strcmp(type, "rpc") == 0) {
190 error("%s line of /proc/net/rpc/nfs has %zu words, expected %d", type, words, 6);
194 rpc_calls = str2ull(procfile_lineword(ff, l, 1));
195 rpc_retransmits = str2ull(procfile_lineword(ff, l, 2));
196 rpc_auth_refresh = str2ull(procfile_lineword(ff, l, 3));
198 unsigned long long sum = rpc_calls + rpc_retransmits + rpc_auth_refresh;
199 if(sum == 0ULL) do_rpc = -1;
202 else if(do_proc2 == 1 && strcmp(type, "proc2") == 0) {
203 // the first number is the count of numbers present
204 // so we start for word 2
206 unsigned long long sum = 0;
208 for(i = 0, j = 2; j < words && nfs_proc2_values[i].name[0] ; i++, j++) {
209 nfs_proc2_values[i].value = str2ull(procfile_lineword(ff, l, j));
210 nfs_proc2_values[i].present = 1;
211 sum += nfs_proc2_values[i].value;
216 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.");
223 else if(do_proc3 == 1 && strcmp(type, "proc3") == 0) {
224 // the first number is the count of numbers present
225 // so we start for word 2
227 unsigned long long sum = 0;
229 for(i = 0, j = 2; j < words && nfs_proc3_values[i].name[0] ; i++, j++) {
230 nfs_proc3_values[i].value = str2ull(procfile_lineword(ff, l, j));
231 nfs_proc3_values[i].present = 1;
232 sum += nfs_proc3_values[i].value;
237 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.");
244 else if(do_proc4 == 1 && strcmp(type, "proc4") == 0) {
245 // the first number is the count of numbers present
246 // so we start for word 2
248 unsigned long long sum = 0;
250 for(i = 0, j = 2; j < words && nfs_proc4_values[i].name[0] ; i++, j++) {
251 nfs_proc4_values[i].value = str2ull(procfile_lineword(ff, l, j));
252 nfs_proc4_values[i].present = 1;
253 sum += nfs_proc4_values[i].value;
258 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.");
269 // --------------------------------------------------------------------
272 st = rrdset_find_bytype_localhost("nfs", "net");
274 st = rrdset_create("nfs", "net", NULL, "network", NULL, "NFS Client Network", "operations/s", 5007, update_every, RRDSET_TYPE_STACKED);
277 rrddim_add(st, "udp", NULL, 1, 1, RRDDIM_ALGORITHM_INCREMENTAL);
278 rrddim_add(st, "tcp", NULL, 1, 1, RRDDIM_ALGORITHM_INCREMENTAL);
280 else rrdset_next(st);
282 // ignore net_count, net_tcp_connections
284 if(net_tcp_connections) {};
286 rrddim_set(st, "udp", net_udp_count);
287 rrddim_set(st, "tcp", net_tcp_count);
291 // --------------------------------------------------------------------
294 st = rrdset_find_bytype_localhost("nfs", "rpc");
296 st = rrdset_create("nfs", "rpc", NULL, "rpc", NULL, "NFS Client Remote Procedure Calls Statistics", "calls/s", 5008, update_every, RRDSET_TYPE_LINE);
299 rrddim_add(st, "calls", NULL, 1, 1, RRDDIM_ALGORITHM_INCREMENTAL);
300 rrddim_add(st, "retransmits", NULL, -1, 1, RRDDIM_ALGORITHM_INCREMENTAL);
301 rrddim_add(st, "auth_refresh", NULL, -1, 1, RRDDIM_ALGORITHM_INCREMENTAL);
303 else rrdset_next(st);
305 rrddim_set(st, "calls", rpc_calls);
306 rrddim_set(st, "retransmits", rpc_retransmits);
307 rrddim_set(st, "auth_refresh", rpc_auth_refresh);
311 // --------------------------------------------------------------------
315 st = rrdset_find_bytype_localhost("nfs", "proc2");
317 st = rrdset_create("nfs", "proc2", NULL, "nfsv2rpc", NULL, "NFS v2 Client Remote Procedure Calls", "calls/s", 5009, update_every, RRDSET_TYPE_STACKED);
319 for(i = 0; nfs_proc2_values[i].present ; i++)
320 rrddim_add(st, nfs_proc2_values[i].name, NULL, 1, 1, RRDDIM_ALGORITHM_INCREMENTAL);
322 else rrdset_next(st);
324 for(i = 0; nfs_proc2_values[i].present ; i++)
325 rrddim_set(st, nfs_proc2_values[i].name, nfs_proc2_values[i].value);
330 // --------------------------------------------------------------------
334 st = rrdset_find_bytype_localhost("nfs", "proc3");
336 st = rrdset_create("nfs", "proc3", NULL, "nfsv3rpc", NULL, "NFS v3 Client Remote Procedure Calls", "calls/s", 5010, update_every, RRDSET_TYPE_STACKED);
338 for(i = 0; nfs_proc3_values[i].present ; i++)
339 rrddim_add(st, nfs_proc3_values[i].name, NULL, 1, 1, RRDDIM_ALGORITHM_INCREMENTAL);
341 else rrdset_next(st);
343 for(i = 0; nfs_proc3_values[i].present ; i++)
344 rrddim_set(st, nfs_proc3_values[i].name, nfs_proc3_values[i].value);
349 // --------------------------------------------------------------------
353 st = rrdset_find_bytype_localhost("nfs", "proc4");
355 st = rrdset_create("nfs", "proc4", NULL, "nfsv4rpc", NULL, "NFS v4 Client Remote Procedure Calls", "calls/s", 5011, update_every, RRDSET_TYPE_STACKED);
357 for(i = 0; nfs_proc4_values[i].present ; i++)
358 rrddim_add(st, nfs_proc4_values[i].name, NULL, 1, 1, RRDDIM_ALGORITHM_INCREMENTAL);
360 else rrdset_next(st);
362 for(i = 0; nfs_proc4_values[i].present ; i++)
363 rrddim_set(st, nfs_proc4_values[i].name, nfs_proc4_values[i].value);