aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/core/stats.h5
-rw-r--r--src/stats.c29
-rw-r--r--src/vty/stats_vty.c26
3 files changed, 59 insertions, 1 deletions
diff --git a/include/osmocom/core/stats.h b/include/osmocom/core/stats.h
index e01016d4..b9edac2a 100644
--- a/include/osmocom/core/stats.h
+++ b/include/osmocom/core/stats.h
@@ -73,6 +73,7 @@ struct osmo_stats_reporter {
char *bind_addr_str; /*!< local bind IP address */
int dest_port; /*!< destination (UDP) port */
int mtu; /*!< Maximum Transmission Unit */
+ unsigned int flush_period; /*!< period between regular flushes */
/*! Maximum class/index to report. FIXME: More details! */
enum osmo_stats_class max_class;
@@ -87,7 +88,8 @@ struct osmo_stats_reporter {
int fd; /*!< file descriptor of socket */
struct msgb *buffer; /*!< message buffer for log output */
int agg_enabled; /*!< is aggregation enabled? */
- int force_single_flush;
+ int force_single_flush; /*!< set to 1 to force a flush (send even unchanged stats values) */
+ unsigned int flush_period_counter; /*!< count sends between forced flushes */
struct llist_head list;
int (*open)(struct osmo_stats_reporter *srep);
@@ -129,6 +131,7 @@ int osmo_stats_reporter_set_max_class(struct osmo_stats_reporter *srep,
int osmo_stats_reporter_set_name_prefix(struct osmo_stats_reporter *srep, const char *prefix);
int osmo_stats_reporter_enable(struct osmo_stats_reporter *srep);
int osmo_stats_reporter_disable(struct osmo_stats_reporter *srep);
+int osmo_stats_reporter_set_flush_period(struct osmo_stats_reporter *srep, unsigned int period);
/* reporter creation */
struct osmo_stats_reporter *osmo_stats_reporter_create_log(const char *name);
diff --git a/src/stats.c b/src/stats.c
index 61b7df87..5954167a 100644
--- a/src/stats.c
+++ b/src/stats.c
@@ -341,6 +341,25 @@ int osmo_stats_set_interval(int interval)
return 0;
}
+/*! Set the regular flush period for a given stats_reporter
+ *
+ * Send all stats even if they have not changed (i.e. force the flush)
+ * every N-th reporting interval. Set to 0 to disable regular flush,
+ * set to 1 to flush every time, set to 2 to flush every 2nd time, etc.
+ * \param[in] srep stats_reporter to set flush period for
+ * \param[in] period Reporting interval in seconds
+ * \returns 0 on success; negative on error */
+int osmo_stats_reporter_set_flush_period(struct osmo_stats_reporter *srep, unsigned int period)
+{
+ srep->flush_period = period;
+ srep->flush_period_counter = 0;
+ /* force the flush now if it's not disabled by period=0 */
+ if (period > 0)
+ srep->force_single_flush = 1;
+
+ return 0;
+}
+
/*! Set the name prefix of a given stats_reporter.
* \param[in] srep stats_reporter whose name prefix is to be set
* \param[in] prefix NAme perfix to pre-pend for any reported value
@@ -706,7 +725,17 @@ static void flush_all_reporters()
continue;
osmo_stats_reporter_send_buffer(srep);
+
+ /* reset force_single_flush first */
srep->force_single_flush = 0;
+ /* and schedule a new flush if it's time for it */
+ if (srep->flush_period > 0) {
+ srep->flush_period_counter++;
+ if (srep->flush_period_counter >= srep->flush_period) {
+ srep->force_single_flush = 1;
+ srep->flush_period_counter = 0;
+ }
+ }
}
}
diff --git a/src/vty/stats_vty.c b/src/vty/stats_vty.c
index a512703f..46282817 100644
--- a/src/vty/stats_vty.c
+++ b/src/vty/stats_vty.c
@@ -245,6 +245,27 @@ DEFUN(cfg_stats_reporter_disable, cfg_stats_reporter_disable_cmd,
return CMD_SUCCESS;
}
+DEFUN(cfg_stats_reporter_flush_period, cfg_stats_reporter_flush_period_cmd,
+ "flush-period <0-65535>",
+ CFG_STATS_STR "Send all stats even if they have not changed (i.e. force the flush)"
+ "every N-th reporting interval. Set to 0 to disable regular flush (default).\n"
+ "0 to disable regular flush (default), 1 to flush every time, 2 to flush every 2nd time, etc\n")
+{
+ int rc;
+ unsigned int period = atoi(argv[0]);
+ struct osmo_stats_reporter *srep = osmo_stats_vty2srep(vty);
+ OSMO_ASSERT(srep);
+
+ rc = osmo_stats_reporter_set_flush_period(srep, period);
+ if (rc < 0) {
+ vty_out(vty, "%% Unable to set force flush period: %s%s",
+ strerror(-rc), VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ return CMD_SUCCESS;
+}
+
DEFUN(cfg_stats_reporter_statsd, cfg_stats_reporter_statsd_cmd,
"stats reporter statsd",
CFG_STATS_STR CFG_REPORTER_STR "Report to a STATSD server\n")
@@ -588,6 +609,10 @@ static int config_write_stats_reporter(struct vty *vty, struct osmo_stats_report
else
vty_out(vty, " no prefix%s", VTY_NEWLINE);
+ if (srep->flush_period > 0)
+ vty_out(vty, " flush-period %d%s",
+ srep->flush_period, VTY_NEWLINE);
+
if (srep->enabled)
vty_out(vty, " enable%s", VTY_NEWLINE);
@@ -637,6 +662,7 @@ void osmo_stats_vty_add_cmds()
install_element(CFG_STATS_NODE, &cfg_stats_reporter_level_cmd);
install_element(CFG_STATS_NODE, &cfg_stats_reporter_enable_cmd);
install_element(CFG_STATS_NODE, &cfg_stats_reporter_disable_cmd);
+ install_element(CFG_STATS_NODE, &cfg_stats_reporter_flush_period_cmd);
install_element_ve(&show_stats_asciidoc_table_cmd);
install_element_ve(&show_rate_counters_cmd);