[SR-Dev] git:master: kex: added implementation of core stats and mi stats

Daniel-Constantin Mierla miconda at gmail.com
Wed Apr 22 17:17:47 CEST 2009


Module: sip-router
Branch: master
Commit: 4568924a49062d998cad865ce92b223df3e1f58a
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=4568924a49062d998cad865ce92b223df3e1f58a

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Wed Apr 22 17:14:00 2009 +0200

kex: added implementation of core stats and mi stats

- code for specific implementations of statistics API moved here from
  libkcore
- k statistics API use now atomic ops for SR core

---

 modules_k/kex/core_stats.c |  247 ++++++++++++++++++++++++++++++++++++++++++++
 modules_k/kex/core_stats.h |   82 +++++++++++++++
 modules_k/kex/kex_mod.c    |   10 ++
 3 files changed, 339 insertions(+), 0 deletions(-)

diff --git a/modules_k/kex/core_stats.c b/modules_k/kex/core_stats.c
new file mode 100644
index 0000000..b72fa0e
--- /dev/null
+++ b/modules_k/kex/core_stats.c
@@ -0,0 +1,247 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2006 Voice Sistem SRL
+ *
+ * This file is part of Kamailio, a free SIP server.
+ *
+ * Kamailio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Kamailio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * History:
+ * ---------
+ *  2006-01-23  first version (bogdan)
+ *  2006-11-28  Added statistics for the number of bad URI's, methods, and 
+ *              proxy requests (Jeffrey Magder - SOMA Networks)
+ */
+
+/*!
+ * \file
+ * \brief Kamailio Core statistics
+ */
+
+
+#include <string.h>
+
+#include "../../lib/kcore/statistics.h"
+#include "../../lib/kmi/mi.h"
+#include "../../dprint.h"
+
+
+#ifdef STATISTICS
+
+stat_var* rcv_reqs;				/*!< received requests        */
+stat_var* rcv_rpls;				/*!< received replies         */
+stat_var* fwd_reqs;				/*!< forwarded requests       */
+stat_var* fwd_rpls;				/*!< forwarded replies        */
+stat_var* drp_reqs;				/*!< dropped requests         */
+stat_var* drp_rpls;				/*!< dropped replies          */
+stat_var* err_reqs;				/*!< error requests           */
+stat_var* err_rpls;				/*!< error replies            */
+stat_var* bad_URIs;				/*!< number of bad URIs       */
+stat_var* unsupported_methods;	/*!< unsupported methods      */
+stat_var* bad_msg_hdr;			/*!< messages with bad header */
+
+
+/*! exported core statistics */
+stat_export_t core_stats[] = {
+	{"rcv_requests" ,         0,  &rcv_reqs              },
+	{"rcv_replies" ,          0,  &rcv_rpls              },
+	{"fwd_requests" ,         0,  &fwd_reqs              },
+	{"fwd_replies" ,          0,  &fwd_rpls              },
+	{"drop_requests" ,        0,  &drp_reqs              },
+	{"drop_replies" ,         0,  &drp_rpls              },
+	{"err_requests" ,         0,  &err_reqs              },
+	{"err_replies" ,          0,  &err_rpls              },
+	{"bad_URIs_rcvd",         0,  &bad_URIs              },
+	{"unsupported_methods",   0,  &unsupported_methods   },
+	{"bad_msg_hdr",           0,  &bad_msg_hdr           },
+	{0,0,0}
+};
+
+static struct mi_root *mi_get_stats(struct mi_root *cmd, void *param);
+static struct mi_root *mi_reset_stats(struct mi_root *cmd, void *param);
+
+static mi_export_t mi_stat_cmds[] = {
+	{ "get_statistics",    mi_get_stats,    0  ,  0,  0 },
+	{ "reset_statistics",  mi_reset_stats,  0  ,  0,  0 },
+	{ 0, 0, 0, 0, 0}
+};
+
+int register_mi_stats(void)
+{
+	/* register MI commands */
+	if (register_mi_mod( "statistics", mi_stat_cmds)<0) {
+		LM_ERR("unable to register MI cmds\n");
+		return -1;
+	}
+	return 0;
+}
+int register_core_stats(void)
+{
+	/* register core statistics */
+	if (register_module_stats( "core", core_stats)!=0 ) {
+		LM_ERR("failed to register core statistics\n");
+		return -1;
+	}
+#if 0
+	/* register sh_mem statistics */
+	if (register_module_stats( "shmem", shm_stats)!=0 ) {
+		LM_ERR("failed to register sh_mem statistics\n");
+		return -1;
+	}
+#endif
+	return 0;
+}
+
+/***************************** MI STUFF ********************************/
+
+inline static int mi_add_stat(struct mi_node *rpl, stat_var *stat)
+{
+	struct mi_node *node;
+	stats_collector *sc;
+
+	if((sc = get_stats_collector())==NULL) return -1;
+
+	node = addf_mi_node_child(rpl, 0, 0, 0, "%.*s:%.*s = %lu",
+		sc->amodules[stat->mod_idx].name.len,
+		sc->amodules[stat->mod_idx].name.s,
+		stat->name.len, stat->name.s,
+		get_stat_val(stat) );
+
+	if (node==0)
+		return -1;
+	return 0;
+}
+
+inline static int mi_add_module_stats(struct mi_node *rpl,
+													module_stats *mods)
+{
+	struct mi_node *node;
+	stat_var *stat;
+
+	for( stat=mods->head ; stat ; stat=stat->lnext) {
+		node = addf_mi_node_child(rpl, 0, 0, 0, "%.*s:%.*s = %lu",
+			mods->name.len, mods->name.s,
+			stat->name.len, stat->name.s,
+			get_stat_val(stat) );
+		if (node==0)
+			return -1;
+	}
+	return 0;
+}
+
+
+static struct mi_root *mi_get_stats(struct mi_root *cmd, void *param)
+{
+	struct mi_root *rpl_tree;
+	struct mi_node *rpl;
+	struct mi_node *arg;
+	module_stats   *mods;
+	stat_var       *stat;
+	str val;
+	int i;
+
+	stats_collector *sc;
+
+	if((sc = get_stats_collector())==NULL)
+		return init_mi_tree( 404, "Statistics Not Found", 20);
+
+	if (cmd->node.kids==NULL)
+		return init_mi_tree( 400, MI_MISSING_PARM_S, MI_MISSING_PARM_LEN);
+
+	rpl_tree = init_mi_tree( 200, MI_OK_S, MI_OK_LEN);
+	if (rpl_tree==0)
+		return 0;
+	rpl = &rpl_tree->node;
+
+	for( arg=cmd->node.kids ; arg ; arg=arg->next) {
+		if (arg->value.len==0)
+			continue;
+
+		val = arg->value;
+
+		if ( val.len==3 && memcmp(val.s,"all",3)==0) {
+			/* add all statistic variables */
+			for( i=0 ; i<sc->mod_no ;i++ ) {
+				if (mi_add_module_stats( rpl, &sc->amodules[i] )!=0)
+					goto error;
+			}
+		} else if ( val.len>1 && val.s[val.len-1]==':') {
+			/* add module statistics */
+			val.len--;
+			mods = get_stat_module( &val );
+			if (mods==0)
+				continue;
+			if (mi_add_module_stats( rpl, mods )!=0)
+				goto error;
+		} else {
+			/* add only one statistic */
+			stat = get_stat( &val );
+			if (stat==0)
+				continue;
+			if (mi_add_stat(rpl,stat)!=0)
+				goto error;
+		}
+	}
+
+	if (rpl->kids==0) {
+		free_mi_tree(rpl_tree);
+		return init_mi_tree( 404, "Statistics Not Found", 20);
+	}
+
+	return rpl_tree;
+error:
+	free_mi_tree(rpl_tree);
+	return 0;
+}
+
+
+
+static struct mi_root *mi_reset_stats(struct mi_root *cmd, void *param)
+{
+	struct mi_root *rpl_tree;
+	struct mi_node *arg;
+	stat_var       *stat;
+	int found;
+
+	if (cmd->node.kids==NULL)
+		return init_mi_tree( 400, MI_MISSING_PARM_S, MI_MISSING_PARM_LEN);
+
+	rpl_tree = init_mi_tree( 200, MI_OK_S, MI_OK_LEN);
+	if (rpl_tree==0)
+		return 0;
+	found = 0;
+
+	for( arg=cmd->node.kids ; arg ; arg=arg->next) {
+		if (arg->value.len==0)
+			continue;
+
+		stat = get_stat( &arg->value );
+		if (stat==0)
+			continue;
+
+		reset_stat( stat );
+		found = 1;
+	}
+
+	if (!found) {
+		free_mi_tree(rpl_tree);
+		return init_mi_tree( 404, "Statistics Not Found", 20);
+	}
+
+	return rpl_tree;
+}
+
+#endif
diff --git a/modules_k/kex/core_stats.h b/modules_k/kex/core_stats.h
new file mode 100644
index 0000000..fabbee1
--- /dev/null
+++ b/modules_k/kex/core_stats.h
@@ -0,0 +1,82 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2006 Voice Sistem SRL
+ *
+ * This file is part of Kamailio, a free SIP server.
+ *
+ * Kamailio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Kamailio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * History:
+ * ---------
+ *  2006-01-23  first version (bogdan)
+ *  2006-11-28  Added statistics for the number of bad URI's, methods, and 
+ *              proxy requests (Jeffrey Magder - SOMA Networks)
+ */
+
+/*!
+ * \file
+ * \brief  Kamailio statistics
+ */
+
+
+#ifndef _CORE_STATS_H_
+#define _CORE_STATS_H_
+
+#include "../../lib/kcore/statistics.h"
+
+#ifdef STATISTICS
+/*! exported core statistics */
+extern stat_export_t core_stats[];
+
+/*! \brief received requests */
+extern stat_var* rcv_reqs;
+
+/*! \brief received replies */
+extern stat_var* rcv_rpls;
+
+/*! \brief forwarded requests */
+extern stat_var* fwd_reqs;
+
+/*! \brief forwarded replies */
+extern stat_var* fwd_rpls;
+
+/*! \brief dropped requests */
+extern stat_var* drp_reqs;
+
+/*! \brief dropped replies */
+extern stat_var* drp_rpls;
+
+/*! \brief error requests */
+extern stat_var* err_reqs;
+
+/*! \brief error replies */
+extern stat_var* err_rpls;
+
+/*! \brief Set in parse_uri() */
+extern stat_var* bad_URIs;
+
+/*! \brief Set in parse_method() */
+extern stat_var* unsupported_methods;
+
+/*! \brief Set in get_hdr_field(). */
+extern stat_var* bad_msg_hdr;
+ 
+int register_mi_stats(void);
+int register_core_stats(void);
+
+#endif /*STATISTICS*/
+
+#endif /*_CORE_STATS_H_*/
diff --git a/modules_k/kex/kex_mod.c b/modules_k/kex/kex_mod.c
index e99b6dc..c9c3ae3 100644
--- a/modules_k/kex/kex_mod.c
+++ b/modules_k/kex/kex_mod.c
@@ -28,6 +28,7 @@
 #include "../../dprint.h"
 
 #include "mi_core.h"
+#include "core_stats.h"
 
 
 MODULE_VERSION
@@ -72,6 +73,12 @@ static int mod_init(void)
 {
 	if(init_mi_core()<0)
 		return -1;
+#ifdef STATISTICS
+	if(register_core_stats()<0)
+		return -1;
+	if(register_mi_stats()<0)
+		return -1;
+#endif
 	return 0;
 }
 
@@ -80,6 +87,9 @@ static int mod_init(void)
  */
 void destroy(void)
 {
+#ifdef STATISTICS
+	destroy_stats_collector();
+#endif
 	return;
 }
 




More information about the sr-dev mailing list