johnf-fnordmetric 1.2.7
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +6 -0
- data/Rakefile +9 -0
- data/fnordmetric.gemspec +41 -0
- data/lib/fnordmetric/acceptors/acceptor.rb +42 -0
- data/lib/fnordmetric/acceptors/amqp_acceptor.rb +56 -0
- data/lib/fnordmetric/acceptors/fyrehose_acceptor.rb +43 -0
- data/lib/fnordmetric/acceptors/stomp_acceptor.rb +71 -0
- data/lib/fnordmetric/acceptors/tcp_acceptor.rb +58 -0
- data/lib/fnordmetric/acceptors/udp_acceptor.rb +37 -0
- data/lib/fnordmetric/api.rb +46 -0
- data/lib/fnordmetric/cache.rb +20 -0
- data/lib/fnordmetric/context.rb +96 -0
- data/lib/fnordmetric/defaults.rb +22 -0
- data/lib/fnordmetric/enterprise/compatibility_handler.rb +42 -0
- data/lib/fnordmetric/ext.rb +75 -0
- data/lib/fnordmetric/gauge.rb +98 -0
- data/lib/fnordmetric/gauge_calculations.rb +106 -0
- data/lib/fnordmetric/gauge_modifiers.rb +144 -0
- data/lib/fnordmetric/gauge_rendering.rb +40 -0
- data/lib/fnordmetric/gauge_validations.rb +15 -0
- data/lib/fnordmetric/gauges/distribution_gauge.rb +87 -0
- data/lib/fnordmetric/gauges/server_health_gauge.rb +13 -0
- data/lib/fnordmetric/gauges/timeseries_gauge.rb +138 -0
- data/lib/fnordmetric/gauges/toplist_gauge.rb +44 -0
- data/lib/fnordmetric/histogram.rb +64 -0
- data/lib/fnordmetric/logger.rb +63 -0
- data/lib/fnordmetric/namespace.rb +208 -0
- data/lib/fnordmetric/session.rb +139 -0
- data/lib/fnordmetric/standalone.rb +20 -0
- data/lib/fnordmetric/timeseries.rb +79 -0
- data/lib/fnordmetric/toplist.rb +61 -0
- data/lib/fnordmetric/udp_client.rb +22 -0
- data/lib/fnordmetric/util.rb +25 -0
- data/lib/fnordmetric/version.rb +3 -0
- data/lib/fnordmetric/web/app.rb +63 -0
- data/lib/fnordmetric/web/app_helpers.rb +42 -0
- data/lib/fnordmetric/web/dashboard.rb +40 -0
- data/lib/fnordmetric/web/event.rb +99 -0
- data/lib/fnordmetric/web/reactor.rb +127 -0
- data/lib/fnordmetric/web/web.rb +59 -0
- data/lib/fnordmetric/web/websocket.rb +41 -0
- data/lib/fnordmetric/widget.rb +82 -0
- data/lib/fnordmetric/widgets/bars_widget.rb +44 -0
- data/lib/fnordmetric/widgets/html_widget.rb +28 -0
- data/lib/fnordmetric/widgets/numbers_widget.rb +80 -0
- data/lib/fnordmetric/widgets/pie_widget.rb +23 -0
- data/lib/fnordmetric/widgets/timeseries_widget.rb +65 -0
- data/lib/fnordmetric/widgets/toplist_widget.rb +68 -0
- data/lib/fnordmetric/worker.rb +89 -0
- data/lib/fnordmetric/zero_config_gauge.rb +138 -0
- data/lib/fnordmetric.rb +149 -0
- data/run_specs.sh +11 -0
- data/spec/api_spec.rb +49 -0
- data/spec/context_spec.rb +42 -0
- data/spec/dashboard_spec.rb +38 -0
- data/spec/event_spec.rb +170 -0
- data/spec/ext_spec.rb +14 -0
- data/spec/fnordmetric_spec.rb +56 -0
- data/spec/gauge_like_shared.rb +56 -0
- data/spec/gauge_modifiers_spec.rb +583 -0
- data/spec/gauge_spec.rb +230 -0
- data/spec/namespace_spec.rb +114 -0
- data/spec/session_spec.rb +231 -0
- data/spec/spec_helper.rb +49 -0
- data/spec/tcp_acceptor_spec.rb +35 -0
- data/spec/timeseries_gauge_spec.rb +56 -0
- data/spec/udp_acceptor_spec.rb +35 -0
- data/spec/util_spec.rb +46 -0
- data/spec/widget_spec.rb +113 -0
- data/spec/worker_spec.rb +40 -0
- data/web/.gitignore +4 -0
- data/web/build.sh +34 -0
- data/web/css/fnordmetric.core.css +868 -0
- data/web/fnordmetric-core.css +1409 -0
- data/web/fnordmetric-core.js +3420 -0
- data/web/fnordmetric-ui.css +282 -0
- data/web/fnordmetric-ui.js +12032 -0
- data/web/haml/app.haml +20 -0
- data/web/haml/distribution_gauge.haml +118 -0
- data/web/haml/timeseries_gauge.haml +80 -0
- data/web/haml/toplist_gauge.haml +194 -0
- data/web/img/head.png +0 -0
- data/web/img/list.png +0 -0
- data/web/img/list_active.png +0 -0
- data/web/img/list_hover.png +0 -0
- data/web/img/loader.gif +0 -0
- data/web/img/loader_white.gif +0 -0
- data/web/img/navbar.png +0 -0
- data/web/img/navbar_btn.png +0 -0
- data/web/img/picto_gauge.png +0 -0
- data/web/js/fnordmetric.bars_widget.js +178 -0
- data/web/js/fnordmetric.dashboard_view.js +99 -0
- data/web/js/fnordmetric.gauge_explorer.js +173 -0
- data/web/js/fnordmetric.gauge_view.js +260 -0
- data/web/js/fnordmetric.html_widget.js +21 -0
- data/web/js/fnordmetric.js +315 -0
- data/web/js/fnordmetric.numbers_widget.js +122 -0
- data/web/js/fnordmetric.overview_view.js +35 -0
- data/web/js/fnordmetric.pie_widget.js +118 -0
- data/web/js/fnordmetric.realtime_timeline_widget.js +175 -0
- data/web/js/fnordmetric.session_view.js +342 -0
- data/web/js/fnordmetric.timeline_widget.js +333 -0
- data/web/js/fnordmetric.timeseries_widget.js +405 -0
- data/web/js/fnordmetric.toplist_widget.js +119 -0
- data/web/js/fnordmetric.ui.js +91 -0
- data/web/js/fnordmetric.util.js +248 -0
- data/web/vendor/font-awesome/css/font-awesome-ie7.min.css +22 -0
- data/web/vendor/font-awesome/css/font-awesome.css +540 -0
- data/web/vendor/font-awesome/css/font-awesome.min.css +33 -0
- data/web/vendor/font-awesome/font/FontAwesome.otf +0 -0
- data/web/vendor/font-awesome/font/fontawesome-webfont.eot +0 -0
- data/web/vendor/font-awesome/font/fontawesome-webfont.svg +284 -0
- data/web/vendor/font-awesome/font/fontawesome-webfont.ttf +0 -0
- data/web/vendor/font-awesome/font/fontawesome-webfont.woff +0 -0
- data/web/vendor/jquery-1.6.2.min.js +18 -0
- data/web/vendor/jquery-ui.min.js +6 -0
- data/web/vendor/jquery.combobox.js +129 -0
- data/web/vendor/jquery.maskedinput.js +252 -0
- metadata +444 -0
@@ -0,0 +1,99 @@
|
|
1
|
+
FnordMetric.views.dashboardView = (function(dashboard_name){
|
2
|
+
var widgets = [];
|
3
|
+
var widget_objs = {};
|
4
|
+
var viewport = null;
|
5
|
+
|
6
|
+
function load(_viewport){
|
7
|
+
viewport = _viewport.html('');
|
8
|
+
viewport.append('<div class="navbar"></div>');
|
9
|
+
viewport.append('<div class="dashboard_view"></div>');
|
10
|
+
|
11
|
+
FnordMetric.ui.navbar($('.navbar', viewport), {
|
12
|
+
breadcrumb: [
|
13
|
+
["Dashboard", "/group/fnord"],
|
14
|
+
[dashboard_name, "/dashboard/"+dashboard_name]
|
15
|
+
],
|
16
|
+
buttons: [
|
17
|
+
["<i class='icon-refresh'></i>Refresh", function(){ load(viewport); }]
|
18
|
+
]
|
19
|
+
});
|
20
|
+
|
21
|
+
$.ajax({
|
22
|
+
url: FnordMetric.p + '/' + FnordMetric.currentNamespace+'/dashboard/'+dashboard_name,
|
23
|
+
success: function(resp, status){
|
24
|
+
var conf = JSON.parse(resp);
|
25
|
+
renderWidgets(conf.widgets);
|
26
|
+
}
|
27
|
+
});
|
28
|
+
};
|
29
|
+
|
30
|
+
function renderWidgets(_widgets){
|
31
|
+
for(wkey in _widgets){
|
32
|
+
var widget = _widgets[wkey];
|
33
|
+
widget["elem"] = $('<div class="widget"></div>');
|
34
|
+
widgets[wkey] = widget;
|
35
|
+
$('.dashboard_view', viewport).append(widget.elem);
|
36
|
+
resizeWidget(wkey);
|
37
|
+
renderWidget(wkey);
|
38
|
+
};
|
39
|
+
resize();
|
40
|
+
};
|
41
|
+
|
42
|
+
function renderWidget(wkey, _w){
|
43
|
+
var widget = widgets[wkey];
|
44
|
+
if(!widget["widget_key"]){ widget["widget_key"] = wkey; }
|
45
|
+
/* argh... */
|
46
|
+
if(widget.klass=='TimelineWidget'){ _w = FnordMetric.widgets.timeseriesWidget(); }
|
47
|
+
if(widget.klass=='NumbersWidget'){ _w = FnordMetric.widgets.numbersWidget(); }
|
48
|
+
|
49
|
+
if(widget.klass=='ToplistWidget'){ _w = FnordMetric.widgets.toplistWidget(); }
|
50
|
+
|
51
|
+
if(widget.klass=='BarsWidget'){ _w = FnordMetric.widgets.barsWidget(); }
|
52
|
+
if(widget.klass=='PieWidget'){ _w = FnordMetric.widgets.pieWidget(); }
|
53
|
+
if(widget.klass=="HtmlWidget") { _w = FnordMetric.widgets.htmlWidget(); }
|
54
|
+
|
55
|
+
if(_w){
|
56
|
+
_w.render(widget);
|
57
|
+
widget_objs[wkey] = _w;
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
function resizeWidget(wkey){
|
62
|
+
var widget = widgets[wkey];
|
63
|
+
var wwperc = widgets[wkey].width;
|
64
|
+
if(!wwperc){ wwperc = 100; }
|
65
|
+
var wwidth = viewport.width() * (wwperc/100.0);
|
66
|
+
if(wwperc==100){
|
67
|
+
widgets[wkey].elem.addClass('full_width');
|
68
|
+
} else { wwidth -= 1; }
|
69
|
+
widget.elem.width(wwidth);
|
70
|
+
}
|
71
|
+
|
72
|
+
function resize(){
|
73
|
+
for(wkey in widgets){
|
74
|
+
resizeWidget(wkey);
|
75
|
+
};
|
76
|
+
};
|
77
|
+
|
78
|
+
function close(){
|
79
|
+
$('body').trigger('fm_dashboard_close');
|
80
|
+
};
|
81
|
+
|
82
|
+
function announce(evt){
|
83
|
+
if((evt.type == "widget_response") || (evt.type == "widget_push")){
|
84
|
+
for(wkey in widget_objs){
|
85
|
+
if(widget_objs[wkey].announce){
|
86
|
+
widget_objs[wkey].announce(evt)
|
87
|
+
}
|
88
|
+
}
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
return {
|
93
|
+
load: load,
|
94
|
+
resize: resize,
|
95
|
+
announce: announce,
|
96
|
+
close: close
|
97
|
+
};
|
98
|
+
|
99
|
+
});
|
@@ -0,0 +1,173 @@
|
|
1
|
+
FnordMetric.views.gaugeExplorer = (function(){
|
2
|
+
|
3
|
+
var elem, widget, gauge_list, widget_inst;
|
4
|
+
var start_timestamp, end_timestamp, time_range;
|
5
|
+
var currentGauge;
|
6
|
+
var autoupdate_timer, autodiscover_timer;
|
7
|
+
|
8
|
+
var time_range = 3600;
|
9
|
+
var default_time_ranges = [
|
10
|
+
["5m", 300],
|
11
|
+
["15m", 900],
|
12
|
+
["30m", 1800],
|
13
|
+
["1h", 3600],
|
14
|
+
["2h", 3600 * 2],
|
15
|
+
["6h", 3600 * 6],
|
16
|
+
["12h", 3600 * 12],
|
17
|
+
["24h", 3600 * 24],
|
18
|
+
["48h", 3600 * 48]
|
19
|
+
];
|
20
|
+
|
21
|
+
function load(_elem){
|
22
|
+
elem = _elem;
|
23
|
+
gauge_list = {};
|
24
|
+
|
25
|
+
elem.html('<div class="navbar"></div><div class="ge_controlpanel">' +
|
26
|
+
'<label>Select a Gauge</label><select class="ge_gauge_picker">' +
|
27
|
+
'<option selected=selected>Please select a gauge...</option></select>' +
|
28
|
+
'<div class="ge_meta">Type to autocomplete...</div>' +
|
29
|
+
'</div><div class="ge_controlpanel" style="border-right:none;">' +
|
30
|
+
'<label>Select the Timerange</label><a class="button datepicker_sa"><div class="date" style="width:300px;"> </div>' +
|
31
|
+
'<i class="icon-calendar"></i></a>' +
|
32
|
+
'<div class="ge_timerange_links ge_meta">Recent Data: </div></div>' +
|
33
|
+
'<div style="clear:both;" class="widget_viewport"><div class="headbar"><h2>Please select a gauge...</h2></div><i class="ge_empty">Please select a gauge...</i></div>');
|
34
|
+
|
35
|
+
FnordMetric.ui.navbar($('.navbar', elem), {
|
36
|
+
breadcrumb: [
|
37
|
+
["Gauge Explorer", "#gauge_explorer"],
|
38
|
+
],
|
39
|
+
buttons: [
|
40
|
+
["<i class='icon-refresh'></i>Refresh", function(){ load(elem); }]
|
41
|
+
]
|
42
|
+
});
|
43
|
+
|
44
|
+
$(default_time_ranges).each(function(i, tr){
|
45
|
+
$('.ge_timerange_links', elem).append(
|
46
|
+
$('<a>')
|
47
|
+
.attr('href', '#')
|
48
|
+
.attr('data-timerange', tr[1])
|
49
|
+
.click(function(){
|
50
|
+
time_range = parseInt($(this).attr('data-timerange'), 10);
|
51
|
+
autoupdate();
|
52
|
+
return false;
|
53
|
+
})
|
54
|
+
.html(tr[0]));
|
55
|
+
});
|
56
|
+
|
57
|
+
autoupdate();
|
58
|
+
render();
|
59
|
+
requestGaugeInfoAsync();
|
60
|
+
|
61
|
+
autodiscover_timer = window.setInterval(requestGaugeInfoAsync, 5000);
|
62
|
+
autoupdate_timer = window.setInterval(autoupdate, 1000);
|
63
|
+
};
|
64
|
+
|
65
|
+
function autoupdate() {
|
66
|
+
end_timestamp = ((new Date()).getTime() / 1000) + 60;
|
67
|
+
start_timestamp = end_timestamp - time_range;
|
68
|
+
|
69
|
+
if (widget)
|
70
|
+
widget.set_timerange(start_timestamp, end_timestamp);
|
71
|
+
|
72
|
+
$(".datepicker_sa .date", elem).html(
|
73
|
+
FnordMetric.util.dateFormat(start_timestamp) +
|
74
|
+
' ‐ ' +
|
75
|
+
FnordMetric.util.dateFormat(end_timestamp)
|
76
|
+
)
|
77
|
+
}
|
78
|
+
|
79
|
+
function render() {
|
80
|
+
if (!currentGauge) return;
|
81
|
+
|
82
|
+
$(".widget_viewport", elem).html('');
|
83
|
+
widget = FnordMetric.widgets.timeseriesWidget();
|
84
|
+
|
85
|
+
var gauges = [currentGauge.key];
|
86
|
+
var series = [{
|
87
|
+
"color": "#4572a7",
|
88
|
+
"data": [{x:0, y:0}],
|
89
|
+
name: currentGauge.key,
|
90
|
+
title: currentGauge.title
|
91
|
+
}];
|
92
|
+
|
93
|
+
var wheight = FnordMetric.get_conf().gauge_explorer_widget_height;
|
94
|
+
|
95
|
+
if (!wheight)
|
96
|
+
wheight = window.innerHeight - 300;
|
97
|
+
|
98
|
+
widget_inst = widget.render({
|
99
|
+
elem: $(".widget_viewport", elem),
|
100
|
+
title: currentGauge.title,
|
101
|
+
async_chart: true,
|
102
|
+
start_timestamp: start_timestamp,
|
103
|
+
end_timestamp: end_timestamp,
|
104
|
+
include_current: true,
|
105
|
+
width: 100,
|
106
|
+
height: wheight,
|
107
|
+
gauges: gauges,
|
108
|
+
series: series,
|
109
|
+
default_cardinal: false,
|
110
|
+
default_style: "line",
|
111
|
+
no_update_range: true,
|
112
|
+
no_datepicker: true,
|
113
|
+
widget_key: "gauge_explorer"
|
114
|
+
});
|
115
|
+
}
|
116
|
+
|
117
|
+
function resize(_width, _height){
|
118
|
+
render();
|
119
|
+
};
|
120
|
+
|
121
|
+
function announce(evt){
|
122
|
+
if (evt.type == "widget_response" && widget)
|
123
|
+
widget.announce(evt);
|
124
|
+
|
125
|
+
if (evt.type == "gauge_list_response"){
|
126
|
+
$('.ge_gauge_picker', elem).html();
|
127
|
+
var changed = false;
|
128
|
+
|
129
|
+
$(evt.gauges).each(function(n, gauge){
|
130
|
+
if (typeof gauge_list[gauge.key] == 'undefined') {
|
131
|
+
var gauge_title = gauge.title + ' [' + gauge.key + ']';
|
132
|
+
|
133
|
+
gauge_list[gauge.key] = {
|
134
|
+
"key": gauge.key,
|
135
|
+
"title": gauge.title
|
136
|
+
};
|
137
|
+
|
138
|
+
$('.ge_gauge_picker', elem).append(
|
139
|
+
'<option value=' + gauge.key + '>' + gauge_title + '</option>');
|
140
|
+
|
141
|
+
changed = true;
|
142
|
+
}
|
143
|
+
});
|
144
|
+
|
145
|
+
if (changed || evt.gauges.length == 0)
|
146
|
+
$('.ge_gauge_picker', elem)
|
147
|
+
.bind('value_changed', function(){
|
148
|
+
currentGauge = gauge_list[$(this).val()];
|
149
|
+
render();
|
150
|
+
})
|
151
|
+
.combobox();
|
152
|
+
}
|
153
|
+
}
|
154
|
+
|
155
|
+
function requestGaugeInfoAsync() {
|
156
|
+
FnordMetric.publish({
|
157
|
+
"type": "gauge_list_request"
|
158
|
+
});
|
159
|
+
}
|
160
|
+
|
161
|
+
function close(){
|
162
|
+
window.clearInterval(autoupdate_timer);
|
163
|
+
window.clearInterval(autodiscover_timer);
|
164
|
+
};
|
165
|
+
|
166
|
+
return {
|
167
|
+
load: load,
|
168
|
+
resize: resize,
|
169
|
+
announce: announce,
|
170
|
+
close: close
|
171
|
+
};
|
172
|
+
|
173
|
+
});
|
@@ -0,0 +1,260 @@
|
|
1
|
+
FnordMetric.views.gaugeView = (function(gauge_name){
|
2
|
+
var widgets = [];
|
3
|
+
var widget_objs = {};
|
4
|
+
var viewport = null;
|
5
|
+
var tabs = [];
|
6
|
+
var conf = {};
|
7
|
+
var tick;
|
8
|
+
|
9
|
+
var start_timestamp, end_timestamp;
|
10
|
+
|
11
|
+
function load(_viewport){
|
12
|
+
viewport = _viewport;
|
13
|
+
viewport.html('');
|
14
|
+
viewport.append('<div class="navbar"></div>');
|
15
|
+
viewport.append($('<div class="gauge_viewport"></div>'));
|
16
|
+
|
17
|
+
conf.title = gauge_name;
|
18
|
+
tick = FnordMetric.gauges[gauge_name].tick
|
19
|
+
ctick = Math.max(3600, tick);
|
20
|
+
|
21
|
+
FnordMetric.ui.navbar($('.navbar', viewport), {
|
22
|
+
breadcrumb: [
|
23
|
+
["Fnord", "/group/fnord"],
|
24
|
+
[conf.title, "/gauge/"+gauge_name]
|
25
|
+
],
|
26
|
+
buttons: [
|
27
|
+
["<i class='icon-refresh'></i>Refresh", function(){ load(viewport); }]
|
28
|
+
],
|
29
|
+
datepicker: true
|
30
|
+
});
|
31
|
+
|
32
|
+
var now = parseInt((new Date()).getTime() / 1000);
|
33
|
+
|
34
|
+
start_timestamp = atTick((now-(ctick*24)));
|
35
|
+
end_timestamp = atTick(now);
|
36
|
+
|
37
|
+
updateDatepicker();
|
38
|
+
load_interval();
|
39
|
+
}
|
40
|
+
|
41
|
+
function atTick(t){
|
42
|
+
return (Math.ceil(t / ctick) * ctick);
|
43
|
+
}
|
44
|
+
|
45
|
+
function close(){
|
46
|
+
|
47
|
+
}
|
48
|
+
|
49
|
+
function resize(){
|
50
|
+
|
51
|
+
}
|
52
|
+
|
53
|
+
function updateDatepicker(){
|
54
|
+
$(".navbar .datepicker .date", viewport).html(
|
55
|
+
FnordMetric.util.dateFormat(start_timestamp) +
|
56
|
+
' ‐ ' +
|
57
|
+
FnordMetric.util.dateFormat(end_timestamp)
|
58
|
+
).parent().click(function(){
|
59
|
+
open_interval_modal();
|
60
|
+
});
|
61
|
+
}
|
62
|
+
|
63
|
+
function announce(evt){
|
64
|
+
if ((evt.gauge != gauge_name) ||
|
65
|
+
(evt.type != "render_response") ||
|
66
|
+
(!evt.payload)){ return true; }
|
67
|
+
|
68
|
+
if(evt.payload.html){
|
69
|
+
$('.gauge_viewport', viewport)
|
70
|
+
.html(evt.payload.html);
|
71
|
+
}
|
72
|
+
|
73
|
+
if(evt.payload.exec){
|
74
|
+
eval(evt.payload.exec);
|
75
|
+
}
|
76
|
+
|
77
|
+
FnordMetric.resizeView();
|
78
|
+
}
|
79
|
+
|
80
|
+
function interval_modal_done(modal){
|
81
|
+
var _sdate = $('.start_date', modal).val().match('([0-9]{2})\.([0-9]{2})\.([0-9]{4})')
|
82
|
+
var _stime = $('.start_time', modal).val().match('([0-9]{2}):([0-9]{2})')
|
83
|
+
var _edate = $('.end_date', modal).val().match('([0-9]{2})\.([0-9]{2})\.([0-9]{4})')
|
84
|
+
var _etime = $('.end_time', modal).val().match('([0-9]{2}):([0-9]{2})')
|
85
|
+
|
86
|
+
if (_sdate && _stime && _edate && _etime){
|
87
|
+
var sd = new Date();
|
88
|
+
var ed = new Date();
|
89
|
+
sd.setHours(parseInt(_stime[1]), parseInt(_stime[2]), 0);
|
90
|
+
sd.setFullYear(parseInt(_sdate[3]), parseInt(_sdate[2])-1, parseInt(_sdate[1]));
|
91
|
+
ed.setHours(parseInt(_etime[1]), parseInt(_etime[2]), 0);
|
92
|
+
ed.setFullYear(parseInt(_edate[3]), parseInt(_edate[2])-1, parseInt(_edate[1]));
|
93
|
+
|
94
|
+
if (sd && ed && (ed.getTime() > sd.getTime())) {
|
95
|
+
start_timestamp = parseInt(sd.getTime() / 1000);
|
96
|
+
end_timestamp = parseInt(ed.getTime() / 1000);
|
97
|
+
|
98
|
+
load_interval();
|
99
|
+
FnordMetric.ui.close_modal('body');
|
100
|
+
}
|
101
|
+
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
function open_interval_modal(){
|
106
|
+
var modal = $('<div>');
|
107
|
+
|
108
|
+
var interval_list = $('<ul>');
|
109
|
+
var now = parseInt((new Date()).getTime() / 1000);
|
110
|
+
|
111
|
+
var enter_catcher = function(e){
|
112
|
+
if (e.which == 13) interval_modal_done(modal);
|
113
|
+
}
|
114
|
+
|
115
|
+
var offset_opener = function(e){
|
116
|
+
var now = parseInt((new Date()).getTime() / 1000);
|
117
|
+
|
118
|
+
if($(this).attr('data-offset-off')){
|
119
|
+
now -= eval($(this).attr('data-offset-off'));
|
120
|
+
}
|
121
|
+
|
122
|
+
var off = eval($(this).attr('data-offset'));
|
123
|
+
|
124
|
+
if (off > ctick) {
|
125
|
+
start_timestamp = atTick((now-(off)));
|
126
|
+
end_timestamp = atTick(now);
|
127
|
+
} else {
|
128
|
+
start_timestamp = now-off;
|
129
|
+
end_timestamp = now;
|
130
|
+
}
|
131
|
+
|
132
|
+
load_interval();
|
133
|
+
FnordMetric.ui.close_modal('body');
|
134
|
+
}
|
135
|
+
|
136
|
+
modal.append(
|
137
|
+
$('<div>')
|
138
|
+
.css({
|
139
|
+
background: '#f2f2f2',
|
140
|
+
borderBottom: "1px solid #ddd",
|
141
|
+
padding: '12px 20px 10px 20px'
|
142
|
+
})
|
143
|
+
.append('<a class="button dark" style="height:30px; float:right; margin:1px; line-height:30px;">OK</a>')
|
144
|
+
.append('<input class="input ropen start_date" style="width:100px;" placeholder="DD.MM.YYYY" />')
|
145
|
+
.append('<input class="input lopen start_time" style="width:50px;" placeholder="HH:MM" />')
|
146
|
+
.append('<span style="margin:0 15px; color:#999;">—</span>')
|
147
|
+
.append('<input class="input ropen end_date" style="width:100px;" placeholder="DD.MM.YYYY" />')
|
148
|
+
.append('<input type="text" class="input lopen end_time" style="width:50px;" placeholder="HH:MM" />')
|
149
|
+
).append($('<div style="padding:15px 20px;" class="offset_links ui_fancylinks">'));
|
150
|
+
|
151
|
+
if (tick < 300){
|
152
|
+
$('.offset_links', modal)
|
153
|
+
.append('<b>Just now</b>')
|
154
|
+
.append('<a data-offset="5*60">Last 5 Minutes</a> ')
|
155
|
+
.append('<a data-offset="10*60">Last 10 Minutes</a> ')
|
156
|
+
.append('<a data-offset="15*60">Last 15 Minutes</a> ')
|
157
|
+
.append('<a data-offset="30*60">Last 30 Minutes</a> ')
|
158
|
+
.append('<a data-offset="45*60">Last 45 Minutes</a><br /><br />');
|
159
|
+
}
|
160
|
+
|
161
|
+
if (tick < 4000){
|
162
|
+
$('.offset_links', modal)
|
163
|
+
.append('<b>Hourly</b>')
|
164
|
+
.append('<a data-offset="3600">Last Hour</a> ')
|
165
|
+
.append('<a data-offset="3600*3">Last 3 Hours</a> ')
|
166
|
+
.append('<a data-offset="3600*6">Last 6 Hours</a> ')
|
167
|
+
.append('<a data-offset="3600*12">Last 12 Hours</a> ')
|
168
|
+
.append('<a data-offset="3600*18">Last 18 Hours</a><br /><br />');
|
169
|
+
}
|
170
|
+
|
171
|
+
$('.offset_links', modal)
|
172
|
+
.append('<b>Daily</b>')
|
173
|
+
.append('<a data-offset="3600*24">Today</a>, ')
|
174
|
+
.append('<a data-offset="3600*24" data-offset-off="3600*24">Yesterday</a> ')
|
175
|
+
.append('<a data-offset="3600*3*24">Last 3 Days</a> ')
|
176
|
+
.append('<a data-offset="3600*7*24">Last 7 Days</a> ')
|
177
|
+
.append('<a data-offset="3600*7*24*14">Last 14 Days</a> ')
|
178
|
+
.append('<a data-offset="3600*7*24*30">Last 30 Days</a> ');
|
179
|
+
|
180
|
+
$('.offset_links a', modal)
|
181
|
+
.click(offset_opener);
|
182
|
+
|
183
|
+
$.mask.definitions['~']='[0-5]';
|
184
|
+
$.mask.definitions['%']='[0-2]';
|
185
|
+
$.mask.definitions['$']='[0-2]';
|
186
|
+
$.mask.definitions['#']='[0-3]';
|
187
|
+
|
188
|
+
$('.button', modal)
|
189
|
+
.click(function(){ interval_modal_done(modal) });
|
190
|
+
|
191
|
+
$('.start_date', modal)
|
192
|
+
.mask("#9.$9.2099")
|
193
|
+
.keypress(enter_catcher)
|
194
|
+
.val(FnordMetric.util.dateFormat(start_timestamp).split(" ")[0]);
|
195
|
+
|
196
|
+
$('.start_time', modal)
|
197
|
+
.mask("%9:~9")
|
198
|
+
.keypress(enter_catcher)
|
199
|
+
.val(FnordMetric.util.dateFormat(start_timestamp).split(" ")[1]);
|
200
|
+
|
201
|
+
$('.end_date', modal)
|
202
|
+
.mask("#9.$9.2099")
|
203
|
+
.keypress(enter_catcher)
|
204
|
+
.val(FnordMetric.util.dateFormat(end_timestamp).split(" ")[0]);
|
205
|
+
|
206
|
+
$('.end_time', modal)
|
207
|
+
.mask("%9:~9")
|
208
|
+
.keypress(enter_catcher)
|
209
|
+
.val(FnordMetric.util.dateFormat(end_timestamp).split(" ")[1]);
|
210
|
+
|
211
|
+
|
212
|
+
/*for(n=0; n < 10; n++){
|
213
|
+
var interval = now;
|
214
|
+
now -= 3600;
|
215
|
+
interval += "-" + now;
|
216
|
+
interval_list.append(
|
217
|
+
$('<li>')
|
218
|
+
.html($('<a href="#">')
|
219
|
+
.html(interval)
|
220
|
+
.attr('data', interval)
|
221
|
+
.click(function(){
|
222
|
+
select_interval($(this).attr('data'))
|
223
|
+
}))
|
224
|
+
);
|
225
|
+
}*/
|
226
|
+
|
227
|
+
FnordMetric.ui.modal({
|
228
|
+
height: 280,
|
229
|
+
max_width: 570,
|
230
|
+
content: modal
|
231
|
+
});
|
232
|
+
}
|
233
|
+
|
234
|
+
function select_interval(inter){
|
235
|
+
start_timestamp = parseInt(inter.split("-")[0]);
|
236
|
+
end_timestamp = parseInt(inter.split("-")[1]);
|
237
|
+
updateDatepicker();
|
238
|
+
load_interval();
|
239
|
+
FnordMetric.ui.close_modal(this);
|
240
|
+
}
|
241
|
+
|
242
|
+
function load_interval(){
|
243
|
+
$('.gauge_viewport', viewport)
|
244
|
+
.html("");
|
245
|
+
|
246
|
+
FnordMetric.publish({
|
247
|
+
"gauge": gauge_name,
|
248
|
+
"type": "render_request",
|
249
|
+
"interval": start_timestamp + "-" + end_timestamp
|
250
|
+
})
|
251
|
+
}
|
252
|
+
|
253
|
+
return {
|
254
|
+
load: load,
|
255
|
+
resize: resize,
|
256
|
+
announce: announce,
|
257
|
+
close: close
|
258
|
+
};
|
259
|
+
|
260
|
+
});
|
@@ -0,0 +1,21 @@
|
|
1
|
+
FnordMetric.widgets.htmlWidget = function(){
|
2
|
+
function render(opts){
|
3
|
+
|
4
|
+
opts.elem.append(
|
5
|
+
$('<div class="headbar small"></div>').html(opts.title)
|
6
|
+
).css({
|
7
|
+
'marginBottom': 20,
|
8
|
+
'overflow': 'hidden'
|
9
|
+
});
|
10
|
+
|
11
|
+
var container = $('<div></div>')
|
12
|
+
.addClass('html_container')
|
13
|
+
.html(opts.html);
|
14
|
+
|
15
|
+
opts.elem.append(container);
|
16
|
+
}
|
17
|
+
|
18
|
+
return {
|
19
|
+
render: render
|
20
|
+
};
|
21
|
+
}
|