summaryrefslogtreecommitdiff
path: root/docs/examples/index.html
diff options
context:
space:
mode:
Diffstat (limited to 'docs/examples/index.html')
-rw-r--r--docs/examples/index.html216
1 files changed, 216 insertions, 0 deletions
diff --git a/docs/examples/index.html b/docs/examples/index.html
new file mode 100644
index 0000000..9d12389
--- /dev/null
+++ b/docs/examples/index.html
@@ -0,0 +1,216 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <meta http-equiv="content-type" content="text/html;charset=utf-8" />
+
+ <title>Jarmon - customisable, Javascript generated charts from
+ Collectd RRD data</title>
+
+ <link rel="stylesheet" type="text/css" href="assets/css/style.css" />
+ <link rel="stylesheet" type="text/css" href="assets/css/tabs-no-images.css" />
+ <link rel="stylesheet" type="text/css" href="assets/css/jquerytools.dateinput.skin1.css" />
+
+ <script type="text/javascript" src="assets/js/dependencies.js"></script>
+
+ <script type="text/javascript" src="../../jarmon/jarmon.js"></script>
+ <script type="text/javascript" src="jarmon_example_recipes.js"></script>
+ <script type="text/javascript">
+ // Recipes for the charts on this page
+
+ var application_recipes = [
+ {
+ title: 'Jarmon Webserver TCP Stats',
+ data: [
+ ['data/tcpconns-8080-local/tcp_connections-CLOSE_WAIT.rrd', 0, 'CLOSE_WAIT', ''],
+ ['data/tcpconns-8080-local/tcp_connections-SYN_RECV.rrd', 0, 'SYN_RECV', ''],
+ ['data/tcpconns-8080-local/tcp_connections-TIME_WAIT.rrd', 0, 'TIME_WAIT', ''],
+ ['data/tcpconns-8080-local/tcp_connections-CLOSED.rrd', 0, 'CLOSED', ''],
+ ['data/tcpconns-8080-local/tcp_connections-FIN_WAIT2.rrd', 0, 'FIN_WAIT2', ''],
+ ['data/tcpconns-8080-local/tcp_connections-FIN_WAIT1.rrd', 0, 'FIN_WAIT1', ''],
+ ['data/tcpconns-8080-local/tcp_connections-ESTABLISHED.rrd', 0, 'ESTABLISHED', ''],
+ ['data/tcpconns-8080-local/tcp_connections-LAST_ACK.rrd', 0, 'LAST_ACK', ''],
+ ['data/tcpconns-8080-local/tcp_connections-LISTEN.rrd', 0, 'LISTEN', ''],
+ ['data/tcpconns-8080-local/tcp_connections-SYN_SENT.rrd', 0, 'SYN_SENT', ''],
+ ['data/tcpconns-8080-local/tcp_connections-CLOSING.rrd', 0, 'CLOSING', '']
+ ],
+ options: jQuery.extend(true, {yaxis: {tickDecimals: 0}}, jarmon.Chart.BASE_OPTIONS, jarmon.Chart.STACKED_OPTIONS)
+ }
+ ];
+
+
+ function initialiseCharts() {
+ /**
+ * Setup chart date range controls and all charts
+ **/
+
+ var p = new jarmon.Parallimiter(1);
+ function serialDownloader(url) {
+ return p.addCallable(jarmon.downloadBinary, [url]);
+ }
+
+ // Extract the chart template from the page
+ var chartTemplate = $('.chart-container').remove();
+
+ function templateFactory(parentEl) {
+ return function() {
+ // The chart template must be appended to the page early, so
+ // that flot can calculate chart dimensions etc.
+ return chartTemplate.clone().appendTo(parentEl);
+ }
+ }
+
+ var cc = new jarmon.ChartCoordinator($('.chartRangeControl'));
+ var t;
+ // Initialise tabs and update charts when tab is clicked
+ $(".css-tabs:first").bind('click', function(i) {
+ // XXX: Hack to give the tab just enough time to become visible
+ // so that flot can calculate chart dimensions.
+ window.clearTimeout(t);
+ t = window.setTimeout(function() { cc.update(); }, 100);
+ });
+
+ cc.charts = [].concat(
+ jarmon.Chart.fromRecipe(
+ [].concat(
+ jarmon.COLLECTD_RECIPES.cpu,
+ jarmon.COLLECTD_RECIPES.memory,
+ jarmon.COLLECTD_RECIPES.load),
+ templateFactory('.system-charts'), serialDownloader),
+ jarmon.Chart.fromRecipe(
+ jarmon.COLLECTD_RECIPES.interface,
+ templateFactory('.network-charts'), serialDownloader),
+ jarmon.Chart.fromRecipe(
+ jarmon.COLLECTD_RECIPES.dns,
+ templateFactory('.dns-charts'), serialDownloader),
+ jarmon.Chart.fromRecipe(
+ application_recipes,
+ templateFactory('.application-charts'), serialDownloader)
+ );
+
+ // Initialise all the charts
+ cc.init();
+ }
+
+ $(function() {
+ // Add dhtml calendars to the date input fields
+ $(".timerange_control img")
+ .dateinput({
+ 'format': 'dd mmm yyyy 00:00:00',
+ 'max': +1,
+ 'css': {'input': 'jquerytools_date'}})
+ .bind('onBeforeShow', function(e) {
+ var classes = $(this).attr('class').split(' ');
+ var currentDate, input_selector;
+ for(var i=0; i<=classes.length; i++) {
+ input_selector = '[name="' + classes[i] + '"]';
+ // Look for a neighboring input element whose name matches the
+ // class name of this calendar
+ // Parse the value as a date if the returned date.getTime
+ // returns NaN we know it's an invalid date
+ // XXX: is there a better way to check for valid date?
+ currentDate = new Date($(this).siblings(input_selector).val());
+ if(currentDate.getTime() != NaN) {
+ $(this).data('dateinput')._input_selector = input_selector;
+ $(this).data('dateinput')._initial_val = currentDate.getTime();
+ $(this).data('dateinput').setValue(currentDate);
+ break;
+ }
+ }
+ })
+ .bind('onHide', function(e) {
+ // Called after a calendar date has been chosen by the user.
+
+ // Use the sibling selector that we generated above before opening
+ // the calendar
+ var input_selector = $(this).data('dateinput')._input_selector;
+ var oldStamp = $(this).data('dateinput')._initial_val;
+ var newDate = $(this).data('dateinput').getValue();
+ // Only update the form field if the date has changed.
+ if(oldStamp != newDate.getTime()) {
+ $(this).siblings(input_selector).val(
+ newDate.toString().split(' ').slice(1,5).join(' '));
+ // Trigger a change event which should automatically update the
+ // graphs and change the timerange drop down selector to
+ // "custom"
+ $(this).siblings(input_selector).trigger('change');
+ }
+ });
+
+ // Avoid overlaps between the calendars
+ // XXX: This is a bit of hack, what if there's more than one set of calendar
+ // controls on a page?
+ $(".timerange_control img.from_custom").bind('onBeforeShow',
+ function() {
+ var otherVal = new Date(
+ $('.timerange_control [name="to_custom"]').val());
+
+ $(this).data('dateinput').setMax(otherVal);
+ }
+ );
+ $(".timerange_control img.to_custom").bind('onBeforeShow',
+ function() {
+ var otherVal = new Date(
+ $('.timerange_control [name="from_custom"]').val());
+
+ $(this).data('dateinput').setMin(otherVal);
+ }
+ );
+
+ // Setup dhtml tabs
+ $(".css-tabs").tabs(".css-panes > div", {history: true});
+
+ initialiseCharts();
+ });
+ </script>
+ </head>
+
+ <body>
+ <div class="chartRangeControl">
+ <form>
+ <div>
+ <span class="timerange_control custom">
+ <img src="assets/icons/calendar.png" width="16" height="16" alt="calendar" class="from_custom"
+ title="Click to choose a custom start date" />
+ <input name="from_custom" type="text" readonly="readonly"
+ title="Time range start" />
+ <img src="assets/icons/calendar.png" width="16" height="16" alt="calendar" class="to_custom"
+ title="Click to choose a custom end date" />
+ <input name="to_custom" type="text" readonly="readonly"
+ title="Time range end" />
+ </span>
+ <span class="timerange_control standard">
+ <select name="from_standard"
+ title="Time range shortcuts - click to select an alternative time range" >
+ </select>
+ </span>
+ <input name="from" type="hidden" />
+ <input name="to" type="hidden" />
+ <select name="tzoffset"
+ title="Timezone offset - click to choose a custom timezone offset" ></select>
+ <input name="action" value="Update" type="button"
+ title="Graph update - click to update all graphs" />
+ </div>
+ <div class="range-preview"
+ title="Time range preview - click and drag to select a custom timerange" ></div>
+ </form>
+ <ul class="css-tabs">
+ <li><a href="#system">System</a></li>
+ <li><a href="#network">Network</a></li>
+ <li><a href="#dns">DNS</a></li>
+ <li><a href="#application">Application</a></li>
+ </ul>
+ <div class="css-panes charts">
+ <div class="system-charts"></div>
+ <div class="network-charts"></div>
+ <div class="dns-charts"></div>
+ <div class="application-charts"></div>
+ </div>
+ <div class="chart-container">
+ <h2 class="title"></h2>
+ <div class="chart"></div>
+ <div class="graph-legend"></div>
+ </div>
+ </div>
+ </body>
+</html>