ezmetrics 1.0.5 → 1.0.6
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.
- 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
|