@cryptotaxi247 / netdata-1 / commits / dc59efa51

Add IPv4 TCP charts to FreeBSD plugin

Vladimir Kobal committed Jan 2, 2017 at 23:15 UTC dc59efa5189042339d7471bde2918bf6a3387dbe
1 file changed +213 -2
src/freebsd_sysctl.c
+213 -2
@@ -18,6 +18,9 @@
18 #define _IFI_OQDROPS // It is for FreeNAS only. Most probably in future releases of FreeNAS it will be removed
19 #include <net/if.h>
20 #include <ifaddrs.h>
21 +// NEEDED BY do_tcp...
22 +#include <netinet/tcp_var.h>
23 +
24 // NEEDED BY: do_disk_io
25 #define RRD_TYPE_DISK "disk"
26
@@ -33,7 +36,9 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
36 static int do_cpu = -1, do_cpu_cores = -1, do_interrupts = -1, do_context = -1, do_forks = -1, do_processes = -1,
37 do_loadavg = -1, do_all_processes = -1, do_disk_io = -1, do_swap = -1, do_ram = -1, do_swapio = -1,
38 do_pgfaults = -1, do_committed = -1, do_ipc_semaphores = -1, do_ipc_shared_mem = -1, do_ipc_msg_queues = -1,
36 - do_dev_intr = -1, do_soft_intr = -1, do_netisr = -1, do_netisr_per_core = -1, do_bandwidth = -1;
39 + do_dev_intr = -1, do_soft_intr = -1, do_netisr = -1, do_netisr_per_core = -1, do_bandwidth = -1,
40 + do_tcp_sockets = -1, do_tcp_packets = -1, do_tcp_errors = -1, do_tcp_handshake = -1,
41 + do_ecn = -1, do_tcpext_syscookies = -1, do_tcpext_ofo = -1, do_tcpext_connaborts = -1;
42
43 if (unlikely(do_cpu == -1)) {
44 do_cpu = config_get_boolean("plugin:freebsd:sysctl", "cpu utilization", 1);
@@ -58,6 +63,14 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
63 do_netisr = config_get_boolean("plugin:freebsd:sysctl", "netisr", 1);
64 do_netisr_per_core = config_get_boolean("plugin:freebsd:sysctl", "netisr per core", 1);
65 do_bandwidth = config_get_boolean("plugin:freebsd:sysctl", "bandwidth", 1);
66 + do_tcp_sockets = config_get_boolean("plugin:freebsd:sysctl", "ipv4 TCP connections", 1);
67 + do_tcp_packets = config_get_boolean("plugin:freebsd:sysctl", "ipv4 TCP packets", 1);
68 + do_tcp_errors = config_get_boolean("plugin:freebsd:sysctl", "ipv4 TCP errors", 1);
69 + do_tcp_handshake = config_get_boolean("plugin:freebsd:sysctl", "ipv4 TCP handshake issues", 1);
70 + do_ecn = config_get_boolean_ondemand("plugin:freebsd:sysctl", "ECN packets", CONFIG_ONDEMAND_ONDEMAND);
71 + do_tcpext_syscookies = config_get_boolean_ondemand("plugin:freebsd:sysctl", "TCP SYN cookies", CONFIG_ONDEMAND_ONDEMAND);
72 + do_tcpext_ofo = config_get_boolean_ondemand("plugin:freebsd:sysctl", "TCP out-of-order queue", CONFIG_ONDEMAND_ONDEMAND);
73 + do_tcpext_connaborts = config_get_boolean_ondemand("plugin:freebsd:sysctl", "TCP connection aborts", CONFIG_ONDEMAND_ONDEMAND);
74 }
75
76 RRDSET *st;
@@ -178,6 +191,10 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
191 u_long ift_obytes;
192 } iftot = {0, 0};
193
194 + // NEEDED BY: do_tcp...
195 + struct tcpstat tcpstat;
196 + uint64_t tcps_states[TCP_NSTATES];
197 +
198 // --------------------------------------------------------------------
199
200 if (last_loadavg_usec <= dt) {
@@ -616,7 +633,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
633 }
634 else rrdset_next(st);
635
619 - rrddim_set(st, "reads", (dstat[i].operations[DEVSTAT_READ] - prev_dstat.operations_read) ?
636 + rrddim_set(st, "reads", (dstat[i].operations[DEVSTAT_READ] - prev_dstat.operations_read) ?
637 (cur_dstat.duration_read_ms - prev_dstat.duration_read_ms) / (dstat[i].operations[DEVSTAT_READ] - prev_dstat.operations_read) : 0);
638 rrddim_set(st, "writes", (dstat[i].operations[DEVSTAT_WRITE] - prev_dstat.operations_write) ?
639 (cur_dstat.duration_write_ms - prev_dstat.duration_write_ms) / (dstat[i].operations[DEVSTAT_WRITE] - prev_dstat.operations_write) : 0);
@@ -1219,5 +1236,199 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
1236 }
1237 }
1238
1239 + // --------------------------------------------------------------------
1240 +
1241 + // see http://net-snmp.sourceforge.net/docs/mibs/tcp.html
1242 + if (likely(do_tcp_sockets)) {
1243 + if (unlikely(GETSYSCTL("net.inet.tcp.states", tcps_states))) {
1244 + do_tcp_sockets = 0;
1245 + error("DISABLED: ipv4.tcpsock");
1246 + } else {
1247 + if (likely(do_tcp_sockets)) {
1248 + st = rrdset_find("ipv4.tcpsock");
1249 + if (unlikely(!st)) {
1250 + st = rrdset_create("ipv4", "tcpsock", NULL, "tcp", NULL, "IPv4 TCP Connections",
1251 + "active connections", 2500, update_every, RRDSET_TYPE_LINE);
1252 +
1253 + rrddim_add(st, "CurrEstab", "connections", 1, 1, RRDDIM_ABSOLUTE);
1254 + } else
1255 + rrdset_next(st);
1256 +
1257 + rrddim_set(st, "CurrEstab", tcps_states[TCPS_ESTABLISHED]);
1258 + rrdset_done(st);
1259 + }
1260 + }
1261 + }
1262 +
1263 + // --------------------------------------------------------------------
1264 +
1265 + // see http://net-snmp.sourceforge.net/docs/mibs/tcp.html
1266 + if (likely(do_tcp_packets || do_tcp_errors || do_tcp_handshake || do_tcpext_connaborts || do_tcpext_ofo || do_tcpext_syscookies || do_ecn)) {
1267 + if (unlikely(GETSYSCTL("net.inet.tcp.stats", tcpstat))){
1268 + do_tcp_packets = 0;
1269 + error("DISABLED: ipv4.tcppackets");
1270 + do_tcp_errors = 0;
1271 + error("DISABLED: ipv4.tcperrors");
1272 + do_tcp_handshake = 0;
1273 + error("DISABLED: ipv4.tcphandshake");
1274 + do_tcpext_connaborts = 0;
1275 + error("DISABLED: ipv4.tcpconnaborts");
1276 + do_tcpext_ofo = 0;
1277 + error("DISABLED: ipv4.tcpofo");
1278 + do_tcpext_syscookies = 0;
1279 + error("DISABLED: ipv4.tcpsyncookies");
1280 + do_ecn = 0;
1281 + error("DISABLED: ipv4.ecnpkts");
1282 + } else {
1283 + if (likely(do_tcp_packets)) {
1284 + st = rrdset_find("ipv4.tcppackets");
1285 + if (unlikely(!st)) {
1286 + st = rrdset_create("ipv4", "tcppackets", NULL, "tcp", NULL, "IPv4 TCP Packets",
1287 + "packets/s",
1288 + 2600, update_every, RRDSET_TYPE_LINE);
1289 +
1290 + rrddim_add(st, "InSegs", "received", 1, 1, RRDDIM_INCREMENTAL);
1291 + rrddim_add(st, "OutSegs", "sent", -1, 1, RRDDIM_INCREMENTAL);
1292 + } else
1293 + rrdset_next(st);
1294 +
1295 + rrddim_set(st, "InSegs", tcpstat.tcps_rcvtotal);
1296 + rrddim_set(st, "OutSegs", tcpstat.tcps_sndtotal);
1297 + rrdset_done(st);
1298 + }
1299 +
1300 + // --------------------------------------------------------------------
1301 +
1302 + if (likely(do_tcp_errors)) {
1303 + st = rrdset_find("ipv4.tcperrors");
1304 + if (unlikely(!st)) {
1305 + st = rrdset_create("ipv4", "tcperrors", NULL, "tcp", NULL, "IPv4 TCP Errors",
1306 + "packets/s",
1307 + 2700, update_every, RRDSET_TYPE_LINE);
1308 + st->isdetail = 1;
1309 +
1310 + rrddim_add(st, "InErrs", NULL, 1, 1, RRDDIM_INCREMENTAL);
1311 + rrddim_add(st, "InCsumErrors", NULL, 1, 1, RRDDIM_INCREMENTAL);
1312 + rrddim_add(st, "RetransSegs", NULL, -1, 1, RRDDIM_INCREMENTAL);
1313 + } else
1314 + rrdset_next(st);
1315 +
1316 + rrddim_set(st, "InErrs", tcpstat.tcps_rcvbadoff + tcpstat.tcps_rcvreassfull + tcpstat.tcps_rcvshort);
1317 + rrddim_set(st, "InCsumErrors", tcpstat.tcps_rcvbadsum);
1318 + rrddim_set(st, "RetransSegs", tcpstat.tcps_sndrexmitpack);
1319 + rrdset_done(st);
1320 + }
1321 +
1322 + // --------------------------------------------------------------------
1323 +
1324 + if (likely(do_tcp_handshake)) {
1325 + st = rrdset_find("ipv4.tcphandshake");
1326 + if (unlikely(!st)) {
1327 + st = rrdset_create("ipv4", "tcphandshake", NULL, "tcp", NULL,
1328 + "IPv4 TCP Handshake Issues",
1329 + "events/s", 2900, update_every, RRDSET_TYPE_LINE);
1330 + st->isdetail = 1;
1331 +
1332 + rrddim_add(st, "EstabResets", NULL, 1, 1, RRDDIM_INCREMENTAL);
1333 + rrddim_add(st, "ActiveOpens", NULL, 1, 1, RRDDIM_INCREMENTAL);
1334 + rrddim_add(st, "PassiveOpens", NULL, 1, 1, RRDDIM_INCREMENTAL);
1335 + rrddim_add(st, "AttemptFails", NULL, 1, 1, RRDDIM_INCREMENTAL);
1336 + } else
1337 + rrdset_next(st);
1338 +
1339 + rrddim_set(st, "EstabResets", tcpstat.tcps_drops);
1340 + rrddim_set(st, "ActiveOpens", tcpstat.tcps_connattempt);
1341 + rrddim_set(st, "PassiveOpens", tcpstat.tcps_accepts);
1342 + rrddim_set(st, "AttemptFails", tcpstat.tcps_conndrops);
1343 + rrdset_done(st);
1344 + }
1345 +
1346 + // --------------------------------------------------------------------
1347 +
1348 + if (do_tcpext_connaborts == CONFIG_ONDEMAND_YES || (do_tcpext_connaborts == CONFIG_ONDEMAND_ONDEMAND && (tcpstat.tcps_rcvpackafterwin || tcpstat.tcps_rcvafterclose || tcpstat.tcps_rcvmemdrop || tcpstat.tcps_persistdrop || tcpstat.tcps_finwait2_drops))) {
1349 + do_tcpext_connaborts = CONFIG_ONDEMAND_YES;
1350 + st = rrdset_find("ipv4.tcpconnaborts");
1351 + if (unlikely(!st)) {
1352 + st = rrdset_create("ipv4", "tcpconnaborts", NULL, "tcp", NULL, "TCP Connection Aborts", "connections/s", 3010, update_every, RRDSET_TYPE_LINE);
1353 +
1354 + rrddim_add(st, "TCPAbortOnData", "baddata", 1, 1, RRDDIM_INCREMENTAL);
1355 + rrddim_add(st, "TCPAbortOnClose", "userclosed", 1, 1, RRDDIM_INCREMENTAL);
1356 + rrddim_add(st, "TCPAbortOnMemory", "nomemory", 1, 1, RRDDIM_INCREMENTAL);
1357 + rrddim_add(st, "TCPAbortOnTimeout", "timeout", 1, 1, RRDDIM_INCREMENTAL);
1358 + rrddim_add(st, "TCPAbortOnLinger", "linger", 1, 1, RRDDIM_INCREMENTAL);
1359 + }
1360 + else rrdset_next(st);
1361 +
1362 + rrddim_set(st, "TCPAbortOnData", tcpstat.tcps_rcvpackafterwin);
1363 + rrddim_set(st, "TCPAbortOnClose", tcpstat.tcps_rcvafterclose);
1364 + rrddim_set(st, "TCPAbortOnMemory", tcpstat.tcps_rcvmemdrop);
1365 + rrddim_set(st, "TCPAbortOnTimeout", tcpstat.tcps_persistdrop);
1366 + rrddim_set(st, "TCPAbortOnLinger", tcpstat.tcps_finwait2_drops);
1367 + rrdset_done(st);
1368 + }
1369 +
1370 + // --------------------------------------------------------------------
1371 +
1372 + if (do_tcpext_ofo == CONFIG_ONDEMAND_YES || (do_tcpext_ofo == CONFIG_ONDEMAND_ONDEMAND && tcpstat.tcps_rcvoopack)) {
1373 + do_tcpext_ofo = CONFIG_ONDEMAND_YES;
1374 + st = rrdset_find("ipv4.tcpofo");
1375 + if (unlikely(!st)) {
1376 + st = rrdset_create("ipv4", "tcpofo", NULL, "tcp", NULL, "TCP Out-Of-Order Queue", "packets/s", 3050, update_every, RRDSET_TYPE_LINE);
1377 +
1378 + rrddim_add(st, "TCPOFOQueue", "inqueue", 1, 1, RRDDIM_INCREMENTAL);
1379 + }
1380 + else rrdset_next(st);
1381 +
1382 + rrddim_set(st, "TCPOFOQueue", tcpstat.tcps_rcvoopack);
1383 + rrdset_done(st);
1384 + }
1385 +
1386 + // --------------------------------------------------------------------
1387 +
1388 + if (do_tcpext_syscookies == CONFIG_ONDEMAND_YES || (do_tcpext_syscookies == CONFIG_ONDEMAND_ONDEMAND && (tcpstat.tcps_sc_sendcookie || tcpstat.tcps_sc_recvcookie || tcpstat.tcps_sc_zonefail))) {
1389 + do_tcpext_syscookies = CONFIG_ONDEMAND_YES;
1390 +
1391 + st = rrdset_find("ipv4.tcpsyncookies");
1392 + if (unlikely(!st)) {
1393 + st = rrdset_create("ipv4", "tcpsyncookies", NULL, "tcp", NULL, "TCP SYN Cookies", "packets/s", 3100, update_every, RRDSET_TYPE_LINE);
1394 +
1395 + rrddim_add(st, "SyncookiesRecv", "received", 1, 1, RRDDIM_INCREMENTAL);
1396 + rrddim_add(st, "SyncookiesSent", "sent", -1, 1, RRDDIM_INCREMENTAL);
1397 + rrddim_add(st, "SyncookiesFailed", "failed", -1, 1, RRDDIM_INCREMENTAL);
1398 + }
1399 + else rrdset_next(st);
1400 +
1401 + rrddim_set(st, "SyncookiesRecv", tcpstat.tcps_sc_recvcookie);
1402 + rrddim_set(st, "SyncookiesSent", tcpstat.tcps_sc_sendcookie);
1403 + rrddim_set(st, "SyncookiesFailed", tcpstat.tcps_sc_zonefail);
1404 + rrdset_done(st);
1405 + }
1406 +
1407 + // --------------------------------------------------------------------
1408 +
1409 + if (do_ecn == CONFIG_ONDEMAND_YES || (do_ecn == CONFIG_ONDEMAND_ONDEMAND && (tcpstat.tcps_ecn_ce || tcpstat.tcps_ecn_ect0 || tcpstat.tcps_ecn_ect1))) {
1410 + do_ecn = CONFIG_ONDEMAND_YES;
1411 + st = rrdset_find("ipv4.ecnpkts");
1412 + if (unlikely(!st)) {
1413 + st = rrdset_create("ipv4", "ecnpkts", NULL, "ecn", NULL, "IPv4 ECN Statistics", "packets/s", 8700, update_every, RRDSET_TYPE_LINE);
1414 + st->isdetail = 1;
1415 +
1416 + rrddim_add(st, "InCEPkts", "CEP", 1, 1, RRDDIM_INCREMENTAL);
1417 + rrddim_add(st, "InNoECTPkts", "NoECTP", -1, 1, RRDDIM_INCREMENTAL);
1418 + rrddim_add(st, "InECT0Pkts", "ECTP0", 1, 1, RRDDIM_INCREMENTAL);
1419 + rrddim_add(st, "InECT1Pkts", "ECTP1", 1, 1, RRDDIM_INCREMENTAL);
1420 + }
1421 + else rrdset_next(st);
1422 +
1423 + rrddim_set(st, "InCEPkts", tcpstat.tcps_ecn_ce);
1424 + rrddim_set(st, "InNoECTPkts", tcpstat.tcps_ecn_ce - (tcpstat.tcps_ecn_ect0 + tcpstat.tcps_ecn_ect1));
1425 + rrddim_set(st, "InECT0Pkts", tcpstat.tcps_ecn_ect0);
1426 + rrddim_set(st, "InECT1Pkts", tcpstat.tcps_ecn_ect1);
1427 + rrdset_done(st);
1428 + }
1429 +
1430 + }
1431 + }
1432 +
1433 return 0;
1434 }