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,315 @@
|
|
1
|
+
var FnordMetric = (function(pre_init){
|
2
|
+
|
3
|
+
var canvasElem = false;
|
4
|
+
var currentView = false;
|
5
|
+
var currentNamespace = false;
|
6
|
+
var ws_addr = null;
|
7
|
+
var js_api = false;
|
8
|
+
var gauges = {};
|
9
|
+
var socket, conf;
|
10
|
+
|
11
|
+
var navigatedViaHash = false;
|
12
|
+
|
13
|
+
function renderDashboard(_dash){
|
14
|
+
loadView(FnordMetric.views.dashboardView(_dash));
|
15
|
+
}
|
16
|
+
|
17
|
+
function renderGauge(_gauge){
|
18
|
+
loadView(FnordMetric.views.gaugeView(_gauge));
|
19
|
+
}
|
20
|
+
|
21
|
+
function renderSidebarGroup(grname){
|
22
|
+
var ul = $("<ul>")
|
23
|
+
.attr('data-group', grname);
|
24
|
+
|
25
|
+
$('#sidebar')
|
26
|
+
.append('<div class="ul_head">' + grname + '</div>')
|
27
|
+
.append(ul);
|
28
|
+
|
29
|
+
return ul;
|
30
|
+
}
|
31
|
+
|
32
|
+
function renderSidebar(){
|
33
|
+
var prev_active = false;
|
34
|
+
|
35
|
+
if($('#sidebar li.active').length > 0){
|
36
|
+
prev_active = $('#sidebar li.active:first').attr('data-token');
|
37
|
+
}
|
38
|
+
|
39
|
+
$('#sidebar')
|
40
|
+
.html('');
|
41
|
+
|
42
|
+
var sidebar_overview;
|
43
|
+
|
44
|
+
if (!conf.hide_active_users || !conf.hide_gauge_explorer)
|
45
|
+
sidebar_overview = renderSidebarGroup('Overview');
|
46
|
+
|
47
|
+
if (!conf.hide_gauge_explorer) {
|
48
|
+
sidebar_overview
|
49
|
+
.append($('<li class="overview">')
|
50
|
+
.append($('<a href="#" class="title">').html('<i class="icon-bar-chart"></i> Gauge Explorer'))
|
51
|
+
.click(function(){ renderGaugeExplorer(); }));
|
52
|
+
}
|
53
|
+
|
54
|
+
if (!conf.hide_active_users) {
|
55
|
+
sidebar_overview
|
56
|
+
.append($('<li class="overview">')
|
57
|
+
.append($('<a href="#" class="title">').html('<i class="icon icon-group"></i> Active Users'))
|
58
|
+
.click(function(){ renderSessionView(); }));
|
59
|
+
}
|
60
|
+
|
61
|
+
for(gkey in gauges){
|
62
|
+
if(!gauges[gkey].group){ gauges[gkey].group = 'Gauges'; }
|
63
|
+
if(!gauges[gkey].title){ gauges[gkey].title = gkey; }
|
64
|
+
|
65
|
+
var ul = $('#sidebar ul[data-group="' + gauges[gkey].group + '"]');
|
66
|
+
if(ul.length == 0){ ul = renderSidebarGroup(gauges[gkey].group); }
|
67
|
+
|
68
|
+
ul.append($('<li class="gauge">')
|
69
|
+
.attr('data-token', gkey)
|
70
|
+
.attr('data-view', gauges[gkey].view_type)
|
71
|
+
.append('<i class="icon-arrow-right">')
|
72
|
+
.append($('<a href="#" class="title">').html(gauges[gkey].title)));
|
73
|
+
}
|
74
|
+
|
75
|
+
$('#sidebar li').click(sidebarClick);
|
76
|
+
|
77
|
+
if(prev_active){
|
78
|
+
$('#sidebar li[data-token="'+prev_active+'"]').addClass('active');
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
function sidebarClick(){
|
83
|
+
$('#sidebar li').removeClass('active');
|
84
|
+
$(this).addClass('active');
|
85
|
+
|
86
|
+
if($(this).attr('data-view') == "dashboard"){
|
87
|
+
FnordMetric.renderDashboard($(this).attr('data-token'));
|
88
|
+
window.location.hash = 'dashboard/' + $(this).attr('data-token');
|
89
|
+
} else if($(this).attr('data-view') == "gauge"){
|
90
|
+
FnordMetric.renderGauge($(this).attr('data-token'));
|
91
|
+
window.location.hash = 'gauge/' + $(this).attr('data-token');
|
92
|
+
}
|
93
|
+
|
94
|
+
$(this).addClass('active');
|
95
|
+
|
96
|
+
return false;
|
97
|
+
}
|
98
|
+
|
99
|
+
function addGauge(msg){
|
100
|
+
if(!gauges[msg.gauge_key]){
|
101
|
+
gauges[msg.gauge_key] = {
|
102
|
+
"view_type": msg.view,
|
103
|
+
"title": msg.title,
|
104
|
+
"tick": msg.tick,
|
105
|
+
"group": msg.group
|
106
|
+
};
|
107
|
+
|
108
|
+
renderSidebar();
|
109
|
+
|
110
|
+
if(!currentView && (window.location.hash.length < 2)){
|
111
|
+
window.location.hash = "gauge_explorer";
|
112
|
+
}
|
113
|
+
|
114
|
+
navigateViaHash();
|
115
|
+
}
|
116
|
+
}
|
117
|
+
|
118
|
+
function renderSessionView(){
|
119
|
+
window.location.hash = 'active_users';
|
120
|
+
loadView(FnordMetric.views.sessionView());
|
121
|
+
}
|
122
|
+
|
123
|
+
function renderGaugeExplorer(){
|
124
|
+
window.location.hash = 'gauge_explorer';
|
125
|
+
loadView(FnordMetric.views.gaugeExplorer());
|
126
|
+
}
|
127
|
+
|
128
|
+
function renderOverviewView(){
|
129
|
+
loadView(FnordMetric.views.overviewView());
|
130
|
+
}
|
131
|
+
|
132
|
+
function loadView(_view){
|
133
|
+
FnordMetric.ui.close_modal('body');
|
134
|
+
if(currentView){ currentView.close(); }
|
135
|
+
canvasElem.html('loading!');
|
136
|
+
currentView = _view;
|
137
|
+
currentView.load(canvasElem);
|
138
|
+
resizeView();
|
139
|
+
};
|
140
|
+
|
141
|
+
function resizeView(){
|
142
|
+
if (!conf.no_resize_viewport) {
|
143
|
+
var viewport_width = window.innerWidth - 220;
|
144
|
+
if(viewport_width < 780){ viewport_width=780; }
|
145
|
+
$('#viewport').width(viewport_width);
|
146
|
+
$('.navbar').width(viewport_width);
|
147
|
+
}
|
148
|
+
|
149
|
+
FnordMetric.ui.resizable('.viewport_inner');
|
150
|
+
if(currentView){
|
151
|
+
currentView.resize(
|
152
|
+
canvasElem.innerWidth(),
|
153
|
+
canvasElem.innerHeight()
|
154
|
+
);
|
155
|
+
}
|
156
|
+
$('.resize_full_height').height(window.innerHeight-40);
|
157
|
+
$('#viewport .viewport_inner').css('minHeight', window.innerHeight-2);
|
158
|
+
$('.resize_min_full_height').css('minHeight', window.innerHeight-2);
|
159
|
+
$(".resize_listener").trigger('fm_resize');
|
160
|
+
};
|
161
|
+
|
162
|
+
function init(_conf){
|
163
|
+
conf = _conf;
|
164
|
+
this.currentNamespace = _conf.token;
|
165
|
+
|
166
|
+
if (conf.address) {
|
167
|
+
this.ws_addr = "ws://" + conf.address + '/stream';
|
168
|
+
} else {
|
169
|
+
this.ws_addr = "ws://" + document.location.host + '/stream';
|
170
|
+
}
|
171
|
+
|
172
|
+
if(conf.title){ $('title').html(conf.title); }
|
173
|
+
|
174
|
+
canvasElem = $("<div class='viewport_inner'>");
|
175
|
+
canvasElem.addClass('clearfix');
|
176
|
+
|
177
|
+
var _wrap_elem = $("<div id='wrap'>")
|
178
|
+
.append($("<div id='sidebar'>"))
|
179
|
+
.append($("<div id='viewport'>").append(canvasElem));
|
180
|
+
|
181
|
+
connect();
|
182
|
+
|
183
|
+
$('#app').html(_wrap_elem);
|
184
|
+
$(document).ready(renderSidebar);
|
185
|
+
$(window).resize(resizeView);
|
186
|
+
resizeView();
|
187
|
+
};
|
188
|
+
|
189
|
+
function connect(){
|
190
|
+
socket = new WebSocket(FnordMetric.ws_addr);
|
191
|
+
|
192
|
+
if (js_api == false) {
|
193
|
+
socket.onmessage = socketMessage;
|
194
|
+
socket.onclose = socketClose;
|
195
|
+
socket.onopen = socketOpen;
|
196
|
+
} else {
|
197
|
+
socket.onmessage = js_api.socketMessage;
|
198
|
+
socket.onclose = js_api.socketClose;
|
199
|
+
socket.onopen = js_api.socketOpen;
|
200
|
+
}
|
201
|
+
}
|
202
|
+
|
203
|
+
function publish(obj){
|
204
|
+
if(!obj.namespace){
|
205
|
+
obj.namespace = FnordMetric.currentNamespace;
|
206
|
+
}
|
207
|
+
socket.send(JSON.stringify(obj));
|
208
|
+
}
|
209
|
+
|
210
|
+
function socketMessage(raw){
|
211
|
+
var evt = JSON.parse(raw.data);
|
212
|
+
|
213
|
+
if((evt.type == "discover_response")){
|
214
|
+
addGauge(evt);
|
215
|
+
} else {
|
216
|
+
if(currentView){ currentView.announce(evt); }
|
217
|
+
}
|
218
|
+
}
|
219
|
+
|
220
|
+
function socketOpen(){
|
221
|
+
console.log("[FnordMetric] connected...");
|
222
|
+
|
223
|
+
if (!conf.no_discovery)
|
224
|
+
publish({"type": "discover_request"});
|
225
|
+
|
226
|
+
$('.flash_msg_over').fadeOut(function(){ $(this).remove(); });
|
227
|
+
}
|
228
|
+
|
229
|
+
function socketClose(){
|
230
|
+
console.log("[FnordMetric] socket closed");
|
231
|
+
|
232
|
+
if($('.flash_msg_over').length == 0){
|
233
|
+
$(viewport)
|
234
|
+
.append($("<div class='flash_msg_over'>")
|
235
|
+
.append($("<div class='inner'>")
|
236
|
+
.append('<h1>Oopsiedaisy, lost the connection...</h1>')
|
237
|
+
.append('<h2>Reconnecting to server...</h2>')
|
238
|
+
.append('<div class="loader_white">')));
|
239
|
+
|
240
|
+
window.setTimeout(function(){
|
241
|
+
$('.flash_msg_over').addClass('visible');
|
242
|
+
}, 20);
|
243
|
+
}
|
244
|
+
|
245
|
+
window.setTimeout(connect, 1000);
|
246
|
+
}
|
247
|
+
|
248
|
+
function navigateViaHash(){
|
249
|
+
if (window.location.hash){
|
250
|
+
var elem = null;
|
251
|
+
if (!!window.location.hash.match(/^#dashboard\/[a-zA-Z_0-9-]+$/)) {
|
252
|
+
elem = $('#sidebar li.gauge[data-token="'+window.location.hash.slice(11)+'"]');
|
253
|
+
} else if (!!window.location.hash.match(/^#gauge\/[a-zA-Z_0-9-]+$/)){
|
254
|
+
elem = $('#sidebar li.gauge[data-token="'+window.location.hash.slice(7)+'"]');
|
255
|
+
} else if(window.location.hash == "#gauge_explorer") {
|
256
|
+
navigatedViaHash = true;
|
257
|
+
renderGaugeExplorer();
|
258
|
+
} else if(window.location.hash == "#active_users") {
|
259
|
+
navigatedViaHash = true;
|
260
|
+
renderSessionView();
|
261
|
+
}
|
262
|
+
|
263
|
+
if (elem && (elem.length > 0)) {
|
264
|
+
navigatedViaHash = true;
|
265
|
+
elem.click();
|
266
|
+
}
|
267
|
+
}
|
268
|
+
}
|
269
|
+
|
270
|
+
var setup = function(opts){
|
271
|
+
if (typeof $ == 'undefined') {
|
272
|
+
console.log("error: FnordMetric requires jQuery 1.6.2+");
|
273
|
+
return;
|
274
|
+
}
|
275
|
+
|
276
|
+
FnordMetric.currentNamespace = opts.namespace;
|
277
|
+
FnordMetric.ws_addr = "ws://" + opts.address + "/stream";
|
278
|
+
|
279
|
+
$(document).ready(function(){
|
280
|
+
js_api = FnordMetric.js_api;
|
281
|
+
connect();
|
282
|
+
});
|
283
|
+
}
|
284
|
+
|
285
|
+
var get_conf = function(){
|
286
|
+
return conf;
|
287
|
+
}
|
288
|
+
|
289
|
+
return {
|
290
|
+
renderDashboard: renderDashboard,
|
291
|
+
renderGauge: renderGauge,
|
292
|
+
renderSessionView: renderSessionView,
|
293
|
+
renderOverviewView: renderOverviewView,
|
294
|
+
renderGaugeExplorer: renderGaugeExplorer,
|
295
|
+
resizeView: resizeView,
|
296
|
+
loadView: loadView,
|
297
|
+
init: init,
|
298
|
+
publish: publish,
|
299
|
+
setup: setup,
|
300
|
+
p: '',
|
301
|
+
socket: socket,
|
302
|
+
currentNamespace: currentNamespace,
|
303
|
+
ws_addr: ws_addr,
|
304
|
+
currentWidgetUID: 23,
|
305
|
+
ui: {},
|
306
|
+
views: {},
|
307
|
+
widgets: {},
|
308
|
+
util: {},
|
309
|
+
gauges: gauges,
|
310
|
+
get_conf: get_conf,
|
311
|
+
rickshaw: pre_init.rickshaw,
|
312
|
+
util: pre_init.util
|
313
|
+
};
|
314
|
+
|
315
|
+
})(FnordMetric);
|
@@ -0,0 +1,122 @@
|
|
1
|
+
FnordMetric.widgets.numbersWidget = function(){
|
2
|
+
|
3
|
+
var max_per_row = 8;
|
4
|
+
var opts;
|
5
|
+
|
6
|
+
function render(_opts){
|
7
|
+
|
8
|
+
opts = _opts;
|
9
|
+
|
10
|
+
opts.elem.append(
|
11
|
+
$('<div class="headbar small"></div>').html(opts.title)
|
12
|
+
).css({
|
13
|
+
'marginBottom': 20,
|
14
|
+
'overflow': 'hidden'
|
15
|
+
});
|
16
|
+
|
17
|
+
if(!opts.series_titles){
|
18
|
+
opts.series_titles = opts.series;
|
19
|
+
}
|
20
|
+
|
21
|
+
for(k in opts.series){
|
22
|
+
|
23
|
+
var container = $('<div></div>')
|
24
|
+
.addClass('numbers_container')
|
25
|
+
.attr('rel', opts.series[k])
|
26
|
+
.append($('<div class="title">').html(opts.series_titles[k]));
|
27
|
+
|
28
|
+
opts.elem.append(container);
|
29
|
+
}
|
30
|
+
|
31
|
+
if(opts.autoupdate){
|
32
|
+
var secs = parseInt(opts.autoupdate);
|
33
|
+
if(secs > 0){
|
34
|
+
|
35
|
+
var autoupdate_interval = window.setInterval(function(){
|
36
|
+
requestValues();
|
37
|
+
}, secs*1000);
|
38
|
+
|
39
|
+
$('body').bind('fm_dashboard_close', function(){
|
40
|
+
window.clearInterval(autoupdate_interval);
|
41
|
+
});
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
requestValues();
|
46
|
+
}
|
47
|
+
|
48
|
+
function resize(){
|
49
|
+
$('.numbers_container', opts.elem).each(function(i, e){
|
50
|
+
var num_numbers = $('.number', e).length;
|
51
|
+
if(num_numbers > max_per_row){ num_numbers = max_per_row; }
|
52
|
+
$(e).css('width', (num_numbers * 90)+'px');
|
53
|
+
});
|
54
|
+
}
|
55
|
+
|
56
|
+
function requestValues(){
|
57
|
+
for(k in opts.series){
|
58
|
+
FnordMetric.publish({
|
59
|
+
"namespace": FnordMetric.currentNamespace,
|
60
|
+
"type": "widget_request",
|
61
|
+
"klass": "generic",
|
62
|
+
"channel": opts.channel,
|
63
|
+
"cmd": "values_for",
|
64
|
+
"gauge": opts.series[k],
|
65
|
+
"offsets": opts.offsets,
|
66
|
+
"widget_key": opts.widget_key
|
67
|
+
})
|
68
|
+
}
|
69
|
+
}
|
70
|
+
|
71
|
+
function renderValues(series, values){
|
72
|
+
for(vkey in values){
|
73
|
+
if(!values[vkey].desc){ values[vkey].desc = vkey; }
|
74
|
+
|
75
|
+
var celem = $('.numbers_container[rel="'+series+'"]', opts.elem)
|
76
|
+
var velem = $('.number[rel="'+vkey+'"]', celem);
|
77
|
+
var vdesc = FnordMetric.util.evilFormat(values[vkey].desc);
|
78
|
+
|
79
|
+
if (velem.length == 0){
|
80
|
+
velem = $('<div></div>')
|
81
|
+
.addClass('number')
|
82
|
+
.attr('rel', vkey)
|
83
|
+
.append($('<span class="desc">').html(vdesc))
|
84
|
+
.append($('<span class="value">').html(0))
|
85
|
+
|
86
|
+
if (opts.series_units[series]) {
|
87
|
+
velem.attr("data-unit", opts.series_units[series]);
|
88
|
+
}
|
89
|
+
|
90
|
+
celem.append(velem);
|
91
|
+
}
|
92
|
+
|
93
|
+
if(!!opts.dont_animate){
|
94
|
+
velem.attr('data', values[vkey].value)
|
95
|
+
$('.value', velem).html(FnordMetric.util.formatGaugeValue(vkey, values[vkey].value));
|
96
|
+
} else {
|
97
|
+
velem.attr('data', values[vkey].value)
|
98
|
+
}
|
99
|
+
}
|
100
|
+
|
101
|
+
resize();
|
102
|
+
|
103
|
+
if(!opts.dont_animate){
|
104
|
+
FnordMetric.util.updateNumbers($(opts.elem), 4);
|
105
|
+
}
|
106
|
+
}
|
107
|
+
|
108
|
+
function announce(ev){
|
109
|
+
if(ev.widget_key == opts.widget_key){
|
110
|
+
if((ev.type == "widget_response") && (ev.cmd == "values_for")){
|
111
|
+
renderValues(ev.gauge, ev.values)
|
112
|
+
}
|
113
|
+
}
|
114
|
+
}
|
115
|
+
|
116
|
+
|
117
|
+
return {
|
118
|
+
render: render,
|
119
|
+
announce: announce
|
120
|
+
};
|
121
|
+
|
122
|
+
};
|
@@ -0,0 +1,35 @@
|
|
1
|
+
FnordMetric.views.overviewView = function(){
|
2
|
+
var widgets = [];
|
3
|
+
var viewport = null;
|
4
|
+
|
5
|
+
function load(_viewport){
|
6
|
+
viewport = _viewport.html('');
|
7
|
+
|
8
|
+
viewport.append('<div class="navbar"></div>');
|
9
|
+
viewport.append('<h1>Application Overview</h1>');
|
10
|
+
viewport.append('<h3>Welcome to FnordMetric :)</h3>');
|
11
|
+
|
12
|
+
// $.ajax({
|
13
|
+
// url: FnordMetric.p + '/' + FnordMetric.currentNamespace+'/dashboard/'+dashboard_name,
|
14
|
+
// success: function(resp, status){
|
15
|
+
// var conf = JSON.parse(resp);
|
16
|
+
// renderWidgets(conf.widgets);
|
17
|
+
// }
|
18
|
+
// });
|
19
|
+
};
|
20
|
+
|
21
|
+
function resize(){
|
22
|
+
// here be dragons
|
23
|
+
}
|
24
|
+
|
25
|
+
function close(){
|
26
|
+
// here be dragons
|
27
|
+
}
|
28
|
+
|
29
|
+
return {
|
30
|
+
load: load,
|
31
|
+
resize: resize,
|
32
|
+
close: close
|
33
|
+
};
|
34
|
+
|
35
|
+
};
|
@@ -0,0 +1,118 @@
|
|
1
|
+
FnordMetric.widgets.pieWidget = function(){
|
2
|
+
|
3
|
+
function render(opts){
|
4
|
+
|
5
|
+
return drawLayout();
|
6
|
+
|
7
|
+
var widget_uid = FnordMetric.util.getNextWidgetUID();
|
8
|
+
var chart=false;
|
9
|
+
|
10
|
+
function redraw(first_time, silent){
|
11
|
+
if(!silent){ $(opts.elem).css('opacity', 0.5); }
|
12
|
+
var gauge_values = {};
|
13
|
+
var gauges_left = opts.gauges.length;
|
14
|
+
var at = parseInt(new Date().getTime()/1000);
|
15
|
+
$(opts.gauges).each(function(i,gauge){
|
16
|
+
$.ajax({
|
17
|
+
url: FnordMetric.p + '/' + FnordMetric.currentNamespace+'/gauge/'+gauge+'?at='+at,
|
18
|
+
success: function(_resp){
|
19
|
+
var resp = JSON.parse(_resp);
|
20
|
+
gauges_left -= 1;
|
21
|
+
for(_tk in resp){
|
22
|
+
gauge_values[gauge] = parseInt(resp[_tk]||0);
|
23
|
+
}
|
24
|
+
if(gauges_left==0){
|
25
|
+
redrawChart(first_time, gauge_values);
|
26
|
+
}
|
27
|
+
}
|
28
|
+
});
|
29
|
+
});
|
30
|
+
}
|
31
|
+
|
32
|
+
function redrawChart(first_time, gauge_values){
|
33
|
+
|
34
|
+
var series_data = [];
|
35
|
+
|
36
|
+
for(_gkey in gauge_values){
|
37
|
+
series_data.push([
|
38
|
+
opts.gauge_titles[_gkey],
|
39
|
+
gauge_values[_gkey]
|
40
|
+
]);
|
41
|
+
}
|
42
|
+
|
43
|
+
/*chart = new Highcharts.Chart({
|
44
|
+
chart: {
|
45
|
+
renderTo: 'container-'+widget_uid,
|
46
|
+
defaultSeriesType: 'pie',
|
47
|
+
height: 270,
|
48
|
+
spacingTop: 5,
|
49
|
+
spacingBottom: 30
|
50
|
+
},
|
51
|
+
credits: {
|
52
|
+
enabled: false
|
53
|
+
},
|
54
|
+
title: { text: '' },
|
55
|
+
legend: {
|
56
|
+
layout: 'horizontal',
|
57
|
+
align: 'top',
|
58
|
+
verticalAlign: 'top',
|
59
|
+
margin: 25,
|
60
|
+
borderWidth: 0
|
61
|
+
},
|
62
|
+
tooltip: {
|
63
|
+
formatter: function() {
|
64
|
+
return '<b>'+ this.point.name +'</b>: '+ this.y + ' (' + this.percentage.toFixed(1) + '%)';
|
65
|
+
}
|
66
|
+
},
|
67
|
+
plotOptions: {
|
68
|
+
pie: {
|
69
|
+
animation: first_time,
|
70
|
+
dataLabels: {
|
71
|
+
formatter: function() {
|
72
|
+
return '<b>'+ this.point.name +'</b><br />'+ this.percentage.toFixed(1) +' %';
|
73
|
+
}
|
74
|
+
}
|
75
|
+
}
|
76
|
+
},
|
77
|
+
series: [
|
78
|
+
{
|
79
|
+
name: opts.title,
|
80
|
+
data: series_data
|
81
|
+
}
|
82
|
+
]
|
83
|
+
});*/
|
84
|
+
|
85
|
+
//chart.redraw();
|
86
|
+
$(opts.elem).css('opacity', 1);
|
87
|
+
}
|
88
|
+
|
89
|
+
function drawLayout(){
|
90
|
+
$(opts.elem).append( $('<div></div>').attr('class', 'headbar small').append(
|
91
|
+
$('<span></span>').html(opts.title)
|
92
|
+
) ).append(
|
93
|
+
$('<div></div>').attr('id', 'container-'+widget_uid).css({
|
94
|
+
height: 270
|
95
|
+
})
|
96
|
+
);
|
97
|
+
}
|
98
|
+
|
99
|
+
drawLayout();
|
100
|
+
redraw(true);
|
101
|
+
|
102
|
+
if(opts.autoupdate){
|
103
|
+
var autoupdate_interval = window.setInterval(function(){
|
104
|
+
redraw(false, true);
|
105
|
+
}, opts.autoupdate*1000);
|
106
|
+
|
107
|
+
$('body').bind('fm_dashboard_close', function(){
|
108
|
+
window.clearInterval(autoupdate_interval);
|
109
|
+
});
|
110
|
+
}
|
111
|
+
|
112
|
+
}
|
113
|
+
|
114
|
+
return {
|
115
|
+
render: render
|
116
|
+
};
|
117
|
+
|
118
|
+
};
|