From 1b8f812fbf8d14bad0fcf9749ac71f640bda2868 Mon Sep 17 00:00:00 2001 From: oetiker Date: Tue, 11 Sep 2007 06:28:15 +0000 Subject: [PATCH] Allow to the the smoothing window size other thatn the default 5%. -- Evan Miller emiller imvu.com git-svn-id: svn://svn.oetiker.ch/rrdtool/trunk/program@1203 a5681a0c-68f1-0310-ab6d-d61299d08faa --- doc/rrdcreate.pod | 11 +++++++++-- doc/rrdtune.pod | 12 ++++++++++++ src/rrd_create.c | 21 +++++++++++++++++++++ src/rrd_dump.c | 5 +++++ src/rrd_format.h | 40 +++++++++++++++++++++++++--------------- src/rrd_hw.c | 9 ++++++++- src/rrd_info.c | 5 +++++ src/rrd_restore.c | 5 +++++ src/rrd_tune.c | 16 ++++++++++++++++ 9 files changed, 106 insertions(+), 18 deletions(-) diff --git a/doc/rrdcreate.pod b/doc/rrdcreate.pod index 49db70e..37eacbe 100644 --- a/doc/rrdcreate.pod +++ b/doc/rrdcreate.pod @@ -238,11 +238,11 @@ BIB<:>IB<:>IB<:>IB<:>I[B<: =item * -BIB<:>IB<:>IB<:>I +BIB<:>IB<:>IB<:>I[B<:smoothing-window=>I] =item * -BIB<:>IB<:>IB<:>I +BIB<:>IB<:>IB<:>I[B<:smoothing-window=>I] =item * @@ -342,6 +342,13 @@ If SEASONAL and DEVSEASONAL B are created explicitly, I need not be the same for both. Note that I can also be changed via the B I command. +I specifies the fraction of a season that should be +averaged around each point. By default, the value of I is +0.05, which means each value in SEASONAL and DEVSEASONAL will be occasionally +replaced by averaging it with its (I*0.05) nearest neighbors. +Setting I to zero will disable the running-average smoother +altogether. + I provides the links between related B. If HWPREDICT is specified alone and the other B are created implicitly, then there is no need to worry about this argument. If B are created diff --git a/doc/rrdtune.pod b/doc/rrdtune.pod index 5a08394..859c143 100644 --- a/doc/rrdtune.pod +++ b/doc/rrdtune.pod @@ -18,6 +18,8 @@ S<[B<--alpha> I]> S<[B<--beta> I]> S<[B<--gamma> I]> S<[B<--gamma-deviation> I]> +S<[B<--smoothing-window> I]> +S<[B<--smoothing-window-deviation> I]> S<[B<--aberrant-reset> I]> =head1 DESCRIPTION @@ -117,6 +119,16 @@ B. This parameter must be between 0 and 1. Alter the seasonal deviation adaptation parameter for the DEVSEASONAL B. This parameter must be between 0 and 1. +=item S I> + +Alter the size of the smoothing window for the SEASONAL B. This must +be between 0 and 1. + +=item S I> + +Alter the size of the smoothing window for the DEVSEASONAL B. This must +be between 0 and 1. + =item S I> This option causes the aberrant behavior detection algorithm to reset diff --git a/src/rrd_create.c b/src/rrd_create.c index 47d34cb..b6dd08f 100644 --- a/src/rrd_create.c +++ b/src/rrd_create.c @@ -264,6 +264,8 @@ int rrd_create_r( /* initialize some parameters */ rrd.rra_def[rrd.stat_head->rra_cnt]. par[RRA_seasonal_gamma].u_val = 0.1; + rrd.rra_def[rrd.stat_head->rra_cnt]. + par[RRA_seasonal_smoothing_window].u_val = 0.05; /* fall through */ case CF_DEVPREDICT: rrd.rra_def[rrd.stat_head->rra_cnt]. @@ -420,6 +422,25 @@ int rrd_create_r( par[RRA_dependent_rra_idx].u_cnt = atoi(token) - 1; break; + case CF_DEVSEASONAL: + case CF_SEASONAL: + /* optional smoothing window */ + if (sscanf(token, "smoothing-window=%lf", + &(rrd.rra_def[rrd.stat_head->rra_cnt]. + par[RRA_seasonal_smoothing_window].u_val))) { + strcpy(rrd.stat_head->version, RRD_VERSION); /* smoothing-window causes Version 4 */ + if (rrd.rra_def[rrd.stat_head->rra_cnt]. + par[RRA_seasonal_smoothing_window].u_val < 0.0 + || rrd.rra_def[rrd.stat_head->rra_cnt]. + par[RRA_seasonal_smoothing_window].u_val > 1.0) { + rrd_set_error("Invalid smoothing-window %f: must be between 0 and 1", + rrd.rra_def[rrd.stat_head->rra_cnt]. + par[RRA_seasonal_smoothing_window].u_val); + } + } else { + rrd_set_error("Invalid option %s", token); + } + break; case CF_HWPREDICT: case CF_MHWPREDICT: /* length of the associated CF_SEASONAL and CF_DEVSEASONAL arrays. */ diff --git a/src/rrd_dump.c b/src/rrd_dump.c index dadd34d..6343e1d 100644 --- a/src/rrd_dump.c +++ b/src/rrd_dump.c @@ -197,6 +197,11 @@ int rrd_dump_r( fprintf(out_file, "\t\t %lu \n", rrd.rra_def[i].par[RRA_seasonal_smooth_idx].u_cnt); + if (atoi(rrd.stat_head->version) >= 4) { + fprintf(out_file, + "\t\t %0.10e \n", + rrd.rra_def[i].par[RRA_seasonal_smoothing_window].u_val); + } fprintf(out_file, "\t\t %lu \n", rrd.rra_def[i].par[RRA_dependent_rra_idx].u_cnt); diff --git a/src/rrd_format.h b/src/rrd_format.h index 0d8a9dc..3eb46ae 100644 --- a/src/rrd_format.h +++ b/src/rrd_format.h @@ -194,13 +194,15 @@ enum cf_en { CF_AVERAGE = 0, /* data consolidation functions */ enum rra_par_en { RRA_cdp_xff_val = 0, /* what part of the consolidated * datapoint must be known, to produce a * valid entry in the rra */ - RRA_hw_alpha, + /* CF_HWPREDICT: */ + RRA_hw_alpha = 1, /* exponential smoothing parameter for the intercept in * the Holt-Winters prediction algorithm. */ - RRA_hw_beta, + RRA_hw_beta = 2, /* exponential smoothing parameter for the slope in * the Holt-Winters prediction algorithm. */ - RRA_dependent_rra_idx, + + RRA_dependent_rra_idx = 3, /* For CF_HWPREDICT: index of the RRA with the seasonal * effects of the Holt-Winters algorithm (of type * CF_SEASONAL). @@ -212,22 +214,30 @@ enum rra_par_en { RRA_cdp_xff_val = 0, /* what part of the consolidated * Holt-Winters prediction (of type CF_HWPREDICT). * For CF_FAILURES: index of the CF_DEVSEASONAL array. * */ - RRA_seasonal_smooth_idx, - /* For CF_SEASONAL and CF_DEVSEASONAL: - * an integer between 0 and row_count - 1 which + + /* CF_SEASONAL and CF_DEVSEASONAL: */ + RRA_seasonal_gamma = 1, + /* exponential smoothing parameter for seasonal effects. */ + + RRA_seasonal_smoothing_window = 2, + /* fraction of the season to include in the running average + * smoother */ + + /* RRA_dependent_rra_idx = 3, */ + + RRA_seasonal_smooth_idx = 4, + /* an integer between 0 and row_count - 1 which * is index in the seasonal cycle for applying * the period smoother. */ - RRA_failure_threshold, + + /* CF_FAILURES: */ + RRA_delta_pos = 1, /* confidence bound scaling parameters */ + RRA_delta_neg = 2, + /* RRA_dependent_rra_idx = 3, */ + RRA_window_len = 4, + RRA_failure_threshold = 5, /* For CF_FAILURES, number of violations within the last * window required to mark a failure. */ - RRA_seasonal_gamma = RRA_hw_alpha, - /* exponential smoothing parameter for seasonal effects. - * */ - RRA_delta_pos = RRA_hw_alpha, - RRA_delta_neg = RRA_hw_beta, - /* confidence bound scaling parameters for the - * the FAILURES RRA. */ - RRA_window_len = RRA_seasonal_smooth_idx }; /* For CF_FAILURES, the length of the window for measuring diff --git a/src/rrd_hw.c b/src/rrd_hw.c index 98333e2..e802412 100644 --- a/src/rrd_hw.c +++ b/src/rrd_hw.c @@ -139,7 +139,14 @@ int apply_smoother( rrd_value_t *working_average; rrd_value_t *baseline; - offset = floor(0.025 * row_count); + if (atoi(rrd->stat_head->version) >= 4) { + offset = floor(rrd->rra_def[rra_idx]. + par[RRA_seasonal_smoothing_window]. + u_val / 2 * row_count); + } else { + offset = floor(0.05 / 2 * row_count); + } + if (offset == 0) return 0; /* no smoothing */ diff --git a/src/rrd_info.c b/src/rrd_info.c index 3a35d48..8f88d68 100644 --- a/src/rrd_info.c +++ b/src/rrd_info.c @@ -205,6 +205,11 @@ info_t *rrd_info_r( info.u_val = rrd.rra_def[i].par[RRA_seasonal_gamma].u_val; cd = info_push(cd, sprintf_alloc("rra[%d].gamma", i), RD_I_VAL, info); + if (atoi(rrd.stat_head->version) >= 4) { + info.u_val = rrd.rra_def[i].par[RRA_seasonal_smoothing_window].u_val; + cd = info_push(cd, sprintf_alloc("rra[%d].smoothing_window", i), RD_I_VAL, + info); + } break; case CF_FAILURES: info.u_val = rrd.rra_def[i].par[RRA_delta_pos].u_val; diff --git a/src/rrd_restore.c b/src/rrd_restore.c index 3dc8931..c301736 100644 --- a/src/rrd_restore.c +++ b/src/rrd_restore.c @@ -383,6 +383,11 @@ int xml2rrd( read_tag(&ptr2, "seasonal_smooth_idx", "%lu", &(rrd->rra_def[rra_index]. par[RRA_seasonal_smooth_idx].u_cnt)); + if (atoi(rrd->stat_head->version) >= 4) { + read_tag(&ptr2, "smoothing_window", "%lf", + &(rrd->rra_def[rra_index]. + par[RRA_seasonal_smoothing_window].u_val)); + } read_tag(&ptr2, "dependent_rra_idx", "%lu", &(rrd->rra_def[rra_index]. par[RRA_dependent_rra_idx].u_cnt)); diff --git a/src/rrd_tune.c b/src/rrd_tune.c index 1c72db7..36b2bb0 100644 --- a/src/rrd_tune.c +++ b/src/rrd_tune.c @@ -88,6 +88,8 @@ int rrd_tune( {"beta", required_argument, 0, 'y'}, {"gamma", required_argument, 0, 'z'}, {"gamma-deviation", required_argument, 0, 'v'}, + {"smoothing-window", required_argument, 0, 's'}, + {"smoothing-window-deviation", required_argument, 0, 'S'}, {"aberrant-reset", required_argument, 0, 'b'}, {0, 0, 0, 0} }; @@ -296,6 +298,20 @@ int rrd_tune( return -1; } break; + case 's': + strcpy(rrd.stat_head->version, RRD_VERSION); /* smoothing_window causes Version 4 */ + if (set_hwarg(&rrd, CF_SEASONAL, RRA_seasonal_smoothing_window, optarg)) { + rrd_free(&rrd); + return -1; + } + break; + case 'S': + strcpy(rrd.stat_head->version, RRD_VERSION); /* smoothing_window causes Version 4 */ + if (set_hwarg(&rrd, CF_DEVSEASONAL, RRA_seasonal_smoothing_window, optarg)) { + rrd_free(&rrd); + return -1; + } + break; case '?': if (optopt != 0) rrd_set_error("unknown option '%c'", optopt); -- 2.30.2