ezmetrics 1.2.1 → 1.2.2
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 +64 -23
- data/lib/ezmetrics.rb +28 -5
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 408332cfc86d05b75d8b6004098d736ad60a624189f46022af822fdf6c24960d
|
4
|
+
data.tar.gz: 6d4ef89fa6a80e28cb443e16f1528b351a93bf7bf50e2a8fc756dc943a25f11f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 99a4ac48560305d2967cdcc8b248978ee3f0748ab1fb7da2830a3804d732d29664f25bfdc4bd2bfa50c449994913ecd455362f57af1f39f0f45e904e36876c12
|
7
|
+
data.tar.gz: c53617fbc324765b9b388b1280b6d363a3707b002a2718cd0467a16ff24708a8adbf81a812aca111a643924de4834a155efdef252911195570837fdb8f6a9dce
|
data/README.md
CHANGED
@@ -27,25 +27,25 @@ and stores them for the timeframe you specified, 60 seconds by default.
|
|
27
27
|
You can change the timeframe according to your needs and save the metrics by calling `log` method:
|
28
28
|
|
29
29
|
```ruby
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
30
|
+
# Store the metrics for 60 seconds (default behaviour)
|
31
|
+
EZmetrics.new.log(
|
32
|
+
duration: 100.5,
|
33
|
+
views: 40.7,
|
34
|
+
db: 59.8,
|
35
|
+
queries: 4,
|
36
|
+
status: 200
|
37
|
+
)
|
38
38
|
```
|
39
39
|
|
40
40
|
```ruby
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
41
|
+
# Store the metrics for 10 minutes
|
42
|
+
EZmetrics.new(10.minutes).log(
|
43
|
+
duration: 100.5,
|
44
|
+
views: 40.7,
|
45
|
+
db: 59.8,
|
46
|
+
queries: 4,
|
47
|
+
status: 200
|
48
|
+
)
|
49
49
|
```
|
50
50
|
|
51
51
|
---
|
@@ -53,13 +53,13 @@ You can change the timeframe according to your needs and save the metrics by cal
|
|
53
53
|
For displaying metrics you need to call `show` method:
|
54
54
|
|
55
55
|
```ruby
|
56
|
-
|
57
|
-
|
56
|
+
# Aggregate and show metrics for last 60 seconds (default behaviour)
|
57
|
+
EZmetrics.new.show
|
58
58
|
```
|
59
59
|
|
60
60
|
```ruby
|
61
|
-
|
62
|
-
|
61
|
+
# Aggregate and show metrics for last 10 minutes
|
62
|
+
EZmetrics.new(10.minutes).show
|
63
63
|
```
|
64
64
|
|
65
65
|
You can combine these timeframes, for example - store for 10 minutes, display for 5 minutes.
|
@@ -131,6 +131,47 @@ This will return a hash with the following structure:
|
|
131
131
|
}
|
132
132
|
```
|
133
133
|
|
134
|
+
---
|
135
|
+
|
136
|
+
If you prefer a single level object - you can change the default output structure by calling `.flatten` before `.show`
|
137
|
+
|
138
|
+
```ruby
|
139
|
+
EZmetrics.new(1.hour).flatten.show(db: :avg, duration: [:avg, :max])
|
140
|
+
```
|
141
|
+
|
142
|
+
```ruby
|
143
|
+
{
|
144
|
+
db_avg: 182,
|
145
|
+
duration_avg: 205,
|
146
|
+
duration_max: 5171
|
147
|
+
}
|
148
|
+
```
|
149
|
+
|
150
|
+
---
|
151
|
+
|
152
|
+
Same for [partitioned aggregation](#partitioning)
|
153
|
+
|
154
|
+
```ruby
|
155
|
+
EZmetrics.new(1.hour).partition_by(:minute).flatten.show(db: :avg, duration: [:avg, :max])
|
156
|
+
```
|
157
|
+
|
158
|
+
```ruby
|
159
|
+
[
|
160
|
+
{
|
161
|
+
timestamp: 1575242880,
|
162
|
+
db_avg: 387,
|
163
|
+
duration_avg: 477,
|
164
|
+
duration_max: 8566
|
165
|
+
},
|
166
|
+
{
|
167
|
+
timestamp: 1575242940,
|
168
|
+
db_avg: 123,
|
169
|
+
duration_avg: 234,
|
170
|
+
duration_max: 3675
|
171
|
+
}
|
172
|
+
]
|
173
|
+
```
|
174
|
+
|
134
175
|
### Aggregation
|
135
176
|
|
136
177
|
The aggregation can be easily configured by specifying aggregation options as in the following examples:
|
@@ -221,11 +262,11 @@ EZmetrics.new.show(views: :avg, :db: [:avg, :max], requests: true)
|
|
221
262
|
|
222
263
|
If you want to visualize your metrics by using a **line chart**, you will need to use partitioning.
|
223
264
|
|
224
|
-
To aggregate metrics, partitioned by a unit of time you need to call
|
265
|
+
To aggregate metrics, partitioned by a unit of time you need to call `.partition_by({time_unit})` before calling `.show`
|
225
266
|
|
226
267
|
```ruby
|
227
|
-
|
228
|
-
|
268
|
+
# Aggregate metrics for last hour, partition by minute
|
269
|
+
EZmetrics.new(1.hour).partition_by(:minute).show(duration: [:avg, :max], db: :avg)
|
229
270
|
```
|
230
271
|
|
231
272
|
This will return an array of objects with the following structure:
|
data/lib/ezmetrics.rb
CHANGED
@@ -63,6 +63,11 @@ class EZmetrics
|
|
63
63
|
partitioned_metrics ? aggregate_partitioned_data : aggregate_data
|
64
64
|
end
|
65
65
|
|
66
|
+
def flatten
|
67
|
+
@flat = true
|
68
|
+
self
|
69
|
+
end
|
70
|
+
|
66
71
|
def partition_by(time_unit=:minute)
|
67
72
|
time_unit = PARTITION_UNITS.include?(time_unit) ? time_unit : :minute
|
68
73
|
@partitioned_metrics = interval_metrics.group_by { |h| second_to_partition_unit(time_unit, h["second"]) }
|
@@ -71,7 +76,7 @@ class EZmetrics
|
|
71
76
|
|
72
77
|
private
|
73
78
|
|
74
|
-
attr_reader :redis, :interval_seconds, :interval_metrics, :requests,
|
79
|
+
attr_reader :redis, :interval_seconds, :interval_metrics, :requests, :flat,
|
75
80
|
:storage_key, :safe_payload, :this_second_metrics, :partitioned_metrics, :options
|
76
81
|
|
77
82
|
def aggregate_data
|
@@ -86,7 +91,7 @@ class EZmetrics
|
|
86
91
|
partitioned_metrics.map do |partition, metrics|
|
87
92
|
@interval_metrics = metrics
|
88
93
|
@requests = interval_metrics.sum { |hash| hash["statuses"]["all"] }
|
89
|
-
{ timestamp: partition, data: build_result }
|
94
|
+
flat ? { timestamp: partition, **build_result } : { timestamp: partition, data: build_result }
|
90
95
|
end
|
91
96
|
rescue
|
92
97
|
new(options)
|
@@ -95,7 +100,9 @@ class EZmetrics
|
|
95
100
|
def build_result
|
96
101
|
result = {}
|
97
102
|
|
98
|
-
|
103
|
+
if options[:requests]
|
104
|
+
append_requests_to_result(result, { all: requests, grouped: count_all_status_groups })
|
105
|
+
end
|
99
106
|
|
100
107
|
options.each do |metrics, aggregation_functions|
|
101
108
|
next unless METRICS.include?(metrics)
|
@@ -103,8 +110,8 @@ class EZmetrics
|
|
103
110
|
next unless aggregation_functions.any?
|
104
111
|
|
105
112
|
aggregation_functions.each do |aggregation_function|
|
106
|
-
|
107
|
-
result
|
113
|
+
aggregated_metrics = aggregate(metrics, aggregation_function)
|
114
|
+
append_metrics_to_result(result, metrics, aggregation_function, aggregated_metrics)
|
108
115
|
end
|
109
116
|
end
|
110
117
|
result
|
@@ -112,6 +119,22 @@ class EZmetrics
|
|
112
119
|
result
|
113
120
|
end
|
114
121
|
|
122
|
+
def append_requests_to_result(result, aggregated_requests)
|
123
|
+
return result[:requests] = aggregated_requests unless flat
|
124
|
+
|
125
|
+
result[:requests_all] = aggregated_requests[:all]
|
126
|
+
aggregated_requests[:grouped].each do |group, counter|
|
127
|
+
result[:"requests_#{group}"] = counter
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def append_metrics_to_result(result, metrics, aggregation_function, aggregated_metrics)
|
132
|
+
return result[:"#{metrics}_#{aggregation_function}"] = aggregated_metrics if flat
|
133
|
+
|
134
|
+
result[metrics] ||= {}
|
135
|
+
result[metrics][aggregation_function] = aggregated_metrics
|
136
|
+
end
|
137
|
+
|
115
138
|
def second_to_partition_unit(time_unit, second)
|
116
139
|
return second if time_unit == :second
|
117
140
|
time = Time.at(second)
|