diff options
Diffstat (limited to 'python')
-rw-r--r-- | python/gras/query/__init__.py | 33 | ||||
-rw-r--r-- | python/gras/query/chart_factory.js | 82 | ||||
-rw-r--r-- | python/gras/query/chart_total_io_counts.js | 31 | ||||
-rw-r--r-- | python/gras/query/main.js | 32 |
4 files changed, 105 insertions, 73 deletions
diff --git a/python/gras/query/__init__.py b/python/gras/query/__init__.py index 06c7b70..b71b7e0 100644 --- a/python/gras/query/__init__.py +++ b/python/gras/query/__init__.py @@ -1,7 +1,9 @@ import time import BaseHTTPServer +import urlparse import json import os + __path__ = os.path.abspath(os.path.dirname(__file__)) server_registry = dict() @@ -15,23 +17,39 @@ class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler): def do_GET(s): """Respond to a GET request.""" + + #extract the path and set default + o = urlparse.urlparse(s.path) args = server_registry[s.server] - path = s.path - if path.startswith('/'): path = path[1:] - if not path: path = 'main.html' + path = o.path + + #handle json requests if path.endswith('.json'): s.send_response(200) s.send_header("Content-type", "application/json") s.end_headers() - if path == 'args.json': + if path == '/args.json': arg_strs = dict((str(k), str(v)) for k, v in args.iteritems()) s.wfile.write(json.dumps(arg_strs)) - elif path == 'stats.json': - s.wfile.write(args['top_block'].query(s.path)) else: - s.wfile.write(json.dumps({})) + #why the fuck does no OS ever patch boost when there is a bug + #https://svn.boost.org/trac/boost/ticket/6785 + #serialize the path args into xml -- but I just wanted json + def xml_from_qs(k, v): + if not isinstance(v, list): v = [v] + return ''.join(['<%s>%s</%s>'%(k, v_i, k) for v_i in v]) + query_args = [xml_from_qs(k,v) for k,v in urlparse.parse_qs(o.query).iteritems()] + query_args.append(xml_from_qs('path', path)) + xml_args = xml_from_qs('args', ''.join(query_args)) + s.wfile.write(args['top_block'].query(xml_args)) return + + #clean up path for filesystem + if path.startswith('/'): path = path[1:] + if not path: path = 'main.html' target = os.path.join(__path__, path) + + #get files from the local file system if os.path.exists(target): s.send_response(200) if target.endswith('.js'): s.send_header("Content-type", "text/javascript") @@ -39,6 +57,7 @@ class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler): else: s.send_header("Content-type", "text") s.end_headers() s.wfile.write(open(target).read()) + #otherwise not found do 404 else: s.send_response(404) s.send_header("Content-type", "text/html") diff --git a/python/gras/query/chart_factory.js b/python/gras/query/chart_factory.js index 5b3239a..ae23728 100644 --- a/python/gras/query/chart_factory.js +++ b/python/gras/query/chart_factory.js @@ -1,4 +1,9 @@ /*********************************************************************** + * Some constants + **********************************************************************/ +var GRAS_CHARTS_STD_WIDTH = 250; + +/*********************************************************************** * Chart registry for now chart types **********************************************************************/ var gras_chart_get_registry = function() @@ -12,43 +17,28 @@ var gras_chart_get_registry = function() } /*********************************************************************** - * update after new query event + * get blocks that need active querying **********************************************************************/ -function gras_chart_factory_update(registry, point) +function gras_chart_factory_active_blocks(registry) { + var block_ids = new Array(); $.each(registry.active_charts, function(index, chart_info) { - chart_info.point = point; //store last data point - chart_info.chart.update(point); + $.merge(block_ids, chart_info.args.block_ids); }); + return $.unique(block_ids); } /*********************************************************************** - * One time setup + * update after new query event **********************************************************************/ -function gras_chart_factory_setup(registry, point) +function gras_chart_factory_update(registry, point) { - //gui init for factory controls - gras_chart_factory_init(registry); - - //block registry and checkboxes init - $.each(point.blocks, function(id, block) + registry.point = point; //store last data point + $.each(registry.active_charts, function(index, chart_info) { - registry.block_ids.push(id); - var container = $('#chart_designer_blocks'); - var div = $('<div />'); - $(div).append('<label>' + id + '</label>'); - var input = $('<input />').attr({ - type: 'checkbox', - name: id - }); - input.attr('checked', false); - $(div).append(input); - $(container).append(div); + chart_info.chart.update(point); }); - - //try to load last settings - try{gras_chart_load(registry);}catch(e){} } /*********************************************************************** @@ -174,7 +164,7 @@ function gras_chart_factory_make(registry, args) args['height'] = chart_box.height(); args['position'] = chart_box.offset(); chart.gc_resize = false; - chart.update(chart_info.point); + chart.update(registry.point); gras_chart_save(registry); }; @@ -187,7 +177,7 @@ function gras_chart_factory_make(registry, args) start: function(event, ui) { chart.gc_resize = true; - chart.update(chart_info.point); + chart.update(registry.point); }}); chart_box.css('position', 'absolute'); @@ -204,20 +194,9 @@ function gras_chart_factory_make(registry, args) } /*********************************************************************** - * chart factory handle online/offline - **********************************************************************/ -function gras_chart_factory_online(registry) -{ - if (!registry.online) registry.offline_count++; - if (registry.online) $('#page').css('background-color', '#EEEEFF'); - else if (registry.offline_count%2 == 0) $('#page').css('background-color', '#FF4848'); - else if (registry.offline_count%2 == 1) $('#page').css('background-color', '#EEEEFF'); -} - -/*********************************************************************** * chart factory init **********************************************************************/ -function gras_chart_factory_init(registry) +function gras_chart_factory_init(registry, done_cb) { //init registry containers registry.active_charts = new Array(); @@ -259,4 +238,29 @@ function gras_chart_factory_init(registry) if (registry.overall_active) gras_query_stats(registry); else window.clearInterval(registry.timeout_handle); }); + + //block registry and checkboxes init + $.getJSON('/blocks.json', function(data) + { + $.each(data.blocks, function(index, id) + { + registry.block_ids.push(id); + var container = $('#chart_designer_blocks'); + var div = $('<div />'); + $(div).append('<label>' + id + '</label>'); + var input = $('<input />').attr({ + type: 'checkbox', + name: id + }); + input.attr('checked', false); + $(div).append(input); + $(container).append(div); + }); + + //try to load last settings + try{gras_chart_load(registry);}catch(e){} + + //done callback because getJSON was async + done_cb(registry); + }); } diff --git a/python/gras/query/chart_total_io_counts.js b/python/gras/query/chart_total_io_counts.js index 2f9ced3..f959414 100644 --- a/python/gras/query/chart_total_io_counts.js +++ b/python/gras/query/chart_total_io_counts.js @@ -21,20 +21,29 @@ GrasChartTotalIoCounts.prototype.update = function(point) $('ul', this.div).remove(); //clear old lists this.div.append(ul); + function make_entry(strong, span) { - var init_time = parseInt(block_data.init_time); - var stats_time = parseInt(block_data.stats_time); - var tps = parseInt(block_data.tps); - var duration = (stats_time - init_time)/tps; var li = $('<li />'); - var strong = $('<strong />').text('Elapsed' + ': '); - var span = $('<span />').text(duration.toFixed(2).toString() + ' secs'); + var strong = $('<strong />').text(strong + ": "); + var span = $('<span />').text(span); li.append(strong); li.append(span); ul.append(li); } + //create total time elapsed entry + { + var init_time = block_data.init_time; + var stats_time = block_data.stats_time; + var tps = block_data.tps; + var duration = (stats_time - init_time)/tps; + make_entry('Elapsed', duration.toFixed(2).toString() + ' secs'); + } + var stuff = [ + ['Enque', 'items', 'items_enqueued'], + ['Enque', 'tags', 'tags_enqueued'], + ['Enque', 'msgs', 'msgs_enqueued'], ['Input', 'items', 'items_consumed'], ['Input', 'tags', 'tags_consumed'], ['Input', 'msgs', 'msgs_consumed'], @@ -50,12 +59,10 @@ GrasChartTotalIoCounts.prototype.update = function(point) var key = contents[2]; $.each(block_data[key], function(index, count) { - var li = $('<li />'); - var strong = $('<strong />').text(dir + index.toString() + ': '); - var span = $('<span />').text(count.toString() + ' ' + units); - li.append(strong); - li.append(span); - if (count > 0) ul.append(li); + if (count > 0) + { + make_entry(dir + index.toString(), count.toString() + ' ' + units); + } }); }); } diff --git a/python/gras/query/main.js b/python/gras/query/main.js index 8a261f9..a9c255b 100644 --- a/python/gras/query/main.js +++ b/python/gras/query/main.js @@ -1,9 +1,4 @@ /*********************************************************************** - * Some constants - **********************************************************************/ -var GRAS_CHARTS_STD_WIDTH = 250; - -/*********************************************************************** * Stats registry data structure **********************************************************************/ var GrasStatsRegistry = function() @@ -17,6 +12,17 @@ var GrasStatsRegistry = function() } /*********************************************************************** + * Server offline animation + **********************************************************************/ +function gras_handle_offline(registry) +{ + if (!registry.online) registry.offline_count++; + if (registry.online) $('#page').css('background-color', '#EEEEFF'); + else if (registry.offline_count%2 == 0) $('#page').css('background-color', '#FF4848'); + else if (registry.offline_count%2 == 1) $('#page').css('background-color', '#EEEEFF'); +} + +/*********************************************************************** * Query stats **********************************************************************/ var gras_query_stats = function(registry) @@ -26,10 +32,12 @@ var gras_query_stats = function(registry) async: true, url: "/stats.json", dataType: "json", + traditional: true, //needed to parse data + data: {block:gras_chart_factory_active_blocks(registry)}, success: function(response) { registry.online = true; - gras_chart_factory_online(registry); + gras_handle_offline(registry); if (registry.overall_active) { gras_chart_factory_update(registry, response); @@ -43,7 +51,7 @@ var gras_query_stats = function(registry) error: function() { registry.online = false; - gras_chart_factory_online(registry); + gras_handle_offline(registry); registry.timeout_handle = window.setTimeout(function() { gras_query_stats(registry); @@ -68,12 +76,6 @@ var gras_stats_main = function() document.title += ' - ' + registry.top_id; }); - //query the stats for initial setup - $.getJSON('/stats.json', function(data) - { - gras_chart_factory_setup(registry, data); - }); - - //start the query loop in the background - gras_query_stats(registry); + //initialize the charts factory + gras_chart_factory_init(registry, gras_query_stats); } |