added support for IPv4 statistics, netfilter conntrack, IPVS
Costa Tsaousis (ktsaou) committed
Mar 30, 2014 at 22:26 UTC
2638cda46997f3a7ac90e8a9ed06c3ba70827054
3 files changed
+352
-23
netdata.c
+333
-16
@@ -34,17 +34,23 @@
34
#define RRD_DIMENSION_ABSOLUTE 0
35
#define RRD_DIMENSION_INCREMENTAL 1
36
37
-#define RRD_TYPE_NET "net"
38
-#define RRD_TYPE_NET_LEN strlen(RRD_TYPE_NET)
37
+#define RRD_TYPE_NET "net"
38
+#define RRD_TYPE_NET_LEN strlen(RRD_TYPE_NET)
39
40
-#define RRD_TYPE_TC "tc"
41
-#define RRD_TYPE_TC_LEN strlen(RRD_TYPE_TC)
40
+#define RRD_TYPE_TC "tc"
41
+#define RRD_TYPE_TC_LEN strlen(RRD_TYPE_TC)
42
43
-#define RRD_TYPE_DISK "disk"
44
-#define RRD_TYPE_DISK_LEN strlen(RRD_TYPE_DISK)
43
+#define RRD_TYPE_DISK "disk"
44
+#define RRD_TYPE_DISK_LEN strlen(RRD_TYPE_DISK)
45
46
-#define RRD_TYPE_NET_SNMP "ipv4"
47
-#define RRD_TYPE_NET_SNMP_LEN strlen(RRD_TYPE_NET_SNMP)
46
+#define RRD_TYPE_NET_SNMP "ipv4"
47
+#define RRD_TYPE_NET_SNMP_LEN strlen(RRD_TYPE_NET_SNMP)
48
+
49
+#define RRD_TYPE_NET_STAT_CONNTRACK "conntrack"
50
+#define RRD_TYPE_NET_STAT_CONNTRACK_LEN strlen(RRD_TYPE_NET_STAT_CONNTRACK)
51
+
52
+#define RRD_TYPE_NET_IPVS "ipvs"
53
+#define RRD_TYPE_NET_IPVS_LEN strlen(RRD_TYPE_NET_IPVS)
54
55
#define WEB_PATH_FILE "file"
56
#define WEB_PATH_DATA "data"
@@ -108,6 +114,12 @@
114
#define MAX_PROC_NET_SNMP_LINE 4096
115
#define MAX_PROC_NET_SNMP_NAME 1024
116
117
+#define MAX_PROC_NET_STAT_CONNTRACK_LINE 4096
118
+#define MAX_PROC_NET_STAT_CONNTRACK_NAME 1024
119
+
120
+#define MAX_PROC_NET_IPVS_LINE 4096
121
+#define MAX_PROC_NET_IPVS_NAME 1024
122
+
123
124
int silent = 0;
125
int save_history = HISTORY;
@@ -2030,20 +2042,40 @@ int do_proc_net_snmp() {
2042
if(r != 14) error("Cannot read /proc/net/snmp TCP line. Expected 14 params, read %d.", r);
2043
2044
// see http://net-snmp.sourceforge.net/docs/mibs/tcp.html
2033
- RRD_STATS *st = rrd_stats_find(RRD_TYPE_NET_SNMP ".tcp");
2045
+ RRD_STATS *st = rrd_stats_find(RRD_TYPE_NET_SNMP ".tcpsock");
2046
+ if(!st) {
2047
+ st = rrd_stats_create(RRD_TYPE_NET_SNMP ".tcpsock", RRD_TYPE_NET_SNMP ".tcpsock", save_history, "IPv4 TCP Connections", "Connections", RRD_TYPE_NET_SNMP);
2048
+ if(!st) {
2049
+ error("Cannot create RRD_STATS for %s.", RRD_TYPE_NET_SNMP ".tcpsock");
2050
+ continue;
2051
+ }
2052
+
2053
+ if(!rrd_stats_dimension_add(st, "connections", "connections", sizeof(unsigned long long), 1, 1, RRD_DIMENSION_ABSOLUTE))
2054
+ error("Cannot add RRD_STATS dimension %s.", "connections");
2055
+ }
2056
+ else rrd_stats_next(st);
2057
+
2058
+ rrd_stats_dimension_set(st, "connections", &CurrEstab);
2059
+ rrd_stats_done(st);
2060
+
2061
+ st = rrd_stats_find(RRD_TYPE_NET_SNMP ".tcp");
2062
if(!st) {
2035
- st = rrd_stats_create(RRD_TYPE_NET_SNMP ".tcp", RRD_TYPE_NET_SNMP ".tcp", save_history, "IPv4 TCP Established Sockets", "Established Sockets", RRD_TYPE_NET_SNMP);
2063
+ st = rrd_stats_create(RRD_TYPE_NET_SNMP ".tcp", RRD_TYPE_NET_SNMP ".tcp", save_history, "IPv4 TCP Packets", "Packets/s", RRD_TYPE_NET_SNMP);
2064
if(!st) {
2065
error("Cannot create RRD_STATS for %s.", RRD_TYPE_NET_SNMP ".tcp");
2066
continue;
2067
}
2068
2041
- if(!rrd_stats_dimension_add(st, "established", "established", sizeof(unsigned long long), 1, 1, RRD_DIMENSION_ABSOLUTE))
2042
- error("Cannot add RRD_STATS dimension %s.", "established");
2069
+ if(!rrd_stats_dimension_add(st, "sent", "sent", sizeof(unsigned long long), -1, 1, RRD_DIMENSION_INCREMENTAL))
2070
+ error("Cannot add RRD_STATS dimension %s.", "sent");
2071
+
2072
+ if(!rrd_stats_dimension_add(st, "received", "received", sizeof(unsigned long long), 1, 1, RRD_DIMENSION_INCREMENTAL))
2073
+ error("Cannot add RRD_STATS dimension %s.", "received");
2074
}
2075
else rrd_stats_next(st);
2076
2046
- rrd_stats_dimension_set(st, "established", &CurrEstab);
2077
+ rrd_stats_dimension_set(st, "received", &InSegs);
2078
+ rrd_stats_dimension_set(st, "sent", &OutSegs);
2079
rrd_stats_done(st);
2080
}
2081
else if(strncmp(p, "Udp: ", 5) == 0) {
@@ -2091,6 +2123,280 @@ int do_proc_net_snmp() {
2123
return 0;
2124
}
2125
2126
+// ----------------------------------------------------------------------------
2127
+// /proc/net/netstat processor
2128
+
2129
+int do_proc_net_netstat() {
2130
+ char buffer[MAX_PROC_NET_SNMP_LINE+1] = "";
2131
+
2132
+ FILE *fp = fopen("/proc/net/netstat", "r");
2133
+ if(!fp) {
2134
+ error("Cannot read /proc/net/netstat.");
2135
+ return 1;
2136
+ }
2137
+
2138
+ for(;1;) {
2139
+ char *p = fgets(buffer, MAX_PROC_NET_SNMP_LINE, fp);
2140
+ if(!p) break;
2141
+
2142
+ if(strncmp(p, "IpExt: ", 7) == 0) {
2143
+ // skip the header line, read the data
2144
+ p = fgets(buffer, MAX_PROC_NET_SNMP_LINE, fp);
2145
+ if(!p) break;
2146
+
2147
+ if(strncmp(p, "IpExt: ", 7) != 0) {
2148
+ error("Cannot read IpExt line from /proc/net/netstat.");
2149
+ break;
2150
+ }
2151
+
2152
+ unsigned long long InNoRoutes, InTruncatedPkts, InMcastPkts, OutMcastPkts, InBcastPkts, OutBcastPkts, InOctets, OutOctets, InMcastOctets, OutMcastOctets, InBcastOctets, OutBcastOctets;
2153
+
2154
+ int r = sscanf(&buffer[7], "%llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu\n",
2155
+ &InNoRoutes, &InTruncatedPkts, &InMcastPkts, &OutMcastPkts, &InBcastPkts, &OutBcastPkts, &InOctets, &OutOctets, &InMcastOctets, &OutMcastOctets, &InBcastOctets, &OutBcastOctets);
2156
+
2157
+ if(r == EOF) break;
2158
+ if(r != 12) error("Cannot read /proc/net/netstat IpExt line. Expected 12 params, read %d.", r);
2159
+
2160
+ RRD_STATS *st = rrd_stats_find(RRD_TYPE_NET ".ipv4");
2161
+ if(!st) {
2162
+ st = rrd_stats_create(RRD_TYPE_NET ".ipv4", RRD_TYPE_NET ".ipv4", save_history, "All IPv4 Bandwidth", "bandwidth in kilobits/s", RRD_TYPE_NET);
2163
+ if(!st) {
2164
+ error("Cannot create RRD_STATS for %s.", RRD_TYPE_NET ".ipv4");
2165
+ continue;
2166
+ }
2167
+
2168
+ if(!rrd_stats_dimension_add(st, "sent", "sent", sizeof(unsigned long long), -8, 1024, RRD_DIMENSION_INCREMENTAL))
2169
+ error("Cannot add RRD_STATS dimension %s.", "sent");
2170
+
2171
+ if(!rrd_stats_dimension_add(st, "received", "received", sizeof(unsigned long long), 8, 1024, RRD_DIMENSION_INCREMENTAL))
2172
+ error("Cannot add RRD_STATS dimension %s.", "received");
2173
+
2174
+ }
2175
+ else rrd_stats_next(st);
2176
+
2177
+ rrd_stats_dimension_set(st, "sent", &OutOctets);
2178
+ rrd_stats_dimension_set(st, "received", &InOctets);
2179
+ rrd_stats_done(st);
2180
+ }
2181
+ }
2182
+
2183
+ fclose(fp);
2184
+ return 0;
2185
+}
2186
+
2187
+// ----------------------------------------------------------------------------
2188
+// /proc/net/stat/nf_conntrack processor
2189
+
2190
+int do_proc_net_stat_conntrack() {
2191
+ char buffer[MAX_PROC_NET_STAT_CONNTRACK_LINE+1] = "";
2192
+
2193
+ FILE *fp = fopen("/proc/net/stat/nf_conntrack", "r");
2194
+ if(!fp) {
2195
+ error("Cannot read /proc/net/stat/nf_conntrack.");
2196
+ return 1;
2197
+ }
2198
+
2199
+ // read the discard the header
2200
+ char *p = fgets(buffer, MAX_PROC_NET_STAT_CONNTRACK_LINE, fp);
2201
+
2202
+ unsigned long long aentries = 0, asearched = 0, afound = 0, anew = 0, ainvalid = 0, aignore = 0, adelete = 0, adelete_list = 0,
2203
+ ainsert = 0, ainsert_failed = 0, adrop = 0, aearly_drop = 0, aicmp_error = 0, aexpect_new = 0, aexpect_create = 0, aexpect_delete = 0, asearch_restart = 0;
2204
+
2205
+ for(;1;) {
2206
+ p = fgets(buffer, MAX_PROC_NET_STAT_CONNTRACK_LINE, fp);
2207
+ if(!p) break;
2208
+
2209
+ unsigned long long tentries, tsearched, tfound, tnew, tinvalid, tignore, tdelete, tdelete_list, tinsert, tinsert_failed, tdrop, tearly_drop, ticmp_error, texpect_new, texpect_create, texpect_delete, tsearch_restart;
2210
+
2211
+ int r = sscanf(buffer, "%llx %llx %llx %llx %llx %llx %llx %llx %llx %llx %llx %llx %llx %llx %llx %llx %llx\n",
2212
+ &tentries, &tsearched, &tfound, &tnew, &tinvalid, &tignore, &tdelete, &tdelete_list, &tinsert, &tinsert_failed, &tdrop, &tearly_drop, &ticmp_error, &texpect_new, &texpect_create, &texpect_delete, &tsearch_restart);
2213
+
2214
+ if(r == EOF) break;
2215
+ if(r != 17) error("Cannot read /proc/net/stat/nf_conntrack. Expected 17 params, read %d.", r);
2216
+
2217
+ if(!aentries) aentries = tentries;
2218
+
2219
+ // sum all the cpus together
2220
+ asearched += tsearched;
2221
+ afound += tfound;
2222
+ anew += tnew;
2223
+ ainvalid += tinvalid;
2224
+ aignore += tignore;
2225
+ adelete += tdelete;
2226
+ adelete_list += tdelete_list;
2227
+ ainsert += tinsert;
2228
+ ainsert_failed += tinsert_failed;
2229
+ adrop += tdrop;
2230
+ aearly_drop += tearly_drop;
2231
+ aicmp_error += ticmp_error;
2232
+ aexpect_new += texpect_new;
2233
+ aexpect_create += texpect_create;
2234
+ aexpect_delete += texpect_delete;
2235
+ asearch_restart += tsearch_restart;
2236
+ }
2237
+ fclose(fp);
2238
+
2239
+ RRD_STATS *st = rrd_stats_find(RRD_TYPE_NET_STAT_CONNTRACK ".sockets");
2240
+ if(!st) {
2241
+ st = rrd_stats_create(RRD_TYPE_NET_STAT_CONNTRACK ".sockets", RRD_TYPE_NET_STAT_CONNTRACK ".sockets", save_history, "Netfilter Connections", "Connections", RRD_TYPE_NET_STAT_CONNTRACK);
2242
+ if(!st) {
2243
+ error("Cannot create RRD_STATS for %s.", RRD_TYPE_NET_STAT_CONNTRACK ".sockets");
2244
+ return 1;
2245
+ }
2246
+
2247
+ if(!rrd_stats_dimension_add(st, "connections", "connections", sizeof(unsigned long long), 1, 1, RRD_DIMENSION_ABSOLUTE))
2248
+ error("Cannot add RRD_STATS dimension %s.", "connections");
2249
+ }
2250
+ else rrd_stats_next(st);
2251
+
2252
+ rrd_stats_dimension_set(st, "connections", &aentries);
2253
+ rrd_stats_done(st);
2254
+
2255
+ st = rrd_stats_find(RRD_TYPE_NET_STAT_CONNTRACK ".new");
2256
+ if(!st) {
2257
+ st = rrd_stats_create(RRD_TYPE_NET_STAT_CONNTRACK ".new", RRD_TYPE_NET_STAT_CONNTRACK ".new", save_history, "Netfilter New Connections", "Connections/s", RRD_TYPE_NET_STAT_CONNTRACK);
2258
+ if(!st) {
2259
+ error("Cannot create RRD_STATS for %s.", RRD_TYPE_NET_STAT_CONNTRACK ".new");
2260
+ return 1;
2261
+ }
2262
+
2263
+ if(!rrd_stats_dimension_add(st, "dropped", "dropped", sizeof(unsigned long long), -1, 1, RRD_DIMENSION_INCREMENTAL))
2264
+ error("Cannot add RRD_STATS dimension %s.", "dropped");
2265
+
2266
+ if(!rrd_stats_dimension_add(st, "new", "new", sizeof(unsigned long long), 1, 1, RRD_DIMENSION_INCREMENTAL))
2267
+ error("Cannot add RRD_STATS dimension %s.", "new");
2268
+ }
2269
+ else rrd_stats_next(st);
2270
+
2271
+ rrd_stats_dimension_set(st, "new", &anew);
2272
+ rrd_stats_dimension_set(st, "dropped", &adrop);
2273
+ rrd_stats_done(st);
2274
+
2275
+ st = rrd_stats_find(RRD_TYPE_NET_STAT_CONNTRACK ".changes");
2276
+ if(!st) {
2277
+ st = rrd_stats_create(RRD_TYPE_NET_STAT_CONNTRACK ".changes", RRD_TYPE_NET_STAT_CONNTRACK ".changes", save_history, "Netfilter Connection Changes", "Connections/s", RRD_TYPE_NET_STAT_CONNTRACK);
2278
+ if(!st) {
2279
+ error("Cannot create RRD_STATS for %s.", RRD_TYPE_NET_STAT_CONNTRACK ".changes");
2280
+ return 1;
2281
+ }
2282
+
2283
+ if(!rrd_stats_dimension_add(st, "deleted", "deleted", sizeof(unsigned long long), -1, 1, RRD_DIMENSION_INCREMENTAL))
2284
+ error("Cannot add RRD_STATS dimension %s.", "deleted");
2285
+
2286
+ if(!rrd_stats_dimension_add(st, "inserted", "inserted", sizeof(unsigned long long), 1, 1, RRD_DIMENSION_INCREMENTAL))
2287
+ error("Cannot add RRD_STATS dimension %s.", "inserted");
2288
+ }
2289
+ else rrd_stats_next(st);
2290
+
2291
+ rrd_stats_dimension_set(st, "inserted", &ainsert);
2292
+ rrd_stats_dimension_set(st, "deleted", &adelete);
2293
+ rrd_stats_done(st);
2294
+
2295
+ return 0;
2296
+}
2297
+
2298
+// ----------------------------------------------------------------------------
2299
+// /proc/net/ip_vs_stats processor
2300
+
2301
+int do_proc_net_ip_vs_stats() {
2302
+ char buffer[MAX_PROC_NET_IPVS_LINE+1] = "";
2303
+
2304
+ FILE *fp = fopen("/proc/net/ip_vs_stats", "r");
2305
+ if(!fp) {
2306
+ error("Cannot read /proc/net/ip_vs_stats.");
2307
+ return 1;
2308
+ }
2309
+
2310
+ // read the discard the 2 header lines
2311
+ char *p = fgets(buffer, MAX_PROC_NET_IPVS_LINE, fp);
2312
+ if(!p) {
2313
+ error("Cannot read /proc/net/ip_vs_stats.");
2314
+ return 1;
2315
+ }
2316
+
2317
+ p = fgets(buffer, MAX_PROC_NET_IPVS_LINE, fp);
2318
+ if(!p) {
2319
+ error("Cannot read /proc/net/ip_vs_stats.");
2320
+ return 1;
2321
+ }
2322
+
2323
+ p = fgets(buffer, MAX_PROC_NET_IPVS_LINE, fp);
2324
+ if(!p) {
2325
+ error("Cannot read /proc/net/ip_vs_stats.");
2326
+ return 1;
2327
+ }
2328
+
2329
+ unsigned long long entries, InPackets, OutPackets, InBytes, OutBytes;
2330
+
2331
+ int r = sscanf(buffer, "%llx %llx %llx %llx %llx\n", &entries, &InPackets, &OutPackets, &InBytes, &OutBytes);
2332
+
2333
+ if(r == EOF) {
2334
+ error("Cannot read /proc/net/ip_vs_stats.");
2335
+ return 1;
2336
+ }
2337
+ if(r != 5) error("Cannot read /proc/net/ip_vs_stats. Expected 5 params, read %d.", r);
2338
+
2339
+ fclose(fp);
2340
+
2341
+ RRD_STATS *st = rrd_stats_find(RRD_TYPE_NET_IPVS ".sockets");
2342
+ if(!st) {
2343
+ st = rrd_stats_create(RRD_TYPE_NET_IPVS ".sockets", RRD_TYPE_NET_IPVS ".sockets", save_history, "IPVS Connections", "Connections", RRD_TYPE_NET_IPVS);
2344
+ if(!st) {
2345
+ error("Cannot create RRD_STATS for %s.", RRD_TYPE_NET_IPVS ".sockets");
2346
+ return 1;
2347
+ }
2348
+
2349
+ if(!rrd_stats_dimension_add(st, "connections", "connections", sizeof(unsigned long long), 1, 1, RRD_DIMENSION_ABSOLUTE))
2350
+ error("Cannot add RRD_STATS dimension %s.", "connections");
2351
+ }
2352
+ else rrd_stats_next(st);
2353
+
2354
+ rrd_stats_dimension_set(st, "connections", &entries);
2355
+ rrd_stats_done(st);
2356
+
2357
+ st = rrd_stats_find(RRD_TYPE_NET_IPVS ".packets");
2358
+ if(!st) {
2359
+ st = rrd_stats_create(RRD_TYPE_NET_IPVS ".packets", RRD_TYPE_NET_IPVS ".packets", save_history, "IPVS Packets", "Packets/s", RRD_TYPE_NET_IPVS);
2360
+ if(!st) {
2361
+ error("Cannot create RRD_STATS for %s.", RRD_TYPE_NET_IPVS ".packets");
2362
+ return 1;
2363
+ }
2364
+
2365
+ if(!rrd_stats_dimension_add(st, "sent", "sent", sizeof(unsigned long long), -1, 1, RRD_DIMENSION_INCREMENTAL))
2366
+ error("Cannot add RRD_STATS dimension %s.", "sent");
2367
+
2368
+ if(!rrd_stats_dimension_add(st, "received", "received", sizeof(unsigned long long), 1, 1, RRD_DIMENSION_INCREMENTAL))
2369
+ error("Cannot add RRD_STATS dimension %s.", "received");
2370
+ }
2371
+ else rrd_stats_next(st);
2372
+
2373
+ rrd_stats_dimension_set(st, "received", &InPackets);
2374
+ rrd_stats_dimension_set(st, "sent", &OutPackets);
2375
+ rrd_stats_done(st);
2376
+
2377
+ st = rrd_stats_find(RRD_TYPE_NET_IPVS ".bytes");
2378
+ if(!st) {
2379
+ st = rrd_stats_create(RRD_TYPE_NET_IPVS ".bytes", RRD_TYPE_NET_IPVS ".bytes", save_history, "IPVS Bandwidth", "bandwidth in kilobits/s", RRD_TYPE_NET_IPVS);
2380
+ if(!st) {
2381
+ error("Cannot create RRD_STATS for %s.", RRD_TYPE_NET_IPVS ".bytes");
2382
+ return 1;
2383
+ }
2384
+
2385
+ if(!rrd_stats_dimension_add(st, "sent", "sent", sizeof(unsigned long long), -8, 1024, RRD_DIMENSION_INCREMENTAL))
2386
+ error("Cannot add RRD_STATS dimension %s.", "sent");
2387
+
2388
+ if(!rrd_stats_dimension_add(st, "received", "received", sizeof(unsigned long long), 8, 1024, RRD_DIMENSION_INCREMENTAL))
2389
+ error("Cannot add RRD_STATS dimension %s.", "received");
2390
+ }
2391
+ else rrd_stats_next(st);
2392
+
2393
+ rrd_stats_dimension_set(st, "received", &InBytes);
2394
+ rrd_stats_dimension_set(st, "sent", &OutBytes);
2395
+ rrd_stats_done(st);
2396
+
2397
+ return 0;
2398
+}
2399
+
2400
// ----------------------------------------------------------------------------
2401
// /proc processor
2402
@@ -2101,6 +2407,14 @@ void *proc_main(void *ptr)
2407
gettimeofday(&last, NULL);
2408
last.tv_sec -= update_every;
2409
2410
+ // when ZERO, attempt to do it
2411
+ int vdo_proc_net_dev = 0;
2412
+ int vdo_proc_diskstats = 0;
2413
+ int vdo_proc_net_snmp = 0;
2414
+ int vdo_proc_net_netstat = 0;
2415
+ int vdo_proc_net_stat_conntrack = 0;
2416
+ int vdo_proc_net_ip_vs_stats = 0;
2417
+
2418
for(;1;) {
2419
unsigned long long usec, susec;
2420
gettimeofday(&now, NULL);
@@ -2110,9 +2424,12 @@ void *proc_main(void *ptr)
2424
debug(D_PROCNETDEV_LOOP, "PROCNETDEV: Last full loop took %llu usec.", usec);
2425
2426
// BEGIN -- the job to be done
2113
- do_proc_net_dev(usec);
2114
- do_proc_diskstats(usec);
2115
- do_proc_net_snmp(usec);
2427
+ if(!vdo_proc_net_dev) vdo_proc_net_dev = do_proc_net_dev(usec);
2428
+ if(!vdo_proc_diskstats) vdo_proc_diskstats = do_proc_diskstats(usec);
2429
+ if(!vdo_proc_net_snmp) vdo_proc_net_snmp = do_proc_net_snmp(usec);
2430
+ if(!vdo_proc_net_netstat) vdo_proc_net_netstat = do_proc_net_netstat(usec);
2431
+ if(!vdo_proc_net_stat_conntrack) vdo_proc_net_stat_conntrack = do_proc_net_stat_conntrack(usec);
2432
+ if(!vdo_proc_net_ip_vs_stats) vdo_proc_net_ip_vs_stats = do_proc_net_ip_vs_stats(usec);
2433
// END -- the job is done
2434
2435
// find the time to sleep in order to wait exactly update_every seconds
web/index.html
+17
-5
@@ -51,8 +51,8 @@
51
mainchart.group = 15;
52
mainchart.group_method = "average";
53
}
54
- else if(mainchart.type == "ipv4") {
55
- mainchart.group = 30;
54
+ else if(mainchart.type == "ipv4" || mainchart.type == "conntrack" || mainchart.type == "ipvs") {
55
+ mainchart.group = 15;
56
mainchart.group_method = "max";
57
}
58
@@ -164,7 +164,17 @@
164
}
165
else if(c.type == "ipv4") {
166
c.category = "IPv4 connections"
167
- c.group = 60;
167
+ c.group = 30;
168
+ c.group_method = "max";
169
+ }
170
+ else if(c.type == "conntrack") {
171
+ c.category = "Netfilter Connections Tracked"
172
+ c.group = 30;
173
+ c.group_method = "max";
174
+ }
175
+ else if(c.type == "ipvs") {
176
+ c.category = "IPVS"
177
+ c.group = 30;
178
c.group_method = "max";
179
}
180
else if(c.type == "disk") {
@@ -210,8 +220,10 @@
220
$.each(categories, function(i, a) {
221
if(a.name == "net") a.priority = 1;
222
else if(a.name == "tc") a.priority = 2;
213
- else if(a.name == "ipv4") a.priority = 3;
214
- else if(a.name == "disk") a.priority = 4;
223
+ else if(a.name == "conntrack") a.priority = 3;
224
+ else if(a.name == "ipvs") a.priority = 4;
225
+ else if(a.name == "ipv4") a.priority = 5;
226
+ else if(a.name == "disk") a.priority = 6;
227
else a.priority = 4;
228
229
a.html = "<tr><td><ol class=\"breadcrumb graphs\"><li class=\"active\"><a id=\"" + a.name + "\" href=\"#" + a.name + "\"><b>" + a.title + "</b> " + a.description + " </a></li></ol></td></tr><tr><td><div class=\"thumbgraphs\">" + a.html + "</td></tr>";
web/netdata.js
+2
-2
@@ -48,7 +48,7 @@ function refreshChart(chart) {
48
if(chart.height < 200) options.vAxis.title = null;
49
if(chart.width < 350) options.hAxis.title = null;
50
51
- if(chart.name.substring(0, 5) == "ipv4.") {
51
+ if(chart.name.substring(0, 5) == "ipv4." || chart.name.substring(0, 10) == "conntrack." || chart.name.substring(0, 5) == "ipvs.") {
52
options.lineWidth = 3;
53
options.curveType = 'function';
54
}
@@ -73,7 +73,7 @@ function refreshChart(chart) {
73
// Instantiate and draw our chart, passing in some options.
74
if(!chart.chart) {
75
console.log('Creating new chart for ' + chart.url);
76
- if(chart.name.substring(0, 5) == "ipv4.")
76
+ if(chart.name.substring(0, 5) == "ipv4." || chart.name.substring(0, 10) == "conntrack." || chart.name.substring(0, 5) == "ipvs.")
77
chart.chart = new google.visualization.LineChart(document.getElementById(chart.div));
78
else
79
chart.chart = new google.visualization.AreaChart(document.getElementById(chart.div));