diff options
-rw-r--r-- | include/osmocom/core/stats.h | 5 | ||||
-rw-r--r-- | src/stats.c | 35 | ||||
-rw-r--r-- | src/vty/stats_vty.c | 61 |
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); |