@cryptotaxi247 / netdata-1 / commits / a99257d70

code cleanup

Costa Tsaousis (ktsaou) committed Mar 27, 2014 at 01:55 UTC a99257d70f7a265dda23b896d3064937ff6fce02
3 files changed +161 -117
all.xsl
+1 -1
@@ -12,7 +12,7 @@
12 <!--Load the AJAX API-->
13 <script type="text/javascript" src="https://www.google.com/jsapi"></script>
14 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
15 - <script type="text/javascript" src="/file/netdata.js"></script>
15 + <script type="text/javascript" src="netdata.js"></script>
16 <script type="text/javascript">
17
18 // Set a callback to run when the Google Visualization API is loaded.
netdata.c
+156 -100
@@ -29,7 +29,21 @@
29
30 #include <pthread.h>
31
32 +#define RRD_DIMENSION_ABSOLUTE 0
33 +#define RRD_DIMENSION_INCREMENTAL 1
34
35 +#define RRD_TYPE_NET "net"
36 +#define RRD_TYPE_NET_LEN strlen(RRD_TYPE_NET)
37 +
38 +#define RRD_TYPE_TC "tc"
39 +#define RRD_TYPE_TC_LEN strlen(RRD_TYPE_TC)
40 +
41 +#define RRD_TYPE_DISK "disk"
42 +#define RRD_TYPE_DISK_LEN strlen(RRD_TYPE_DISK)
43 +
44 +#define WEB_PATH_FILE "file"
45 +#define WEB_PATH_DATA "data"
46 +#define WEB_PATH_GRAPH "graph"
47
48 // internal defaults
49 #define UPDATE_EVERY 1
@@ -72,7 +86,7 @@
86 #define MIN_SOCKET_INPUT_DATA 16384
87 #define DEFAULT_DATA_BUFFER 65536
88
75 -#define MAX_HTTP_HEADER_SIZE 1024
89 +#define MAX_HTTP_HEADER_SIZE 8192
90
91 #define MAX_PROC_NET_DEV_LINE 4096
92 #define MAX_PROC_NET_DEV_IFACE_NAME 1024
@@ -289,6 +303,8 @@ struct rrd_dimension {
303 size_t bytes;
304 size_t entries;
305
306 + int type;
307 +
308 long multiplier;
309 long divisor;
310
@@ -311,7 +327,8 @@ struct rrd_stats {
327 char type[RRD_STATS_NAME_MAX + 1];
328
329 size_t entries;
314 - size_t last_entry;
330 + size_t current_entry;
331 + // size_t last_entry;
332
333 time_t last_updated;
334
@@ -330,7 +347,7 @@ RRD_STATS *rrd_stats_create(const char *id, const char *name, unsigned long entr
347
348 debug(D_RRD_STATS, "Creating RRD_STATS for '%s'.", name);
349
333 - st = calloc(sizeof(RRD_STATS), 1);
350 + st = calloc(1, sizeof(RRD_STATS));
351 if(!st) return NULL;
352
353 st->times = calloc(entries, sizeof(struct timeval));
@@ -356,7 +373,8 @@ RRD_STATS *rrd_stats_create(const char *id, const char *name, unsigned long entr
373 st->type[RRD_STATS_NAME_MAX] = '\0';
374
375 st->entries = entries;
359 - st->last_entry = 0;
376 + st->current_entry = 0;
377 + // st->last_entry = 0;
378 st->dimensions = NULL;
379 st->last_updated = time(NULL);
380
@@ -373,19 +391,20 @@ RRD_STATS *rrd_stats_create(const char *id, const char *name, unsigned long entr
391 return(st);
392 }
393
376 -RRD_DIMENSION *rrd_stats_dimension_add(RRD_STATS *st, const char *id, const char *name, size_t bytes, long multiplier, long divisor)
394 +RRD_DIMENSION *rrd_stats_dimension_add(RRD_STATS *st, const char *id, const char *name, size_t bytes, long multiplier, long divisor, int type)
395 {
396 RRD_DIMENSION *rd = NULL;
397
398 debug(D_RRD_STATS, "Adding dimension '%s' (%s) to RRD_STATS '%s' (%s).", name, id, st->name, st->id);
399
382 - rd = calloc(sizeof(RRD_DIMENSION), 1);
400 + rd = calloc(1, sizeof(RRD_DIMENSION));
401 if(!rd) return NULL;
402
403 rd->bytes = bytes;
404 rd->entries = st->entries;
405 rd->multiplier = multiplier;
406 rd->divisor = divisor;
407 + rd->type = type;
408 rd->values = calloc(rd->entries, rd->bytes);
409 if(!rd->values) {
410 error("Cannot allocate %lu entries of %lu bytes each for RRD_DIMENSION.", rd->entries, rd->bytes);
@@ -458,11 +477,12 @@ void rrd_stats_next(RRD_STATS *st)
477
478 pthread_mutex_lock(&st->mutex);
479
461 - // st->last_entry should never be outside the array
480 + // st->current_entry should never be outside the array
481 // or, the parallel threads may end up crashing
463 - st->last_entry = ((st->last_entry + 1) >= st->entries) ? 0 : st->last_entry + 1;
482 + // st->last_entry = st->current_entry;
483 + st->current_entry = ((st->current_entry + 1) >= st->entries) ? 0 : st->current_entry + 1;
484
465 - now = &st->times[st->last_entry];
485 + now = &st->times[st->current_entry];
486 gettimeofday(now, NULL);
487
488 // leave mutex locked
@@ -513,22 +533,22 @@ void rrd_stats_dimension_set(RRD_STATS *st, const char *id, void *data)
533 if(rd->bytes == sizeof(long long)) {
534 long long *dimension = rd->values, *value = data;
535
516 - dimension[st->last_entry] = (*value);
536 + dimension[st->current_entry] = (*value);
537 }
538 else if(rd->bytes == sizeof(long)) {
539 long *dimension = rd->values, *value = data;
540
521 - dimension[st->last_entry] = (*value);
541 + dimension[st->current_entry] = (*value);
542 }
543 else if(rd->bytes == sizeof(int)) {
544 int *dimension = rd->values, *value = data;
545
526 - dimension[st->last_entry] = (*value);
546 + dimension[st->current_entry] = (*value);
547 }
548 else if(rd->bytes == sizeof(char)) {
549 char *dimension = rd->values, *value = data;
550
531 - dimension[st->last_entry] = (*value);
551 + dimension[st->current_entry] = (*value);
552 }
553 else fatal("I don't know how to handle data of length %d bytes.", rd->bytes);
554 }
@@ -554,7 +574,7 @@ size_t rrd_stats_one_xml(RRD_STATS *st, char *buffer, size_t len)
574 return(i);
575 }
576
557 -#define RRD_GRAPH_XML_HEADER "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet type=\"text/xsl\" href=\"/file/all.xsl\"?>\n\n<catalog>\n"
577 +#define RRD_GRAPH_XML_HEADER "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?xml-stylesheet type=\"text/xsl\" href=\"all.xsl\"?>\n\n<catalog>\n"
578 #define RRD_GRAPH_XML_FOOTER "</catalog>\n"
579
580 size_t rrd_stats_graph_xml(RRD_STATS *st, char *buffer, size_t len)
@@ -592,7 +612,7 @@ size_t rrd_stats_json(RRD_STATS *st, char *b, size_t length, size_t entries_to_s
612 size_t i = 0; // the bytes of JSON output we have generated so far
613 size_t printed = 0; // the lines of JSON data we have generated so far
614
595 - size_t last_entry = st->last_entry;
615 + size_t current_entry = st->current_entry;
616 size_t t, lt; // t = the current entry, lt = the lest entry of data
617 long count = st->entries; // count down of the entries examined so far
618 int pad = 0; // align the entries when grouping values together
@@ -602,7 +622,6 @@ size_t rrd_stats_json(RRD_STATS *st, char *b, size_t length, size_t entries_to_s
622 size_t dimensions = 0; // the total number of dimensions present
623
624 unsigned long long usec = 0;// usec between the entries
605 - long long value; // temp variable for storing data values
625 char dtm[201]; // temp variable for storing dates
626
627 // find how many dimensions we have
@@ -629,13 +648,13 @@ size_t rrd_stats_json(RRD_STATS *st, char *b, size_t length, size_t entries_to_s
648 i += sprintf(&b[i], " ],\n \"rows\":\n [\n");
649
650 // to allow grouping on the same values, we need a pad
632 - pad = last_entry % group_count;
651 + pad = current_entry % group_count;
652
634 - // make sure last_entry is within limits
635 - if(last_entry < 0 || last_entry >= st->entries) last_entry = 0;
653 + // make sure current_entry is within limits
654 + if(current_entry < 0 || current_entry >= st->entries) current_entry = 0;
655
656 // find the old entry of the round-robin
638 - t = last_entry + 1;
657 + t = current_entry + 1;
658 if(t >= st->entries) t = 0;
659 lt = t;
660
@@ -645,7 +664,7 @@ size_t rrd_stats_json(RRD_STATS *st, char *b, size_t length, size_t entries_to_s
664
665 // the loop in dimension data
666 count -= 2;
648 - for ( ; t != last_entry && count >= 0 ; lt = t++, count--) {
667 + for ( ; t != current_entry && count >= 0 ; lt = t++, count--) {
668 if(t >= st->entries) t = 0;
669
670 // if the last is empty, loop again
@@ -679,27 +698,43 @@ size_t rrd_stats_json(RRD_STATS *st, char *b, size_t length, size_t entries_to_s
698 }
699
700 for( rd = st->dimensions, c = 0 ; rd && c < dimensions ; rd = rd->next, c++) {
701 + long long oldvalue, value; // temp variable for storing data values
702 +
703 if(rd->bytes == sizeof(long long)) {
704 long long *dimension = rd->values;
684 - value = dimension[t] - dimension[lt];
705 + value = dimension[t];
706 + oldvalue = dimension[lt];
707 }
708 else if(rd->bytes == sizeof(long)) {
709 long *dimension = rd->values;
688 - value = dimension[t] - dimension[lt];
710 + value = dimension[t];
711 + oldvalue = dimension[lt];
712 }
713 else if(rd->bytes == sizeof(int)) {
714 int *dimension = rd->values;
692 - value = dimension[t] - dimension[lt];
715 + value = dimension[t];
716 + oldvalue = dimension[lt];
717 }
718 else if(rd->bytes == sizeof(char)) {
719 char *dimension = rd->values;
696 - value = dimension[t] - dimension[lt];
720 + value = dimension[t];
721 + oldvalue = dimension[lt];
722 }
723 else fatal("Cannot produce JSON for size %d bytes dimension.", rd->bytes);
724
700 - value = value * 1000000L / usec;
725 + switch(rd->type) {
726 + case RRD_DIMENSION_INCREMENTAL:
727 + value -= oldvalue;
728 + value = value * 1000000L / usec;
729 + break;
730 +
731 + default:
732 + break;
733 + }
734 +
735 value = value * rd->multiplier / rd->divisor;
736
737 + group_counts[c]++;
738 switch(group_method) {
739 case GROUP_MAX:
740 if(abs(value) > abs(group_values[c])) group_values[c] = value;
@@ -708,15 +743,12 @@ size_t rrd_stats_json(RRD_STATS *st, char *b, size_t length, size_t entries_to_s
743 default:
744 case GROUP_AVERAGE:
745 group_values[c] += value;
746 + if(((count-pad) % group_count) == 0) group_values[c] /= group_counts[c];
747 break;
748 }
713 - group_counts[c]++;
749
750 if(((count-pad) % group_count) == 0) {
716 - if(group_method == GROUP_AVERAGE) group_values[c] /= group_counts[c];
717 -
751 i += sprintf(&b[i], "{\"v\":%lld}%s", group_values[c], rd->next?",":"");
719 -
752 group_values[c] = group_counts[c] = 0;
753 }
754 }
@@ -809,6 +841,8 @@ struct web_client {
841 int wait_receive;
842 int wait_send;
843
844 + char response_header[MAX_HTTP_HEADER_SIZE+1];
845 +
846 struct web_client *prev;
847 struct web_client *next;
848 } *web_clients = NULL;
@@ -884,52 +918,60 @@ int mysendfile(struct web_client *w, char *filename)
918 {
919 debug(D_WEB_CLIENT, "%llu: Looking for file '%s'...", w->id, filename);
920
887 - if(filename[0] == '/') filename = &filename[1];
888 - if(strncmp(filename, "data/", 5) == 0) filename = &filename[5];
889 - else if(strncmp(filename, "graph/", 5) == 0) filename = &filename[6];
890 - else if(strncmp(filename, "file/", 5) == 0) filename = &filename[5];
921 + // skip leading slashes
922 + while (filename[0] == '/') filename = &filename[1];
923
924 + // if the filename contain known paths, skip them
925 + if(strncmp(filename, WEB_PATH_DATA "/", strlen(WEB_PATH_DATA) + 1) == 0) filename = &filename[strlen(WEB_PATH_DATA) + 1];
926 + else if(strncmp(filename, WEB_PATH_GRAPH "/", strlen(WEB_PATH_GRAPH) + 1) == 0) filename = &filename[strlen(WEB_PATH_GRAPH) + 1];
927 + else if(strncmp(filename, WEB_PATH_FILE "/", strlen(WEB_PATH_FILE) + 1) == 0) filename = &filename[strlen(WEB_PATH_FILE) + 1];
928 +
929 + // if the filename contains a / or a .., refuse to serve it
930 if(strstr(filename, "/") != 0 || strstr(filename, "..") != 0) {
931 debug(D_WEB_CLIENT_ACCESS, "%llu: File '%s' is not acceptable.", w->id, filename);
894 - w->data->bytes = sprintf(w->data->buffer, "File '%s' is not acceptable. Filenames cannot contain / or ..", filename);
895 - return 404;
932 + w->data->bytes = sprintf(w->data->buffer, "File '%s' cannot be served. Filenames cannot contain / or ..", filename);
933 + return 400;
934 }
935
936 // check if the file exists
937 struct stat stat;
938 if(lstat(filename, &stat) != 0) {
939 debug(D_WEB_CLIENT_ACCESS, "%llu: File '%s' is not found.", w->id, filename);
902 - w->data->bytes = sprintf(w->data->buffer, "File '%s' is not found.", filename);
940 + w->data->bytes = sprintf(w->data->buffer, "File '%s' does not exist, or is not accessible.", filename);
941 return 404;
942 }
943
944 + // check if the file is owned by us
945 if(stat.st_uid != getuid() && stat.st_uid != geteuid()) {
946 debug(D_WEB_CLIENT_ACCESS, "%llu: File '%s' is not mine.", w->id, filename);
908 - w->data->bytes = sprintf(w->data->buffer, "File '%s' is not mine.", filename);
909 - return 404;
947 + w->data->bytes = sprintf(w->data->buffer, "Access to file '%s' is not permitted.", filename);
948 + return 403;
949 }
950
912 - int failcount = 0;
913 - while(failcount < 100) {
914 - w->ifd = open(filename, O_NONBLOCK, O_RDONLY);
915 - if(w->ifd != -1 || (errno != EBUSY && errno != EAGAIN)) break;
916 - failcount++;
917 - error("%llu: file '%s' is busy, trying again...", w->id, filename);
918 - usleep(500);
919 - }
920 - if(w->ifd < 0) {
921 - error("%llu: Cannot open file '%s'.", w->id, filename);
922 - w->data->bytes = sprintf(w->data->buffer, "Cannot open file '%s'.", filename);
951 + // open the file
952 + w->ifd = open(filename, O_NONBLOCK, O_RDONLY);
953 + if(w->ifd == -1) {
954 w->ifd = w->ofd;
924 - return 404;
955 +
956 + if(errno == EBUSY || errno == EAGAIN) {
957 + error("%llu: File '%s' is busy, sending 307 Moved Temporarily to force retry.", w->id, filename);
958 + sprintf(w->response_header, "Location: %s\r\n", filename);
959 + w->data->bytes = sprintf(w->data->buffer, "The file '%s' is currently busy. Please try again later.", filename);
960 + return 307;
961 + }
962 + else {
963 + error("%llu: Cannot open file '%s'.", w->id, filename);
964 + w->data->bytes = sprintf(w->data->buffer, "Cannot open file '%s'.", filename);
965 + return 404;
966 + }
967 }
968
969 // pick a Content-Type for the file
970 if(strstr(filename, ".html") != NULL) w->data->contenttype = CT_TEXT_HTML;
929 - else if(strstr(filename, ".js") != NULL) w->data->contenttype = CT_APPLICATION_X_JAVASCRIPT;
930 - else if(strstr(filename, ".css") != NULL) w->data->contenttype = CT_TEXT_CSS;
931 - else if(strstr(filename, ".xml") != NULL) w->data->contenttype = CT_TEXT_XML;
932 - else if(strstr(filename, ".xsl") != NULL) w->data->contenttype = CT_TEXT_XSL;
971 + else if(strstr(filename, ".js") != NULL) w->data->contenttype = CT_APPLICATION_X_JAVASCRIPT;
972 + else if(strstr(filename, ".css") != NULL) w->data->contenttype = CT_TEXT_CSS;
973 + else if(strstr(filename, ".xml") != NULL) w->data->contenttype = CT_TEXT_XML;
974 + else if(strstr(filename, ".xsl") != NULL) w->data->contenttype = CT_TEXT_XSL;
975
976 debug(D_WEB_CLIENT_ACCESS, "%llu: Sending file '%s' (%ld bytes, ifd %d, ofd %d).", w->id, filename, stat.st_size, w->ifd, w->ofd);
977
@@ -940,6 +982,7 @@ int mysendfile(struct web_client *w, char *filename)
982 w->data->buffer[0] = '\0';
983 w->data->rbytes = stat.st_size;
984 w->data->date = stat.st_mtim.tv_sec;
985 +
986 return 200;
987 }
988
@@ -978,6 +1021,7 @@ void web_client_process(struct web_client *w)
1021 // check if we have an empty line (end of HTTP header)
1022 if(!strstr(w->data->buffer, "\r\n\r\n")) return;
1023
1024 + w->response_header[0] = '\0';
1025 w->data->date = time(NULL);
1026 w->wait_receive = 0;
1027 w->data->sent = 0;
@@ -1006,23 +1050,23 @@ void web_client_process(struct web_client *w)
1050 }
1051
1052 if(url) {
1009 - tok = mystrsep(&url, "/?");
1053 + tok = mystrsep(&url, "/?&");
1054
1055 debug(D_WEB_CLIENT, "%llu: Processing command '%s'.", w->id, tok);
1056
1013 - if(strcmp(tok, "data") == 0) {
1057 + if(strcmp(tok, WEB_PATH_DATA) == 0) { // "data"
1058 // the client is requesting rrd data
1059
1060 // get the name of the data to show
1017 - tok = mystrsep(&url, "/?");
1061 + tok = mystrsep(&url, "/?&");
1062 debug(D_WEB_CLIENT, "%llu: Searching for RRD data with name '%s'.", w->id, tok);
1063
1064 // do we have such a data set?
1065 RRD_STATS *st = rrd_stats_find_byname(tok);
1066 if(!st) {
1067 // we don't have it
1024 - code = 404;
1025 - w->data->bytes = sprintf(w->data->buffer, "There are not statistics for '%s'\r\n", tok);
1068 + // try to send a file with that name
1069 + code = mysendfile(w, tok);
1070 }
1071 else {
1072 // we have it
@@ -1035,20 +1079,20 @@ void web_client_process(struct web_client *w)
1079
1080 if(url) {
1081 // parse the lines required
1038 - tok = mystrsep(&url, "/?");
1082 + tok = mystrsep(&url, "/?&");
1083 if(tok) lines = atoi(tok);
1084 if(lines < 5) lines = save_history;
1085 }
1086 if(url) {
1087 // parse the group count required
1044 - tok = mystrsep(&url, "/?");
1088 + tok = mystrsep(&url, "/?&");
1089 if(tok) group_count = atoi(tok);
1090 if(group_count < 1) group_count = 1;
1091 if(group_count > save_history / 20) group_count = save_history / 20;
1092 }
1093 if(url) {
1094 // parse the grouping method required
1051 - tok = mystrsep(&url, "/?");
1095 + tok = mystrsep(&url, "/?&");
1096 if(strcmp(tok, "max") == 0) group_method = GROUP_MAX;
1097 else if(strcmp(tok, "average") == 0) group_method = GROUP_AVERAGE;
1098 else debug(D_WEB_CLIENT, "%llu: Unknown group method '%s'", w->id, tok);
@@ -1061,19 +1105,19 @@ void web_client_process(struct web_client *w)
1105 w->data->bytes = rrd_stats_json(st, w->data->buffer, w->data->size, lines, group_count, group_method);
1106 }
1107 }
1064 - else if(strcmp(tok, "graph") == 0) {
1108 + else if(strcmp(tok, WEB_PATH_GRAPH) == 0) { // "graph"
1109 // the client is requesting an rrd graph
1110
1111 // get the name of the data to show
1068 - tok = mystrsep(&url, "/?");
1112 + tok = mystrsep(&url, "/?&");
1113 debug(D_WEB_CLIENT, "%llu: Searching for RRD data with name '%s'.", w->id, tok);
1114
1115 // do we have such a data set?
1116 RRD_STATS *st = rrd_stats_find_byname(tok);
1117 if(!st) {
1118 // we don't have it
1075 - code = 404;
1076 - w->data->bytes = sprintf(w->data->buffer, "There are not statistics for '%s'\r\n", tok);
1119 + // try to send a file with that name
1120 + code = mysendfile(w, tok);
1121 }
1122 else {
1123 code = 200;
@@ -1107,12 +1151,9 @@ void web_client_process(struct web_client *w)
1151 w->data->contenttype = CT_TEXT_XML;
1152 w->data->bytes = rrd_stats_all_xml(w->data->buffer, w->data->size);
1153 }
1110 - else if(strcmp(tok, "file") == 0) {
1154 + else if(strcmp(tok, WEB_PATH_FILE) == 0) { // "file"
1155 code = mysendfile(w, url);
1156 }
1113 - else if(strcmp(tok, "favicon.ico") == 0) {
1114 - code = mysendfile(w, "favicon.ico");
1115 - }
1157 else if(!tok[0]) {
1158 code = mysendfile(w, "index.html");
1159 }
@@ -1173,6 +1214,18 @@ void web_client_process(struct web_client *w)
1214 code_msg = "OK";
1215 break;
1216
1217 + case 307:
1218 + code_msg = "Temporary Redirect";
1219 + break;
1220 +
1221 + case 400:
1222 + code_msg = "Bad Request";
1223 + break;
1224 +
1225 + case 403:
1226 + code_msg = "Forbidden";
1227 + break;
1228 +
1229 case 404:
1230 code_msg = "Not Found";
1231 break;
@@ -1186,9 +1239,8 @@ void web_client_process(struct web_client *w)
1239 struct tm tm = *gmtime(&w->data->date);
1240 strftime(date, sizeof(date), "%a, %d %b %Y %H:%M:%S %Z", &tm);
1241
1189 - char header[MAX_HTTP_HEADER_SIZE+1] = "";
1190 - size_t headerlen = 0;
1191 - headerlen += sprintf(&header[headerlen],
1242 + size_t headerlen = strlen(w->response_header);
1243 + headerlen += sprintf(&w->response_header[headerlen],
1244 "HTTP/1.1 %d %s\r\n"
1245 "Connection: %s\r\n"
1246 "Server: Data Collector HTTP Server\r\n"
@@ -1202,7 +1254,7 @@ void web_client_process(struct web_client *w)
1254 );
1255
1256 if(w->mode == WEB_CLIENT_MODE_NORMAL) {
1205 - headerlen += sprintf(&header[headerlen],
1257 + headerlen += sprintf(&w->response_header[headerlen],
1258 "Expires: %s\r\n"
1259 "Cache-Control: private\r\n"
1260 , date
@@ -1211,13 +1263,13 @@ void web_client_process(struct web_client *w)
1263
1264 // if we know the content length, put it
1265 if(w->data->bytes || w->data->rbytes)
1214 - headerlen += sprintf(&header[headerlen],
1266 + headerlen += sprintf(&w->response_header[headerlen],
1267 "Content-Length: %ld\r\n"
1268 , w->data->bytes?w->data->bytes:w->data->rbytes
1269 );
1270 else w->keepalive = 0; // content-length is required for keep-alive
1271
1220 - headerlen += sprintf(&header[headerlen], "\r\n");
1272 + headerlen += sprintf(&w->response_header[headerlen], "\r\n");
1273
1274 // disable TCP_NODELAY, to buffer the header
1275 int flag = 0;
@@ -1226,7 +1278,7 @@ void web_client_process(struct web_client *w)
1278 // sent the HTTP header
1279 debug(D_WEB_CLIENT, "%llu: Sending response HTTP header of size %d.", w->id, headerlen);
1280
1229 - bytes = send(w->ofd, header, headerlen, 0);
1281 + bytes = send(w->ofd, w->response_header, headerlen, 0);
1282 if(bytes != headerlen)
1283 error("%llu: HTTP Header failed to be sent (I sent %d bytes but the system sent %d bytes).", w->id, headerlen, bytes);
1284
@@ -1506,7 +1558,7 @@ void *socket_listen_main(void *ptr)
1558
1559 int do_proc_net_dev() {
1560 char buffer[MAX_PROC_NET_DEV_LINE+1] = "";
1509 - char name[MAX_PROC_NET_DEV_IFACE_NAME + 1] = "net.";
1561 + char name[MAX_PROC_NET_DEV_IFACE_NAME + 1] = RRD_TYPE_NET ".";
1562 unsigned long long rbytes, rpackets, rerrors, rdrops, rfifo, rframe, rcompressed, rmulticast;
1563 unsigned long long tbytes, tpackets, terrors, tdrops, tfifo, tcollisions, tcarrier, tcompressed;
1564
@@ -1534,7 +1586,7 @@ int do_proc_net_dev() {
1586
1587 // if(DEBUG) printf("%s\n", buffer);
1588 r = sscanf(buffer, "%s\t%llu\t%llu\t%llu\t%llu\t%llu\t%llu\t%llu\t%llu\t%llu\t%llu\t%llu\t%llu\t%llu\t%llu\t%llu\t%llu\n",
1537 - &name[4],
1589 + &name[RRD_TYPE_NET_LEN + 1],
1590 &rbytes, &rpackets, &rerrors, &rdrops, &rfifo, &rframe, &rcompressed, &rmulticast,
1591 &tbytes, &tpackets, &terrors, &tdrops, &tfifo, &tcollisions, &tcarrier, &tcompressed);
1592 if(r == EOF) break;
@@ -1543,16 +1595,16 @@ int do_proc_net_dev() {
1595 RRD_STATS *st = rrd_stats_find(name);
1596
1597 if(!st) {
1546 - st = rrd_stats_create(name, name, save_history, "Network usage for ", "Bandwidth in kilobits/s", "net");
1598 + st = rrd_stats_create(name, name, save_history, "Network usage for ", "Bandwidth in kilobits/s", RRD_TYPE_NET);
1599 if(!st) {
1600 error("Cannot create RRD_STATS for interface %s.", name);
1601 continue;
1602 }
1603
1552 - if(!rrd_stats_dimension_add(st, "sent", "sent", sizeof(unsigned long long), -8, 1024))
1604 + if(!rrd_stats_dimension_add(st, "sent", "sent", sizeof(unsigned long long), -8, 1024, RRD_DIMENSION_INCREMENTAL))
1605 error("Cannot add RRD_STATS dimension %s.", "sent");
1606
1555 - if(!rrd_stats_dimension_add(st, "received", "received", sizeof(unsigned long long), 8, 1024))
1607 + if(!rrd_stats_dimension_add(st, "received", "received", sizeof(unsigned long long), 8, 1024, RRD_DIMENSION_INCREMENTAL))
1608 error("Cannot add RRD_STATS dimension %s.", "received");
1609
1610 }
@@ -1573,7 +1625,7 @@ int do_proc_net_dev() {
1625
1626 int do_proc_diskstats() {
1627 char buffer[MAX_PROC_DISKSTATS_LINE+1] = "";
1576 - char name[MAX_PROC_DISKSTATS_DISK_NAME + 1] = "disk.";
1628 + char name[MAX_PROC_DISKSTATS_DISK_NAME + 1] = RRD_TYPE_DISK ".";
1629 // 1 2 3 4 5 6 7 8 9 10 11
1630 unsigned long long major, minor, reads, reads_merged, readsectors, readms, writes, writes_merged, writesectors, writems, currentios, iosms, wiosms;
1631
@@ -1592,7 +1644,7 @@ int do_proc_diskstats() {
1644
1645 // if(DEBUG) printf("%s\n", buffer);
1646 r = sscanf(buffer, "%llu %llu %s %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu\n",
1595 - &major, &minor, &name[5],
1647 + &major, &minor, &name[RRD_TYPE_DISK_LEN + 1],
1648 &reads, &reads_merged, &readsectors, &readms, &writes, &writes_merged, &writesectors, &writems, &currentios, &iosms, &wiosms
1649 );
1650 if(r == EOF) break;
@@ -1625,7 +1677,7 @@ int do_proc_diskstats() {
1677 char ssfilename[FILENAME_MAX + 1];
1678 int sector_size = 512;
1679
1628 - sprintf(ssfilename, "/sys/block/%s/queue/hw_sector_size", &name[5]);
1680 + sprintf(ssfilename, "/sys/block/%s/queue/hw_sector_size", &name[RRD_TYPE_DISK_LEN + 1]);
1681 FILE *fpss = fopen(ssfilename, "r");
1682 if(fpss) {
1683 char ssbuffer[1025];
@@ -1644,16 +1696,16 @@ int do_proc_diskstats() {
1696 }
1697 else error("Cannot read sector size for device %s from %s. Assuming 512.", name, ssfilename);
1698
1647 - st = rrd_stats_create(name, name, save_history, "Disk usage for ", "I/O in kilobytes/s", "disk");
1699 + st = rrd_stats_create(name, name, save_history, "Disk usage for ", "I/O in kilobytes/s", RRD_TYPE_DISK);
1700 if(!st) {
1701 error("Cannot create RRD_STATS for disk %s.", name);
1702 continue;
1703 }
1704
1653 - if(!rrd_stats_dimension_add(st, "writes", "writes", sizeof(unsigned long long), sector_size * -1, 1024))
1705 + if(!rrd_stats_dimension_add(st, "writes", "writes", sizeof(unsigned long long), sector_size * -1, 1024, RRD_DIMENSION_INCREMENTAL))
1706 error("Cannot add RRD_STATS dimension %s.", "writes");
1707
1656 - if(!rrd_stats_dimension_add(st, "reads", "reads", sizeof(unsigned long long), sector_size, 1024))
1708 + if(!rrd_stats_dimension_add(st, "reads", "reads", sizeof(unsigned long long), sector_size, 1024, RRD_DIMENSION_INCREMENTAL))
1709 error("Cannot add RRD_STATS dimension %s.", "reads");
1710
1711 }
@@ -1775,7 +1827,7 @@ void tc_device_commit(struct tc_device *d)
1827
1828 RRD_STATS *st = rrd_stats_find(d->id);
1829 if(!st) {
1778 - st = rrd_stats_create(d->id, d->name, save_history, "Class usage for ", "Bandwidth in kilobits/s", "tc");
1830 + st = rrd_stats_create(d->id, d->name, save_history, "Class usage for ", "Bandwidth in kilobits/s", RRD_TYPE_TC);
1831 if(!st) {
1832 error("Cannot create RRD_STATS for interface %s.", d->name);
1833 return;
@@ -1783,7 +1835,7 @@ void tc_device_commit(struct tc_device *d)
1835
1836 for ( c = d->classes ; c ; c = c->next) {
1837 if(c->isleaf && c->hasparent) {
1786 - if(!rrd_stats_dimension_add(st, c->id, c->name, sizeof(unsigned long long), 8, 1024))
1838 + if(!rrd_stats_dimension_add(st, c->id, c->name, sizeof(unsigned long long), 8, 1024, RRD_DIMENSION_INCREMENTAL))
1839 error("Cannot add RRD_STATS dimension %s.", c->name);
1840 }
1841 }
@@ -1811,8 +1863,8 @@ void tc_device_set_class_name(struct tc_device *d, char *id, char *name)
1863
1864 void tc_device_set_device_name(struct tc_device *d, char *name)
1865 {
1814 - strcpy(d->name, "tc.");
1815 - strncpy(&d->name[3], name, RRD_STATS_NAME_MAX - 3);
1866 + strcpy(d->name, RRD_TYPE_TC ".");
1867 + strncpy(&d->name[RRD_TYPE_TC_LEN + 1], name, RRD_STATS_NAME_MAX - 3);
1868 d->name[RRD_STATS_NAME_MAX] = '\0';
1869 }
1870
@@ -1820,11 +1872,11 @@ struct tc_device *tc_device_create(char *name)
1872 {
1873 struct tc_device *d;
1874
1823 - d = calloc(sizeof(struct tc_device), 1);
1875 + d = calloc(1, sizeof(struct tc_device));
1876 if(!d) return NULL;
1877
1826 - strcpy(d->name, "tc.");
1827 - strncpy(&d->name[3], name, RRD_STATS_NAME_MAX - 3);
1878 + strcpy(d->name, RRD_TYPE_TC ".");
1879 + strncpy(&d->name[RRD_TYPE_TC_LEN + 1], name, RRD_STATS_NAME_MAX - 3);
1880 d->name[RRD_STATS_NAME_MAX] = '\0';
1881
1882 strcpy(d->id, d->name);
@@ -1836,7 +1888,7 @@ struct tc_class *tc_class_add(struct tc_device *n, char *id, char *parentid)
1888 {
1889 struct tc_class *c;
1890
1839 - c = calloc(sizeof(struct tc_class), 1);
1891 + c = calloc(1, sizeof(struct tc_class));
1892 if(!c) return NULL;
1893
1894 c->next = n->classes;
@@ -1924,11 +1976,15 @@ void *tc_main(void *ptr)
1976 if(name && *name) tc_device_set_device_name(device, name);
1977 }
1978 else if(device && (strcmp(p, "SETCLASSNAME") == 0)) {
1927 - char *name = strsep(&b, " |\n");
1928 - char *path = strsep(&b, " |\n");
1929 - char *id = strsep(&b, " |\n");
1979 + char *name = strsep(&b, " |\n");
1980 + char *path = strsep(&b, " |\n");
1981 + char *id = strsep(&b, " |\n");
1982 char *qdisc = strsep(&b, " |\n");
1983 if(id && *id && path && *path) tc_device_set_class_name(device, id, path);
1984 +
1985 + // prevent unused variables warning
1986 + if(qdisc) qdisc = NULL;
1987 + if(name) name = NULL;
1988 }
1989 else if((strcmp(p, "MYPID") == 0)) {
1990 char *id = strsep(&b, " \n");
netdata.start
+4 -16
@@ -181,32 +181,20 @@ EOF2
181 fi
182 done
183
184 -ref=$[4 * NETDATA_CONFIG_UPDATE_EVERY]
185 -tim=$[1000 * NETDATA_CONFIG_UPDATE_EVERY]
186 -if [ $count -gt 4 ]
187 -then
188 - ref=1
189 - tim=$[1000 * NETDATA_CONFIG_UPDATE_EVERY / count]
190 - if [ $tim -lt $[200 * NETDATA_CONFIG_UPDATE_EVERY] ]
191 - then
192 - tim=$[200 * NETDATA_CONFIG_UPDATE_EVERY]
193 - fi
194 -fi
195 -
184 cat >>${data}/index.html <<EOF3
185 refreshCharts(999999);
186 }
187
188 var refreshCount = 0;
189 function myChartsRefresh() {
202 - refreshCount += $ref;
190 + refreshCount += 2;
191 if(refreshCount > $NETDATA_CONFIG_RELOAD_EVERY) location.reload();
192
205 - // refresh up to $ref charts per second
206 - refreshCharts($ref);
193 + // refresh up to 2 charts per second
194 + refreshCharts(2);
195 }
196
209 - setInterval(myChartsRefresh, $tim);
197 + setInterval(myChartsRefresh, 1000);
198
199 //window.onresize = function(event) {
200 // refreshCharts(999999);