]> arthur.barton.de Git - netdata.git/commitdiff
support for non-interpolated dimensions for both incremental and absolute values...
authorCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Mon, 19 May 2014 21:57:07 +0000 (00:57 +0300)
committerCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Mon, 19 May 2014 21:57:07 +0000 (00:57 +0300)
apps_plugin.c
charts.d/squid.chart.sh
netdata.c
web/netdata.js

index 6afc984347c543f13a2ee92849e079510dc66e7c..bfe8b8aa48d2bd0cb2699ae47944c538185d6ce7 100755 (executable)
@@ -1048,14 +1048,14 @@ void show_charts(void)
        for (w = target_root; w ; w = w->next) {
                if(w->target || (!w->processes && !w->exposed)) continue;
 
-               fprintf(stdout, "DIMENSION %s '' absolute-last-value 1 1\n", w->name);
+               fprintf(stdout, "DIMENSION %s '' absolute-no-interpolation 1 1\n", w->name);
        }
 
        fprintf(stdout, "CHART apps.processes '' 'Apps Processes' 'processes' apps apps stacked 20004 %d\n", update_every);
        for (w = target_root; w ; w = w->next) {
                if(w->target || (!w->processes && !w->exposed)) continue;
 
-               fprintf(stdout, "DIMENSION %s '' absolute-last-value 1 1\n", w->name);
+               fprintf(stdout, "DIMENSION %s '' absolute-no-interpolation 1 1\n", w->name);
        }
 
        fprintf(stdout, "CHART apps.cpu_user '' 'Apps CPU User Time (%ld%% = %ld core%s)' 'cpu time %%' apps none stacked 20020 %d\n", (processors * 100), processors, (processors>1)?"s":"", update_every);
@@ -1119,7 +1119,7 @@ void show_charts(void)
        fprintf(stdout, "DIMENSION system '' incremental 1 1000\n");
 
        fprintf(stdout, "CHART netdata.apps_files '' 'Apps Plugin Files' 'files/s' netdata netdata line 10001 %d\n", update_every);
-       fprintf(stdout, "DIMENSION files '' incremental-last-value 1 1\n");
+       fprintf(stdout, "DIMENSION files '' incremental-no-interpolation 1 1\n");
 
        fflush(stdout);
 }
index a9f757f91d175959c17d7938b6e1eb1c428506ad..71f8bd0425b2aa7b94f06cf87e119654dcceae29 100755 (executable)
@@ -23,17 +23,17 @@ DIMENSION client_http_kbytes_out out incremental -8 1
 DIMENSION client_http_hit_kbytes_out hits incremental -8 1
 
 CHART squid.clients_requests '' "Squid Client Requests" "requests/s" squid '' line 20003 $update_every
-DIMENSION client_http_requests requests incremental 1 1
-DIMENSION client_http_hits hits incremental 1 1
-DIMENSION client_http_errors errors incremental -1 1
+DIMENSION client_http_requests requests incremental-no-interpolation 1 1
+DIMENSION client_http_hits hits incremental-no-interpolation 1 1
+DIMENSION client_http_errors errors incremental-no-interpolation -1 1
 
 CHART squid.servers_net '' "Squid Server Bandwidth" "kilobits/s" squid '' area 20002 $update_every
 DIMENSION server_all_kbytes_in in incremental 8 1
 DIMENSION server_all_kbytes_out out incremental -8 1
 
 CHART squid.servers_requests '' "Squid Server Requests" "requests/s" squid '' line 20004 $update_every
-DIMENSION server_all_requests requests incremental 1 1
-DIMENSION server_all_errors errors incremental -1 1
+DIMENSION server_all_requests requests incremental-no-interpolation 1 1
+DIMENSION server_all_errors errors incremental-no-interpolation -1 1
 EOF
        
        return 0
index f0e752881231e7afea72830fd51bfead58827a00..d0f9793a4a8adcce2906d1f744909e00e32939ec 100644 (file)
--- a/netdata.c
+++ b/netdata.c
@@ -840,23 +840,28 @@ int config_set_boolean(const char *section, const char *name, int value)
 // ----------------------------------------------------------------------------
 // chart types
 
+#define CHART_TYPE_LINE_NAME "line"
+#define CHART_TYPE_AREA_NAME "area"
+#define CHART_TYPE_STACKED_NAME "stacked"
+
+
 #define CHART_TYPE_LINE        0
 #define CHART_TYPE_AREA 1
 #define CHART_TYPE_STACKED 2
 
 int chart_type_id(const char *name)
 {
-       if(strcmp(name, "area") == 0) return CHART_TYPE_AREA;
-       if(strcmp(name, "stacked") == 0) return CHART_TYPE_STACKED;
-       if(strcmp(name, "line") == 0) return CHART_TYPE_LINE;
+       if(strcmp(name, CHART_TYPE_AREA_NAME) == 0) return CHART_TYPE_AREA;
+       if(strcmp(name, CHART_TYPE_STACKED_NAME) == 0) return CHART_TYPE_STACKED;
+       if(strcmp(name, CHART_TYPE_LINE_NAME) == 0) return CHART_TYPE_LINE;
        return CHART_TYPE_LINE;
 }
 
 const char *chart_type_name(int chart_type)
 {
-       static char *line = "line";
-       static char *area = "area";
-       static char *stacked = "stacked";
+       static char line[] = CHART_TYPE_LINE_NAME;
+       static char area[] = CHART_TYPE_AREA_NAME;
+       static char stacked[] = CHART_TYPE_STACKED_NAME;
 
        switch(chart_type) {
                case CHART_TYPE_LINE:
@@ -875,6 +880,14 @@ const char *chart_type_name(int chart_type)
 // ----------------------------------------------------------------------------
 // algorithms types
 
+#define RRD_DIMENSION_ABSOLUTE_NAME                                    "absolute"
+#define RRD_DIMENSION_INCREMENTAL_NAME                                         "incremental"
+#define RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL_NAME               "percentage-of-incremental-row"
+#define RRD_DIMENSION_PCENT_OVER_ROW_TOTAL_NAME                        "percentage-of-absolute-row"
+#define RRD_DIMENSION_INCREMENTAL_NO_INTERPOLATION_NAME        "incremental-no-interpolation"
+#define RRD_DIMENSION_ABSOLUTE_NO_INTERPOLATION_NAME   "absolute-no-interpolation"
+
+
 #define RRD_DIMENSION_ABSOLUTE                                         0
 #define RRD_DIMENSION_INCREMENTAL                                      1
 #define RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL            2
@@ -884,23 +897,23 @@ const char *chart_type_name(int chart_type)
 
 int algorithm_id(const char *name)
 {
-       if(strcmp(name, "absolute") == 0) return RRD_DIMENSION_ABSOLUTE;
-       if(strcmp(name, "absolute-last-value") == 0) return RRD_DIMENSION_ABSOLUTE_NO_INTERPOLATION;
-       if(strcmp(name, "incremental") == 0) return RRD_DIMENSION_INCREMENTAL;
-       if(strcmp(name, "incremental-last-value") == 0) return RRD_DIMENSION_INCREMENTAL_NO_INTERPOLATION;
-       if(strcmp(name, "percentage-of-absolute-row") == 0) return RRD_DIMENSION_PCENT_OVER_ROW_TOTAL;
-       if(strcmp(name, "percentage-of-incremental-row") == 0) return RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL;
+       if(strcmp(name, RRD_DIMENSION_ABSOLUTE_NAME) == 0)                                              return RRD_DIMENSION_ABSOLUTE;
+       if(strcmp(name, RRD_DIMENSION_ABSOLUTE_NO_INTERPOLATION_NAME) == 0)     return RRD_DIMENSION_ABSOLUTE_NO_INTERPOLATION;
+       if(strcmp(name, RRD_DIMENSION_INCREMENTAL_NAME) == 0)                                   return RRD_DIMENSION_INCREMENTAL;
+       if(strcmp(name, RRD_DIMENSION_INCREMENTAL_NO_INTERPOLATION_NAME) == 0)  return RRD_DIMENSION_INCREMENTAL_NO_INTERPOLATION;
+       if(strcmp(name, RRD_DIMENSION_PCENT_OVER_ROW_TOTAL_NAME) == 0)                  return RRD_DIMENSION_PCENT_OVER_ROW_TOTAL;
+       if(strcmp(name, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL_NAME) == 0)                 return RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL;
        return RRD_DIMENSION_ABSOLUTE;
 }
 
 const char *algorithm_name(int chart_type)
 {
-       static char *absolute = "absolute";
-       static char *incremental = "incremental";
-       static char *percentage_of_absolute_row = "percentage-of-absolute-row";
-       static char *percentage_of_incremental_row = "percentage-of-incremental-row";
-       static char *incremental_last_value = "incremental-last-value";
-       static char *absolute_last_value = "absolute-last-value";
+       static char absolute[] = RRD_DIMENSION_ABSOLUTE_NAME;
+       static char incremental[] = RRD_DIMENSION_INCREMENTAL_NAME;
+       static char percentage_of_absolute_row[] = RRD_DIMENSION_PCENT_OVER_ROW_TOTAL_NAME;
+       static char percentage_of_incremental_row[] = RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL_NAME;
+       static char incremental_last_value[] = RRD_DIMENSION_INCREMENTAL_NO_INTERPOLATION_NAME;
+       static char absolute_last_value[] = RRD_DIMENSION_ABSOLUTE_NO_INTERPOLATION_NAME;
 
        switch(chart_type) {
                case RRD_DIMENSION_ABSOLUTE:
@@ -951,27 +964,23 @@ int memory_mode = NETDATA_MEMORY_MODE_SAVE;
 
 const char *memory_mode_name(int id)
 {
-       static const char *ram = NETDATA_MEMORY_MODE_RAM_NAME;
-       static const char *map = NETDATA_MEMORY_MODE_MAP_NAME;
-       static const char *save = NETDATA_MEMORY_MODE_SAVE_NAME;
-       const char *s = save;
+       static const char ram[] = NETDATA_MEMORY_MODE_RAM_NAME;
+       static const char map[] = NETDATA_MEMORY_MODE_MAP_NAME;
+       static const char save[] = NETDATA_MEMORY_MODE_SAVE_NAME;
 
        switch(id) {
                case NETDATA_MEMORY_MODE_RAM:
-                       s = ram;
-                       ;;
+                       return ram;
 
                case NETDATA_MEMORY_MODE_MAP:
-                       s = map;
-                       ;;
+                       return map;
 
                case NETDATA_MEMORY_MODE_SAVE:
                default:
-                       s = save;
-                       ;;
+                       return save;
        }
 
-       return(s);
+       return save;
 }
 
 int memory_mode_id(const char *name)
@@ -1488,6 +1497,33 @@ void rrd_stats_free_all(void)
        pthread_rwlock_unlock(&root_rwlock);
 }
 
+void rrd_stats_save_all(void)
+{
+       RRD_STATS *st;
+       RRD_DIMENSION *rd;
+
+       pthread_rwlock_wrlock(&root_rwlock);
+       for(st = root; st ; st = st->next) {
+               pthread_rwlock_wrlock(&st->rwlock);
+
+               if(st->mapped == NETDATA_MEMORY_MODE_SAVE) {
+                       debug(D_RRD_STATS, "Saving stats '%s' to '%s'.", st->name, st->cache_file);
+                       savememory(st->cache_file, st, st->memsize);
+               }
+
+               for(rd = st->dimensions; rd ; rd = rd->next) {
+                       if(rd->mapped == NETDATA_MEMORY_MODE_SAVE) {
+                               debug(D_RRD_STATS, "Saving dimension '%s' to '%s'.", rd->name, rd->cache_file);
+                               savememory(rd->cache_file, rd, rd->memsize);
+                       }
+               }
+
+               pthread_rwlock_unlock(&st->rwlock);
+       }
+       pthread_rwlock_unlock(&root_rwlock);
+}
+
+
 RRD_STATS *rrd_stats_find(const char *id)
 {
        unsigned long hash = simple_hash(id);
@@ -1810,23 +1846,26 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
                st->last_updated.tv_usec = 0;
 
                for( rd = st->dimensions ; rd ; rd = rd->next ) {
-                       calculated_number old_calculated_value = rd->calculated_value;
+                       calculated_number new_value;
 
                        switch(rd->algorithm) {
                                case RRD_DIMENSION_ABSOLUTE_NO_INTERPOLATION:
                                case RRD_DIMENSION_INCREMENTAL_NO_INTERPOLATION:
-                                       rd->calculated_value = rd->last_calculated_value;
+                                       if(next_ut + st->update_every * 1000000ULL < now_ut)
+                                               new_value = rd->last_calculated_value;
+                                       else
+                                               new_value = rd->calculated_value;
+
                                        if(st->debug)
                                                debug(D_RRD_STATS, "%s/%s: CALC2 "
-                                                       CALCULATED_NUMBER_FORMAT " = " CALCULATED_NUMBER_FORMAT
+                                                       CALCULATED_NUMBER_FORMAT
                                                        , st->id, rd->name
-                                                       , rd->calculated_value
-                                                       , rd->last_calculated_value
+                                                       , new_value
                                                        );
-                                       ;;
+                                       break;
 
                                default:
-                                       rd->calculated_value = (calculated_number)
+                                       new_value = (calculated_number)
                                                (       (         (rd->calculated_value - rd->last_calculated_value)
                                                                * (calculated_number)np
                                                                / (calculated_number)(now_ut - last_ut)
@@ -1841,16 +1880,16 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
                                                        " * %llu"
                                                        " / %llu) + " CALCULATED_NUMBER_FORMAT
                                                        , st->id, rd->name
-                                                       , rd->calculated_value
-                                                       , old_calculated_value, rd->last_calculated_value
+                                                       , new_value
+                                                       , rd->calculated_value, rd->last_calculated_value
                                                        , np
                                                        , (now_ut - last_ut), rd->last_calculated_value
                                                        );
-                                       ;;
+                                       break;
                        }
 
                        rd->values[st->current_entry] = (storage_number)
-                               (         rd->calculated_value
+                               (         new_value
                                        * (calculated_number)10
                                        * (calculated_number)rd->multiplier
                                        / (calculated_number)rd->divisor
@@ -1864,20 +1903,19 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
                                        " / %ld"
                                        , st->id, rd->name
                                        , st->current_entry
-                                       , rd->values[st->current_entry]
-                                       , rd->last_calculated_value
+                                       , rd->values[st->current_entry], new_value
                                        , rd->multiplier
                                        , rd->divisor
                                        );
 
-                       rd->last_calculated_value = rd->calculated_value;
-
-                       if(rd->algorithm == RRD_DIMENSION_ABSOLUTE_NO_INTERPOLATION || rd->algorithm == RRD_DIMENSION_ABSOLUTE_NO_INTERPOLATION) {
-                               if(next_ut + st->update_every * 1000000ULL >= now_ut) {
-                                       //FIXME
-                                       ;
-                               }
+                       if((rd->algorithm == RRD_DIMENSION_ABSOLUTE_NO_INTERPOLATION || rd->algorithm == RRD_DIMENSION_ABSOLUTE_NO_INTERPOLATION)
+                               && (next_ut + st->update_every * 1000000ULL < now_ut)) {
+                               // there is another iteration
+                               // do not change the anything
+                               ;
                        }
+                       else
+                               rd->last_calculated_value = rd->calculated_value = new_value;
                }
 
                if(st->first_entry_t && st->counter >= (unsigned long long)st->entries) {
@@ -1987,17 +2025,19 @@ void web_buffer_rrd_value(struct web_buffer *wb, storage_number value)
        if (value < 0) *wstr++ = '-';
 
        // reverse it
-       strreverse(str, wstr-1);
-
-       // move the last digit
        wstr--;
-       wstr[1] = wstr[0];
+       strreverse(str, wstr);
+
+       if(*wstr != '0') {
+               // move the last digit one byte to the right
+               wstr[1] = wstr[0];
 
-       // put the dot
-       wstr[0] = '.';
+               // put the dot in the hole
+               wstr[0] = '.';
 
-       // terminate it
-       wstr += 2;
+               // terminate it
+               wstr += 2;
+       }
        *wstr='\0';
 
        // update the buffer length
@@ -2015,39 +2055,40 @@ void web_buffer_jsdate(struct web_buffer *wb, int year, int month, int day, int
 
        char *b = &wb->buffer[wb->bytes];
 
-       b[0]='D';
-       b[1]='a';
-       b[2]='t';
-       b[3]='e';
-       b[4]='(';
-       b[5]= 48 + year / 1000; year -= (year / 1000) * 1000;
-       b[6]= 48 + year / 100; year -= (year / 100) * 100;
-       b[7]= 48 + year / 10;
-       b[8]= 48 + year % 10;
-       b[9]=',';
-       b[10]=' ';
-       b[11]= 48 + month / 10;
-       b[12]= 48 + month % 10;
-       b[13]=',';
-       b[14]=' ';
-       b[15]= 48 + day / 10;
-       b[16]= 48 + day % 10;
-       b[17]=',';
-       b[18]=' ';
-       b[19]= 48 + hours / 10;
-       b[20]= 48 + hours % 10;
-       b[21]=',';
-       b[22]=' ';
-       b[23]= 48 + minutes / 10;
-       b[24]= 48 + minutes % 10;
-       b[25]=',';
-       b[26]=' ';
-       b[27]= 48 + seconds / 10;
-       b[28]= 48 + seconds % 10;
-       b[29]=')';
-       b[30]='\0';
-
-       wb->bytes += 30;
+       int i = 0;
+       b[i++]='D';
+       b[i++]='a';
+       b[i++]='t';
+       b[i++]='e';
+       b[i++]='(';
+       b[i++]= 48 + year / 1000; year -= (year / 1000) * 1000;
+       b[i++]= 48 + year / 100; year -= (year / 100) * 100;
+       b[i++]= 48 + year / 10;
+       b[i++]= 48 + year % 10;
+       b[i++]=',';
+       //b[i++]=' ';
+       b[i]= 48 + month / 10; if(b[i] != '0') i++;
+       b[i++]= 48 + month % 10;
+       b[i++]=',';
+       //b[i++]=' ';
+       b[i]= 48 + day / 10; if(b[i] != '0') i++;
+       b[i++]= 48 + day % 10;
+       b[i++]=',';
+       //b[i++]=' ';
+       b[i]= 48 + hours / 10; if(b[i] != '0') i++;
+       b[i++]= 48 + hours % 10;
+       b[i++]=',';
+       //b[i++]=' ';
+       b[i]= 48 + minutes / 10; if(b[i] != '0') i++;
+       b[i++]= 48 + minutes % 10;
+       b[i++]=',';
+       //b[i++]=' ';
+       b[i]= 48 + seconds / 10; if(b[i] != '0') i++;
+       b[i++]= 48 + seconds % 10;
+       b[i++]=')';
+       b[i]='\0';
+
+       wb->bytes += i;
 }
 
 struct web_buffer *web_buffer_create(long size)
@@ -2226,6 +2267,7 @@ time_t rrd_stats_first_entry_t(RRD_STATS *st)
 
 unsigned long rrd_stats_one_json(RRD_STATS *st, char *options, struct web_buffer *wb)
 {
+       time_t now = time(NULL);
        web_buffer_increase(wb, 16384);
 
        pthread_rwlock_rdlock(&st->rwlock);
@@ -2269,7 +2311,7 @@ unsigned long rrd_stats_one_json(RRD_STATS *st, char *options, struct web_buffer
                , rrd_stats_first_entry_t(st)
                , st->current_entry
                , st->last_updated.tv_sec
-               , time(NULL) - st->last_updated.tv_sec
+               , now - (st->last_updated.tv_sec > now) ? now : st->last_updated.tv_sec
                , st->update_every
                , st->isdetail
                , st->usec_since_last_update
@@ -2504,9 +2546,15 @@ unsigned long rrd_stats_json(int type, RRD_STATS *st, struct web_buffer *wb, int
 
                // print the header for each dimension
                // and update the print_hidden array for the dimensions that should be hidden
+               int pc = 0;
                for( rd = st->dimensions, c = 0 ; rd && c < dimensions ; rd = rd->next, c++) {
-                       if(!print_hidden[c])
+                       if(!print_hidden[c]) {
+                               pc++;
                                web_buffer_printf(wb, ",\n              {%sid%s:%s%s,%slabel%s:%s%s%s,%spattern%s:%s%s,%stype%s:%snumber%s}", kq, kq, sq, sq, kq, kq, sq, rd->name, sq, kq, kq, sq, sq, kq, kq, sq, sq);
+                       }
+               }
+               if(!pc) {
+                       web_buffer_printf(wb, ",\n              {%sid%s:%s%s,%slabel%s:%s%s%s,%spattern%s:%s%s,%stype%s:%snumber%s}", kq, kq, sq, sq, kq, kq, sq, "no data", sq, kq, kq, sq, sq, kq, kq, sq, sq);
                }
 
                // print the begin of row data
@@ -2619,8 +2667,10 @@ unsigned long rrd_stats_json(int type, RRD_STATS *st, struct web_buffer *wb, int
                                else
                                        web_buffer_strcpy(wb, normal_annotation);
 
+                               pc = 0;
                                for(c = 0 ; c < dimensions ; c++) {
                                        if(!print_hidden[c]) {
+                                               pc++;
                                                web_buffer_strcpy(wb, pre_value);
                                                web_buffer_rrd_value(wb, print_values[c]);
                                                web_buffer_strcpy(wb, post_value);
@@ -2628,6 +2678,11 @@ unsigned long rrd_stats_json(int type, RRD_STATS *st, struct web_buffer *wb, int
                                                if(print_values[c]) found_non_zero[c]++;
                                        }
                                }
+                               if(!pc) {
+                                       web_buffer_strcpy(wb, pre_value);
+                                       web_buffer_rrd_value(wb, (storage_number)0);
+                                       web_buffer_strcpy(wb, post_value);
+                               }
 
                                printed++;
                        }
@@ -6788,7 +6843,7 @@ void sig_handler(int signo)
                case SIGSEGV:
                        error("Signaled exit (signal %d). Errno: %d (%s)", signo, errno, strerror(errno));
                        kill_childs();
-                       rrd_stats_free_all();
+                       rrd_stats_save_all();
                        exit(1);
                        break;
 
index 0e7d5f97d3f8738a9e10eb314eca017e342f5cd8..cf9569ebf9c1db136c40f0c7e7d634301091671e 100644 (file)
@@ -99,7 +99,7 @@ function refreshChart(chart, doNext) {
 
 function chartIsLoadingHTML(name, width, height, message)
 {
-       return "<table><tr><td align=\"center\" width=\"" + width + "\" height=\"" + height + "\" style=\"vertical-align:middle\"><h4><span class=\"glyphicon glyphicon-refresh\"></span><br/><br/>loading " + name + "<br/><br/><span class=\"label label-default\">" + (message?message:"Please wait...") + "</span></h4></td></tr></table>";
+       return "<table><tr><td align=\"center\" width=\"" + width + "\" height=\"" + height + "\" style=\"vertical-align:middle\"><h4><span class=\"glyphicon glyphicon-refresh\"></span><br/><br/>" + name + "<br/><br/><span class=\"label label-default\">" + (message?message:"loading chart...") + "</span></h4></td></tr></table>";
 }
 
 function showChartIsLoading(id, name, width, height, message) {
@@ -175,17 +175,17 @@ function calculateChartPointsToShow(c, divisor, maxtime, group) {
        if(c.chartType == 'LineChart') {
                if(c.points_to_show > c.chartOptions.width / 2) {
                        c.chartOptions.lineWidth = 1;
-                       c.chartOptions.curveType = 'line';
+                       c.chartOptions.curveType = 'none';
                }
 
                else if(c.points_to_show > c.chartOptions.width / 3) {
                        c.chartOptions.lineWidth = 1;
-                       c.chartOptions.curveType = 'function';
+                       c.chartOptions.curveType = c.default_curveType;
                }
 
                else {
                        c.chartOptions.lineWidth = 2;
-                       c.chartOptions.curveType = 'function';
+                       c.chartOptions.curveType = c.default_curveType;
                }
        }
        else if(c.chartType == 'AreaChart') {
@@ -259,8 +259,6 @@ function loadCharts(base_url, doNext) {
                                        json.charts[i].chartOptions.areaOpacity = 0.3;
                                        
                                        json.charts[i].chartOptions.vAxis.viewWindowMode = 'maximized';
-                                       json.charts[i].chartOptions.vAxis.minValue = null;
-                                       json.charts[i].chartOptions.vAxis.maxValue = null;
                                        json.charts[i].non_zero = 0;
                                        break;
 
@@ -281,8 +279,14 @@ function loadCharts(base_url, doNext) {
                                case "line":
                                        json.charts[i].chartType = "LineChart";
                                        json.charts[i].chartOptions.lineWidth = 2;
-                                       json.charts[i].chartOptions.curveType = 'function';
                                        json.charts[i].non_zero = 0;
+
+                                       json.charts[i].default_curveType = 'function';
+                                       $.each(json.charts[i].dimensions, function(d, dim) {
+                                               if(dim.algorithm == 'incremental-no-interpolation' || dim.algorithm == 'absolute-no-interpolation') {
+                                                       json.charts[i].default_curveType = 'none';
+                                               }
+                                       });
                                        break;
                        }