johnf-fnordmetric 1.2.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. data/Gemfile +6 -0
  2. data/Rakefile +9 -0
  3. data/fnordmetric.gemspec +41 -0
  4. data/lib/fnordmetric/acceptors/acceptor.rb +42 -0
  5. data/lib/fnordmetric/acceptors/amqp_acceptor.rb +56 -0
  6. data/lib/fnordmetric/acceptors/fyrehose_acceptor.rb +43 -0
  7. data/lib/fnordmetric/acceptors/stomp_acceptor.rb +71 -0
  8. data/lib/fnordmetric/acceptors/tcp_acceptor.rb +58 -0
  9. data/lib/fnordmetric/acceptors/udp_acceptor.rb +37 -0
  10. data/lib/fnordmetric/api.rb +46 -0
  11. data/lib/fnordmetric/cache.rb +20 -0
  12. data/lib/fnordmetric/context.rb +96 -0
  13. data/lib/fnordmetric/defaults.rb +22 -0
  14. data/lib/fnordmetric/enterprise/compatibility_handler.rb +42 -0
  15. data/lib/fnordmetric/ext.rb +75 -0
  16. data/lib/fnordmetric/gauge.rb +98 -0
  17. data/lib/fnordmetric/gauge_calculations.rb +106 -0
  18. data/lib/fnordmetric/gauge_modifiers.rb +144 -0
  19. data/lib/fnordmetric/gauge_rendering.rb +40 -0
  20. data/lib/fnordmetric/gauge_validations.rb +15 -0
  21. data/lib/fnordmetric/gauges/distribution_gauge.rb +87 -0
  22. data/lib/fnordmetric/gauges/server_health_gauge.rb +13 -0
  23. data/lib/fnordmetric/gauges/timeseries_gauge.rb +138 -0
  24. data/lib/fnordmetric/gauges/toplist_gauge.rb +44 -0
  25. data/lib/fnordmetric/histogram.rb +64 -0
  26. data/lib/fnordmetric/logger.rb +63 -0
  27. data/lib/fnordmetric/namespace.rb +208 -0
  28. data/lib/fnordmetric/session.rb +139 -0
  29. data/lib/fnordmetric/standalone.rb +20 -0
  30. data/lib/fnordmetric/timeseries.rb +79 -0
  31. data/lib/fnordmetric/toplist.rb +61 -0
  32. data/lib/fnordmetric/udp_client.rb +22 -0
  33. data/lib/fnordmetric/util.rb +25 -0
  34. data/lib/fnordmetric/version.rb +3 -0
  35. data/lib/fnordmetric/web/app.rb +63 -0
  36. data/lib/fnordmetric/web/app_helpers.rb +42 -0
  37. data/lib/fnordmetric/web/dashboard.rb +40 -0
  38. data/lib/fnordmetric/web/event.rb +99 -0
  39. data/lib/fnordmetric/web/reactor.rb +127 -0
  40. data/lib/fnordmetric/web/web.rb +59 -0
  41. data/lib/fnordmetric/web/websocket.rb +41 -0
  42. data/lib/fnordmetric/widget.rb +82 -0
  43. data/lib/fnordmetric/widgets/bars_widget.rb +44 -0
  44. data/lib/fnordmetric/widgets/html_widget.rb +28 -0
  45. data/lib/fnordmetric/widgets/numbers_widget.rb +80 -0
  46. data/lib/fnordmetric/widgets/pie_widget.rb +23 -0
  47. data/lib/fnordmetric/widgets/timeseries_widget.rb +65 -0
  48. data/lib/fnordmetric/widgets/toplist_widget.rb +68 -0
  49. data/lib/fnordmetric/worker.rb +89 -0
  50. data/lib/fnordmetric/zero_config_gauge.rb +138 -0
  51. data/lib/fnordmetric.rb +149 -0
  52. data/run_specs.sh +11 -0
  53. data/spec/api_spec.rb +49 -0
  54. data/spec/context_spec.rb +42 -0
  55. data/spec/dashboard_spec.rb +38 -0
  56. data/spec/event_spec.rb +170 -0
  57. data/spec/ext_spec.rb +14 -0
  58. data/spec/fnordmetric_spec.rb +56 -0
  59. data/spec/gauge_like_shared.rb +56 -0
  60. data/spec/gauge_modifiers_spec.rb +583 -0
  61. data/spec/gauge_spec.rb +230 -0
  62. data/spec/namespace_spec.rb +114 -0
  63. data/spec/session_spec.rb +231 -0
  64. data/spec/spec_helper.rb +49 -0
  65. data/spec/tcp_acceptor_spec.rb +35 -0
  66. data/spec/timeseries_gauge_spec.rb +56 -0
  67. data/spec/udp_acceptor_spec.rb +35 -0
  68. data/spec/util_spec.rb +46 -0
  69. data/spec/widget_spec.rb +113 -0
  70. data/spec/worker_spec.rb +40 -0
  71. data/web/.gitignore +4 -0
  72. data/web/build.sh +34 -0
  73. data/web/css/fnordmetric.core.css +868 -0
  74. data/web/fnordmetric-core.css +1409 -0
  75. data/web/fnordmetric-core.js +3420 -0
  76. data/web/fnordmetric-ui.css +282 -0
  77. data/web/fnordmetric-ui.js +12032 -0
  78. data/web/haml/app.haml +20 -0
  79. data/web/haml/distribution_gauge.haml +118 -0
  80. data/web/haml/timeseries_gauge.haml +80 -0
  81. data/web/haml/toplist_gauge.haml +194 -0
  82. data/web/img/head.png +0 -0
  83. data/web/img/list.png +0 -0
  84. data/web/img/list_active.png +0 -0
  85. data/web/img/list_hover.png +0 -0
  86. data/web/img/loader.gif +0 -0
  87. data/web/img/loader_white.gif +0 -0
  88. data/web/img/navbar.png +0 -0
  89. data/web/img/navbar_btn.png +0 -0
  90. data/web/img/picto_gauge.png +0 -0
  91. data/web/js/fnordmetric.bars_widget.js +178 -0
  92. data/web/js/fnordmetric.dashboard_view.js +99 -0
  93. data/web/js/fnordmetric.gauge_explorer.js +173 -0
  94. data/web/js/fnordmetric.gauge_view.js +260 -0
  95. data/web/js/fnordmetric.html_widget.js +21 -0
  96. data/web/js/fnordmetric.js +315 -0
  97. data/web/js/fnordmetric.numbers_widget.js +122 -0
  98. data/web/js/fnordmetric.overview_view.js +35 -0
  99. data/web/js/fnordmetric.pie_widget.js +118 -0
  100. data/web/js/fnordmetric.realtime_timeline_widget.js +175 -0
  101. data/web/js/fnordmetric.session_view.js +342 -0
  102. data/web/js/fnordmetric.timeline_widget.js +333 -0
  103. data/web/js/fnordmetric.timeseries_widget.js +405 -0
  104. data/web/js/fnordmetric.toplist_widget.js +119 -0
  105. data/web/js/fnordmetric.ui.js +91 -0
  106. data/web/js/fnordmetric.util.js +248 -0
  107. data/web/vendor/font-awesome/css/font-awesome-ie7.min.css +22 -0
  108. data/web/vendor/font-awesome/css/font-awesome.css +540 -0
  109. data/web/vendor/font-awesome/css/font-awesome.min.css +33 -0
  110. data/web/vendor/font-awesome/font/FontAwesome.otf +0 -0
  111. data/web/vendor/font-awesome/font/fontawesome-webfont.eot +0 -0
  112. data/web/vendor/font-awesome/font/fontawesome-webfont.svg +284 -0
  113. data/web/vendor/font-awesome/font/fontawesome-webfont.ttf +0 -0
  114. data/web/vendor/font-awesome/font/fontawesome-webfont.woff +0 -0
  115. data/web/vendor/jquery-1.6.2.min.js +18 -0
  116. data/web/vendor/jquery-ui.min.js +6 -0
  117. data/web/vendor/jquery.combobox.js +129 -0
  118. data/web/vendor/jquery.maskedinput.js +252 -0
  119. 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
+ };