ezmetrics 0.0.4

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.
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: []