summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Graf <tgraf@suug.ch>2016-01-29 12:11:44 +0100
committerThomas Graf <tgraf@suug.ch>2016-01-29 12:11:44 +0100
commit4efaa8ce9e82777d1208688e5bad833043587d81 (patch)
tree8e7216b8ee66bbbe754e40f82a6bee656d3b41bb
parent1f79ea4396d4e1fb7d7042ab54552b33f082c7dc (diff)
curses: Add ability to reset statistics
Press 'r' in curses mode to reset a statistic counter to start counting from 0 again. This does NOT reset the counter from the source itself but merely emulates a counter reset. If you restart bmon, the counter will be back to its total value. Signed-off-by: Thomas Graf <tgraf@suug.ch>
-rw-r--r--include/bmon/attr.h6
-rw-r--r--src/attr.c13
-rw-r--r--src/out_ascii.c4
-rw-r--r--src/out_curses.c19
-rw-r--r--src/out_format.c4
5 files changed, 40 insertions, 6 deletions
diff --git a/include/bmon/attr.h b/include/bmon/attr.h
index 224f151..9d52c78 100644
--- a/include/bmon/attr.h
+++ b/include/bmon/attr.h
@@ -42,6 +42,9 @@ struct rate
/* Value of r_current at last read */
uint64_t r_prev;
+ /* Reset value to substract to emulate statistics reset */
+ uint64_t r_reset;
+
/* Rate per second calculated every `rate_interval' */
float r_rate;
@@ -49,6 +52,8 @@ struct rate
timestamp_t r_last_calc;
};
+extern uint64_t rate_get_total(struct rate *);
+
enum {
ATTR_TYPE_UNSPEC,
ATTR_TYPE_COUNTER,
@@ -134,5 +139,6 @@ extern struct attr * attr_select_prev(void);
extern struct attr * attr_current(void);
extern void attr_start_collecting_history(struct attr *);
+extern void attr_reset_counter(struct attr *a);
#endif
diff --git a/src/attr.c b/src/attr.c
index 297fc2b..cb33bb5 100644
--- a/src/attr.c
+++ b/src/attr.c
@@ -524,6 +524,11 @@ static float __calc_usage(double rate, uint64_t max)
return 100.0f / ((double) max / (rate * cfg_rate_interval));
}
+uint64_t rate_get_total(struct rate *r)
+{
+ return r->r_total - r->r_reset;
+}
+
void attr_calc_usage(struct attr *a, float *rx, float *tx,
uint64_t rxmax, uint64_t txmax)
{
@@ -626,6 +631,14 @@ void attr_notify_update(struct attr *a, timestamp_t *ts)
}
}
+void attr_reset_counter(struct attr *a)
+{
+ if (a->a_def->ad_type == ATTR_TYPE_COUNTER) {
+ a->a_rx_rate.r_reset = a->a_rx_rate.r_total;
+ a->a_tx_rate.r_reset = a->a_tx_rate.r_total;
+ }
+}
+
static void __exit attr_exit(void)
{
struct attr_def *ad, *n;
diff --git a/src/out_ascii.c b/src/out_ascii.c
index b3e8d2d..c9d2e91 100644
--- a/src/out_ascii.c
+++ b/src/out_ascii.c
@@ -101,10 +101,10 @@ static void print_attr_detail(struct element *e, struct attr *a, void *arg)
char *rx_u, *tx_u;
int rxprec, txprec;
- double rx = unit_value2str(a->a_rx_rate.r_total,
+ double rx = unit_value2str(rate_get_total(&a->a_rx_rate),
a->a_def->ad_unit,
&rx_u, &rxprec);
- double tx = unit_value2str(a->a_tx_rate.r_total,
+ double tx = unit_value2str(rate_get_total(&a->a_tx_rate),
a->a_def->ad_unit,
&tx_u, &txprec);
diff --git a/src/out_curses.c b/src/out_curses.c
index 05b4c45..670be75 100644
--- a/src/out_curses.c
+++ b/src/out_curses.c
@@ -241,10 +241,10 @@ static void draw_attr_detail(struct element *e, struct attr *a, void *arg)
int rxprec, txprec, ncol;
struct detail_arg *da = arg;
- double rx = unit_value2str(a->a_rx_rate.r_total,
+ double rx = unit_value2str(rate_get_total(&a->a_rx_rate),
a->a_def->ad_unit,
&rx_u, &rxprec);
- double tx = unit_value2str(a->a_tx_rate.r_total,
+ double tx = unit_value2str(rate_get_total(&a->a_tx_rate),
a->a_def->ad_unit,
&tx_u, &txprec);
@@ -392,6 +392,7 @@ static void draw_help(void)
mvaddnstr(y+15, x+3, "H Start recording history data", -1);
mvaddnstr(y+16, x+3, "TAB Switch time unit of graph", -1);
mvaddnstr(y+17, x+3, "<, > Change number of graphs", -1);
+ mvaddnstr(y+18, x+3, "r Reset counter of element", -1);
attroff(A_STANDOUT);
@@ -1079,6 +1080,16 @@ out:
refresh();
}
+static void __reset_attr_counter(struct element *e, struct attr *a, void *arg)
+{
+ attr_reset_counter(a);
+}
+
+static void reset_counters(void)
+{
+ element_foreach_attr(current_element, __reset_attr_counter, NULL);
+}
+
static int handle_input(int ch)
{
switch (ch)
@@ -1198,6 +1209,10 @@ static int handle_input(int ch)
case '\t':
history_select_next();
return 1;
+
+ case 'r':
+ reset_counters();
+ return 1;
}
return 0;
diff --git a/src/out_format.c b/src/out_format.c
index ab07408..d9d5e36 100644
--- a/src/out_format.c
+++ b/src/out_format.c
@@ -123,10 +123,10 @@ static char *get_token(struct element_group *g, struct element *e,
goto out;
if (!strncasecmp(type, "rx:", 3)) {
- snprintf(buf, len, "%" PRIu64, a->a_rx_rate.r_total);
+ snprintf(buf, len, "%" PRIu64, rate_get_total(&a->a_rx_rate));
return buf;
} else if (!strncasecmp(type, "tx:", 3)) {
- snprintf(buf, len, "%" PRIu64, a->a_tx_rate.r_total);
+ snprintf(buf, len, "%" PRIu64, rate_get_total(&a->a_tx_rate));
return buf;
} else if (!strncasecmp(type, "rxrate:", 7)) {
snprintf(buf, len, "%.2f", a->a_rx_rate.r_rate);