Skip to content

Commit

Permalink
report number of fds in stats, added /debug endpoint to retrieve memo…
Browse files Browse the repository at this point in the history
…ry stats
  • Loading branch information
pablohoffman committed Jun 7, 2013
1 parent 7b04ead commit d54d249
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 2 deletions.
16 changes: 14 additions & 2 deletions splash/resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from twisted.internet import reactor, defer
from twisted.python import log
from splash.qtrender import HtmlRender, PngRender, RenderError
from splash.utils import getarg, BadRequest
from splash.utils import getarg, BadRequest, get_num_fds, get_leaks
from splash import sentry


Expand Down Expand Up @@ -48,8 +48,9 @@ def _writeOutput(self, html, request):
"path": request.path,
"args": request.args,
"rendertime": time.time() - request.starttime,
"rss": resource.getrusage(resource.RUSAGE_SELF).ru_maxrss,
"maxrss": resource.getrusage(resource.RUSAGE_SELF).ru_maxrss,
"load": os.getloadavg(),
"fds": get_num_fds(),
}
log.msg(json.dumps(stats), system="stats")
request.setHeader("content-type", self.content_type)
Expand Down Expand Up @@ -90,12 +91,23 @@ def _getRender(self, request):
return PngRender(url, baseurl, width, height, vwidth, vheight)


class Debug(Resource):

isLeaf = True

def render_GET(self, request):
return json.dumps({
"leaks": get_leaks(),
})


class Root(Resource):

def __init__(self):
Resource.__init__(self)
self.putChild("render.html", RenderHtml())
self.putChild("render.png", RenderPng())
self.putChild("debug", Debug())

def getChild(self, name, request):
if name == "":
Expand Down
17 changes: 17 additions & 0 deletions splash/utils.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import os, gc, inspect
from collections import defaultdict

_REQUIRED = object()

Expand All @@ -15,3 +17,18 @@ def getarg(request, name, default=_REQUIRED, type=str, range=None):
else:
return default

PID = os.getpid()
def get_num_fds():
return len(os.listdir("/proc/%s/fd" % PID))

def get_leaks():
relevant_types = frozenset(('CustomQWebPage', 'CustomQNetworkAccessManager',
'QWebView', 'HtmlRender', 'PngRender', 'QNetworkRequest'))
leaks = defaultdict(int)
gc.collect()
for o in gc.get_objects():
if not inspect.isclass(o):
cname = type(o).__name__
if cname in relevant_types:
leaks[cname] += 1
return leaks

0 comments on commit d54d249

Please sign in to comment.