Mercurial > code > home > repos > homeauto
diff service/reasoning/reasoning.py @ 287:3b61c0dfaaef
switch from evtiming to greplin.scales. Optimize rules reader to reuse previous data (400ms -> 0.6ms)
Ignore-this: a655f4c56db51b09b3f14d7f09e354cb
author | drewp@bigasterisk.com |
---|---|
date | Mon, 09 May 2016 00:32:08 -0700 |
parents | da0b3a1394a3 |
children | e03696277b32 |
line wrap: on
line diff
--- a/service/reasoning/reasoning.py Sun May 08 03:05:27 2016 -0700 +++ b/service/reasoning/reasoning.py Mon May 09 00:32:08 2016 -0700 @@ -26,6 +26,10 @@ from twisted.internet.defer import inlineCallbacks import cyclone.web, cyclone.websocket +sys.path.append("scales/src") +from greplin import scales +from greplin.scales.cyclonehandler import StatsHandler + from inference import infer, readRules from actions import Actions from inputgraph import InputGraph @@ -35,14 +39,15 @@ from logsetup import log -sys.path.append('../../../ffg/ffg') -import evtiming - ROOM = Namespace("http://projects.bigasterisk.com/room/") DEV = Namespace("http://projects.bigasterisk.com/device/") NS = {'': ROOM, 'dev': DEV} +STATS = scales.collection('/web', + scales.PmfStat('poll'), + scales.PmfStat('graphChanged')) + class Reasoning(object): def __init__(self): self.prevGraph = None @@ -58,21 +63,21 @@ self.inputGraph.updateFileData() @inlineCallbacks + @STATS.poll.time() def poll(self): - t1 = time.time() try: yield self.inputGraph.updateRemoteData() self.lastPollTime = time.time() except Exception, e: log.error(traceback.format_exc()) self.lastError = str(e) - evtiming.serviceLevel.addData('poll', time.time() - t1) + def updateRules(self): rulesPath = 'rules.n3' try: t1 = time.time() - self.rulesN3, self.ruleGraph = readRules( + self.rulesN3, self.ruleStore = readRules( rulesPath, outputPatterns=[ # Incomplete. See escapeoutputstatements.py for # explanation. @@ -81,7 +86,6 @@ (None, ROOM['powerState'], None), (None, ROOM['state'], None), ]) - self._readRules(rulesPath) ruleParseTime = time.time() - t1 except ValueError: # this is so if you're just watching the inferred output, @@ -93,7 +97,7 @@ return [(ROOM['reasoner'], ROOM['ruleParseTime'], Literal(ruleParseTime))], ruleParseTime - evtiming.serviceLevel.timed('graphChanged') + @STATS.graphChanged.time() def graphChanged(self, inputGraph, oneShot=False, oneShotGraph=None): """ If we're getting called for a oneShot event, the oneShotGraph @@ -108,11 +112,11 @@ oldInferred = self.inferred try: ruleStatStmts, ruleParseSec = self.updateRules() - + self.inferred = self._makeInferred(inputGraph.getGraph()) self.inferred += unquoteOutputStatements(self.inferred) - + self.inferred += ruleStatStmts if oneShot: @@ -146,9 +150,9 @@ return out + class Index(cyclone.web.RequestHandler): def get(self): - print evtiming.serviceLevel.serviceJsonReport() # make sure GET / fails if our poll loop died ago = time.time() - self.settings.reasoning.lastPollTime @@ -276,6 +280,7 @@ (r'/rules', Rules), (r'/status', Status), (r'/events', Events), + (r'/stats/(.*)', StatsHandler, {'serverName': 'reasoning'}), ] cyclone.web.Application.__init__(self, handlers, reasoning=reasoning)