ezmetrics 1.0.5 → 1.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +31 -3
- data/lib/ezmetrics.rb +3 -1
- data/lib/ezmetrics/benchmark.rb +87 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc9e49c32e99f5d45f45ca6d3d467e53c09b8502
|
4
|
+
data.tar.gz: ce9f340d9f70ddfd7aebbac487e2d1b4b094527f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 295ae4b987d80ec5feb6cbb21e0f5dee0ea6523d140e50840b5637b57c3263f712b5c798eed3c69794fb8618a5236e7f6005a1fee34f4e2f6e8812f97ab636e7
|
7
|
+
data.tar.gz: 8c9523d1385036e83a1eaea18e275c91f2865c391ad60f50a2af76b865843338e1d4408e8f08f037c2af14ba552181f7a82e85be7ea5b7242755f2c4070fb418
|
data/README.md
CHANGED
@@ -15,14 +15,14 @@ gem 'ezmetrics'
|
|
15
15
|
|
16
16
|
### Getting started
|
17
17
|
|
18
|
-
This tool captures and aggregates metrics such as
|
18
|
+
This tool captures and aggregates Rails application metrics such as
|
19
19
|
- `duration`
|
20
20
|
- `views`
|
21
21
|
- `db`
|
22
22
|
- `queries`
|
23
23
|
- `status`
|
24
24
|
|
25
|
-
for
|
25
|
+
and stores them for the timeframe you specified, 60 seconds by default.
|
26
26
|
|
27
27
|
You can change the timeframe according to your needs and save the metrics by calling `log` method:
|
28
28
|
|
@@ -54,7 +54,9 @@ or
|
|
54
54
|
> Please note that you can combine these timeframes, for example - store for 10 minutes, display for 5 minutes.
|
55
55
|
|
56
56
|
|
57
|
-
###
|
57
|
+
### Capture metrics
|
58
|
+
|
59
|
+
Just add an initializer to your application:
|
58
60
|
|
59
61
|
```ruby
|
60
62
|
# config/initializers/ezmetrics.rb
|
@@ -81,6 +83,8 @@ end
|
|
81
83
|
|
82
84
|
### Display metrics
|
83
85
|
|
86
|
+
As simple as:
|
87
|
+
|
84
88
|
```ruby
|
85
89
|
EZmetrics.new.show
|
86
90
|
```
|
@@ -117,3 +121,27 @@ This will return a hash with the following structure:
|
|
117
121
|
}
|
118
122
|
```
|
119
123
|
|
124
|
+
### Performance
|
125
|
+
|
126
|
+
The implementation is based on **Redis** commands such as:
|
127
|
+
|
128
|
+
- [`get`](https://redis.io/commands/get)
|
129
|
+
- [`mget`](https://redis.io/commands/mget)
|
130
|
+
- [`setex`](https://redis.io/commands/setex)
|
131
|
+
|
132
|
+
which are extremely fast.
|
133
|
+
|
134
|
+
You can check the **aggregation** time by running:
|
135
|
+
|
136
|
+
```ruby
|
137
|
+
EZmetrics::Benchmark.new.measure_aggregation
|
138
|
+
```
|
139
|
+
|
140
|
+
The result of running this benchmark on a *2017 Macbook Pro 2.9 GHz Intel Core i7 with 16 GB of RAM*:
|
141
|
+
|
142
|
+
| Interval | Duration (seconds) |
|
143
|
+
|:--------:|:------------------:|
|
144
|
+
| 1 minute | 0.0 |
|
145
|
+
| 1 hour | 0.11 |
|
146
|
+
| 12 hours | 1.6 |
|
147
|
+
| 24 hours | 3.5 |
|
data/lib/ezmetrics.rb
CHANGED
@@ -0,0 +1,87 @@
|
|
1
|
+
require "benchmark"
|
2
|
+
|
3
|
+
class EZmetrics::Benchmark
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@start = Time.now.to_i
|
7
|
+
@redis = Redis.new
|
8
|
+
@durations = []
|
9
|
+
@iterations = 3
|
10
|
+
@intervals = {
|
11
|
+
"1.minute" => 60,
|
12
|
+
"1.hour " => 3600,
|
13
|
+
"12.hours" => 43200,
|
14
|
+
"24.hours" => 86400
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
def measure_aggregation
|
19
|
+
write_metrics
|
20
|
+
print_header
|
21
|
+
intervals.each do |interval, seconds|
|
22
|
+
result = measure_aggregation_time(interval, seconds)
|
23
|
+
print_row(result)
|
24
|
+
end
|
25
|
+
cleanup_metrics
|
26
|
+
print_footer
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
attr_reader :start, :redis, :durations, :intervals, :iterations
|
32
|
+
|
33
|
+
def write_metrics
|
34
|
+
seconds = intervals.values.max
|
35
|
+
seconds.times do |i|
|
36
|
+
second = start - i
|
37
|
+
payload = {
|
38
|
+
"duration_sum" => rand(10000),
|
39
|
+
"duration_max" => rand(10000),
|
40
|
+
"views_sum" => rand(1000),
|
41
|
+
"views_max" => rand(1000),
|
42
|
+
"db_sum" => rand(8000),
|
43
|
+
"db_max" => rand(8000),
|
44
|
+
"queries_sum" => rand(100),
|
45
|
+
"queries_max" => rand(100),
|
46
|
+
"statuses" => {
|
47
|
+
"2xx" => rand(10),
|
48
|
+
"3xx" => rand(10),
|
49
|
+
"4xx" => rand(10),
|
50
|
+
"5xx" => rand(10),
|
51
|
+
"all" => rand(40)
|
52
|
+
}
|
53
|
+
}
|
54
|
+
redis.setex("ez-metrics:#{second}", seconds, JSON.generate(payload))
|
55
|
+
end
|
56
|
+
nil
|
57
|
+
end
|
58
|
+
|
59
|
+
def cleanup_metrics
|
60
|
+
interval_start = Time.now.to_i - intervals.values.max - 100
|
61
|
+
interval_keys = (interval_start..Time.now.to_i).to_a.map { |second| "ez-metrics:#{second}" }
|
62
|
+
redis.del(interval_keys)
|
63
|
+
end
|
64
|
+
|
65
|
+
def measure_aggregation_time(interval, seconds)
|
66
|
+
iterations.times do
|
67
|
+
durations << ::Benchmark.measure { EZmetrics.new(seconds).show }.real
|
68
|
+
end
|
69
|
+
|
70
|
+
return {
|
71
|
+
interval: interval.gsub(".", " "),
|
72
|
+
duration: (durations.sum.to_f / iterations).round(2)
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
def print_header
|
77
|
+
print "\n#{'─'*31}\n| Interval | Duration (seconds)\n#{'─'*31}\n"
|
78
|
+
end
|
79
|
+
|
80
|
+
def print_row(result)
|
81
|
+
print "| #{result[:interval]} | #{result[:duration]}\n"
|
82
|
+
end
|
83
|
+
|
84
|
+
def print_footer
|
85
|
+
print "#{'─'*31}\n"
|
86
|
+
end
|
87
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ezmetrics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicolae Rotaru
|
@@ -47,6 +47,7 @@ files:
|
|
47
47
|
- LICENSE
|
48
48
|
- README.md
|
49
49
|
- lib/ezmetrics.rb
|
50
|
+
- lib/ezmetrics/benchmark.rb
|
50
51
|
homepage: https://github.com/nyku/ezmetrics
|
51
52
|
licenses:
|
52
53
|
- GPL-3.0
|