Files
reddit/r2/draw_load.py
ketralnis 37e2ba9892 * Combine cassandra clusters into a single one
* Add a new Cassandra CF for comment-sort caching
* Add JSONP support
* Support non-auto-renewing PayPal IPNs
* Gold accounting
* Gold features: comments tracking, larger comment limit
* Autorenewing gold
* Google checkout support
* Profile-page sorting for all
* Title-text on the logo
* Hardcache sharding and profiling
* Self serve enhancements
* Add /r/foo/faq
* Make self-centred reddits allow for more verbose selftext
* Much better down-handling of databases
* Add the ability to take a thread-dump from a running process
* Remove the comscore tracker
* Add comments to modqueue (does not back-populate)
2010-10-18 11:52:44 -07:00

114 lines
3.8 KiB
Python

from __future__ import with_statement
import Image, ImageDraw
colors = [
"#FFFFFF", "#f0f5FF",
"#E2ECFF", "#d6f5cb",
"#CAFF98", "#e4f484",
"#FFEA71", "#ffdb81",
"#FF9191", "#FF0000"]
def get_load_level(host, nlevels = 8):
# default number of cpus shall be 1
ncpus = getattr(host, "ncpu", 1)
# color code in nlevel levels
return _load_int(host.load(), ncpus, nlevels = 8)
def _load_int(current, max_val, nlevels = 8):
i = min(max(int(nlevels*current/max_val+0.4), 0),nlevels+1)
return colors[i]
def draw_load(row_size = 12, width = 200, out_file = "/tmp/load.png"):
from r2.lib import services
a = services.AppServiceMonitor()
hosts = list(a)
number = (len([x for x in hosts if x.services]) +
len([x for x in hosts if x.database]) +
sum(len(x.queue.queues) for x in hosts if x.queue)) + 14
im = Image.new("RGB", (width, number * row_size + 3))
draw = ImageDraw.Draw(im)
def draw_box(label, color, center = False):
ypos = draw_box.ypos
xpos = 1
if center:
w, h = draw.textsize(label)
xpos = (width - w) / 2
draw.rectangle(((1, ypos), (width-2, ypos + row_size)), color)
draw.text((xpos,ypos+1), label, fill = "#000000")
draw_box.ypos += row_size
draw_box.ypos = 0
draw_box(" ==== DATABASES ==== ", "#BBBBBB", center = True)
for host in hosts:
if host.database or host.host.startswith('vote'):
draw_box(" %s load: %s" % (host.host, host.load()),
get_load_level(host))
draw_box(" ==== SERVICES ==== ", "#BBBBBB", center = True)
for host in hosts:
if host.host.startswith('app'):
draw_box(" %s load: %s" % (host.host, host.load()),
get_load_level(host))
draw_box(" ==== BUTTONS ==== ", "#BBBBBB", center = True)
for host in hosts:
if host.host.startswith('button'):
draw_box(" %s load: %s" % (host.host, host.load()),
get_load_level(host))
draw_box(" ==== MEDIA ==== ", "#BBBBBB", center = True)
for host in hosts:
if host.host.startswith('media'):
draw_box(" %s load: %s" % (host.host, host.load()),
get_load_level(host))
draw_box(" ==== SEARCH ==== ", "#BBBBBB", center = True)
for host in hosts:
if host.host.startswith('search'):
draw_box(" %s load: %s" % (host.host, host.load()),
get_load_level(host))
draw_box(" ==== CACHES ==== ", "#BBBBBB", center = True)
for host in hosts:
if (host.host.startswith('cache') or host.host.startswith('pmc') or
host.host.startswith('url')):
draw_box(" %s load: %s" % (host.host, host.load()),
get_load_level(host))
draw_box(" ==== QUEUES ==== ", "#BBBBBB", center = True)
for host in hosts:
if host.queue:
draw_box(" %s load: %s" % (host.host, host.load()),
get_load_level(host))
for name, data in host.queue:
max_len = host.queue.max_length(name)
draw_box(" %16s: %5s / %5s" % (name, data(), max_len),
_load_int(data(), max_len))
with open(out_file, 'w') as handle:
im.save(handle, "PNG")
def merge_images(out_file, file_names):
images = []
width = 0
height = 0
for f in file_names:
images.append(Image.open(f))
w, h = images[-1].size
width = max(w, width)
height += h
total = Image.new("RGB", (width, height))
height = 0
for im in images:
total.paste(im, (0, height))
w, h = im.size
height += h
with open(out_file, 'w') as handle:
total.save(out_file)