aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKirill Zakharenko <earwin@gmail.com>2020-05-08 22:57:05 +0300
committerKirill Zakharenko <earwin@gmail.com>2020-05-08 22:57:05 +0300
commit7037e6d7d13df6c72b836b689e96d0989408a910 (patch)
tree45055f6c06392b8ca3935649ab1c94932c3b3895
parentfd6df4d2ac16595e2ae9dd476eb6ad69a6968e3a (diff)
parent228535d9d5161b3405cf54d3f86e84cbb10e6222 (diff)
Merge fairwaves/wip-stats into fairwaves/production
-rw-r--r--include/osmocom/core/stats.h5
-rw-r--r--src/stats.c35
-rw-r--r--src/vty/stats_vty.c61
3 files changed, 80 insertions, 21 deletions
diff --git a/include/osmocom/core/stats.h b/include/osmocom/core/stats.h
index e01016d4..06918477 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 */
+ 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) */
+ 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, 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 b5adbf29..027b2313 100644
--- a/src/stats.c
+++ b/src/stats.c
@@ -326,8 +326,7 @@ int osmo_stats_reporter_set_max_class(struct osmo_stats_reporter *srep,
return 0;
}
-/*! Set the reporting interval of a given stats_reporter (in seconds).
- * \param[in] srep stats_reporter whose remote address is to be set
+/*! Set the reporting interval (common for all reporters)
* \param[in] interval Reporting interval in seconds
* \returns 0 on success; negative on error */
int osmo_stats_set_interval(int interval)
@@ -342,6 +341,28 @@ 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, int period)
+{
+ if (period < 0)
+ return -EINVAL;
+
+ 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
@@ -707,7 +728,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) {
+ if (srep->flush_period_counter == srep->flush_period) {
+ srep->force_single_flush = 1;
+ srep->flush_period_counter = 0;
+ } else
+ srep->flush_period_counter++;
+ }
}
}
diff --git a/src/vty/stats_vty.c b/src/vty/stats_vty.c
index 296519c3..c1ea3dc7 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;
+ 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")
@@ -269,24 +290,6 @@ DEFUN(cfg_stats_reporter_statsd, cfg_stats_reporter_statsd_cmd,
return CMD_SUCCESS;
}
-DEFUN(cfg_stats_interval, cfg_stats_interval_cmd,
- "stats interval <1-65535>",
- CFG_STATS_STR "Set the reporting interval\n"
- "Interval in seconds\n")
-{
- int rc;
- int interval = atoi(argv[0]);
- rc = osmo_stats_set_interval(interval);
- if (rc < 0) {
- vty_out(vty, "%% Unable to set interval: %s%s",
- strerror(-rc), VTY_NEWLINE);
- return CMD_WARNING;
- }
-
- return CMD_SUCCESS;
-}
-
-
DEFUN(cfg_no_stats_reporter_statsd, cfg_no_stats_reporter_statsd_cmd,
"no stats reporter statsd",
NO_STR CFG_STATS_STR CFG_REPORTER_STR "Report to a STATSD server\n")
@@ -347,6 +350,23 @@ DEFUN(cfg_no_stats_reporter_log, cfg_no_stats_reporter_log_cmd,
return CMD_SUCCESS;
}
+DEFUN(cfg_stats_interval, cfg_stats_interval_cmd,
+ "stats interval <1-65535>",
+ CFG_STATS_STR "Set the reporting interval\n"
+ "Interval in seconds\n")
+{
+ int rc;
+ int interval = atoi(argv[0]);
+ rc = osmo_stats_set_interval(interval);
+ if (rc < 0) {
+ vty_out(vty, "%% Unable to set interval: %s%s",
+ strerror(-rc), VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ return CMD_SUCCESS;
+}
+
DEFUN(show_stats,
show_stats_cmd,
"show stats",
@@ -589,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);
@@ -638,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);