github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/syz-cluster/dashboard/templates/graphs.html (about) 1 {{define "content"}} 2 <main class="container-fluid my-4"> 3 <div class="chart-wrapper mb-5"> 4 <h2 class="h4">Processed Patch Series (weekly)</h2> 5 <p class="text-muted small">How many patch series have been extracted/triaged/built/fuzzed each week.</p> 6 <div id="processed_chart_div" style="width: 100%; height: 400px;"></div> 7 <p class="text-muted small">Click and drag to zoom into a time range. Right-click to reset.</p> 8 </div> 9 10 <hr class="my-4"> 11 12 <div class="chart-wrapper mb-4"> 13 <h2 class="h4">Findings (weekly)</h2> 14 <p class="text-muted small">How many kernel crashes or kernel build/boot errors have been detected each week.</p> 15 <div id="findings_chart_div" style="width: 100%; height: 400px;"></div> 16 <p class="text-muted small">Click and drag to zoom into a time range. Right-click to reset.</p> 17 </div> 18 19 <hr class="my-4"> 20 21 <div class="chart-wrapper mb-4"> 22 <h2 class="h4">Reports (weekly)</h2> 23 <p class="text-muted small">How many reports with findings have been published.</p> 24 <div id="reports_chart_div" style="width: 100%; height: 400px;"></div> 25 <p class="text-muted small">Click and drag to zoom into a time range. Right-click to reset.</p> 26 </div> 27 28 <hr class="my-4"> 29 30 <div class="chart-wrapper mb-4"> 31 <h2 class="h4">Wait Time before Fuzzing (avg hours, weekly)</h2> 32 <p class="text-muted small">How many hours have passed since the moment the series was published and the moment we started fuzzing it.</p> 33 <div id="avg_wait_chart_div" style="width: 100%; height: 400px;"></div> 34 <p class="text-muted small">Click and drag to zoom into a time range. Right-click to reset.</p> 35 </div> 36 37 <hr class="my-4"> 38 39 <div class="chart-wrapper mb-4"> 40 <h2 class="h4">Status Distribution (weekly)</h2> 41 <p class="text-muted small"> 42 <b>Processed:</b> Among the processed series, how many have been actually fuzzed.<br /> 43 <b>Skipped:</b> Among the processed series, how many were skipped during triage (e.g. because no proper base commit was found).<br /> 44 <b>Some steps skipped:</b> Among the processed series, how often did we skip the fuzzing step (e.g. because the patch/patch series did not modify the code we compile). 45 </p> 46 <div id="distribution_chart_div" style="width: 100%; height: 400px;"></div> 47 <p class="text-muted small">Click and drag to zoom into a time range. Right-click to reset.</p> 48 </div> 49 </main> 50 <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> 51 <script type="text/javascript"> 52 google.charts.load('current', {'packages':['corechart']}); 53 google.charts.setOnLoadCallback(drawAllCharts); 54 55 const processedData = [ 56 {{range .Processed}} 57 [new Date({{.Date.Format "2006-01-02"}}), {{.Count}}], 58 {{end}} 59 ]; 60 61 const findingsData = [ 62 {{range .Findings}} 63 [new Date({{.Date.Format "2006-01-02"}}), {{.Count}}], 64 {{end}} 65 ]; 66 67 const delayData = [ 68 {{range .Delay}} 69 [new Date({{.Date.Format "2006-01-02"}}), {{.DelayHours}}], 70 {{end}} 71 ]; 72 73 const distributionData = [ 74 {{range .Distribution}} 75 [new Date({{.Date.Format "2006-01-02"}}), {{.Finished}}, {{.Skipped}}, {{.WithFailedSteps}}, {{.WithSkippedSteps}}], 76 {{end}} 77 ]; 78 79 const reportsData = [ 80 {{range .Reports}} 81 [new Date({{.Date.Format "2006-01-02"}}), {{.Count}}], 82 {{end}} 83 ]; 84 85 function drawAllCharts() { 86 drawChart('processed_chart_div', processedData, '#007bff'); 87 drawChart('findings_chart_div', findingsData, '#dc3545'); 88 drawChart('reports_chart_div', reportsData, '#dc3545'); 89 drawChart('avg_wait_chart_div', delayData, 'black'); 90 drawDistributionChart(); 91 } 92 93 function drawChart(chartDivId, chartData, chartColor) { 94 const data = new google.visualization.DataTable(); 95 data.addColumn('date', 'Date'); 96 data.addColumn('number', 'Count'); 97 data.addRows(chartData); 98 const options = { 99 legend: { position: 'none' }, 100 hAxis: { title: 'Date', format: 'MMM dd, yyyy', gridlines: { color: 'transparent' } }, 101 vAxis: { title: 'Count', minValue: 0 }, 102 colors: [chartColor], 103 explorer: { 104 actions: ['dragToZoom', 'rightClickToReset'], 105 axis: 'horizontal', 106 keepInBounds: true, 107 maxZoomIn: 4.0 108 } 109 }; 110 111 const chart = new google.visualization.LineChart(document.getElementById(chartDivId)); 112 chart.draw(data, options); 113 } 114 115 function drawDistributionChart() { 116 const data = new google.visualization.DataTable(); 117 data.addColumn('date', 'Date'); 118 data.addColumn('number', 'Processed'); 119 data.addColumn('number', 'Skipped'); 120 data.addColumn('number', 'Some steps failed'); 121 data.addColumn('number', 'Some steps skipped'); 122 data.addRows(distributionData); 123 const options = { 124 isStacked: 'percent', 125 legend: { position: 'top', maxLines: 2 }, 126 hAxis: { title: 'Date', format: 'MMM dd, yyyy', gridlines: { color: 'transparent' } }, 127 vAxis: { 128 minValue: 0, 129 format: '#%' 130 }, 131 colors: ['#28a745', '#ffc107', '#ffcccb', '#d5f0c0'], 132 areaOpacity: 0.8 133 }; 134 const chart = new google.visualization.AreaChart(document.getElementById('distribution_chart_div')); 135 chart.draw(data, options); 136 } 137 </script> 138 {{end}}