# ignite-164, ignite-195 : load/html/index.html was deleted tohgether with gg-loadtest-server.js
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/fe005ea3 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/fe005ea3 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/fe005ea3 Branch: refs/heads/ignite-164v2 Commit: fe005ea30dd96e747aed0c500b845980b95932e5 Parents: fe0d10b Author: Artem Shutak <[email protected]> Authored: Fri Feb 6 18:00:58 2015 +0300 Committer: Artem Shutak <[email protected]> Committed: Fri Feb 6 18:00:58 2015 +0300 ---------------------------------------------------------------------- .../src/test/resources/load/html/index.html | 957 ------------------- 1 file changed, 957 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/fe005ea3/modules/core/src/test/resources/load/html/index.html ---------------------------------------------------------------------- diff --git a/modules/core/src/test/resources/load/html/index.html b/modules/core/src/test/resources/load/html/index.html deleted file mode 100644 index 538d52a..0000000 --- a/modules/core/src/test/resources/load/html/index.html +++ /dev/null @@ -1,957 +0,0 @@ -<!-- - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> -<html> -<head> - <meta charset="UTF-8"/> - <meta http-equiv="cache-control" content="no-cache"/> - - <title>Ignite Load Tests</title> - - <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> - <script type="text/javascript" src="https://www.google.com/jsapi"></script> - <script type="text/javascript" src="/gg-loadtest/bootstrap/js/bootstrap.min.js"></script> - <script type="text/javascript" src="/gg-loadtest/js/mustache.js"></script> - - <link rel="stylesheet" type="text/css" href="/gg-loadtest/bootstrap/css/bootstrap.min.css"> - - <style type="text/css"> - .raw-link { - font-size: 16px; - font-family: courier; - } - - .block05 { - width: 49%; - display: inline-block; - } - - .brand img { - width: 16px; - height: 16px; - } - - .gg-chart-block { - margin-bottom: 40px; - } - - a:link { - color : #0077ff; - } - - a:visited { - color : #0077ff; - } - </style> -</head> - -<body> - <div class="navbar"> - <div class="navbar-inner"> - <div class="container"> - <a class="brand" href="#"> - <img src="http://atlassian.gridgain.com/wiki/download/attachments/10682370/book"> - Ignite Load Tests - </a> - - <ul class="nav" role="navigation"> - <li class="dropdown"> - <a class="dropdown-toggle" role="button" data-toggle="dropdown" href="#"> - Display charts - <b class="caret"></b> - </a> - <ul class="dropdown-menu" role="menu"> - <li> - <a id="GridJobExecutionSingleNodeLoadTest" class="gg-chart-checkbox" href="#"> - <input type="checkbox" checked="true"> GridJobExecutionSingleNodeLoadTest - </a> - </li> - <li> - <a id="GridJobExecutionLoadTest" class="gg-chart-checkbox" href="#"> - <input type="checkbox" checked="true"> GridJobExecutionLoadTest - </a> - </li> - <li> - <a id="GridJobExecutionSingleNodeSemaphoreLoadTest" class="gg-chart-checkbox" href="#"> - <input type="checkbox" checked="true"> GridJobExecutionSingleNodeSemaphoreLoadTest - </a> - </li> - <li> - <a id="GridJobExecutionSemaphoreLoadTest" class="gg-chart-checkbox" href="#"> - <input type="checkbox" checked="true"> GridJobExecutionSemaphoreLoadTest - </a> - </li> - <li> - <a id="GridDsiLoadTest" class="gg-chart-checkbox" href="#"> - <input type="checkbox" checked="true"> GridDsiLoadTest - </a> - </li> - <li> - <a id="GridMergeSortLoadTest" class="gg-chart-checkbox" href="#"> - <input type="checkbox" checked="true"> GridMergeSortLoadTest - </a> - </li> - <li> - <a id="GridClientCacheBenchmark" class="gg-chart-checkbox" href="#"> - <input type="checkbox" checked="true"> GridClientCacheBenchmark - </a> - </li> - <li> - <a id="GridCacheBenchmark" class="gg-chart-checkbox" href="#"> - <input type="checkbox" checked="true"> GridCacheBenchmark - </a> - </li> - <li> - <a id="GridSwapEvictAllBenchmark" class="gg-chart-checkbox" href="#"> - <input type="checkbox" checked="true"> GridSwapEvictAllBenchmark - </a> - </li> - <li class="divider"></li> - <li> - <a id="gg-display-all" href="#">Display all</a> - </li> - </ul> - </li> - <li> - <a href="#">Show last:</a> - </li> - <li> - <select id="gg-show-last" class="span1" style="margin-top: 5px;"> - <option>10</option> - <option selected="selected">30</option> - <option>60</option> - <option>90</option> - <option>All</option> - </select> - </li> - <li> - <a href="#">Branch:</a> - </li> - <li> - <select id="gg-branch" class="span2" style="margin-top: 5px;"> - </select> - </li> - <li> - <button id="gg-refresh" class="btn btn-info" style="margin-left: 10px;">Refresh</button> - </li> - </ul> - </div> - </div> - </div> - - <ul class="nav nav-tabs"> - <li class="active"> - <a href="#general" data-toggle="tab">General</a> - </li> - <li> - <a href="#hadoop" data-toggle="tab">Hadoop</a> - </li> - <li> - <a href="#mongo-multinode" data-toggle="tab">Mongo Multinode</a> - </li> - <li> - <a href="#hazelcast" data-toggle="tab">Hazelcast</a> - </li> - </ul> - - <div class="tab-content"> - <div id="general" class="tab-pane fade in active"> - <div class="gg-chart block05"> - <div id="GridJobExecutionSingleNodeLoadTest_chart" class="gg-chart-canvas"></div> - <a href="#" class="raw-link">View raw results</a> - </div> - - <div class="gg-chart block05"> - <div id="GridJobExecutionLoadTest_chart" class="gg-chart-canvas"></div> - <a href="#" class="raw-link">View raw results</a> - </div> - - <div class="gg-chart block05"> - <div id="GridJobExecutionSingleNodeSemaphoreLoadTest_chart" class="gg-chart-canvas"></div> - <a href="#" class="raw-link">View raw results</a> - </div> - - <div class="gg-chart block05"> - <div id="GridJobExecutionSemaphoreLoadTest_chart" class="gg-chart-canvas"></div> - <a href="#" class="raw-link">View raw results</a> - </div> - - <div class="gg-chart" id="GridDsiLoadTest_chart"> - <div class="gg-chart block05"> - <div id="dsi-client-0" class="gg-chart-canvas"></div> - <a href="#" class="raw-link">View raw results</a> - </div> - <div class="gg-chart block05"> - <div id="dsi-client-1" class="gg-chart-canvas"></div> - <a href="#" class="raw-link">View raw results</a> - </div> - - <div class="gg-chart block05"> - <div id="dsi-server-0" class="gg-chart-canvas"></div> - <a href="#" class="raw-link">View raw results</a> - </div> - <div class="gg-chart block05"> - <div id="dsi-server-1" class="gg-chart-canvas"></div> - <a href="#" class="raw-link">View raw results</a> - </div> - </div> - - <div class="gg-chart block05"> - <div id="GridMergeSortLoadTest_chart" class="gg-chart-canvas"></div> - <a href="#" class="raw-link">View raw results</a> - </div> - - <div class="gg-chart block05"> - <div id="GridClientCacheBenchmark_chart" class="gg-chart-canvas"></div> - <a href="#" class="raw-link">View raw results</a> - </div> - - <div class="gg-chart block05"> - <div id="GridCacheBenchmark_chart" class="gg-chart-canvas"></div> - <a href="#" class="raw-link">View raw results</a> - </div> - - <div class="gg-chart block05"> - <div id="GridSwapEvictAllBenchmark_chart" class="gg-chart-canvas"></div> - <a href="#" class="raw-link">View raw results</a> - </div> - </div> - - <div id="hadoop" class="tab-pane fade"> - </div> - - <div id="mongo-multinode" class="tab-pane fade"> - <h3>WriteConcern: ACKNOWLEDGED</h3> - - <div id="ins-MongoMultinodeAcknowledged" class="gg-chart-block"></div> - - <h3>WriteConcern: REPLICA_ACKNOWLEDGED</h3> - - <div id="ins-MongoMultinodeReplicaAcknowledged" class="gg-chart-block"></div> - - <h3>WriteConcern: UNACKNOWLEDGED</h3> - - <div id="ins-MongoMultinodeUnacknowledged" class="gg-chart-block"></div> - </div> - - <div id="hazelcast" class="tab-pane fade"> - </div> - </div> - - <script id="single-div-chart" type="text/mustache"> - <div class="gg-chart block05"> - <div id="{{id}}" class="gg-chart-canvas"></div> - <a href="#" class="raw-link">View raw results</a> - </div> - </script> - - <script type="text/javascript"> - var showLastN = 30; // Number of records to show from the end. - var branch; // Branch, for which to display results. - var commonOptions = { - curveType : 'function', - pointSize : 5, - interpolateNulls : true, - titleTextStyle : { - fontSize : 20 - }, - chartArea : { - left : 60 - }, - hAxis : { - format : 'MMM d, HH:mm' - } - }; - var chartCache; - var chartTemplate = Mustache.compile($('#single-div-chart').html()); - - if (typeof(Storage)!=="undefined") // Local storage is available. - branch = localStorage.gridLastUsedBranch; - - $(document).ready(function() { - // Window resize handler. - $(window).resize(function() { - displayCharts(); - }); - - // Chart menu entry click handler. - $('.gg-chart-checkbox').click(function(e) { - var $cb = $(this).children('input:checkbox'); - - $cb.prop("checked", !$cb.prop("checked")); - - $('#' + $(this).attr('id') + '_chart').closest('.gg-chart').toggle(); - - displayCharts(); - }); - - // Chart menu entry checkbox click handler. - $('.gg-chart-checkbox input:checkbox').click(function(e) { - e.stopPropagation(); - - $('#' + $(this).closest('.gg-chart-checkbox').attr('id') + '_chart').closest('.gg-chart').toggle(); - - displayCharts(); - }); - - // Click handler for Display all menu entry. - $('#gg-display-all').click(function() { - // Invoke click for all unchecked chart checkboxes. - $('.gg-chart-checkbox input:checkbox:not(:checked)').click(); - }); - - // Change handler for Show last combo. - $('#gg-show-last').change(function() { - showLastN = $(this).val(); - - if (showLastN == 'All') - showLastN = undefined; - - displayCharts(true); - }); - - // Change handler for Branch combo. - $('#gg-branch').change(function() { - branch = $(this).val(); - - if (typeof(Storage)!=="undefined") // Local storage is available. - localStorage.gridLastUsedBranch = branch; - - $('.gg-chart-canvas').empty(); - - displayCharts(true); - }); - - // Click handler for Refresh button. - $('#gg-refresh').click(function() { - displayCharts(true); - }); - - // Tab switch handler. - $('a[data-toggle="tab"]').on('shown', function (e) { - displayCharts(); - }); - }); - - google.setOnLoadCallback(function() { - // Get list of available branches. - $.get('/gg-loadtest/branches', function(result) { - var $branchList = $('#gg-branch'); - var currentBranchSeen = false; - var lastEntry; - - parseApacheFsListing(result, function(entry) { - if (!entry) - return; - - if (!branch) { - branch = entry; - currentBranchSeen = true; - } - else - currentBranchSeen |= branch == entry; - - lastEntry = entry; - - $branchList.append('<option>' + entry + '</option>'); - }); - - if (!currentBranchSeen) - branch = lastEntry; - - $("#gg-branch").val(branch); - - displayCharts(); - }, 'text'); - }); - - google.load('visualization', '1.0', {'packages':['corechart']}); - - /** Parses Apache filesystem listing HTML. */ - function parseApacheFsListing(html, branchCb) { - // For each link in a table, fire callback with href value. - $(html).find('td a').each(function(idx, a) { - var href = $(a).attr('href'); - - if (href != '/') - // Fire callback, throwing away trailing /. - branchCb(href.match(/.*\//) ? href.substring(0, href.length - 1) : href); - }); - } - - /** - * Displays Ignite load test charts. - * - * @param invCache Invalidate cache flag. - */ - function displayCharts(invCache) { - // Invalidate cache if needed. - if (invCache) - chartCache = undefined; - - // General. - displayGeneralCharts(); - - // Hadoop. - displayHadoopCharts(); - - // Mongo Multinode. - displayMongoCharts(); - - // Hazelcast. - displayHazelcastCharts(); - } - - /** - * Displays charts for general benchmarks. - */ - function displayGeneralCharts() { - singleLineChart('GridJobExecutionSingleNodeLoadTest', 'Avg. tasks/sec.'); - singleLineChart('GridJobExecutionLoadTest', 'Avg. tasks/sec.', 'darkblue'); - singleLineChart('GridJobExecutionSingleNodeSemaphoreLoadTest', 'Avg. tasks/sec.'); - singleLineChart('GridJobExecutionSemaphoreLoadTest', 'Avg. tasks/sec.', 'darkblue'); - - var dsiClientColumns = function(data) { - data.addColumn('datetime', 'Date/Time'); - data.addColumn('number', 'Tx./sec.'); - data.addColumn('number', 'Avg. latency (ms.)'); - data.addColumn('number', 'Max. submit time (ms.)'); - }; - - multiLineChart({ - name : 'GridDsiLoadTestClient0', - csvFile : 'GridDsiLoadTest.csv-0', - elementId : 'dsi-client-0', - title : 'GridDsiLoadTest (client 0)', - height : 200, - columns : dsiClientColumns - }); - multiLineChart({ - name : 'GridDsiLoadTestClient1', - csvFile : 'GridDsiLoadTest.csv-1', - elementId : 'dsi-client-1', - title : 'GridDsiLoadTest (client 1)', - height : 200, - columns : dsiClientColumns - }); - - var dsiServerColumns = function(data) { - data.addColumn('datetime', 'Date/Time'); - data.addColumn('number', 'Tx./sec.'); - data.addColumn('number', 'Near size'); - data.addColumn('number', 'Dht size'); - }; - - multiLineChart({ - name : 'GridDsiLoadTestServer0', - csvFile : 'GridDsiLoadTest.csv-0-server', - elementId : 'dsi-server-0', - title : 'GridDsiLoadTest (server 0)', - height : 200, - columns : dsiServerColumns - }); - multiLineChart({ - name : 'GridDsiLoadTestServer1', - csvFile : 'GridDsiLoadTest.csv-1-server', - elementId : 'dsi-server-1', - title : 'GridDsiLoadTest (server 1)', - height : 200, - columns : dsiServerColumns - }); - - singleLineChart('GridMergeSortLoadTest', 'Sort time (sec.)', 'green'); - singleLineChart('GridClientCacheBenchmark', 'Iterations/sec.', 'red'); - - multiLineChart({ - name : 'GridCacheBenchmark', - columns : function(data) { - data.addColumn('datetime', 'Date/Time'); - data.addColumn('number', 'Putx duration'); - data.addColumn('number', 'Get duration'); - } - }); - - multiLineChart({ - name : 'GridSwapEvictAllBenchmark', - colors : [ 'purple', 'orange' ], - columns : function(data) { - data.addColumn('datetime', 'Date/Time'); - data.addColumn('number', 'Avg. evict speed'); - data.addColumn('number', 'Avg. unswap speed'); - } - }); - } - - /** - * Displays charts for GGFS (Ignite) vs. HDFS (Hadoop) benchmark. - */ - function displayHadoopCharts() { - var hadoopTests = [ - 'GridFileSystemDirectoryCreateBenchmark', - 'GridFileSystemDirectoryDeleteBenchmark', - 'GridFileSystemDirectoryListBenchmark', - 'GridFileSystemDirectoryRandomOperationsBenchmark', - 'GridFileSystemFileCreateBenchmark', - 'GridFileSystemFileDeleteBenchmark', - 'GridFileSystemFileRandomAccessBenchmark', - 'GridFileSystemFileRandomOperationsBenchmark', - 'GridFileSystemFileScanBenchmark' - ]; - - $.each(hadoopTests, function(idx, test) { - multiLineChart({ - name : test, - colors : [ 'orange', 'rgb(0, 204, 255)' ], - insertInto : 'hadoop', - columns : function(data) { - data.addColumn('datetime', 'Date/Time'); - data.addColumn('number', 'Duration (GGFS)'); - data.addColumn('number', 'Duration (HDFS)'); - } - }); - }); - } - - /** - * Displays charts for Ignite vs. Mongo benchmark. - */ - function displayMongoCharts() { - $.each( - ['Acknowledged', 'ReplicaAcknowledged', 'Unacknowledged'], - function(idx, suiteName) { - multiLineChart({ - name : 'GridMongoInsertBenchmarkMultinode' + suiteName, - title : 'Insert', - colors : [ 'green', 'orange' ], - insertInto : 'ins-MongoMultinode' + suiteName, - columns : function(data) { - data.addColumn('datetime', 'Date/Time'); - data.addColumn('number', 'Inserts/sec. (Mongo)'); - data.addColumn('number', 'Inserts/sec. (Ignite)'); - - return [0, 1, 5]; - } - }); - multiLineChart({ - name : 'GridMongoUpdateBenchmarkMultinode' + suiteName, - title : 'Update', - colors : [ 'green', 'orange' ], - insertInto : 'ins-MongoMultinode' + suiteName, - columns : function(data) { - data.addColumn('datetime', 'Date/Time'); - data.addColumn('number', 'Updates/sec. (Mongo)'); - data.addColumn('number', 'Updates/sec. (Ignite)'); - - return [0, 2, 6]; - } - }); - multiLineChart({ - name : 'GridMongoDeleteBenchmarkMultinode' + suiteName, - title : 'Delete', - colors : [ 'green', 'orange' ], - insertInto : 'ins-MongoMultinode' + suiteName, - columns : function(data) { - data.addColumn('datetime', 'Date/Time'); - data.addColumn('number', 'Deletes/sec. (Mongo)'); - data.addColumn('number', 'Deletes/sec. (Ignite)'); - - return [0, 3, 7]; - } - }); - multiLineChart({ - name : 'GridMongoQueryBenchmarkMultinode' + suiteName, - title : 'Query', - colors : [ 'green', 'orange' ], - insertInto : 'ins-MongoMultinode' + suiteName, - columns : function(data) { - data.addColumn('datetime', 'Date/Time'); - data.addColumn('number', 'Queries/sec. (Mongo)'); - data.addColumn('number', 'Queries/sec. (Ignite)'); - - return [0, 4, 8]; - } - }); - multiLineChart({ - name : 'GridMongoSortQueryBenchmarkMultinode' + suiteName, - title : 'SortQuery', - colors : [ 'green', 'orange' ], - insertInto : 'ins-MongoMultinode' + suiteName, - columns : function(data) { - data.addColumn('datetime', 'Date/Time'); - data.addColumn('number', 'Queries/sec. (Mongo)'); - data.addColumn('number', 'Queries/sec. (Ignite)'); - - return [0, 4, 8]; - } - }); - - multiLineChart({ - name : 'GridMongoMixedOperationsBenchmarkGridGainMultinode' + suiteName, - csvFile : 'GridMongoMixedOperationsBenchmarkMultinode' + suiteName + '.csv', - title : 'MixedOperations (Ignite)', - insertInto : 'ins-MongoMultinode' + suiteName, - columns : function(data) { - data.addColumn('datetime', 'Date/Time'); - data.addColumn('number', 'Inserts/sec.'); - data.addColumn('number', 'Updates/sec.'); - data.addColumn('number', 'Deletes/sec.'); - data.addColumn('number', 'Queries/sec.'); - - return [0, 5, 6, 7, 8]; - } - }); - - multiLineChart({ - name : 'GridMongoMixedOperationsBenchmarkMongoMultinode' + suiteName, - csvFile : 'GridMongoMixedOperationsBenchmarkMultinode' + suiteName + '.csv', - title : 'MixedOperations (Mongo)', - insertInto : 'ins-MongoMultinode' + suiteName, - columns : function(data) { - data.addColumn('datetime', 'Date/Time'); - data.addColumn('number', 'Inserts/sec.'); - data.addColumn('number', 'Updates/sec.'); - data.addColumn('number', 'Deletes/sec.'); - data.addColumn('number', 'Queries/sec.'); - - return [0, 1, 2, 3, 4]; - } - }); - } - ); - } - - /** - * Displays charts for Ignite vs. Hazelcast benchmark. - */ - function displayHazelcastCharts() { - // Base name for all CSV files. - const baseName = 'GridCacheHazelcastComparisonTest'; - - // Tested configuration components. - // Each benchmark uses a distinct combination of those. - // Files are named accordingly. - var comps = [ - { - name : 'PartitionedDistributionMode', - values : [ - { name : 'CLIENT_ONLY', abbr : 'cl' }, - { name : 'PARTITIONED_ONLY', abbr : 'pa' } - ] - }, - { - name : 'WriteSynchronizationMode', - values : [ - { name : 'FULL_SYNC', abbr : 'sync' }, - { name : 'FULL_ASYNC', abbr : 'async' } - ] - }, - { - name : 'GridCacheAtomicityMode', - values : [ - { name : 'ATOMIC', abbr : 'atom' }, - { name : 'TRANSACTIONAL', abbr : 'tran' } - ] - }, - { - name : 'Threads', - values : [ - { name : 'Single', abbr : 'singleTh' }, - { name : 'Multiple', abbr : 'multipleTh' } - ] - }, - { - name : 'Operations', - values : [ - { name : 'Put & Get', abbr : 'pg' }, - { name : 'Put', abbr : 'p' } - ] - }, - { - name : 'Offheap', - values : [ - { name : 'Enabled', abbr : 'off' }, - { name : 'Disabled', abbr : 'mem' } - ] - } - ]; - - const ncombs = Math.pow(2, comps.length); // Number of combinations. - - // Pass through all compinations, form file names, display charts. - for (var i = 0; i < ncombs; i++) { - var fileBase = baseName; - var desc = 'Benchmark ('; // Benchmark description. - var offheap; // OffHeap enabled or not? - - // Each component in the combination has only 2 values. - // This fact is used here to retrieve each value from - // a combination of bits, taken from a current combination - // number. - for (var j = 0; j < comps.length; j++) { - var comp = comps[j]; // Current component. - var compVal = comp.values[(i >> j) & 1]; // Component value (check the corresponding bit). - - fileBase += '_' + compVal.abbr; - - desc += comp.name + ': ' + compVal.name; - if (j < comps.length - 1) - desc += ', '; - - if (comp.name == 'Offheap') - offheap = (compVal.name == 'Enabled'); - } - - desc += ')'; - - //console.log('fileBase', fileBase); - //console.log('desc', desc); - //console.log('offheap', offheap); - - // Depending on the OffHeap mode, we draw either a 2-line or - // 3-line chart. - if (offheap) { - // Draw a 3-line chart. - multiLineChart({ - name : fileBase, - title : desc, - colors : [ 'orange', 'chocolate', 'blueviolet' ], - insertInto : 'hazelcast', - columns : function(data) { - data.addColumn('datetime', 'Date/Time'); - data.addColumn('number', 'Ops/sec. (GG keys in mem)'); - data.addColumn('number', 'Ops/sec. (GG keys offheap)'); - data.addColumn('number', 'Ops/sec. (Hazelcast)'); - } - }); - } - else { - // Draw a 2-line chart. - multiLineChart({ - name : fileBase, - title : desc, - colors : [ 'orange', 'blueviolet' ], - insertInto : 'hazelcast', - columns : function(data) { - data.addColumn('datetime', 'Date/Time'); - data.addColumn('number', 'Ops/sec. (Ignite)'); - data.addColumn('number', 'Ops/sec. (Hazelcast)'); - } - }); - } - } - } - - /** - * Draws a chart with one line. - * - * @param name Base name for chart, used to define CSV file name, - * element ID, and title. - * @param lineCaption Line caption in legend. - * @param color Color for the line. - * @param column Column index for data column in case there are more than 1. - */ - function singleLineChart(name, lineCaption, color, column) { - // Try cache first. - if (chartCache && chartCache[name]) { - var c = chartCache[name]; - - var chart = new google.visualization.LineChart(document.getElementById(name + '_chart')); - chart.draw(c.data, c.options); - - return; - } - - var csvLink = '/gg-loadtest/' + branch + '/' + name + '.csv'; - var $chart = $('#' + name + '_chart'); - - $.get(csvLink, function(result) { - var data = new google.visualization.DataTable(); - - data.addColumn('datetime', 'Date/Time') - data.addColumn('number', lineCaption); - - var res = parseCsv(result, true, column ? [ 0, column ] : undefined); - - data.addRows(res.data); - - var delta = deltaPercent(res.min[1], res.max[1]); - - var options = $.extend({ - title : name + ' (Î = ' + delta + '%)', - colors : color ? [ color ] : undefined, - vAxis : { - maxValue : res.max[1] * (2 - (delta / 100)), - minValue : res.min[1] / (2 - (delta / 100)) - } - }, commonOptions); - - var chart = new google.visualization.LineChart(document.getElementById(name + '_chart')); - chart.draw(data, options); - - if (!chartCache) - chartCache = new Array(); - - chartCache[name] = { data : data, options : options }; - - $chart.siblings('.raw-link').attr('href', csvLink); - }, 'text'); - } - - /** - * Draws a chart with multiple lines. - * - * @param opts Various options for chart. The required ones are: - * csvFile - name of CSV file; - * elementId - element ID to insert chart to; - * columns - function, which defines a column set. - */ - function multiLineChart(opts) { - var opts0 = $.extend({ - name : opts.name, - title : opts.name, - csvFile : opts.name + '.csv', - elementId : opts.name + '_chart', - height : 200 - }, opts); - - // Try cache first. - if (chartCache && chartCache[opts0.name]) { - var c = chartCache[opts0.name]; - - var chart = new google.visualization.LineChart(document.getElementById(opts0.elementId)); - chart.draw(c.data, c.options); - - return; - } - - // Generate HTML if needed. - if ($('#' + opts0.elementId).length == 0 && opts0.insertInto) - $('#' + opts0.insertInto).append($(chartTemplate({ id : opts0.elementId }))); - - var csvLink = '/gg-loadtest/' + branch + '/' + opts0.csvFile; - - $.get(csvLink, function(result) { - var data = new google.visualization.DataTable(); - - var colIdxs = opts0.columns(data); - - data.addRows(parseCsv(result, false, colIdxs)); - - var chartOpts = $.extend({ - title : opts0.title, - height : opts0.height, - colors : opts0.colors - }, commonOptions); - - - var chart = new google.visualization.LineChart(document.getElementById(opts0.elementId)); - chart.draw(data, chartOpts); - - if (!chartCache) - chartCache = new Array(); - - chartCache[opts0.name] = { data : data, options : chartOpts }; - - $('#' + opts0.elementId).siblings('.raw-link').attr('href', csvLink); - }, 'text'); - } - - /** - * Counts the difference between min and max as a - * percentile of max. - * - * @param min Min. - * @param max Max. - */ - function deltaPercent(min, max) { - return Math.round((max - min) * 100 / max); - } - - /** - * Parses the CSV data. - * - * @param csv A SCV string to parse. - * @param includeMeta Include min-max metadata to parsed output? - * @param columns Column indexes to use. If omitted, will use all columns. - * @return If includeMeta == false - a 2-dim array of parsed elements; - * if includeMeta == true - an object with 2-dim array and min-max metadata. - */ - function parseCsv(csv, includeMeta, columns) { - var dataArr = new Array(); - var maxArr = new Array(); - var minArr = new Array(); - var csvArr = csv.split('\n'); - - // Iterate over lines. - $.each(csvArr, function(lineIdx, line) { - if (!line) - return; - - var lineArr = new Array(); - - // Iterate over line entries. - $.each(line.split(','), function(idx, val) { - // Skip column if needed. - if (columns && columns.indexOf(idx) == -1) - return; - - // We nullify lineArr in case of error. - if (!lineArr) - return; - - if (val.match(/\d\d\/\d\d\/\d\d\d\d.*/)) // Date or datetime value. - lineArr.push(new Date(val)); - else if(val.match(/\d+/)) { // Integer value. - var intVal = parseInt(val); - - if (intVal >= 0) { - lineArr.push(intVal); - - if (includeMeta && (csvArr.length - lineIdx <= (showLastN || Number.MAX_VALUE))) { - if (intVal > (maxArr[idx] || 0)) - maxArr[idx] = intVal; - - if (intVal < (minArr[idx] || Number.MAX_VALUE)) - minArr[idx] = intVal; - } - } - else // Negative means error, in which case we assume null. - lineArr.push(null); - } - else // Assume string value. - lineArr.push(val); - }); - - if (lineArr) - dataArr.push(lineArr); - }); - - if (showLastN && dataArr.length > showLastN) - dataArr = dataArr.slice(dataArr.length - showLastN, dataArr.length); - - if (includeMeta) { - return { - data : dataArr, - max : maxArr, - min : minArr - }; - } - - return dataArr; - } - </script> -</body> -</html>
