[sr-dev] git:master:a2915a9f: app_python: execution log message based on core latency_limit_action

Daniel-Constantin Mierla miconda at gmail.com
Sun Mar 10 10:56:41 CET 2019


Module: kamailio
Branch: master
Commit: a2915a9fc3d974e85829ccb6ea22d655124d4463
URL: https://github.com/kamailio/kamailio/commit/a2915a9fc3d974e85829ccb6ea22d655124d4463

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2019-03-10T10:56:03+01:00

app_python: execution log message based on core latency_limit_action

---

Modified: src/modules/app_python/apy_kemi.c

---

Diff:  https://github.com/kamailio/kamailio/commit/a2915a9fc3d974e85829ccb6ea22d655124d4463.diff
Patch: https://github.com/kamailio/kamailio/commit/a2915a9fc3d974e85829ccb6ea22d655124d4463.patch

---

diff --git a/src/modules/app_python/apy_kemi.c b/src/modules/app_python/apy_kemi.c
index 87e2ccce07..7a3717ecce 100644
--- a/src/modules/app_python/apy_kemi.c
+++ b/src/modules/app_python/apy_kemi.c
@@ -23,12 +23,14 @@
 #include <stdlib.h>
 
 #include <Python.h>
+#include <frameobject.h>
 
 #include "../../core/dprint.h"
 #include "../../core/route.h"
 #include "../../core/fmsg.h"
 #include "../../core/kemi.h"
 #include "../../core/pvar.h"
+#include "../../core/timer.h"
 #include "../../core/mem/pkg.h"
 #include "../../core/mem/shm.h"
 #include "../../core/rpc.h"
@@ -160,15 +162,16 @@ PyObject *sr_apy_kemi_return_str(sr_kemi_t *ket, char *sval, int slen)
 {
 	return PyString_FromStringAndSize(sval, slen);
 }
+
 /**
  *
  */
-PyObject *sr_apy_kemi_exec_func(PyObject *self, PyObject *args, int idx)
+PyObject *sr_apy_kemi_exec_func_ex(sr_kemi_t *ket, PyObject *self,
+			PyObject *args, int idx)
 {
 	str fname;
 	int i;
 	int ret;
-	sr_kemi_t *ket = NULL;
 	sr_kemi_val_t vps[SR_KEMI_PARAMS_MAX];
 	sr_apy_env_t *env_P;
 	sip_msg_t *lmsg = NULL;
@@ -185,10 +188,6 @@ PyObject *sr_apy_kemi_exec_func(PyObject *self, PyObject *args, int idx)
 		lmsg = env_P->msg;
 	}
 
-	ket = sr_apy_kemi_export_get(idx);
-	if(ket==NULL) {
-		return sr_kemi_apy_return_false();
-	}
 	if(ket->mname.len>0) {
 		LM_DBG("execution of method: %.*s\n", ket->fname.len, ket->fname.s);
 	} else {
@@ -700,6 +699,50 @@ PyObject *sr_apy_kemi_exec_func(PyObject *self, PyObject *args, int idx)
 	}
 }
 
+/**
+ *
+ */
+PyObject *sr_apy_kemi_exec_func(PyObject *self, PyObject *args, int idx)
+{
+	sr_kemi_t *ket = NULL;
+	PyObject *ret = NULL;
+	unsigned int ms = 0;
+	PyThreadState *pstate = NULL;
+	PyFrameObject *pframe = NULL;
+
+	ket = sr_apy_kemi_export_get(idx);
+	if(ket==NULL) {
+		return sr_kemi_apy_return_false();
+	}
+	if(unlikely(cfg_get(core, core_cfg, latency_limit_action)>0)) {
+			ms = TICKS_TO_MS(get_ticks_raw());
+	}
+
+	ret = sr_apy_kemi_exec_func_ex(ket, self, args, idx);
+
+	if(unlikely(cfg_get(core, core_cfg, latency_limit_action)>0)) {
+		ms = TICKS_TO_MS(get_ticks_raw()) - ms;
+		if(ms >= cfg_get(core, core_cfg, latency_limit_action)
+				&& is_printable(cfg_get(core, core_cfg, latency_log))) {
+			pstate = PyThreadState_GET();
+			if (pstate != NULL && pstate->frame != NULL) {
+				pframe = pstate->frame;
+			}
+
+			LOG(cfg_get(core, core_cfg, latency_log),
+					"alert - action KSR.%s%s%s(...)"
+					" took too long [%u ms] (file:%s func:%s line:%d)\n",
+					(ket->mname.len>0)?ket->mname.s:"",
+					(ket->mname.len>0)?".":"", ket->fname.s, ms,
+					(pframe)?PyString_AsString(pframe->f_code->co_filename):"",
+					(pframe)?PyString_AsString(pframe->f_code->co_name):"",
+					(pframe)?PyCode_Addr2Line(pframe->f_code, pframe->f_lasti):0);
+		}
+	}
+
+	return ret;
+}
+
 /**
  *
  */




More information about the sr-dev mailing list