timber 2.6.2 → 3.0.0

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 (142) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +8 -38
  3. data/CHANGELOG.md +9 -0
  4. data/README.md +30 -284
  5. data/Rakefile +78 -0
  6. data/lib/timber.rb +6 -6
  7. data/lib/timber/config.rb +1 -83
  8. data/lib/timber/config/integrations.rb +1 -47
  9. data/lib/timber/context.rb +3 -24
  10. data/lib/timber/contexts.rb +2 -30
  11. data/lib/timber/contexts/http.rb +16 -36
  12. data/lib/timber/contexts/release.rb +12 -23
  13. data/lib/timber/contexts/runtime.rb +9 -36
  14. data/lib/timber/contexts/session.rb +8 -21
  15. data/lib/timber/contexts/system.rb +9 -16
  16. data/lib/timber/contexts/user.rb +13 -33
  17. data/lib/timber/current_context.rb +16 -78
  18. data/lib/timber/event.rb +12 -9
  19. data/lib/timber/events.rb +1 -33
  20. data/lib/timber/events/controller_call.rb +20 -31
  21. data/lib/timber/events/error.rb +18 -26
  22. data/lib/timber/events/exception.rb +1 -0
  23. data/lib/timber/events/sql_query.rb +14 -24
  24. data/lib/timber/events/template_render.rb +13 -24
  25. data/lib/timber/integration.rb +1 -1
  26. data/lib/timber/integrator.rb +1 -1
  27. data/lib/timber/log_devices/http.rb +98 -19
  28. data/lib/timber/log_entry.rb +6 -24
  29. data/lib/timber/logger.rb +5 -14
  30. data/lib/timber/util.rb +1 -6
  31. data/lib/timber/util/non_nil_hash_builder.rb +3 -1
  32. data/lib/timber/version.rb +1 -1
  33. data/spec/README.md +2 -8
  34. data/spec/spec_helper.rb +0 -7
  35. data/spec/support/timber.rb +1 -3
  36. data/spec/timber/current_context_spec.rb +12 -50
  37. data/spec/timber/events/controller_call_spec.rb +4 -4
  38. data/spec/timber/events/error_spec.rb +4 -9
  39. data/spec/timber/log_devices/http_spec.rb +26 -2
  40. data/spec/timber/log_entry_spec.rb +12 -6
  41. data/spec/timber/logger_spec.rb +27 -68
  42. data/timber.gemspec +1 -1
  43. metadata +5 -139
  44. data/gemfiles/rails-3.0.gemfile +0 -5
  45. data/gemfiles/rails-3.1.gemfile +0 -5
  46. data/gemfiles/rails-3.2.gemfile +0 -5
  47. data/gemfiles/rails-4.0.gemfile +0 -9
  48. data/gemfiles/rails-4.1.gemfile +0 -9
  49. data/gemfiles/rails-4.2.gemfile +0 -9
  50. data/gemfiles/rails-5.0.gemfile +0 -9
  51. data/gemfiles/rails-5.1.gemfile +0 -9
  52. data/gemfiles/rails-edge.gemfile +0 -7
  53. data/lib/timber/cli.rb +0 -60
  54. data/lib/timber/cli/api.rb +0 -183
  55. data/lib/timber/cli/api/application.rb +0 -34
  56. data/lib/timber/cli/config_file.rb +0 -71
  57. data/lib/timber/cli/file_helper.rb +0 -53
  58. data/lib/timber/cli/installer.rb +0 -70
  59. data/lib/timber/cli/installers.rb +0 -102
  60. data/lib/timber/cli/installers/config_file.rb +0 -51
  61. data/lib/timber/cli/installers/other.rb +0 -59
  62. data/lib/timber/cli/installers/rails.rb +0 -225
  63. data/lib/timber/cli/installers/root.rb +0 -116
  64. data/lib/timber/cli/io.rb +0 -100
  65. data/lib/timber/cli/io/ansi.rb +0 -22
  66. data/lib/timber/cli/io/messages.rb +0 -198
  67. data/lib/timber/cli/os_helper.rb +0 -74
  68. data/lib/timber/config/integrations/rack.rb +0 -74
  69. data/lib/timber/contexts/custom.rb +0 -44
  70. data/lib/timber/contexts/organization.rb +0 -48
  71. data/lib/timber/events/custom.rb +0 -53
  72. data/lib/timber/events/http_request.rb +0 -71
  73. data/lib/timber/events/http_response.rb +0 -81
  74. data/lib/timber/frameworks.rb +0 -19
  75. data/lib/timber/frameworks/rails.rb +0 -27
  76. data/lib/timber/integrations.rb +0 -29
  77. data/lib/timber/integrations/action_controller.rb +0 -18
  78. data/lib/timber/integrations/action_controller/log_subscriber.rb +0 -27
  79. data/lib/timber/integrations/action_controller/log_subscriber/timber_log_subscriber.rb +0 -46
  80. data/lib/timber/integrations/action_dispatch.rb +0 -23
  81. data/lib/timber/integrations/action_dispatch/debug_exceptions.rb +0 -53
  82. data/lib/timber/integrations/action_view.rb +0 -18
  83. data/lib/timber/integrations/action_view/log_subscriber.rb +0 -27
  84. data/lib/timber/integrations/action_view/log_subscriber/timber_log_subscriber.rb +0 -83
  85. data/lib/timber/integrations/active_record.rb +0 -18
  86. data/lib/timber/integrations/active_record/log_subscriber.rb +0 -26
  87. data/lib/timber/integrations/active_record/log_subscriber/timber_log_subscriber.rb +0 -53
  88. data/lib/timber/integrations/rack.rb +0 -27
  89. data/lib/timber/integrations/rack/error_event.rb +0 -64
  90. data/lib/timber/integrations/rack/http_context.rb +0 -27
  91. data/lib/timber/integrations/rack/http_events.rb +0 -210
  92. data/lib/timber/integrations/rack/middleware.rb +0 -28
  93. data/lib/timber/integrations/rack/session_context.rb +0 -65
  94. data/lib/timber/integrations/rack/user_context.rb +0 -135
  95. data/lib/timber/integrations/rails.rb +0 -22
  96. data/lib/timber/integrations/rails/rack_logger.rb +0 -60
  97. data/lib/timber/overrides.rb +0 -12
  98. data/lib/timber/overrides/active_support_3_tagged_logging.rb +0 -111
  99. data/lib/timber/overrides/active_support_buffered_logger.rb +0 -22
  100. data/lib/timber/overrides/active_support_tagged_logging.rb +0 -66
  101. data/lib/timber/overrides/lograge.rb +0 -18
  102. data/lib/timber/overrides/rails_stdout_logging.rb +0 -21
  103. data/lib/timber/util/active_support_log_subscriber.rb +0 -37
  104. data/lib/timber/util/attribute_normalizer.rb +0 -89
  105. data/lib/timber/util/hash.rb +0 -90
  106. data/lib/timber/util/request.rb +0 -72
  107. data/lib/timber/util/struct.rb +0 -16
  108. data/spec/rails/tagged_logging_spec.rb +0 -44
  109. data/spec/support/action_controller.rb +0 -8
  110. data/spec/support/active_record.rb +0 -32
  111. data/spec/support/rails.rb +0 -67
  112. data/spec/support/rails/templates/_partial.html +0 -1
  113. data/spec/support/rails/templates/template.html +0 -1
  114. data/spec/timber/cli/config_file_spec.rb +0 -26
  115. data/spec/timber/cli/installers/config_file_spec.rb +0 -36
  116. data/spec/timber/cli/installers/other_spec.rb +0 -49
  117. data/spec/timber/cli/installers/rails_spec.rb +0 -364
  118. data/spec/timber/cli/installers/root_spec.rb +0 -73
  119. data/spec/timber/config_spec.rb +0 -28
  120. data/spec/timber/contexts/custom_spec.rb +0 -11
  121. data/spec/timber/contexts/organization_spec.rb +0 -11
  122. data/spec/timber/contexts/runtime_spec.rb +0 -11
  123. data/spec/timber/contexts/system_spec.rb +0 -11
  124. data/spec/timber/contexts/user_spec.rb +0 -11
  125. data/spec/timber/contexts_spec.rb +0 -49
  126. data/spec/timber/event_spec.rb +0 -10
  127. data/spec/timber/events/custom_spec.rb +0 -36
  128. data/spec/timber/events/http_request_spec.rb +0 -32
  129. data/spec/timber/events/http_response_spec.rb +0 -12
  130. data/spec/timber/events_spec.rb +0 -55
  131. data/spec/timber/integrations/action_controller/log_subscriber_spec.rb +0 -55
  132. data/spec/timber/integrations/action_dispatch/debug_exceptions_spec.rb +0 -53
  133. data/spec/timber/integrations/action_view/log_subscriber_spec.rb +0 -115
  134. data/spec/timber/integrations/active_record/log_subscriber_spec.rb +0 -46
  135. data/spec/timber/integrations/rack/error_event_spec.rb +0 -63
  136. data/spec/timber/integrations/rack/http_context_spec.rb +0 -60
  137. data/spec/timber/integrations/rack/http_events_spec.rb +0 -101
  138. data/spec/timber/integrations/rack/session_context_spec.rb +0 -62
  139. data/spec/timber/integrations/rails/rack_logger_spec.rb +0 -58
  140. data/spec/timber/util/attribute_normalizer_spec.rb +0 -90
  141. data/spec/timber/util/hash_spec.rb +0 -30
  142. data/spec/timber/util/request_spec.rb +0 -10
@@ -1,115 +0,0 @@
1
- require "spec_helper"
2
-
3
- if defined?(::ActionView)
4
- describe Timber::Integrations::ActionView::LogSubscriber do
5
- let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
6
- let(:io) { StringIO.new }
7
- let(:logger) do
8
- logger = Timber::Logger.new(io)
9
- logger.level = ::Logger::WARN
10
- logger
11
- end
12
-
13
- describe "insert!" do
14
- around(:each) do |example|
15
- class ActionViewLogSubscriberController < ActionController::Base
16
- layout nil
17
-
18
- def index
19
- render template: "template"
20
- end
21
-
22
- def method_for_action(action_name)
23
- action_name
24
- end
25
- end
26
-
27
- ::RailsApp.routes.draw do
28
- get 'action_view_log_subscriber' => 'action_view_log_subscriber#index'
29
- end
30
-
31
- with_rails_logger(logger) do
32
- Timecop.freeze(time) { example.run }
33
- end
34
-
35
- Object.send(:remove_const, :ActionViewLogSubscriberController)
36
- end
37
-
38
- describe "#render_template" do
39
- it "should not log if the level is not sufficient" do
40
- dispatch_rails_request("/action_view_log_subscriber")
41
- expect(io.string).to eq("")
42
- end
43
-
44
- context "with an info level" do
45
- around(:each) do |example|
46
- old_level = logger.level
47
- logger.level = ::Logger::INFO
48
- example.run
49
- logger.level = old_level
50
- end
51
-
52
- it "should log a template render event once" do
53
- dispatch_rails_request("/action_view_log_subscriber")
54
- lines = clean_lines(io.string.split("\n"))
55
- expect(lines[2].strip).to start_with("Rendered spec/support/rails/templates/template.html (0.0ms) @metadata {\"level\":\"info\"")
56
- expect(lines[2]).to include("\"event\":{\"template_render\":{\"name\":\"spec/support/rails/templates/template.html\",\"time_ms\":0.0}},")
57
- end
58
- end
59
- end
60
- end
61
-
62
- if defined?(described_class::TimberLogSubscriber)
63
- describe described_class::TimberLogSubscriber do
64
- let(:event) do
65
- event = Struct.new(:duration, :payload)
66
- event.new(2, identifier: "path/to/template.html")
67
- end
68
-
69
- around(:each) do |example|
70
- old_level = logger.level
71
- logger.level = ::Logger::INFO
72
- example.run
73
- logger.level = old_level
74
- end
75
-
76
- describe "#render_template" do
77
- it "should render the collection" do
78
- log_subscriber = described_class.new
79
- allow(log_subscriber).to receive(:logger).and_return(logger)
80
- log_subscriber.render_template(event)
81
- expect(io.string.strip).to start_with("Rendered path/to/template.html (2.0ms) @metadata")
82
- end
83
- end
84
-
85
- describe "#render_partial" do
86
- it "should render the collection" do
87
- log_subscriber = described_class.new
88
- allow(log_subscriber).to receive(:logger).and_return(logger)
89
- log_subscriber.render_partial(event)
90
- expect(io.string.strip).to start_with("Rendered path/to/template.html (2.0ms) @metadata")
91
- end
92
- end
93
-
94
- describe "#render_collection" do
95
- it "should render the collection" do
96
- log_subscriber = described_class.new
97
- allow(log_subscriber).to receive(:logger).and_return(logger)
98
- log_subscriber.render_collection(event)
99
-
100
- if log_subscriber.respond_to?(:render_count, true)
101
- expect(io.string.strip).to start_with("Rendered collection of path/to/template.html [ times] (2.0ms) @metadata ")
102
- else
103
- expect(io.string.strip).to start_with("Rendered path/to/template.html (2.0ms) @metadata")
104
- end
105
- end
106
- end
107
- end
108
- end
109
-
110
- # Remove blank lines since Rails does this to space out requests in the logs
111
- def clean_lines(lines)
112
- lines.select { |line| !line.start_with?(" @metadata") }
113
- end
114
- end
115
- end
@@ -1,46 +0,0 @@
1
- require "spec_helper"
2
-
3
- if defined?(::ActiveRecord)
4
- describe Timber::Integrations::ActiveRecord::LogSubscriber do
5
- let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
6
- let(:io) { StringIO.new }
7
- let(:logger) do
8
- logger = Timber::Logger.new(io)
9
- logger.level = ::Logger::INFO
10
- logger
11
- end
12
-
13
- describe "#insert!" do
14
- around(:each) do |example|
15
- with_rails_logger(logger) do
16
- Timecop.freeze(time) { example.run }
17
- end
18
- end
19
-
20
- it "should not log if the level is not sufficient" do
21
- ActiveRecord::Base.connection.execute("select * from users")
22
- expect(io.string).to eq("")
23
- end
24
-
25
- context "with an info level" do
26
- around(:each) do |example|
27
- old_level = logger.level
28
- logger.level = ::Logger::DEBUG
29
- example.run
30
- logger.level = old_level
31
- end
32
-
33
- it "should log the sql query" do
34
- ActiveRecord::Base.connection.execute("select * from users")
35
- # Rails 4.X adds random spaces :/
36
- string = io.string.gsub(" ORDER BY", " ORDER BY")
37
- string = string.gsub(" ORDER BY", " ORDER BY")
38
- expect(string).to include("select * from users")
39
- expect(string).to include("@metadata")
40
- expect(string).to include("\"level\":\"debug\"")
41
- expect(string).to include("\"event\":{\"sql_query\"")
42
- end
43
- end
44
- end
45
- end
46
- end
@@ -1,63 +0,0 @@
1
- require "spec_helper"
2
-
3
- if defined?(::Rack)
4
- describe Timber::Integrations::Rack::ErrorEvent do
5
- let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
6
- let(:io) { StringIO.new }
7
- let(:logger) do
8
- logger = Timber::Logger.new(io)
9
- logger.level = ::Logger::INFO
10
- logger
11
- end
12
-
13
- around(:each) do |example|
14
- class RackErrorController < ActionController::Base
15
- layout nil
16
-
17
- hook_name = respond_to?(:before_action) ? "before_action" : "before_filter"
18
- send(hook_name) do
19
- raise "Boom!"
20
- end
21
-
22
- def index
23
- Thread.current[:_timber_context_snapshot] = Timber::CurrentContext.instance.snapshot
24
- render json: {}
25
- end
26
-
27
- def method_for_action(action_name)
28
- action_name
29
- end
30
- end
31
-
32
- ::RailsApp.routes.draw do
33
- get '/rack_error' => 'rack_error#index'
34
- end
35
-
36
- with_rails_logger(logger) do
37
- Timecop.freeze(time) { example.run }
38
- end
39
-
40
- Object.send(:remove_const, :RackErrorController)
41
- end
42
-
43
- describe "#process" do
44
- it "should log the exception" do
45
- allow(Benchmark).to receive(:ms).and_return(1).and_yield
46
-
47
- expect { dispatch_rails_request("/rack_error") }.to raise_error(RuntimeError)
48
-
49
- lines = clean_lines(io.string.split("\n"))
50
- expect(lines.length).to eq(3)
51
-
52
- expect(lines[0]).to start_with("Started GET \"/rack_error\" @metadata ")
53
- expect(lines[1]).to start_with("Processing by RackErrorController#index as HTML @metadata ")
54
- expect(lines[2]).to start_with("RuntimeError (Boom!) @metadata")
55
- end
56
- end
57
-
58
- # Remove blank lines since Rails does this to space out requests in the logs
59
- def clean_lines(lines)
60
- lines.select { |line| !line.start_with?(" @metadat") }
61
- end
62
- end
63
- end
@@ -1,60 +0,0 @@
1
- require "spec_helper"
2
-
3
- if defined?(::Rack)
4
- describe Timber::Integrations::Rack::HTTPContext do
5
- let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
6
- let(:io) { StringIO.new }
7
- let(:logger) do
8
- logger = Timber::Logger.new(io)
9
- logger.level = ::Logger::INFO
10
- logger
11
- end
12
-
13
- around(:each) do |example|
14
- class RackHttpController < ActionController::Base
15
- layout nil
16
-
17
- def index
18
- Thread.current[:_timber_context_snapshot] = Timber::CurrentContext.instance.snapshot
19
- render json: {}
20
- end
21
-
22
- def method_for_action(action_name)
23
- action_name
24
- end
25
- end
26
-
27
- ::RailsApp.routes.draw do
28
- get '/rack_http' => 'rack_http#index'
29
- end
30
-
31
- with_rails_logger(logger) do
32
- Timecop.freeze(time) { example.run }
33
- end
34
-
35
- Object.send(:remove_const, :RackHttpController)
36
- end
37
-
38
- describe "#process" do
39
- it "should set the context" do
40
- allow(Benchmark).to receive(:ms).and_return(1).and_yield
41
-
42
- dispatch_rails_request("/rack_http")
43
- http_context = Thread.current[:_timber_context_snapshot][:http]
44
-
45
- expect(http_context).to eq({:host => "example.org", :method=>"GET", :path=>"/rack_http", :remote_addr=>"123.456.789.10", :request_id=>"unique-request-id-1234"})
46
-
47
- lines = clean_lines(io.string.split("\n"))
48
- expect(lines.length).to eq(3)
49
- lines.each do |line|
50
- expect(line).to include("\"http\":{\"host\":\"example.org\",\"method\":\"GET\",\"path\":\"/rack_http\",\"remote_addr\":\"123.456.789.10\",\"request_id\":\"unique-request-id-1234\"}")
51
- end
52
- end
53
- end
54
-
55
- # Remove blank lines since Rails does this to space out requests in the logs
56
- def clean_lines(lines)
57
- lines.select { |line| !line.start_with?(" @metadat") }
58
- end
59
- end
60
- end
@@ -1,101 +0,0 @@
1
- require "spec_helper"
2
-
3
- if defined?(::Rack)
4
- describe Timber::Integrations::Rack::HTTPEvents do
5
- let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
6
- let(:io) { StringIO.new }
7
- let(:logger) do
8
- logger = Timber::Logger.new(io)
9
- logger.level = ::Logger::INFO
10
- logger
11
- end
12
-
13
- around(:each) do |example|
14
- class RackHttpController < ActionController::Base
15
- layout nil
16
-
17
- def index
18
- Thread.current[:_timber_context_snapshot] = Timber::CurrentContext.instance.snapshot
19
- render json: {}
20
- end
21
-
22
- def method_for_action(action_name)
23
- action_name
24
- end
25
- end
26
-
27
- ::RailsApp.routes.draw do
28
- get '/rack_http' => 'rack_http#index'
29
- end
30
-
31
- with_rails_logger(logger) do
32
- Timecop.freeze(time) { example.run }
33
- end
34
-
35
- Object.send(:remove_const, :RackHttpController)
36
- end
37
-
38
- describe "#process" do
39
- it "should log the events" do
40
- allow(Benchmark).to receive(:ms).and_return(1).and_yield
41
-
42
- dispatch_rails_request("/rack_http")
43
-
44
- lines = clean_lines(io.string.split("\n"))
45
- expect(lines.length).to eq(3)
46
-
47
- expect(lines[0]).to start_with("Started GET \"/rack_http\" @metadata ")
48
- expect(lines[1]).to start_with("Processing by RackHttpController#index as HTML @metadata ")
49
- expect(lines[2]).to start_with("Completed 200 OK in 0.0ms @metadata ")
50
- end
51
-
52
- context "with the route silenced" do
53
- around(:each) do |example|
54
- described_class.silence_request = lambda do |rack_env, rack_request|
55
- rack_request.path == "/rack_http"
56
- end
57
-
58
- example.run
59
-
60
- described_class.silence_request = nil
61
- end
62
-
63
- it "should silence the logs" do
64
- allow(Benchmark).to receive(:ms).and_return(1).and_yield
65
-
66
- dispatch_rails_request("/rack_http")
67
-
68
- lines = clean_lines(io.string.split("\n"))
69
- expect(lines.length).to eq(0)
70
- end
71
- end
72
-
73
- context "collapsed into a single event" do
74
- around(:each) do |example|
75
- described_class.collapse_into_single_event = true
76
-
77
- example.run
78
-
79
- described_class.collapse_into_single_event = nil
80
- end
81
-
82
- it "should silence the logs" do
83
- allow(Benchmark).to receive(:ms).and_return(1).and_yield
84
-
85
- dispatch_rails_request("/rack_http")
86
-
87
- lines = clean_lines(io.string.split("\n"))
88
- expect(lines.length).to eq(2)
89
-
90
- expect(lines[0]).to start_with("Processing by RackHttpController#index as HTML @metadata ")
91
- expect(lines[1]).to start_with("GET /rack_http completed with 200 OK in 0.0ms @metadata ")
92
- end
93
- end
94
- end
95
-
96
- # Remove blank lines since Rails does this to space out requests in the logs
97
- def clean_lines(lines)
98
- lines.select { |line| !line.start_with?(" @metadat") }
99
- end
100
- end
101
- end
@@ -1,62 +0,0 @@
1
- require "spec_helper"
2
-
3
- if defined?(::Rack)
4
- describe Timber::Integrations::Rack::SessionContext do
5
- let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
6
- let(:io) { StringIO.new }
7
- let(:logger) do
8
- logger = Timber::Logger.new(io)
9
- logger.level = ::Logger::INFO
10
- logger
11
- end
12
-
13
- around(:each) do |example|
14
- class RackHttpController < ActionController::Base
15
- layout nil
16
-
17
- def index
18
- Thread.current[:_timber_context_snapshot] = Timber::CurrentContext.instance.snapshot
19
- render json: {}
20
- end
21
-
22
- def method_for_action(action_name)
23
- action_name
24
- end
25
- end
26
-
27
- ::RailsApp.routes.draw do
28
- get '/rack_http' => 'rack_http#index'
29
- end
30
-
31
- with_rails_logger(logger) do
32
- Timecop.freeze(time) { example.run }
33
- end
34
-
35
- Object.send(:remove_const, :RackHttpController)
36
- end
37
-
38
- describe "#process" do
39
- it "should set the context" do
40
- allow(Benchmark).to receive(:ms).and_return(1).and_yield
41
-
42
- expect_any_instance_of(described_class).to receive(:extract_from_cookie).exactly(1).times.and_return("1234")
43
-
44
- dispatch_rails_request("/rack_http")
45
- session_context = Thread.current[:_timber_context_snapshot][:session]
46
-
47
- expect(session_context).to eq({:id => "1234"})
48
-
49
- lines = clean_lines(io.string.split("\n"))
50
- expect(lines.length).to eq(3)
51
- lines.each do |line|
52
- expect(line).to include("\"session\":{\"id\":\"1234\"}")
53
- end
54
- end
55
- end
56
-
57
- # Remove blank lines since Rails does this to space out requests in the logs
58
- def clean_lines(lines)
59
- lines.select { |line| !line.start_with?(" @metadat") }
60
- end
61
- end
62
- end