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, ¤tios, &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);