1<%-- 2 ~ Copyright (C) 2017 The Android Open Source Project 3 ~ 4 ~ Licensed under the Apache License, Version 2.0 (the "License"); you 5 ~ may not use this file except in compliance with the License. You may 6 ~ obtain a copy of the License at 7 ~ 8 ~ http://www.apache.org/licenses/LICENSE-2.0 9 ~ 10 ~ Unless required by applicable law or agreed to in writing, software 11 ~ distributed under the License is distributed on an "AS IS" BASIS, 12 ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 13 ~ implied. See the License for the specific language governing 14 ~ permissions and limitations under the License. 15 --%> 16<%@ page contentType='text/html;charset=UTF-8' language='java' %> 17<%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %> 18<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%> 19 20<html> 21 <%@ include file="header.jsp" %> 22 <link type='text/css' href='/css/datepicker.css' rel='stylesheet'> 23 <link type='text/css' href='/css/show_profiling_overview.css' rel='stylesheet'> 24 <link rel='stylesheet' href='/css/search_header.css'> 25 <script src='https://www.gstatic.com/external_hosted/moment/min/moment-with-locales.min.js'></script> 26 <script src='js/search_header.js'></script> 27 <script src='js/time.js'></script> 28 <script type='text/javascript' src='https://www.gstatic.com/charts/loader.js'></script> 29 <body> 30 <script type='text/javascript'> 31 google.charts.load('current', {'packages':['corechart']}); 32 google.charts.setOnLoadCallback(drawAllPlots); 33 34 var plots = ${plots}; 35 var search; 36 37 $(document).ready(function() { 38 search = $('#filter-bar').createSearchHeader( 39 'Profiling Analysis', '', refresh); 40 search.addFilter('Branch', 'branch', { 41 corpus: ${branches} 42 }, ${branch}); 43 search.addFilter('Device', 'device', { 44 corpus: ${devices} 45 }, ${device}); 46 search.display(); 47 }); 48 49 /** 50 * Draw a box plot. 51 * 52 * Args: 53 * container: the jquery selector in which to draw the graph. 54 * lineGraph: a JSON-serialized BoxPlot. 55 */ 56 function drawBoxPlot(container, plot) { 57 var data = new google.visualization.DataTable(); 58 data.addColumn('string', 'x'); 59 plot.seriesList.forEach(function(series) { 60 data.addColumn('number', series); 61 data.addColumn({id:'fill', type:'number', role:'interval'}); 62 data.addColumn({id:'fill', type:'number', role:'interval'}); 63 data.addColumn({id:'bar', type:'number', role:'interval'}); 64 data.addColumn({id:'bar', type:'number', role:'interval'}); 65 data.addColumn({type:'string', role:'tooltip', p: {'html': true}}); 66 }); 67 var rows = plot.values.map(function(day) { 68 var dateString = new moment().renderDate(1 * day.label); 69 var statArray = day.values.map(function(stat) { 70 var tooltip = ( 71 dateString + 72 '</br><b>Mean:</b> ' + 73 stat.mean.toFixed(2) + 74 '</br><b>Std:</b> ' + 75 stat.std.toFixed(2) + 76 '</br><b>Count:</b> ' + 77 stat.count.toFixed(0)); 78 return [ 79 stat.mean, 80 stat.mean + stat.std, 81 stat.mean - stat.std, 82 stat.mean + stat.std, 83 stat.mean - stat.std, 84 tooltip]; 85 }); 86 return [].concat.apply( 87 [dateString], statArray); 88 }); 89 data.addRows(rows); 90 91 var options = { 92 title: plot.name, 93 curveType: 'function', 94 intervals: { 'color' : 'series-color' }, 95 interval: { 96 'fill': { 97 'style': 'area', 98 'curveType': 'function', 99 'fillOpacity': 0.2 100 }, 101 'bar': { 102 'style': 'bars', 103 'barWidth': 0, 104 'lineWidth': 1, 105 'pointSize': 3, 106 'fillOpacity': 1 107 }}, 108 legend: { position: 'bottom' }, 109 tooltip: { isHtml: true }, 110 fontName: 'Roboto', 111 titleTextStyle: { 112 color: '#757575', 113 fontSize: 16, 114 bold: false 115 }, 116 pointsVisible: true, 117 vAxis:{ 118 title: plot.y_label, 119 titleTextStyle: { 120 color: '#424242', 121 fontSize: 12, 122 italic: false 123 }, 124 textStyle: { 125 fontSize: 12, 126 color: '#757575' 127 }, 128 }, 129 hAxis: { 130 textStyle: { 131 fontSize: 12, 132 color: '#757575' 133 }, 134 titleTextStyle: { 135 color: '#424242', 136 fontSize: 12, 137 italic: false 138 } 139 }, 140 }; 141 var plot = new google.visualization.LineChart(container[0]); 142 plot.draw(data, options); 143 } 144 145 // Draw all graphs. 146 function drawAllPlots() { 147 var container = $('#profiling-container'); 148 container.empty(); 149 150 plots.forEach(function(g) { 151 var plot = $('<div class="box-plot row card"></div>'); 152 plot.appendTo(container); 153 drawBoxPlot(plot.append('<div></div>'), g); 154 }); 155 } 156 157 // refresh the page to see the runs matching the specified filter 158 function refresh() { 159 if($(this).hasClass('disabled')) return; 160 var link = '${pageContext.request.contextPath}' + 161 '/show_profiling_overview?testName=${testName}' + search.args(); 162 window.open(link,'_self'); 163 } 164 </script> 165 <div class='container wide'> 166 <div id='filter-bar' class='row'></div> 167 <div id='profiling-container'> 168 </div> 169 </div> 170 <%@ include file="footer.jsp" %> 171 </body> 172</html> 173