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}}