Skip to content

Commit 7c2d72d

Browse files
author
Matt George
committed
more items for resweb
Also found some issues in the worker module that I went ahead and fixed and tested
1 parent cbc9c85 commit 7c2d72d

File tree

11 files changed

+393
-22
lines changed

11 files changed

+393
-22
lines changed

src/pyres/worker.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,27 @@ def validate_queues(self):
2828
def register_worker(self):
2929
self.resq.redis.sadd('workers',str(self))
3030
#self.resq._redis.add("worker:#{self}:started", Time.now.to_s)
31+
self.started = datetime.datetime.now()
3132
#Stat.clear("processed:#{self}")
3233
#Stat.clear("failed:#{self}")
3334

35+
def _set_started(self, time):
36+
if time:
37+
self.resq.redis.set("worker:%s:started" % self, time.strftime('%Y-%m-%d %H:%M:%S'))
38+
else:
39+
self.resq.redis.delete("worker:%s:started" % self)
40+
41+
def _get_started(self):
42+
datestring = self.resq.redis.get("worker:%s:started" % self)
43+
ds = None
44+
if datestring:
45+
ds = datetime.datetime.strptime(datestring, '%Y-%m-%d %H:%M:%S')
46+
return ds
47+
started = property(_get_started, _set_started)
48+
3449
def unregister_worker(self):
3550
self.resq.redis.srem('workers',str(self))
51+
self.started = None
3652

3753
def startup(self):
3854
self.register_signal_handlers()
@@ -140,12 +156,16 @@ def processed(self):
140156
total_processed.incr()
141157
worker_processed.incr()
142158

159+
def get_processed(self):
160+
return Stat("processed:%s" % str(self), self.resq).get()
161+
143162
def failed(self):
144163
total_failed = Stat("failed", self.resq)
145164
stat = Stat("failed:%s" % self, self.resq)
146165
total_failed.incr()
147166
stat.incr()
148-
167+
def get_failed(self):
168+
return Stat("failed:%s" % self, self.resq).get()
149169
def job(self):
150170
data = self.resq.redis.get("worker:%s" % self)
151171
if data:

src/resweb/server.py

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,20 @@
11
from itty import *
22
from pyres import ResQ
33
from pyres.failure import Failure
4-
from pyres.worker import Worker
5-
from views import Overview, Queues, Workers, Working, Failed, Stats
4+
from views import (
5+
Overview,
6+
Queues,
7+
Queue,
8+
Workers,
9+
Working,
10+
Failed,
11+
Stats,
12+
Stat,
13+
Worker
14+
)
15+
616
HOST = "localhost:6379"
17+
MY_ROOT = os.path.join(os.path.dirname(__file__), 'media')
718
#resq = ResQ(HOST)
819

920
@get("/")
@@ -18,33 +29,43 @@ def working(request):
1829
def queues(request):
1930
return str(Queues(HOST).render())
2031

21-
@get('/queue/(?P<queue_id>\w+)/')
32+
@get('/queues/(?P<queue_id>\w+)/')
2233
def queue(request, queue_id):
23-
return str(Queues(HOST, queue_id).render())
34+
return str(Queue(HOST, queue_id).render())
2435

2536
@get('/failed/')
2637
def failed(request):
2738
return str(Failed(HOST).render())
2839

29-
@get('/workers/(?P<worker_id>\w+)/')
40+
@get('/workers/(?P<worker_id>\w.+)/')
3041
def worker(request, worker_id):
31-
return str(Worker(worker_id).render())
42+
return str(Worker(HOST, worker_id).render())
3243

3344
@get('/workers/')
3445
def workers(request):
3546
return str(Workers(HOST).render())
3647

3748
@get('/stats/')
3849
def stats(request):
39-
return str(Stats(HOST).render())
50+
raise Redirect('/stats/resque/')
51+
52+
@get('/stats/(?P<key>\w+)/')
53+
def stats(request, key):
54+
return str(Stats(HOST, key).render())
55+
56+
@get('/stat/(?P<stat_id>\w.+)')
57+
def stat(request, stat_id):
58+
return str(Stat(HOST, stat_id).render())
4059

4160
@get('/media/(?P<filename>.+)')
4261
def my_media(request, filename):
4362
print filename
63+
#return serve_static_file(request, filename)
4464
#my_media.content_type = content_type(filename)
45-
my_root = os.path.join(os.path.dirname(__file__), 'media')
46-
output = static_file(filename, root=my_root)
47-
return Response(output, content_type=content_type(filename))
65+
66+
return serve_static_file(request, filename, root=MY_ROOT)
67+
#output = static_file(filename, root=MY_ROOT)
68+
#return Response(output, content_type=content_type(filename))
4869
#return static_file(request, filename=filename, root=my_root)
4970

5071
run_itty()

src/resweb/templates/failed.mustache

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1+
{{>header}}
12
<h1>Failed Jobs</h1>
2-
Pending Failure module completion!
3+
Pending Failure module completion!
4+
{{>footer}}

src/resweb/templates/header.mustache

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
<title>Resque.</title>
55
<link href="{{media_folder}}reset.css" media="screen" rel="stylesheet" type="text/css">
66
<link href="{{media_folder}}style.css" media="screen" rel="stylesheet" type="text/css">
7-
<script src="{{media_folder}}jquery-1.3.2.min.js" type="text/javascript"</script>
8-
<script src="{{media_folder}}jquery.relatize_date.js" type="text/javascript"</script>
97

108
</head>
119
<body>
@@ -20,6 +18,10 @@
2018
</ul>
2119
</div>
2220

23-
{{sub_nav}}
21+
<ul class='subnav'>
22+
{{#sub_nav}}
23+
<li ><a href="/{{section}}/{{subtab}}/"><span>{{subtab}}</span></a></li>
24+
{{/sub_nav}}
25+
</ul>
2426

2527
<div id="main">

src/resweb/templates/queue.mustache

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{{>header}}
2+
<h1>Pending jobs on <span class='hl'>{{queue}}</span></h1>
3+
<p class='sub'>Showing {{start}} to {{end}} of <b>{{size}}</b> jobs</p>
4+
<table class='jobs'>
5+
<tr>
6+
<th>Class</th>
7+
<th>Args</th>
8+
</tr>
9+
{{#jobs}}
10+
<tr>
11+
<td class='class'>{{class}}</td>
12+
<td class='args'>{{args}}</td>
13+
</tr>
14+
{{/jobs}}
15+
{{#empty_job}}
16+
<tr>
17+
<td class='no-data' colspan='2'>There are no pending jobs in this queue</td>
18+
</tr>
19+
{{/empty_job}}
20+
</table>
21+
{{>footer}}

src/resweb/templates/queues.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
</tr>
3030
{{#queues}}
3131
<tr>
32-
<td class='queue'><a class="queue" href="/queue/{{queue}}">{{queue}}</a></td>
32+
<td class='queue'><a class="queue" href="/queues/{{queue}}">{{queue}}</a></td>
3333
<td class='size'>{{size}}</td>
3434
</tr>
3535
{{/queues}}

src/resweb/templates/stat.mustache

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{{>header}}
2+
<h1>Key "{{key}}" is a {{key_type}}</h1>
3+
<h2>size: {{size}}</h2>
4+
<table>
5+
{{#items}}
6+
<tr>
7+
<td>
8+
{{row}}
9+
</td>
10+
</tr>
11+
{{/items}}
12+
</table>
13+
{{>footer}}

src/resweb/templates/stats.mustache

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,37 @@
11
{{>header}}
2-
Coming Soon!
2+
{{#standard}}
3+
<h1>{{title}}</h1>
4+
<table class='stats'>
5+
{{#stats}}
6+
<tr>
7+
<th>
8+
{{key}}
9+
</th>
10+
<td>
11+
{{value}}
12+
</td>
13+
</tr>
14+
{{/stats}}
15+
</table>
16+
{{/standard}}
17+
{{#resque_keys}}
18+
<h1>{{title}}</h1>
19+
<p class='sub'>(All keys are actually prefixed with "resque:")</p>
20+
<table class='stats'>
21+
<tr>
22+
<th>key</th>
23+
<th>type</th>
24+
<th>size</th>
25+
</tr>
26+
{{#stats}}
27+
<tr>
28+
<th>
29+
<a href="/stat/{{key}}">{{key}}</a>
30+
</th>
31+
<td>{{type}}</td>
32+
<td>{{size}}</td>
33+
</tr>
34+
{{/stats}}
35+
</table>
36+
{{/resque_keys}}
337
{{>footer}}

src/resweb/templates/worker.mustache

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
{{>header}}
2+
<h1>Worker {{worker}}</h1>
3+
<table class='workers'>
4+
<tr>
5+
<th>&nbsp;</th>
6+
<th>Host</th>
7+
<th>Pid</th>
8+
<th>Started</th>
9+
<th>Queues</th>
10+
<th>Processed</th>
11+
<th>Failed</th>
12+
<th>Processing</th>
13+
</tr>
14+
<tr>
15+
<td class='icon'><img src="/media/{{state}}.png" alt="{{state}}" title="{{state}}"></td>
16+
<td>{{host}}</td>
17+
<td>{{pid}}</td>
18+
<td><span class="time">{{started_at}}</a></td>
19+
<td class='queues'>
20+
{{#queues}}
21+
<a class="queue-tag" href="/queues/{{q}}">{{q}}</a>&nbsp;
22+
{{/queues}}
23+
</td>
24+
<td>{{processed}}</td>
25+
<td>{{failed}}</td>
26+
<td class='process'>
27+
{{#data}}
28+
<code>{{code}}</code>
29+
<small><a class="queue time" href="/working/{{worker}}">{{runat}}</a></small>
30+
{{/data}}
31+
{{#nodata}}
32+
<span class='waiting'>Waiting for a job...</span>
33+
{{/nodata}}
34+
</td>
35+
</tr>
36+
</table>
37+
{{>footer}}

0 commit comments

Comments
 (0)