ezmetrics 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/ezmetrics.rb +125 -0
- metadata +58 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3b6dbad44e0873269406e9c3abb0975e9fef8e1c
|
4
|
+
data.tar.gz: e1d628af71aabf144c0d5dc0d6b6eea5b07b9d4f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ea43f5239df28ab4a6555f3e00ec6fece84dcd5ef4b2e336ae72b9a0638637a0c89d0da739d56547572b2a80c70f908d88dd49710c2e061cf4cc993511f7f9de
|
7
|
+
data.tar.gz: 5a2f04f15cf17e0c214e4da755424dbda834e094bbe42820dc94a85261334b5c8c3a8b2821695d14a075518472039cfbfaa5e23545a0bfb717edda5fb48e12b5
|
data/lib/ezmetrics.rb
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
require "redis" unless defined?(Redis)
|
2
|
+
|
3
|
+
class EZmetrics
|
4
|
+
attr_reader :redis, :last_minute_metrics, :requests, :redis_key
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@redis = Redis.new
|
8
|
+
@redis_key = "ez-metrics"
|
9
|
+
end
|
10
|
+
|
11
|
+
def log(payload)
|
12
|
+
payload = {
|
13
|
+
db: payload[:db].to_f,
|
14
|
+
queries: payload[:queries].to_i,
|
15
|
+
duration: payload[:duration].to_f,
|
16
|
+
status: payload[:status].to_i
|
17
|
+
}
|
18
|
+
|
19
|
+
current_second = Time.now.sec
|
20
|
+
status_group = "#{payload[:status].to_s[0]}xx"
|
21
|
+
this_second_metrics = redis.get("#{redis_key}:#{current_second}")
|
22
|
+
|
23
|
+
if this_second_metrics
|
24
|
+
this_second_metrics = JSON.parse(this_second_metrics)
|
25
|
+
this_second_metrics["db_sum"] += payload[:db]
|
26
|
+
this_second_metrics["queries_sum"] += payload[:queries]
|
27
|
+
this_second_metrics["duration_sum"] += payload[:duration]
|
28
|
+
this_second_metrics["statuses"]["all"] += 1
|
29
|
+
this_second_metrics["statuses"][status_group] += 1
|
30
|
+
this_second_metrics["db_max"] = [payload[:db], this_second_metrics["db_max"]].max
|
31
|
+
this_second_metrics["queries_max"] = [payload[:queries], this_second_metrics["queries_max"]].max
|
32
|
+
this_second_metrics["duration_max"] = [payload[:duration], this_second_metrics["duration_max"]].max
|
33
|
+
else
|
34
|
+
this_second_metrics = {
|
35
|
+
"db_sum" => payload[:db],
|
36
|
+
"db_max" => payload[:db],
|
37
|
+
"queries_sum" => payload[:queries],
|
38
|
+
"queries_max" => payload[:queries],
|
39
|
+
"duration_sum" => payload[:duration],
|
40
|
+
"duration_max" => payload[:duration],
|
41
|
+
"statuses" => { "2xx" => 0, "3xx" => 0, "4xx" => 0, "5xx" => 0, "all" => 1 }
|
42
|
+
}
|
43
|
+
|
44
|
+
this_second_metrics["statuses"][status_group] = 1
|
45
|
+
end
|
46
|
+
|
47
|
+
redis.setex("#{redis_key}:#{current_second}", 59, this_second_metrics.to_json)
|
48
|
+
rescue => error
|
49
|
+
display_error(error)
|
50
|
+
end
|
51
|
+
|
52
|
+
def show
|
53
|
+
@last_minute_metrics = redis.mget((0..59).to_a.map { |second| "#{redis_key}:#{second}" }).compact.map { |m| JSON.parse(m) }
|
54
|
+
|
55
|
+
return empty_metrics unless last_minute_metrics.any?
|
56
|
+
|
57
|
+
@requests = last_minute_metrics.map { |h| h["statuses"]["all"] }.compact.sum
|
58
|
+
|
59
|
+
{
|
60
|
+
duration: {
|
61
|
+
avg: avg(:duration_sum),
|
62
|
+
max: max(:duration_max)
|
63
|
+
},
|
64
|
+
db: {
|
65
|
+
avg: avg(:db_sum),
|
66
|
+
max: max(:db_max)
|
67
|
+
},
|
68
|
+
queries: {
|
69
|
+
avg: avg(:queries_sum),
|
70
|
+
max: max(:queries_max)
|
71
|
+
},
|
72
|
+
requests: {
|
73
|
+
all: requests,
|
74
|
+
grouped: {
|
75
|
+
"2xx" => count("2xx"),
|
76
|
+
"3xx" => count("3xx"),
|
77
|
+
"4xx" => count("4xx"),
|
78
|
+
"5xx" => count("5xx")
|
79
|
+
}
|
80
|
+
}
|
81
|
+
}
|
82
|
+
rescue
|
83
|
+
empty_metrics
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
def avg(metrics)
|
89
|
+
(last_minute_metrics.map { |h| h[metrics.to_s] }.sum.to_f / requests).round
|
90
|
+
end
|
91
|
+
|
92
|
+
def max(metrics)
|
93
|
+
last_minute_metrics.map { |h| h[metrics.to_s] }.max.round
|
94
|
+
end
|
95
|
+
|
96
|
+
def count(group)
|
97
|
+
last_minute_metrics.map { |h| h["statuses"][group.to_s] }.sum
|
98
|
+
end
|
99
|
+
|
100
|
+
def display_error(error)
|
101
|
+
{
|
102
|
+
error: error.class.name,
|
103
|
+
message: error.message,
|
104
|
+
backtrace: error.backtrace.reject { |line| line.match(/ruby|gems/) }
|
105
|
+
}
|
106
|
+
end
|
107
|
+
|
108
|
+
def empty_metrics
|
109
|
+
{
|
110
|
+
duration: {
|
111
|
+
avg: 0,
|
112
|
+
max: 0
|
113
|
+
},
|
114
|
+
db: {
|
115
|
+
avg: 0,
|
116
|
+
max: 0
|
117
|
+
},
|
118
|
+
queries: {
|
119
|
+
avg: 0,
|
120
|
+
max: 0
|
121
|
+
},
|
122
|
+
requests: {}
|
123
|
+
}
|
124
|
+
end
|
125
|
+
end
|
metadata
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ezmetrics
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.4
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nicolae Rotaru
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-11-22 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: redis
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.0'
|
27
|
+
description: A simple tool for capturing and displaying Rails metrics.
|
28
|
+
email: nyku.rn@gmail.com
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- lib/ezmetrics.rb
|
34
|
+
homepage: https://github.com/nyku/ezmetrics
|
35
|
+
licenses:
|
36
|
+
- GPL-3.0
|
37
|
+
metadata: {}
|
38
|
+
post_install_message:
|
39
|
+
rdoc_options: []
|
40
|
+
require_paths:
|
41
|
+
- lib
|
42
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
requirements: []
|
53
|
+
rubyforge_project:
|
54
|
+
rubygems_version: 2.6.13
|
55
|
+
signing_key:
|
56
|
+
specification_version: 4
|
57
|
+
summary: Rails metrics aggregation tool.
|
58
|
+
test_files: []
|