ezmetrics 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/ezmetrics.rb +125 -0
  3. 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: []