Do not pipe into `grep -q`, because that stops reading as soon as a
[arvados.git] / tools / crunchstat-summary / crunchstat_summary / dygraphs.js
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 window.onload = function() {
6     var charts = {};
7     var fmt = {
8         iso: function(y) {
9             var s='';
10             if (y > 1000000000) { y=y/1000000000; s='G'; }
11             else if (y > 1000000) { y=y/1000000; s='M'; }
12             else if (y > 1000) { y=y/1000; s='K'; }
13             return y.toFixed(2).replace(/\.0+$/, '')+s;
14         },
15         time: function(s) {
16             var ret = ''
17             if (s >= 86400) ret += Math.floor(s/86400) + 'd'
18             if (s >= 3600) ret += Math.floor(s/3600)%24 + 'h'
19             if (s >= 60) ret += Math.floor(s/60)%60 + 'm'
20             ret += Math.floor(s)%60 + 's'
21             // finally, strip trailing zeroes: 1d0m0s -> 1d
22             return ret.replace(/(\D)(0\D)*$/, '$1')
23         },
24     }
25     var ticker = {
26         time: function(min, max, pixels, opts, dg) {
27             var max_ticks = Math.floor(pixels / opts('pixelsPerLabel'))
28             var natural = [1, 5, 10, 30, 60,
29                            120, 300, 600, 1800, 3600,
30                            7200, 14400, 43200, 86400]
31             var interval = natural.shift()
32             while (max>min && (max-min)/interval > max_ticks) {
33                 interval = natural.shift() || (interval * 2)
34             }
35             var ticks = []
36             for (var i=Math.ceil(min/interval)*interval; i<=max; i+=interval) {
37                 ticks.push({v: i, label: fmt.time(i)})
38             }
39             return ticks
40         },
41     }
42     chartdata.forEach(function(section, section_idx) {
43         var h1 = document.createElement('h1');
44         h1.appendChild(document.createTextNode(section.label));
45         document.body.appendChild(h1);
46         section.charts.forEach(function(chart, chart_idx) {
47             // Skip chart if every series has zero data points
48             if (0 == chart.data.reduce(function(len, series) {
49                 return len + series.length;
50             }, 0)) {
51                 return;
52             }
53             var id = 'chart-'+section_idx+'-'+chart_idx;
54             var div = document.createElement('div');
55             div.setAttribute('id', id);
56             div.setAttribute('style', 'width: 100%; height: 150px');
57             document.body.appendChild(div);
58             chart.options.valueFormatter = function(y) {
59             }
60             chart.options.axes = {
61                 x: {
62                     axisLabelFormatter: fmt.time,
63                     valueFormatter: fmt.time,
64                     ticker: ticker.time,
65                 },
66                 y: {
67                     axisLabelFormatter: fmt.iso,
68                     valueFormatter: fmt.iso,
69                 },
70             }
71             charts[id] = new Dygraph(div, chart.data, chart.options);
72         });
73     });
74
75     var sync = Dygraph.synchronize(Object.values(charts), {range: false});
76
77     if (typeof window.debug === 'undefined')
78         window.debug = {};
79     window.debug.charts = charts;
80 };