diff --git a/apps/monitoring/Monitoring.cpp b/apps/monitoring/Monitoring.cpp index 88a5ceab..b9254381 100644 --- a/apps/monitoring/Monitoring.cpp +++ b/apps/monitoring/Monitoring.cpp @@ -63,6 +63,11 @@ Monitor::~Monitor() { } int Monitor::onLoad() { + AmArg a; + a.assertArray(); + AmArg b; + a.pop(b); + // todo: if GC configured, start thread AmConfigReader cfg; if(cfg.loadFile(AmConfig::ModConfigPath + string(MOD_NAME ".conf"))) { @@ -92,6 +97,8 @@ void Monitor::invoke(const string& method, logAdd(args,ret); } else if(method == "markFinished"){ markFinished(args,ret); + } else if(method == "setExpiration"){ + setExpiration(args,ret); } else if(method == "get"){ get(args,ret); } else if(method == "getAttribute"){ @@ -120,6 +127,7 @@ void Monitor::invoke(const string& method, ret.push(AmArg("log")); ret.push(AmArg("logAdd")); ret.push(AmArg("markFinished")); + ret.push(AmArg("setExpiration")); ret.push(AmArg("erase")); ret.push(AmArg("clear")); ret.push(AmArg("clearFinished")); @@ -184,7 +192,19 @@ void Monitor::markFinished(const AmArg& args, AmArg& ret) { LogBucket& bucket = getLogBucket(args[0].asCStr()); bucket.log_lock.lock(); if (!bucket.log[args[0].asCStr()].finished) - bucket.log[args[0].asCStr()].finished = time(0); + bucket.log[args[0].asCStr()].finished = time(0); + bucket.log_lock.unlock(); + ret.push(0); + ret.push("OK"); +} + +void Monitor::setExpiration(const AmArg& args, AmArg& ret) { + assertArgCStr(args[0]); + assertArgInt(args[1]); + + LogBucket& bucket = getLogBucket(args[0].asCStr()); + bucket.log_lock.lock(); + bucket.log[args[0].asCStr()].finished = args[1].asInt(); bucket.log_lock.unlock(); ret.push(0); ret.push("OK"); diff --git a/apps/monitoring/Monitoring.h b/apps/monitoring/Monitoring.h index c5ae66a0..3afc0e15 100644 --- a/apps/monitoring/Monitoring.h +++ b/apps/monitoring/Monitoring.h @@ -68,6 +68,7 @@ class Monitor void log(const AmArg& args, AmArg& ret); void logAdd(const AmArg& args, AmArg& ret); void markFinished(const AmArg& args, AmArg& ret); + void setExpiration(const AmArg& args, AmArg& ret); void clear(const AmArg& args, AmArg& ret); void clearFinished(const AmArg& args, AmArg& ret); void erase(const AmArg& args, AmArg& ret); diff --git a/doc/Readme.monitoring b/doc/Readme.monitoring index d1abda91..fcf0d6ca 100644 --- a/doc/Readme.monitoring +++ b/doc/Readme.monitoring @@ -30,10 +30,12 @@ This will remove all info about finished sessions preiodically. DI API ------ -functions to log, e.g. from inside SEMS: +functions to log, e.g. from inside SEMS (but may also be like memcache from outside): log(ID, key, value [, key, value [, key, value [...]]]) - set one or multiple AVPs logAdd(ID, key, value) - add a value to a AVPs markFinished(ID) - mark call as finished + setExpiration(ID, time) - set expiration of item identified with ID to time + in seconds since the Epoch (like time(2)) functions to get log, e.g. from the outside: list() - list IDs of calls