@cryptotaxi247 / netdata-1 / commits / 2638cda46

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));