diff options
| author | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2015-10-20 19:05:52 +0200 | 
|---|---|---|
| committer | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2015-10-29 01:10:06 +0100 | 
| commit | adc900e0e38373193c8451c0310fe742d62c2c8e (patch) | |
| tree | 9a14508cd756418c75c9b3b968568fb6199ae29c /src/vty | |
| parent | 95bf828003b065f00a78144296072a9730cbf7bc (diff) | |
stats/vty: Add stats configuration
This commit provides stats configuration similar to the log
configuration.
The following vty commands are added to the config node:
  stats reporter statsd          Create/Modify a statsd reporter
  no stats reporter statsd       Remove a statsd reporter
To actually configure a reporter, the config-stats node is entered
when the "stats reporter" command has succeeded. The following new
vty commands are available there:
  local-ip ADDR          Set the IP address to which we bind locally
  no local-ip            Do not bind to a certain IP address
  remote-ip ADDR         Set the remote IP address to which we connect
  remote-port <1-65535>  Set the remote port to which we connect
  prefix PREFIX          Set the item/counter name prefix
  no prefix              Do not use a prefix
  enable                 Enable the reporter
  disable                Disable the reporter
Sponsored-by: On-Waves ehf
Diffstat (limited to 'src/vty')
| -rw-r--r-- | src/vty/stats_vty.c | 261 | 
1 files changed, 260 insertions, 1 deletions
diff --git a/src/vty/stats_vty.c b/src/vty/stats_vty.c index c19b2259..954f3581 100644 --- a/src/vty/stats_vty.c +++ b/src/vty/stats_vty.c @@ -29,13 +29,209 @@  #include <osmocom/vty/buffer.h>  #include <osmocom/vty/vty.h>  #include <osmocom/vty/telnet_interface.h> +#include <osmocom/vty/telnet_interface.h>  #include <osmocom/vty/misc.h> +#include <osmocom/core/stats.h> +  #define CFG_STATS_STR "Configure stats sub-system\n"  #define CFG_REPORTER_STR "Configure a stats reporter\n"  #define SHOW_STATS_STR "Show statistical values\n" +struct cmd_node cfg_stats_node = { +	CFG_STATS_NODE, +	"%s(config-stats)# ", +	1 +}; + +static struct stats_reporter *osmo_stats_vty2srep(struct vty *vty) +{ +	if (vty->node == CFG_STATS_NODE) +		return vty->index; + +	return NULL; +} + +static int set_srep_parameter_str(struct vty *vty, +	int (*fun)(struct stats_reporter *, const char *), +	const char *val, const char *param_name) +{ +	int rc; +	struct stats_reporter *srep = osmo_stats_vty2srep(vty); +	OSMO_ASSERT(srep); + +	rc = fun(srep, val); +	if (rc < 0) { +		vty_out(vty, "%% Unable to set %s: %s%s", +			param_name, strerror(-rc), VTY_NEWLINE); +		return CMD_WARNING; +	} + +	return CMD_SUCCESS; +} + +static int set_srep_parameter_int(struct vty *vty, +	int (*fun)(struct stats_reporter *, int), +	const char *val, const char *param_name) +{ +	int rc; +	int int_val; +	struct stats_reporter *srep = osmo_stats_vty2srep(vty); +	OSMO_ASSERT(srep); + +	int_val = atoi(val); + +	rc = fun(srep, int_val); +	if (rc < 0) { +		vty_out(vty, "%% Unable to set %s: %s%s", +			param_name, strerror(-rc), VTY_NEWLINE); +		return CMD_WARNING; +	} + +	return CMD_SUCCESS; +} + +DEFUN(cfg_stats_reporter_local_ip, cfg_stats_reporter_local_ip_cmd, +	"local-ip ADDR", +	"Set the IP address to which we bind locally\n" +	"IP Address\n") +{ +	return set_srep_parameter_str(vty, stats_reporter_set_local_addr, +		argv[0], "local address"); +} + +DEFUN(cfg_no_stats_reporter_local_ip, cfg_no_stats_reporter_local_ip_cmd, +	"no local-ip", +	NO_STR +	"Set the IP address to which we bind locally\n") +{ +	return set_srep_parameter_str(vty, stats_reporter_set_local_addr, +		NULL, "local address"); +} + +DEFUN(cfg_stats_reporter_remote_ip, cfg_stats_reporter_remote_ip_cmd, +	"remote-ip ADDR", +	"Set the remote IP address to which we connect\n" +	"IP Address\n") +{ +	return set_srep_parameter_str(vty, stats_reporter_set_remote_addr, +		argv[0], "remote address"); +} + +DEFUN(cfg_stats_reporter_remote_port, cfg_stats_reporter_remote_port_cmd, +	"remote-port <1-65535>", +	"Set the remote port to which we connect\n" +	"Remote port number\n") +{ +	return set_srep_parameter_int(vty, stats_reporter_set_remote_port, +		argv[0], "remote port"); +} + +DEFUN(cfg_stats_reporter_interval, cfg_stats_reporter_interval_cmd, +	"interval <1-65535>", +	"Set the reporting interval\n" +	"Interval in seconds\n") +{ +	return set_srep_parameter_int(vty, stats_reporter_set_interval, +		argv[0], "reporting interval"); +} + +DEFUN(cfg_stats_reporter_prefix, cfg_stats_reporter_prefix_cmd, +	"prefix PREFIX", +	"Set the item name prefix\n" +	"The prefix string\n") +{ +	return set_srep_parameter_str(vty, stats_reporter_set_name_prefix, +		argv[0], "prefix string"); +} + +DEFUN(cfg_no_stats_reporter_prefix, cfg_no_stats_reporter_prefix_cmd, +	"no prefix", +	NO_STR +	"Set the item name prefix\n") +{ +	return set_srep_parameter_str(vty, stats_reporter_set_name_prefix, +		"", "prefix string"); +} + +DEFUN(cfg_stats_reporter_enable, cfg_stats_reporter_enable_cmd, +	"enable", +	"Enable the reporter\n") +{ +	int rc; +	struct stats_reporter *srep = osmo_stats_vty2srep(vty); +	OSMO_ASSERT(srep); + +	rc = stats_reporter_enable(srep); +	if (rc < 0) { +		vty_out(vty, "%% Unable to enable the reporter: %s%s", +			strerror(-rc), VTY_NEWLINE); +		return CMD_WARNING; +	} + +	return CMD_SUCCESS; +} + +DEFUN(cfg_stats_reporter_disable, cfg_stats_reporter_disable_cmd, +	"disable", +	"Disable the reporter\n") +{ +	int rc; +	struct stats_reporter *srep = osmo_stats_vty2srep(vty); +	OSMO_ASSERT(srep); + +	rc = stats_reporter_disable(srep); +	if (rc < 0) { +		vty_out(vty, "%% Unable to disable the reporter: %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") +{ +	struct stats_reporter *srep; + +	srep = stats_reporter_find(STATS_REPORTER_STATSD, NULL); +	if (!srep) { +		srep = stats_reporter_create_statsd(NULL); +		if (!srep) { +			vty_out(vty, "%% Unable to create statsd reporter%s", +				VTY_NEWLINE); +			return CMD_WARNING; +		} +		/* TODO: if needed, add stats_add_reporter(srep); */ +	} + +	vty->index = srep; +	vty->node = CFG_STATS_NODE; + +	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") +{ +	struct stats_reporter *srep; + +	srep = stats_reporter_find(STATS_REPORTER_STATSD, NULL); +	if (!srep) { +		vty_out(vty, "%% No statsd logging active%s", +			VTY_NEWLINE); +		return CMD_WARNING; +	} + +	stats_reporter_free(srep); + +	return CMD_SUCCESS; +} +  DEFUN(show_stats,        show_stats_cmd,        "show stats", @@ -46,7 +242,70 @@ DEFUN(show_stats,  	return CMD_SUCCESS;  } -void stats_vty_add_cmds(const struct log_info *cat) +static int config_write_stats_reporter(struct vty *vty, struct stats_reporter *srep) +{ +	if (srep == NULL) +		return 0; + +	switch (srep->type) { +	case STATS_REPORTER_STATSD: +		vty_out(vty, "stats reporter statsd%s", VTY_NEWLINE); +		break; +	} + +	vty_out(vty, "  disable%s", VTY_NEWLINE); + +	if (srep->dest_addr_str) +		vty_out(vty, "  remote-ip %s%s", +			srep->dest_addr_str, VTY_NEWLINE); +	if (srep->dest_port) +		vty_out(vty, "  remote-port %d%s", +			srep->dest_port, VTY_NEWLINE); +	if (srep->bind_addr_str) +		vty_out(vty, "  local-ip %s%s", +			srep->bind_addr_str, VTY_NEWLINE); +	if (srep->interval) +		vty_out(vty, "  interval %d%s", +			srep->interval, VTY_NEWLINE); +	if (srep->name_prefix && *srep->name_prefix) +		vty_out(vty, "  prefix %s%s", +			srep->name_prefix, VTY_NEWLINE); +	else +		vty_out(vty, "  no prefix%s", VTY_NEWLINE); + +	if (srep->enabled) +		vty_out(vty, "  enable%s", VTY_NEWLINE); + +	return 1; +} + +static int config_write_stats(struct vty *vty) +{ +	struct stats_reporter *srep; + +	srep = stats_reporter_find(STATS_REPORTER_STATSD, NULL); +	config_write_stats_reporter(vty, srep); + +	return 1; +} + +void stats_vty_add_cmds()  {  	install_element_ve(&show_stats_cmd); + +	install_element(CONFIG_NODE, &cfg_stats_reporter_statsd_cmd); +	install_element(CONFIG_NODE, &cfg_no_stats_reporter_statsd_cmd); + +	install_node(&cfg_stats_node, config_write_stats); +	vty_install_default(CFG_STATS_NODE); + +	install_element(CFG_STATS_NODE, &cfg_stats_reporter_local_ip_cmd); +	install_element(CFG_STATS_NODE, &cfg_no_stats_reporter_local_ip_cmd); +	install_element(CFG_STATS_NODE, &cfg_stats_reporter_remote_ip_cmd); +	install_element(CFG_STATS_NODE, &cfg_stats_reporter_remote_port_cmd); +	install_element(CFG_STATS_NODE, &cfg_stats_reporter_interval_cmd); +	install_element(CFG_STATS_NODE, &cfg_stats_reporter_prefix_cmd); +	install_element(CFG_STATS_NODE, &cfg_no_stats_reporter_prefix_cmd); +	install_element(CFG_STATS_NODE, &cfg_stats_reporter_enable_cmd); +	install_element(CFG_STATS_NODE, &cfg_stats_reporter_disable_cmd);  }  | 
