stats: allow configuring reporter's name in the VTY

This allows configuring more than one reporter of the given type.

Change-Id: Ia815c24dc974648985539913012b3b074ea317a9
Related: SYS#5713
diff --git a/src/vty/stats_vty.c b/src/vty/stats_vty.c
index 17e7190..a4fc6ea 100644
--- a/src/vty/stats_vty.c
+++ b/src/vty/stats_vty.c
@@ -269,14 +269,20 @@
 }
 
 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")
+	"stats reporter statsd [NAME]",
+	CFG_STATS_STR CFG_REPORTER_STR
+	"Report to a STATSD server\n"
+	"Name of the reporter\n")
 {
 	struct osmo_stats_reporter *srep;
+	const char *name = NULL;
 
-	srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_STATSD, NULL);
+	if (argc > 0)
+		name = argv[0];
+
+	srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_STATSD, name);
 	if (!srep) {
-		srep = osmo_stats_reporter_create_statsd(NULL);
+		srep = osmo_stats_reporter_create_statsd(name);
 		if (!srep) {
 			vty_out(vty, "%% Unable to create statsd reporter%s",
 				VTY_NEWLINE);
@@ -293,12 +299,18 @@
 }
 
 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")
+	"no stats reporter statsd [NAME]",
+	NO_STR CFG_STATS_STR CFG_REPORTER_STR
+	"Report to a STATSD server\n"
+	"Name of the reporter\n")
 {
 	struct osmo_stats_reporter *srep;
+	const char *name = NULL;
 
-	srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_STATSD, NULL);
+	if (argc > 0)
+		name = argv[0];
+
+	srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_STATSD, name);
 	if (!srep) {
 		vty_out(vty, "%% No statsd logging active%s",
 			VTY_NEWLINE);
@@ -311,14 +323,20 @@
 }
 
 DEFUN(cfg_stats_reporter_log, cfg_stats_reporter_log_cmd,
-	"stats reporter log",
-	CFG_STATS_STR CFG_REPORTER_STR "Report to the logger\n")
+	"stats reporter log [NAME]",
+	CFG_STATS_STR CFG_REPORTER_STR
+	"Report to the logger\n"
+	"Name of the reporter\n")
 {
 	struct osmo_stats_reporter *srep;
+	const char *name = NULL;
 
-	srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_LOG, NULL);
+	if (argc > 0)
+		name = argv[0];
+
+	srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_LOG, name);
 	if (!srep) {
-		srep = osmo_stats_reporter_create_log(NULL);
+		srep = osmo_stats_reporter_create_log(name);
 		if (!srep) {
 			vty_out(vty, "%% Unable to create log reporter%s",
 				VTY_NEWLINE);
@@ -335,12 +353,18 @@
 }
 
 DEFUN(cfg_no_stats_reporter_log, cfg_no_stats_reporter_log_cmd,
-	"no stats reporter log",
-	NO_STR CFG_STATS_STR CFG_REPORTER_STR "Report to the logger\n")
+	"no stats reporter log [NAME]",
+	NO_STR CFG_STATS_STR CFG_REPORTER_STR
+	"Report to the logger\n"
+	"Name of the reporter\n")
 {
 	struct osmo_stats_reporter *srep;
+	const char *name = NULL;
 
-	srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_LOG, NULL);
+	if (argc > 0)
+		name = argv[0];
+
+	srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_LOG, name);
 	if (!srep) {
 		vty_out(vty, "%% No log reporting active%s",
 			VTY_NEWLINE);
@@ -598,18 +622,22 @@
 
 static int config_write_stats_reporter(struct vty *vty, struct osmo_stats_reporter *srep)
 {
-	if (srep == NULL)
-		return 0;
+	const char *type = NULL;
 
 	switch (srep->type) {
 	case OSMO_STATS_REPORTER_STATSD:
-		vty_out(vty, "stats reporter statsd%s", VTY_NEWLINE);
+		type = "statsd";
 		break;
 	case OSMO_STATS_REPORTER_LOG:
-		vty_out(vty, "stats reporter log%s", VTY_NEWLINE);
+		type = "log";
 		break;
 	}
 
+	vty_out(vty, "stats reporter %s", type);
+	if (srep->name != NULL)
+		vty_out(vty, " %s", srep->name);
+	vty_out(vty, "%s", VTY_NEWLINE);
+
 	vty_out(vty, "  disable%s", VTY_NEWLINE);
 
 	if (srep->have_net_config) {
@@ -652,11 +680,9 @@
 {
 	struct osmo_stats_reporter *srep;
 
-	/* TODO: loop through all reporters */
-	srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_STATSD, NULL);
-	config_write_stats_reporter(vty, srep);
-	srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_LOG, NULL);
-	config_write_stats_reporter(vty, srep);
+	/* Loop through all reporters */
+	llist_for_each_entry(srep, &osmo_stats_reporter_list, list)
+		config_write_stats_reporter(vty, srep);
 
 	vty_out(vty, "stats interval %d%s", osmo_stats_config->interval, VTY_NEWLINE);