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,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;">&nbsp;</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
+ '&nbsp;&dash;&nbsp;' +
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
+ '&nbsp;&dash;&nbsp;' +
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;">&mdash;</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
+ }