slimy 0.0.3 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +14 -1
- data/.travis.yml +4 -0
- data/CHANGELOG.md +8 -0
- data/Gemfile +0 -1
- data/Gemfile.lock +42 -3
- data/Guardfile +8 -0
- data/Rakefile +8 -7
- data/lib/slimy.rb +4 -2
- data/lib/slimy/config.rb +4 -3
- data/lib/slimy/context.rb +18 -13
- data/lib/slimy/rack.rb +8 -3
- data/lib/slimy/rack/middleware.rb +37 -24
- data/lib/slimy/rails.rb +8 -3
- data/lib/slimy/rails/sli_concern.rb +51 -37
- data/lib/slimy/reporters.rb +9 -4
- data/lib/slimy/reporters/datadog.rb +30 -17
- data/lib/slimy/reporters/rails_log_reporter.rb +16 -11
- data/lib/slimy/reporters/reporter.rb +11 -6
- data/lib/slimy/version.rb +4 -2
- data/slimy.gemspec +8 -5
- data/test/slimy/context_test.rb +5 -4
- data/test/slimy/rack_middleware_test.rb +71 -0
- data/test/test_helper.rb +6 -5
- metadata +47 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 162b8ea4228cdc927a683c3ddaaa17e5795f7b48b1c895d5aa2648d3496173d2
|
4
|
+
data.tar.gz: 820932ee306a3d5dad370d446b7bf81b45fd4e1a8d42cb86130e1bddbf373c49
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 52fe4d288cf644d54308f4dd9286ec21e79c41498258f874a7b5a19afac025fae4f89c16692e2cae8e5b26706c180f42ab0b0e0a2126b7118e31434a2e79b916
|
7
|
+
data.tar.gz: 35ce82e426ea6d87d5e21eb4cc38cfc4f39778b7eb0c6232fada3d40fe2be488de510fc0262ffbca0820e6a1c35de236e0f18f1ec6e7796abbe94e65108060e4
|
data/.rubocop.yml
CHANGED
@@ -5,4 +5,17 @@ AllCops:
|
|
5
5
|
|
6
6
|
Style/StringLiterals:
|
7
7
|
Enabled: true
|
8
|
-
EnforcedStyle: double_quotes
|
8
|
+
EnforcedStyle: double_quotes
|
9
|
+
|
10
|
+
Style/ClassVars:
|
11
|
+
Enabled: false
|
12
|
+
|
13
|
+
# Configuration parameters: CountComments.
|
14
|
+
Metrics/MethodLength:
|
15
|
+
Max: 20
|
16
|
+
Severity: refactor
|
17
|
+
|
18
|
+
Metrics/BlockLength:
|
19
|
+
Enabled: true
|
20
|
+
CountComments: false
|
21
|
+
Max: 50
|
data/.travis.yml
ADDED
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
slimy (0.0.
|
5
|
-
rack (~> 2.0)
|
4
|
+
slimy (0.0.5)
|
6
5
|
|
7
6
|
GEM
|
8
7
|
remote: https://rubygems.org/
|
@@ -11,19 +10,52 @@ GEM
|
|
11
10
|
ast (2.4.1)
|
12
11
|
builder (3.2.4)
|
13
12
|
bump (0.10.0)
|
13
|
+
coderay (1.1.2)
|
14
|
+
ffi (1.9.25)
|
15
|
+
formatador (0.2.5)
|
16
|
+
guard (2.14.2)
|
17
|
+
formatador (>= 0.2.4)
|
18
|
+
listen (>= 2.7, < 4.0)
|
19
|
+
lumberjack (>= 1.0.12, < 2.0)
|
20
|
+
nenv (~> 0.1)
|
21
|
+
notiffany (~> 0.0)
|
22
|
+
pry (>= 0.9.12)
|
23
|
+
shellany (~> 0.0)
|
24
|
+
thor (>= 0.18.1)
|
25
|
+
guard-compat (1.2.1)
|
26
|
+
guard-minitest (2.4.6)
|
27
|
+
guard-compat (~> 1.2)
|
28
|
+
minitest (>= 3.0)
|
14
29
|
jaro_winkler (1.5.3)
|
30
|
+
listen (3.1.5)
|
31
|
+
rb-fsevent (~> 0.9, >= 0.9.4)
|
32
|
+
rb-inotify (~> 0.9, >= 0.9.7)
|
33
|
+
ruby_dep (~> 1.2)
|
34
|
+
lumberjack (1.0.12)
|
35
|
+
method_source (0.8.2)
|
15
36
|
minitest (5.14.2)
|
16
37
|
minitest-reporters (1.4.2)
|
17
38
|
ansi
|
18
39
|
builder
|
19
40
|
minitest (>= 5.0)
|
20
41
|
ruby-progressbar
|
42
|
+
nenv (0.3.0)
|
43
|
+
notiffany (0.1.1)
|
44
|
+
nenv (~> 0.1)
|
45
|
+
shellany (~> 0.0)
|
21
46
|
parallel (1.18.0)
|
22
47
|
parser (2.6.5.0)
|
23
48
|
ast (~> 2.4.0)
|
49
|
+
pry (0.10.4)
|
50
|
+
coderay (~> 1.1.0)
|
51
|
+
method_source (~> 0.8.1)
|
52
|
+
slop (~> 3.4)
|
24
53
|
rack (2.2.3)
|
25
54
|
rainbow (3.0.0)
|
26
55
|
rake (10.5.0)
|
56
|
+
rb-fsevent (0.10.3)
|
57
|
+
rb-inotify (0.10.0)
|
58
|
+
ffi (~> 1.0)
|
27
59
|
rubocop (0.75.1)
|
28
60
|
jaro_winkler (~> 1.5.1)
|
29
61
|
parallel (~> 1.10)
|
@@ -32,6 +64,10 @@ GEM
|
|
32
64
|
ruby-progressbar (~> 1.7)
|
33
65
|
unicode-display_width (>= 1.4.0, < 1.7)
|
34
66
|
ruby-progressbar (1.10.1)
|
67
|
+
ruby_dep (1.5.0)
|
68
|
+
shellany (0.0.1)
|
69
|
+
slop (3.6.0)
|
70
|
+
thor (0.20.3)
|
35
71
|
timecop (0.9.2)
|
36
72
|
unicode-display_width (1.6.0)
|
37
73
|
|
@@ -41,12 +77,15 @@ PLATFORMS
|
|
41
77
|
DEPENDENCIES
|
42
78
|
bump
|
43
79
|
bundler (>= 1.0, < 3)
|
80
|
+
guard
|
81
|
+
guard-minitest
|
44
82
|
minitest (~> 5.14)
|
45
83
|
minitest-reporters (~> 1.4)
|
84
|
+
rack (~> 2.0)
|
46
85
|
rake (~> 10.4, >= 10.4.2)
|
47
86
|
rubocop
|
48
87
|
slimy!
|
49
88
|
timecop (~> 0.9)
|
50
89
|
|
51
90
|
BUNDLED WITH
|
52
|
-
2.
|
91
|
+
2.1.4
|
data/Guardfile
ADDED
data/Rakefile
CHANGED
@@ -1,17 +1,18 @@
|
|
1
|
-
|
2
|
-
Bundler::GemHelper.install_tasks
|
3
|
-
require 'rake/testtask'
|
4
|
-
require 'bump/tasks'
|
5
|
-
require 'rubocop/rake_task'
|
1
|
+
# frozen_string_literal: true
|
6
2
|
|
3
|
+
require "bundler"
|
4
|
+
Bundler::GemHelper.install_tasks
|
5
|
+
require "rake/testtask"
|
6
|
+
require "bump/tasks"
|
7
|
+
require "rubocop/rake_task"
|
7
8
|
|
8
9
|
RuboCop::RakeTask.new
|
9
10
|
|
10
11
|
Rake::TestTask.new do |t|
|
11
12
|
t.libs << "test"
|
12
13
|
t.libs << "lib"
|
13
|
-
t.test_files = FileList[
|
14
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
14
15
|
end
|
15
16
|
desc "Run tests"
|
16
17
|
|
17
|
-
task default: [
|
18
|
+
task default: %i[test rubocop]
|
data/lib/slimy.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "slimy/version"
|
2
4
|
require "slimy/context"
|
3
5
|
require "slimy/config"
|
@@ -5,7 +7,7 @@ require "slimy/rack"
|
|
5
7
|
require "slimy/rails"
|
6
8
|
require "slimy/reporters"
|
7
9
|
|
8
|
-
|
10
|
+
# Slimy module for SLI Instrumentation
|
9
11
|
module Slimy
|
10
12
|
class << self
|
11
13
|
def configure
|
@@ -16,4 +18,4 @@ module Slimy
|
|
16
18
|
end
|
17
19
|
end
|
18
20
|
end
|
19
|
-
end
|
21
|
+
end
|
data/lib/slimy/config.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Slimy
|
4
|
+
# Class for configration of Slimy tooling
|
2
5
|
class Configuration
|
3
|
-
|
4
6
|
def initialize
|
5
7
|
@reporter = nil
|
6
8
|
end
|
7
9
|
|
8
10
|
attr_accessor :reporter
|
9
11
|
|
10
|
-
|
11
12
|
def self.default
|
12
13
|
@@default ||= Configuration.new
|
13
14
|
end
|
@@ -16,4 +17,4 @@ module Slimy
|
|
16
17
|
yield(self) if block_given?
|
17
18
|
end
|
18
19
|
end
|
19
|
-
end
|
20
|
+
end
|
data/lib/slimy/context.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
+
module Slimy
|
3
4
|
# Slimy::Context
|
4
5
|
#
|
5
|
-
# This is a group of metadata that exists for the duration of some request
|
6
|
-
# as part of an SLI.
|
6
|
+
# This is a group of metadata that exists for the duration of some request
|
7
|
+
# to be measured as part of an SLI.
|
7
8
|
#
|
8
9
|
class Context
|
9
|
-
|
10
10
|
# Create a new context sets the `start_time` to now
|
11
11
|
#
|
12
12
|
# == Parameters
|
13
|
-
# start_time
|
13
|
+
# start_time:
|
14
14
|
# An overriden Time at which the event started. Defaults to now.
|
15
15
|
#
|
16
16
|
# deadline::
|
@@ -28,7 +28,6 @@ module Slimy
|
|
28
28
|
|
29
29
|
attr_reader :start_time, :end_time, :type
|
30
30
|
|
31
|
-
|
32
31
|
attr_accessor :tags, :deadline
|
33
32
|
|
34
33
|
# Set the end_time value for the context if not already set
|
@@ -76,12 +75,14 @@ module Slimy
|
|
76
75
|
# duration in ms of the event
|
77
76
|
def duration
|
78
77
|
return -1 unless finished?
|
79
|
-
|
78
|
+
|
79
|
+
[@end_time - @start_time, 0].max * 1000.0
|
80
80
|
end
|
81
81
|
|
82
82
|
# Did the request finish before the deadline (or was there no deadline)
|
83
83
|
def deadline_success?
|
84
|
-
return true if @deadline.nil? || !
|
84
|
+
return true if @deadline.nil? || !finished?
|
85
|
+
|
85
86
|
duration < @deadline
|
86
87
|
end
|
87
88
|
|
@@ -94,11 +95,15 @@ module Slimy
|
|
94
95
|
@reportable = false
|
95
96
|
end
|
96
97
|
|
97
|
-
# tool for debugging
|
98
|
+
# tool for debugging
|
98
99
|
def debug_format
|
99
|
-
"slimy_ctx:\n\tfinished: #{finished?}\n
|
100
|
+
"slimy_ctx:\n\tfinished: #{finished?}\n" \
|
101
|
+
+ "\tduration: #{duration}\n" \
|
102
|
+
+ "\tresult_success: #{result_success?}\n" \
|
103
|
+
+ "\tduration_success: #{deadline_success?}\n" \
|
104
|
+
+ "\tsuccess: #{success?}\n" \
|
105
|
+
+ "\tdeadline: #{deadline}\n" \
|
106
|
+
+ "\ttags: #{tags.inspect}\n"
|
100
107
|
end
|
101
|
-
|
102
108
|
end
|
103
|
-
|
104
|
-
end
|
109
|
+
end
|
data/lib/slimy/rack.rb
CHANGED
@@ -1,31 +1,44 @@
|
|
1
|
-
|
2
|
-
class SLIMiddleware
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
3
|
+
module Slimy
|
4
|
+
module Rack
|
5
|
+
# rack middleware for tracking http request SLIs
|
6
|
+
class SLIMiddleware
|
7
|
+
MIDDLEWARE_CONTEXT_KEY = "slimy.milddeware.context"
|
5
8
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
9
|
+
def initialize(app, options = {})
|
10
|
+
@app = app
|
11
|
+
@reporter = if options.key? :reporter
|
12
|
+
options[:reporter]
|
13
|
+
else
|
14
|
+
Slimy::Configuration.default.reporter
|
15
|
+
end
|
16
|
+
end
|
10
17
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
begin
|
15
|
-
response = @app.call(env)
|
16
|
-
context.result_error! if response[0] >= 500
|
17
|
-
rescue Exception => error
|
18
|
-
context.result_error!
|
19
|
-
raise error
|
20
|
-
ensure
|
21
|
-
context.finish
|
22
|
-
report(context)
|
23
|
-
return response
|
18
|
+
def init_context(env)
|
19
|
+
context = Slimy::Context.new(deadline: 200, type: "rack")
|
20
|
+
env[MIDDLEWARE_CONTEXT_KEY] = context
|
24
21
|
end
|
25
|
-
end
|
26
22
|
|
27
|
-
|
28
|
-
|
23
|
+
def call(env)
|
24
|
+
context = init_context(env)
|
25
|
+
response = nil
|
26
|
+
begin
|
27
|
+
response = @app.call(env)
|
28
|
+
context.result_error! if response[0] >= 500
|
29
|
+
rescue StandardError => e
|
30
|
+
context.result_error!
|
31
|
+
raise e
|
32
|
+
ensure
|
33
|
+
context.finish
|
34
|
+
report(context)
|
35
|
+
end
|
36
|
+
response
|
37
|
+
end
|
38
|
+
|
39
|
+
def report(context)
|
40
|
+
@reporter&.report(context)
|
41
|
+
end
|
29
42
|
end
|
30
43
|
end
|
31
|
-
end
|
44
|
+
end
|
data/lib/slimy/rails.rb
CHANGED
@@ -1,52 +1,66 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
module Slimy
|
4
|
+
module Rails
|
5
|
+
# SLITools concern
|
6
|
+
#
|
7
|
+
# This module adds Controller helpers for instrumenting SLIs
|
8
|
+
#
|
9
|
+
module SLITools
|
10
|
+
extend ActiveSupport::Concern
|
11
|
+
included do
|
12
|
+
# class-level meta commands
|
13
|
+
def self.sli_tag(tag, value, except: nil, only: nil)
|
14
|
+
before_action only: only, except: except do
|
15
|
+
add_sli_tag(tag, value)
|
16
|
+
end
|
17
|
+
end
|
6
18
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
19
|
+
def self.sli_tags(tags, except: nil, only: nil)
|
20
|
+
before_action only: only, except: except do
|
21
|
+
tags.each_pair do |tag, value|
|
22
|
+
add_sli_tag(tag, value)
|
23
|
+
end
|
24
|
+
end
|
11
25
|
end
|
12
|
-
end
|
13
26
|
|
14
|
-
|
15
|
-
|
16
|
-
|
27
|
+
def self.sli_ignore(except: nil, only: nil)
|
28
|
+
before_action only: only, except: except do
|
29
|
+
add_sli_ignore
|
30
|
+
end
|
17
31
|
end
|
18
|
-
end
|
19
32
|
|
20
|
-
|
21
|
-
|
22
|
-
|
33
|
+
def self.sli_deadline(deadline, except: nil, only: nil)
|
34
|
+
before_action only: only, except: except do
|
35
|
+
add_sli_deadline(deadline)
|
36
|
+
end
|
23
37
|
end
|
24
|
-
end
|
25
38
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
39
|
+
before_action do
|
40
|
+
add_sli_tag("controller", controller_name)
|
41
|
+
add_sli_tag("action", action_name)
|
42
|
+
end
|
30
43
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
44
|
+
# helpers
|
45
|
+
def slimy_context
|
46
|
+
request.env[Slimy::Rack::SLIMiddleware::MIDDLEWARE_CONTEXT_KEY]
|
47
|
+
end
|
35
48
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
49
|
+
def add_sli_tag(tag, value)
|
50
|
+
ctx = slimy_context
|
51
|
+
ctx.tags[tag] = value unless ctx.nil?
|
52
|
+
end
|
40
53
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
54
|
+
def add_sli_ignore
|
55
|
+
ctx = slimy_context
|
56
|
+
ctx&.do_not_report!
|
57
|
+
end
|
45
58
|
|
46
|
-
|
47
|
-
|
48
|
-
|
59
|
+
def add_sli_deadline(deadline)
|
60
|
+
ctx = slimy_context
|
61
|
+
ctx.deadline = deadline unless ctx.nil?
|
62
|
+
end
|
49
63
|
end
|
50
64
|
end
|
51
65
|
end
|
52
|
-
end
|
66
|
+
end
|
data/lib/slimy/reporters.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "slimy/reporters/reporter"
|
2
4
|
|
3
|
-
module Slimy
|
4
|
-
|
5
|
-
|
6
|
-
|
5
|
+
module Slimy
|
6
|
+
# integrations for sending recorded data somewhere for long term storage
|
7
|
+
module Reporters
|
8
|
+
autoload :RailsLogReporter, "slimy/reporters/rails_log_reporter"
|
9
|
+
autoload :DatadogReporter, "slimy/reporters/datadog"
|
10
|
+
end
|
11
|
+
end
|
@@ -1,25 +1,38 @@
|
|
1
|
-
|
2
|
-
class DatadogReporter < BaseReporter
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
module Slimy
|
4
|
+
module Reporters
|
5
|
+
# Reporter for sending data to datadog
|
6
|
+
#
|
7
|
+
# this requires a DogstatsD instance to operate
|
8
|
+
#
|
9
|
+
class DatadogReporter < BaseReporter
|
10
|
+
def initialize(dogstatsd)
|
11
|
+
@dogstatsd = dogstatsd
|
12
|
+
end
|
13
|
+
|
14
|
+
# report the given context to datadog
|
15
|
+
def report(context)
|
16
|
+
return unless context.reportable?
|
7
17
|
|
8
|
-
|
9
|
-
|
18
|
+
sli_status = (context.success? ? "success" : "failure")
|
19
|
+
current_span = Datadog.tracer.active_span
|
20
|
+
if current_span.nil?
|
21
|
+
Rails.logger.debug("COULD NOT FIND SPAN")
|
22
|
+
else
|
23
|
+
set_tags_on_span(context, sli_status)
|
24
|
+
@dogstatsd.increment("sli.#{context.type}.#{sli_status}",
|
25
|
+
tags: context.tags)
|
26
|
+
end
|
27
|
+
end
|
10
28
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
current_span.set_tag('sli_status', sli_status)
|
15
|
-
current_span.set_tag('sli_deadline', context.deadline)
|
29
|
+
def set_tags_on_span(context, sli_status)
|
30
|
+
current_span.set_tag("sli_status", sli_status)
|
31
|
+
current_span.set_tag("sli_deadline", context.deadline)
|
16
32
|
context.tags.each_pair do |key, value|
|
17
|
-
current_span.set_tag(key,value)
|
33
|
+
current_span.set_tag(key, value)
|
18
34
|
end
|
19
|
-
@dogstatsd.increment("sli.#{context.type}.#{sli_status}", tags: context.tags)
|
20
|
-
else
|
21
|
-
Rails.logger.debug("COULD NOT FIND SPAN")
|
22
35
|
end
|
23
36
|
end
|
24
37
|
end
|
25
|
-
end
|
38
|
+
end
|
@@ -1,16 +1,21 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
module Slimy
|
4
|
+
module Reporters
|
5
|
+
# reporter that logs to rails logs
|
6
|
+
# this will not send the data anywhere else
|
7
|
+
class RailsLogReporter
|
8
|
+
def initialize(level: :debug)
|
9
|
+
@level = level
|
10
|
+
end
|
7
11
|
|
8
|
-
|
9
|
-
|
10
|
-
|
12
|
+
def report(context)
|
13
|
+
log(context.debug_format)
|
14
|
+
end
|
11
15
|
|
12
|
-
|
13
|
-
|
16
|
+
def log(msg)
|
17
|
+
Rails.logger.send(@level, msg)
|
18
|
+
end
|
14
19
|
end
|
15
20
|
end
|
16
|
-
end
|
21
|
+
end
|
@@ -1,9 +1,14 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
module Slimy
|
4
|
+
# module for housing integrations that send data somewhere
|
5
|
+
# for storage/analysis
|
6
|
+
module Reporters
|
7
|
+
# This is mostly a template for actualy implementations
|
8
|
+
class BaseReporter
|
9
|
+
def report(_context)
|
10
|
+
raise NotImplementedError
|
11
|
+
end
|
7
12
|
end
|
8
13
|
end
|
9
|
-
end
|
14
|
+
end
|
data/lib/slimy/version.rb
CHANGED
data/slimy.gemspec
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
$LOAD_PATH.push File.expand_path("lib", __dir__)
|
2
4
|
require "slimy/version"
|
3
5
|
|
4
6
|
Gem::Specification.new do |s|
|
@@ -10,19 +12,20 @@ Gem::Specification.new do |s|
|
|
10
12
|
+ "type metrics for Rack, Sidekiq, and maybe more."
|
11
13
|
s.authors = ["Tyler Henrichs", "Stephen Gregory"]
|
12
14
|
s.email = "devops+slimy@lessonly.com"
|
13
|
-
s.homepage = "https://
|
15
|
+
s.homepage = "https://github.com/lessonly/slimy"
|
14
16
|
s.license = "MIT"
|
15
17
|
s.files = `git ls-files`.split("\n")
|
16
18
|
|
17
19
|
s.require_paths = ["lib"]
|
18
20
|
|
19
|
-
s.add_runtime_dependency "rack", "~> 2.0"
|
20
|
-
|
21
21
|
s.add_development_dependency "bump"
|
22
22
|
s.add_development_dependency "bundler", ">= 1.0", "< 3"
|
23
|
+
s.add_development_dependency "guard"
|
24
|
+
s.add_development_dependency "guard-minitest"
|
23
25
|
s.add_development_dependency "minitest", "~> 5.14"
|
24
26
|
s.add_development_dependency "minitest-reporters", "~> 1.4"
|
27
|
+
s.add_development_dependency "rack", "~> 2.0"
|
25
28
|
s.add_development_dependency "rake", "~> 10.4", ">= 10.4.2"
|
26
29
|
s.add_development_dependency "rubocop"
|
27
30
|
s.add_development_dependency "timecop", "~> 0.9"
|
28
|
-
end
|
31
|
+
end
|
data/test/slimy/context_test.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "test_helper"
|
2
4
|
|
3
5
|
class ContextTest < Minitest::Test
|
4
|
-
|
5
6
|
def test_that_context_new_works
|
6
7
|
context = Slimy::Context.new
|
7
8
|
refute_nil context
|
@@ -14,7 +15,8 @@ class ContextTest < Minitest::Test
|
|
14
15
|
freeze_ms(30) do
|
15
16
|
context.finish
|
16
17
|
assert context.finished?
|
17
|
-
refute context.deadline_success?,
|
18
|
+
refute context.deadline_success?,
|
19
|
+
"duration: #{context.duration} should be less than 20"
|
18
20
|
assert context.result_success?
|
19
21
|
refute context.success?
|
20
22
|
end
|
@@ -44,5 +46,4 @@ class ContextTest < Minitest::Test
|
|
44
46
|
refute context.success?
|
45
47
|
end
|
46
48
|
end
|
47
|
-
|
48
|
-
end
|
49
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rack/mock"
|
4
|
+
require "test_helper"
|
5
|
+
|
6
|
+
class ContextTest < Minitest::Test
|
7
|
+
def setup
|
8
|
+
@reporter = DummyReporter.new
|
9
|
+
@app = ->(_env) { [200, { "Content-Type" => "text/plain" }, ["hello"]] }
|
10
|
+
@app_slow = lambda do |_env|
|
11
|
+
Timecop.freeze(Time.now + 1990)
|
12
|
+
[200, { "Content-Type" => "text/plain" }, ["hello"]]
|
13
|
+
end
|
14
|
+
@app_error = ->(_env) { raise ArgumentError }
|
15
|
+
@app500 = ->(_env) { [500, { "Content-Type" => "text/plain" }, ["error"]] }
|
16
|
+
end
|
17
|
+
|
18
|
+
def teardown
|
19
|
+
Timecop.return
|
20
|
+
end
|
21
|
+
|
22
|
+
def middleware(app)
|
23
|
+
mw = Slimy::Rack::SLIMiddleware.new(app, reporter: @reporter)
|
24
|
+
Rack::Lint.new(mw)
|
25
|
+
end
|
26
|
+
|
27
|
+
def request(app)
|
28
|
+
req = Rack::MockRequest.new(middleware(app))
|
29
|
+
req.get("/", "REMOTE_ADDR" => "127.0.0.1")
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_rack_request
|
33
|
+
res = request(@app)
|
34
|
+
assert_equal(res.status, 200)
|
35
|
+
assert_equal(res.body, "hello")
|
36
|
+
assert(@reporter.ctx.success?, "SLI metric should be successful")
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_slow_rack_request
|
40
|
+
res = request(@app_slow)
|
41
|
+
assert_equal(res.status, 200)
|
42
|
+
assert_equal(res.body, "hello")
|
43
|
+
refute(@reporter.ctx.success?, "SLI metric should be a failure")
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_5xx_rack_request
|
47
|
+
res = request(@app500)
|
48
|
+
assert_equal(res.status, 500)
|
49
|
+
assert_equal(res.body, "error")
|
50
|
+
refute(@reporter.ctx.success?, "SLI metric should be a failure")
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_error_rack_request
|
54
|
+
assert_raises ArgumentError do
|
55
|
+
request(@app_error)
|
56
|
+
end
|
57
|
+
refute(@reporter.ctx.success?, "SLI metric should be a failure")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class DummyReporter
|
62
|
+
def initialize
|
63
|
+
@ctx = nil
|
64
|
+
end
|
65
|
+
|
66
|
+
def report(ctx)
|
67
|
+
@ctx = ctx
|
68
|
+
end
|
69
|
+
|
70
|
+
attr_reader :ctx
|
71
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
-
|
2
|
-
require 'slimy'
|
3
|
-
require 'timecop'
|
1
|
+
# frozen_string_literal: true
|
4
2
|
|
3
|
+
require "minitest/autorun"
|
4
|
+
require "slimy"
|
5
|
+
require "timecop"
|
5
6
|
|
6
7
|
def freeze_ms(duration_ms)
|
7
|
-
Timecop.freeze(Time.now+(duration_ms/1000.0)) do
|
8
|
+
Timecop.freeze(Time.now + (duration_ms / 1000.0)) do
|
8
9
|
yield
|
9
10
|
end
|
10
|
-
end
|
11
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slimy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tyler Henrichs
|
@@ -11,20 +11,6 @@ bindir: bin
|
|
11
11
|
cert_chain: []
|
12
12
|
date: 2020-12-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: rack
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
requirements:
|
18
|
-
- - "~>"
|
19
|
-
- !ruby/object:Gem::Version
|
20
|
-
version: '2.0'
|
21
|
-
type: :runtime
|
22
|
-
prerelease: false
|
23
|
-
version_requirements: !ruby/object:Gem::Requirement
|
24
|
-
requirements:
|
25
|
-
- - "~>"
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
version: '2.0'
|
28
14
|
- !ruby/object:Gem::Dependency
|
29
15
|
name: bump
|
30
16
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,6 +45,34 @@ dependencies:
|
|
59
45
|
- - "<"
|
60
46
|
- !ruby/object:Gem::Version
|
61
47
|
version: '3'
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: guard
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: guard-minitest
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
type: :development
|
70
|
+
prerelease: false
|
71
|
+
version_requirements: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
62
76
|
- !ruby/object:Gem::Dependency
|
63
77
|
name: minitest
|
64
78
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,6 +101,20 @@ dependencies:
|
|
87
101
|
- - "~>"
|
88
102
|
- !ruby/object:Gem::Version
|
89
103
|
version: '1.4'
|
104
|
+
- !ruby/object:Gem::Dependency
|
105
|
+
name: rack
|
106
|
+
requirement: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '2.0'
|
111
|
+
type: :development
|
112
|
+
prerelease: false
|
113
|
+
version_requirements: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '2.0'
|
90
118
|
- !ruby/object:Gem::Dependency
|
91
119
|
name: rake
|
92
120
|
requirement: !ruby/object:Gem::Requirement
|
@@ -145,9 +173,11 @@ files:
|
|
145
173
|
- ".gitignore"
|
146
174
|
- ".rubocop.yml"
|
147
175
|
- ".tool-versions"
|
176
|
+
- ".travis.yml"
|
148
177
|
- CHANGELOG.md
|
149
178
|
- Gemfile
|
150
179
|
- Gemfile.lock
|
180
|
+
- Guardfile
|
151
181
|
- LICENSE
|
152
182
|
- README.md
|
153
183
|
- Rakefile
|
@@ -165,8 +195,9 @@ files:
|
|
165
195
|
- lib/slimy/version.rb
|
166
196
|
- slimy.gemspec
|
167
197
|
- test/slimy/context_test.rb
|
198
|
+
- test/slimy/rack_middleware_test.rb
|
168
199
|
- test/test_helper.rb
|
169
|
-
homepage: https://
|
200
|
+
homepage: https://github.com/lessonly/slimy
|
170
201
|
licenses:
|
171
202
|
- MIT
|
172
203
|
metadata: {}
|