simple_metrics 0.3.6 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. data/README.markdown +53 -16
  2. data/Rakefile +0 -17
  3. data/bin/populate +13 -26
  4. data/bin/simple_metrics_client +64 -0
  5. data/bin/simple_metrics_server +3 -4
  6. data/lib/simple_metrics.rb +76 -17
  7. data/lib/simple_metrics/bucket.rb +106 -43
  8. data/lib/simple_metrics/client.rb +83 -0
  9. data/lib/simple_metrics/data_point.rb +137 -45
  10. data/lib/simple_metrics/functions.rb +5 -5
  11. data/lib/simple_metrics/graph.rb +32 -69
  12. data/lib/simple_metrics/mongo.rb +48 -0
  13. data/lib/simple_metrics/server.rb +66 -0
  14. data/lib/simple_metrics/version.rb +1 -1
  15. data/simple_metrics.gemspec +0 -6
  16. data/spec/bucket_spec.rb +152 -17
  17. data/spec/data_point_spec.rb +64 -14
  18. data/spec/graph_spec.rb +19 -30
  19. data/spec/spec_helper.rb +3 -3
  20. metadata +24 -139
  21. data/.travis.yml +0 -3
  22. data/bin/simple_metrics_web +0 -11
  23. data/config.ru +0 -6
  24. data/default_config.yml +0 -34
  25. data/lib/simple_metrics/app.rb +0 -52
  26. data/lib/simple_metrics/configuration.rb +0 -97
  27. data/lib/simple_metrics/data_point/base.rb +0 -59
  28. data/lib/simple_metrics/data_point/counter.rb +0 -20
  29. data/lib/simple_metrics/data_point/event.rb +0 -16
  30. data/lib/simple_metrics/data_point/gauge.rb +0 -19
  31. data/lib/simple_metrics/data_point/timing.rb +0 -15
  32. data/lib/simple_metrics/data_point_repository.rb +0 -114
  33. data/lib/simple_metrics/importer.rb +0 -64
  34. data/lib/simple_metrics/metric.rb +0 -29
  35. data/lib/simple_metrics/metric_repository.rb +0 -54
  36. data/lib/simple_metrics/public/css/bootstrap-responsive.min.css +0 -12
  37. data/lib/simple_metrics/public/css/bootstrap.min.css +0 -689
  38. data/lib/simple_metrics/public/css/graph.css +0 -45
  39. data/lib/simple_metrics/public/css/rickshaw.min.css +0 -1
  40. data/lib/simple_metrics/public/img/glyphicons-halflings-white.png +0 -0
  41. data/lib/simple_metrics/public/img/glyphicons-halflings.png +0 -0
  42. data/lib/simple_metrics/public/js/app.js +0 -20
  43. data/lib/simple_metrics/public/js/collections/graph.js +0 -16
  44. data/lib/simple_metrics/public/js/collections/metric.js +0 -9
  45. data/lib/simple_metrics/public/js/helpers.js +0 -23
  46. data/lib/simple_metrics/public/js/lib/backbone-0.9.2.min.js +0 -38
  47. data/lib/simple_metrics/public/js/lib/bootstrap.min.js +0 -6
  48. data/lib/simple_metrics/public/js/lib/d3.v2.min.js +0 -4
  49. data/lib/simple_metrics/public/js/lib/handlebars-1.0.0.beta.6.js +0 -1550
  50. data/lib/simple_metrics/public/js/lib/jquery-1.7.1.min.js +0 -4
  51. data/lib/simple_metrics/public/js/lib/moment.min.js +0 -6
  52. data/lib/simple_metrics/public/js/lib/rickshaw.min.js +0 -1
  53. data/lib/simple_metrics/public/js/lib/underscore-1.3.1.min.js +0 -31
  54. data/lib/simple_metrics/public/js/models/graph.js +0 -6
  55. data/lib/simple_metrics/public/js/models/metric.js +0 -7
  56. data/lib/simple_metrics/public/js/router.js +0 -42
  57. data/lib/simple_metrics/public/js/views/app.js +0 -18
  58. data/lib/simple_metrics/public/js/views/dashboard.js +0 -10
  59. data/lib/simple_metrics/public/js/views/graph.js +0 -101
  60. data/lib/simple_metrics/public/js/views/metric.js +0 -82
  61. data/lib/simple_metrics/public/js/views/metrics.js +0 -10
  62. data/lib/simple_metrics/repository.rb +0 -34
  63. data/lib/simple_metrics/udp_server.rb +0 -81
  64. data/lib/simple_metrics/views/graph.erb +0 -93
  65. data/lib/simple_metrics/views/index.erb +0 -0
  66. data/lib/simple_metrics/views/layout.erb +0 -138
  67. data/lib/simple_metrics/views/show.erb +0 -31
  68. data/spec/data_point_repository_spec.rb +0 -77
  69. data/spec/importer_spec.rb +0 -126
  70. data/spec/metric_repository_spec.rb +0 -53
@@ -1,93 +0,0 @@
1
- <h3><%= graph_title params[:time] %></h3><br>
2
- <div class="graph" id="graph-<%= params[:time] %>"/>
3
- <div class="y-axis" id="y-axis-<%= params[:time] %>"/>
4
-
5
- <script>
6
-
7
- var data = <%= JSON.generate(@series) %>;
8
-
9
- var pastel = [
10
- '#239928',
11
- '#6CCC70',
12
- '#DEFFA1',
13
- '#DEFFA1',
14
- '#DEFFA1',
15
- '#362F2B',
16
- '#BFD657',
17
- '#FF6131',
18
- '#FFFF9D',
19
- '#BEEB9F',
20
- '#79BD8F',
21
- '#00A388'
22
- ].reverse();
23
-
24
- var customPalette = new Rickshaw.Color.Palette( { scheme: pastel } );
25
- var spectrum14Palette = new Rickshaw.Color.Palette( { scheme: "spectrum14" } );
26
-
27
- function addColorToSeries(data, palette) {
28
- var result = [];
29
- $.each(data, function(k, v){
30
- v.color = palette.color();
31
- result.push(v);
32
- });
33
- return result;
34
- };
35
-
36
- graph = new Rickshaw.Graph( {
37
- element: document.getElementById("graph-<%= params[:time] %>"),
38
- // width: 320,
39
- // height: 200,
40
- renderer: 'line',
41
- series: addColorToSeries(data, spectrum14Palette)
42
- } );
43
-
44
- function timeUnit(time) {
45
- var timeFixture = new Rickshaw.Fixtures.Time();
46
- var minuteCustom = {
47
- name: 'minute',
48
- seconds: 60,
49
- formatter: function(d) { return d.getUTCHours()+':'+d.getUTCMinutes()+'h'}
50
- };
51
- var hourCustom = {
52
- name: 'hour',
53
- seconds: 60*15,
54
- formatter: function(d) { return d.getUTCHours()+':'+d.getUTCMinutes()+'h'}
55
- };
56
- var dayCustom = {
57
- name: 'day',
58
- seconds: 60*60*2,
59
- formatter: function(d) { return d.getUTCHours()+'h'}
60
- };
61
- var weekCustom = {
62
- name: 'week',
63
- seconds: 60*60*2*7*2,
64
- formatter: function(d) { return d.getUTCDate()+'. '+d.getUTCMonth()+'.'}
65
- };
66
-
67
- switch(time){
68
- case 'minute': return minuteCustom; break;
69
- case 'hour': return hourCustom; break;
70
- case 'day': return dayCustom; break;
71
- case 'week': return weekCustom; break;
72
- };
73
- };
74
-
75
- var x_axis = new Rickshaw.Graph.Axis.Time( {
76
- graph: graph,
77
- timeUnit: timeUnit("<%= params[:time] %>")
78
- } );
79
-
80
- var y_axis = new Rickshaw.Graph.Axis.Y( {
81
- graph: graph,
82
- orientation: 'left',
83
- tickFormat: Rickshaw.Fixtures.Number.formatKMBT,
84
- element: document.getElementById('y-axis-<%= params[:time] %>'),
85
- } );
86
-
87
- graph.render();
88
-
89
- var hoverDetail = new Rickshaw.Graph.HoverDetail( {
90
- graph: graph
91
- } );
92
-
93
- </script>
File without changes
@@ -1,138 +0,0 @@
1
- <html lang="en">
2
- <head>
3
- <meta charset="utf-8">
4
- <title>SimpleMetrics</title>
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <meta name="description" content="">
7
- <meta name="author" content="">
8
-
9
- <link rel='stylesheet' href='/css/bootstrap.min.css' type='text/css' media="screen, projection">
10
- <link rel='stylesheet' href='/css/bootstrap-responsive.min.css' type='text/css' media="screen, projection">
11
- <link rel='stylesheet' href='/css/rickshaw.min.css' type='text/css' media="screen, projection">
12
- <link rel='stylesheet' href='/css/graph.css' type='text/css' media="screen, projection">
13
-
14
- <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
15
- <!--[if lt IE 9]>
16
- <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
17
- <![endif]-->
18
-
19
- <style type="text/css">
20
- body {
21
- padding-top: 60px; /* 60px to make the container go all the way to the bottom of the topbar */
22
- }
23
- </style>
24
-
25
- <script id="graph" type="text/x-handlebars.template">
26
- <h3>{{time}}</h3></br>
27
- <div class="graph"/>
28
- <div class="y-axis"/>
29
- </script>
30
-
31
- <script id="metric-list" type="text/x-handlebars-template">
32
- <ul class="breadcrumb">
33
- <li>
34
- <a href="#metrics">Metrics</a> <span class="divider">/</span>
35
- </li>
36
- <li class="active">{{name}}</li>
37
- </ul>
38
-
39
- <table class="table table-striped" style="font-size: 13px">
40
- <thead>
41
- <tr>
42
- <th>Name</th>
43
- <th>Total</th>
44
- <th>Last Modified</th>
45
- <th>Created At</th>
46
- </tr>
47
- </thead>
48
- <tbody>
49
- {{#each metrics}}
50
- <tr>
51
- <td><a href="#metrics/{{name}}">{{name}}</a></td>
52
- <td>{{total}}</td>
53
- <td>{{dateFormat updated_at}}</td>
54
- <td>{{dateFormat created_at}}</td>
55
- </tr>
56
- {{/each}}
57
- </tbody>
58
- </table>
59
- </script>
60
-
61
- <script id="metric-details" type="text/x-handlebars-template">
62
- {{#with metric}}
63
- <ul class="breadcrumb">
64
- <li>
65
- <a href="#metrics">Metrics</a> <span class="divider">/</span>
66
- </li>
67
- <li class="active">{{name}}</li>
68
- </ul>
69
-
70
- <div class="row-fluid">
71
- <div class="span12">
72
- <div style="margin-bottom:2em" class="row-fluid">
73
- <div id="graph-container-minute" class="span6"></div>
74
- <div id="graph-container-hour" class="span6"></div>
75
- </div>
76
- <div class="row-fluid">
77
- <div id="graph-container-day" class="span6"></div>
78
- <div id="graph-container-week" class="span6"></div>
79
- </div>
80
- </div>
81
- </div>
82
-
83
- {{/with}}
84
- </script>
85
-
86
- </head>
87
-
88
- <body>
89
- <div class="navbar navbar-fixed-top">
90
- <div class="navbar-inner">
91
- <div class="container">
92
- <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
93
- <span class="icon-bar"></span>
94
- <span class="icon-bar"></span>
95
- <span class="icon-bar"></span>
96
- </a>
97
- <a class="brand" href="/">SimpleMetrics</a>
98
- <div class="nav-collapse">
99
- <ul class="nav">
100
- <li class="active"><a href="/">Metrics</a></li>
101
- <li><a href="/dashboard">Dashboards</a></li>
102
- <li><a href="/about">About</a></li>
103
- </ul>
104
- </div><!--/.nav-collapse -->
105
- </div>
106
- </div>
107
- </div>
108
-
109
- <div class="container">
110
- <div id="main"></div>
111
- </div> <!-- /container -->
112
-
113
- <script src="js/lib/jquery-1.7.1.min.js" type="text/javascript"></script>
114
- <script src="js/lib/bootstrap.min.js" type="text/javascript"></script>
115
- <script src="js/lib/underscore-1.3.1.min.js" type="text/javascript"></script>
116
- <script src="js/lib/backbone-0.9.2.min.js" type="text/javascript"></script>
117
- <script src="js/lib/handlebars-1.0.0.beta.6.js" type="text/javascript"></script>
118
- <script src="js/lib/d3.v2.min.js" type="text/javascript"></script>
119
- <script src="js/lib/rickshaw.min.js" type="text/javascript"></script>
120
- <script src="js/lib/moment.min.js" type="text/javascript"></script>
121
-
122
- <script src="js/app.js" type="text/javascript"></script>
123
- <script src="js/router.js" type="text/javascript"></script>
124
- <script src="js/helpers.js" type="text/javascript"></script>
125
-
126
- <script src="js/models/metric.js" type="text/javascript"></script>
127
- <script src="js/models/graph.js" type="text/javascript"></script>
128
-
129
- <script src="js/collections/metric.js" type="text/javascript"></script>
130
- <script src="js/collections/graph.js" type="text/javascript"></script>
131
-
132
- <script src="js/views/app.js" type="text/javascript"></script>
133
- <script src="js/views/metric.js" type="text/javascript"></script>
134
- <script src="js/views/metrics.js" type="text/javascript"></script>
135
- <script src="js/views/graph.js" type="text/javascript"></script>
136
-
137
- </body>
138
- </html>
@@ -1,31 +0,0 @@
1
-
2
- <ul class="breadcrumb">
3
- <li>
4
- <a href="/">Available Metrics</a> <span class="divider">/</span>
5
- </li>
6
- <li class="active"><%= params[:target].join(', ') %></li>
7
- </ul>
8
-
9
- <div class="row-fluid">
10
- <div class="span12">
11
- <div style="margin-bottom:2em" class="row-fluid">
12
- <div id="graph-container-minute" class="span6"></div>
13
- <div id="graph-container-hour" class="span6"></div>
14
- </div>
15
- <div class="row-fluid">
16
- <div id="graph-container-day" class="span6"></div>
17
- <div id="graph-container-week" class="span6"></div>
18
- </div>
19
- </div>
20
- </div>
21
-
22
- <script>
23
-
24
- $(function() {
25
- $("#graph-container-minute").load("/graph?target[]=<%= params[:target].first %>&time=minute");
26
- $("#graph-container-hour").load("/graph?target[]=<%= params[:target].first %>&time=hour");
27
- $("#graph-container-day").load("/graph?target[]=<%= params[:target].first %>&time=day");
28
- $("#graph-container-week").load("/graph?target[]=<%= params[:target].first %>&time=week");
29
- });
30
-
31
- </script>
@@ -1,77 +0,0 @@
1
- # encoding: utf-8
2
- require "spec_helper"
3
-
4
- module SimpleMetrics
5
-
6
- describe DataPointRepository do
7
-
8
- before do
9
- DataPointRepository.truncate_collections
10
- DataPointRepository.ensure_collections_exist
11
- end
12
-
13
- let(:ts) do
14
- Time.now.utc.to_i
15
- end
16
-
17
- let(:repository) do
18
- DataPointRepository.for_retention('stats_per_10s')
19
- end
20
-
21
- describe "#save" do
22
- it "saves data point correctly" do
23
- dp = DataPoint::Counter.new(:name => "key", :ts => ts)
24
- repository.save(dp)
25
-
26
- results = repository.find_all_at_ts(ts)
27
- results.should have(1).data_point
28
- end
29
- end
30
-
31
- describe "#find_all_at_ts" do
32
- it "returns all data points at given time stamp" do
33
- dp1 = DataPoint::Counter.new(:name => "key1", :ts => ts)
34
- dp2 = DataPoint::Counter.new(:name => "key1", :ts => ts + 10)
35
- repository.save(dp1)
36
- repository.save(dp2)
37
-
38
- results = repository.find_all_at_ts(ts)
39
- results.should have(1).data_point
40
- results.first.name.should == "key1"
41
- end
42
- end
43
-
44
- describe "#find_all_in_ts_range_by_name" do
45
- it "returns all data points in given time stamp range by name" do
46
- dp1 = DataPoint::Counter.new(:name => "key1", :ts => ts)
47
- dp2 = DataPoint::Counter.new(:name => "key2", :ts => ts + 10)
48
- dp3 = DataPoint::Counter.new(:name => "key3", :ts => ts + 20)
49
- repository.save(dp1)
50
- repository.save(dp2)
51
- repository.save(dp3)
52
-
53
- results = repository.find_all_in_ts_range_by_name(ts, ts+10, "key1")
54
- results.should have(1).data_point
55
- results.first.name.should == "key1"
56
- end
57
- end
58
-
59
- describe "#find_all_in_ts_range_by_wildcard" do
60
- it "returns all data points in given time stamp range by wildcard" do
61
- dp1 = DataPoint::Counter.new(:name => "test.key1", :ts => ts)
62
- dp2 = DataPoint::Counter.new(:name => "test.key2", :ts => ts + 10)
63
- dp3 = DataPoint::Counter.new(:name => "test.key3", :ts => ts + 20)
64
- repository.save(dp1)
65
- repository.save(dp2)
66
- repository.save(dp3)
67
-
68
- results = repository.find_all_in_ts_range_by_wildcard(ts, ts+10, "test.*")
69
- results.should have(2).data_point2
70
- results.first.name.should == "test.key1"
71
- results.last.name.should == "test.key2"
72
- end
73
- end
74
-
75
- end
76
-
77
- end
@@ -1,126 +0,0 @@
1
- # encoding: utf-8
2
- require "spec_helper"
3
-
4
- module SimpleMetrics
5
-
6
- describe Importer do
7
-
8
- let(:bucket) do
9
- Bucket.first
10
- end
11
-
12
- let(:ts) do
13
- Time.now.utc.to_i
14
- end
15
-
16
- describe "#aggregate_coarse_buckets" do
17
- before do
18
- DataPointRepository.truncate_collections
19
- DataPointRepository.ensure_collections_exist
20
- end
21
-
22
- it "aggregates all counter data points" do
23
- stats1a = DataPoint::Counter.new(:name => "key1", :value => 5)
24
- stats1b = DataPoint::Counter.new(:name => "key1", :value => 7)
25
- stats2 = DataPoint::Counter.new(:name => "key2", :value => 3)
26
-
27
- bucket2 = Bucket[1]
28
- ts_at_insert = bucket2.previous_ts_bucket(ts)
29
- bucket.save(stats1a, ts_at_insert)
30
- Importer.aggregate_coarse_buckets(stats1a)
31
- bucket.save(stats1b, ts_at_insert)
32
- Importer.aggregate_coarse_buckets(stats1b)
33
- bucket.save(stats2, ts_at_insert)
34
- Importer.aggregate_coarse_buckets(stats2)
35
-
36
- results = bucket2.find_all_at_ts(ts_at_insert)
37
- results.should have(2).items
38
-
39
- key1_result = results.find {|stat| stat.name == "key1"}
40
- key1_result.value.should == 12
41
- key1_result.should be_counter
42
-
43
- key2_result = results.find {|stat| stat.name == "key2"}
44
- key2_result.value.should == 3
45
- key2_result.should be_counter
46
- end
47
-
48
- it "aggregates all gauge data points" do
49
- stats1a = DataPoint::Gauge.new(:name => "key1", :value => 5)
50
- stats1b = DataPoint::Gauge.new(:name => "key1", :value => 7)
51
- stats2 = DataPoint::Gauge.new(:name => "key2", :value => 3)
52
-
53
- bucket2 = Bucket[1]
54
- ts_at_insert = bucket2.previous_ts_bucket(ts)
55
- bucket.save(stats1a, ts_at_insert)
56
- Importer.aggregate_coarse_buckets(stats1a)
57
- bucket.save(stats1b, ts_at_insert)
58
- Importer.aggregate_coarse_buckets(stats1b)
59
- bucket.save(stats2, ts_at_insert)
60
- Importer.aggregate_coarse_buckets(stats2)
61
-
62
- results = bucket2.find_all_at_ts(ts_at_insert)
63
- results.should have(2).items
64
-
65
- key1_result = results.find {|stat| stat.name == "key1"}
66
- key1_result.value.should == 6
67
- key1_result.should be_gauge
68
-
69
- key2_result = results.find {|stat| stat.name == "key2"}
70
- key2_result.value.should == 3
71
- key2_result.should be_gauge
72
- end
73
-
74
- end # describe "#aggregate_all"
75
-
76
- describe "#flush_data_points" do
77
- before do
78
- DataPointRepository.truncate_collections
79
- DataPointRepository.ensure_collections_exist
80
- MetricRepository.truncate_collections
81
-
82
- stats1 = DataPoint::Counter.new(:name => "key1", :value => 5)
83
- stats2 = DataPoint::Counter.new(:name => "key1", :value => 7)
84
- stats3 = DataPoint::Counter.new(:name => "key2", :value => 3)
85
- @stats = [stats1, stats2, stats3]
86
- end
87
-
88
- it "saves all stats in finest/first bucket" do
89
- Importer.flush_data_points(@stats)
90
-
91
- results = bucket.find_all_at_ts(ts)
92
- results.should have(2).items
93
- end
94
-
95
- it "saves all stats and aggregate if duplicates found" do
96
- Importer.flush_data_points(@stats)
97
-
98
- results = bucket.find_all_at_ts(ts)
99
- results.should have(2).items
100
- results.first.name.should == "key1"
101
- results.last.name.should == "key2"
102
- results.first.value == 12
103
- results.last.value == 3
104
- end
105
-
106
- it "raises error if name matches but type does not" do
107
- stats4 = DataPoint::Gauge.new(:name => "key1", :value => 3)
108
- input = @stats + [stats4]
109
- expect { Importer.flush_data_points(input) }.to raise_error(SimpleMetrics::DataPoint::NonMatchingTypesError)
110
- end
111
-
112
- it "increments metrics counter" do
113
- Importer.flush_data_points(@stats)
114
- key1 = MetricRepository.find_one_by_name("key1")
115
- key1.name.should == "key1"
116
- key1.total.should == 2
117
- key2 = MetricRepository.find_one_by_name("key2")
118
- key2.name.should == "key2"
119
- key2.total.should == 1
120
- end
121
-
122
- end # describe "#flush_data_points"
123
-
124
- end
125
-
126
- end