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,83 +0,0 @@
1
- module Timber
2
- module Integrations
3
- module ActionView
4
- class LogSubscriber < Integrator
5
-
6
- # The log subscriber that replaces the default `ActionView::LogSubscriber`.
7
- # The intent of this subscriber is to, as transparently as possible, properly
8
- # track events that are being logged here.
9
- #
10
- # @private
11
- class TimberLogSubscriber < ::ActionView::LogSubscriber
12
- def render_template(event)
13
- return true if silence?
14
-
15
- info do
16
- full_name = from_rails_root(event.payload[:identifier])
17
- message = " Rendered #{full_name}"
18
- message << " within #{from_rails_root(event.payload[:layout])}" if event.payload[:layout]
19
- message << " (#{event.duration.round(1)}ms)"
20
-
21
- Events::TemplateRender.new(
22
- name: full_name,
23
- time_ms: event.duration,
24
- message: message
25
- )
26
- end
27
- end
28
-
29
- def render_partial(event)
30
- return true if silence?
31
-
32
- info do
33
- full_name = from_rails_root(event.payload[:identifier])
34
- message = " Rendered #{full_name}"
35
- message << " within #{from_rails_root(event.payload[:layout])}" if event.payload[:layout]
36
- message << " (#{event.duration.round(1)}ms)"
37
- message << " #{cache_message(event.payload)}" if event.payload.key?(:cache_hit)
38
-
39
- Events::TemplateRender.new(
40
- name: full_name,
41
- time_ms: event.duration,
42
- message: message
43
- )
44
- end
45
- end
46
-
47
- def render_collection(event)
48
- return true if silence?
49
-
50
- if respond_to?(:render_count, true)
51
- info do
52
- identifier = event.payload[:identifier] || "templates"
53
- full_name = from_rails_root(identifier)
54
- message = " Rendered collection of #{full_name}" \
55
- " #{render_count(event.payload)} (#{event.duration.round(1)}ms)"
56
-
57
- Events::TemplateRender.new(
58
- name: full_name,
59
- time_ms: event.duration,
60
- message: message
61
- )
62
- end
63
- else
64
- # Older versions of rails delegate this method to #render_template
65
- render_template(event)
66
- end
67
- end
68
-
69
- private
70
- def log_rendering_start(payload)
71
- # Consolidates 2 template rendering events into 1. We don't need 2 events for
72
- # rendering a template. If you disagree, please feel free to open a PR and we
73
- # can make this an option.
74
- end
75
-
76
- def silence?
77
- ActionView.silence?
78
- end
79
- end
80
- end
81
- end
82
- end
83
- end
@@ -1,18 +0,0 @@
1
- require "timber/integration"
2
- require "timber/integrations/active_record/log_subscriber"
3
-
4
- module Timber
5
- module Integrations
6
- # Module for holding *all* ActiveRecord integrations. See {Integration} for
7
- # configuration details for all integrations.
8
- module ActiveRecord
9
- extend Integration
10
-
11
- def self.integrate!
12
- return false if !enabled?
13
-
14
- LogSubscriber.integrate!
15
- end
16
- end
17
- end
18
- end
@@ -1,26 +0,0 @@
1
- require "timber/integrator"
2
-
3
- module Timber
4
- module Integrations
5
- module ActiveRecord
6
- # Reponsible for uninstalling the default `ActiveRecord::LogSubscriber` and replacing it
7
- # with the `TimberLogSubscriber`.
8
- #
9
- # @private
10
- class LogSubscriber < Integrator
11
- def initialize
12
- require "timber/integrations/active_record/log_subscriber/timber_log_subscriber"
13
- rescue LoadError => e
14
- raise RequirementNotMetError.new(e.message)
15
- end
16
-
17
- def integrate!
18
- return true if Util::ActiveSupportLogSubscriber.subscribed?(:active_record, TimberLogSubscriber)
19
-
20
- Util::ActiveSupportLogSubscriber.unsubscribe!(:active_record, ::ActiveRecord::LogSubscriber)
21
- TimberLogSubscriber.attach_to(:active_record)
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,53 +0,0 @@
1
- # We require all of ActiveRecord because the #logger method in ::ActiveRecord::LogSubscriber
2
- # uses ActiveRecord::Base. We can't require active_record/base directly because ActiveRecord
3
- # does not require files properly and we receive unintialized constant errors.
4
- require "active_record"
5
- require "active_record/log_subscriber"
6
-
7
- require "timber/integrator"
8
-
9
- module Timber
10
- module Integrations
11
- module ActiveRecord
12
- class LogSubscriber < Integrator
13
- # The log subscriber that replaces the default `ActiveRecord::LogSubscriber`.
14
- # The intent of this subscriber is to, as transparently as possible, properly
15
- # track events that are being logged here. This LogSubscriber will never change
16
- # default behavior / log messages.
17
- #
18
- # @private
19
- class TimberLogSubscriber < ::ActiveRecord::LogSubscriber
20
- def sql(event)
21
- return true if silence?
22
-
23
- r = super(event)
24
-
25
- if @message
26
- payload = event.payload
27
- event = Events::SQLQuery.new(
28
- sql: payload[:sql],
29
- time_ms: event.duration,
30
- message: @message
31
- )
32
-
33
- logger.debug event
34
-
35
- @message = nil
36
- end
37
-
38
- r
39
- end
40
-
41
- private
42
- def debug(message)
43
- @message = message
44
- end
45
-
46
- def silence?
47
- ActiveRecord.silence?
48
- end
49
- end
50
- end
51
- end
52
- end
53
- end
@@ -1,27 +0,0 @@
1
- require "timber/integrations/rack/error_event"
2
- require "timber/integrations/rack/http_context"
3
- require "timber/integrations/rack/http_events"
4
- require "timber/integrations/rack/session_context"
5
- require "timber/integrations/rack/user_context"
6
-
7
- module Timber
8
- module Integrations
9
- module Rack
10
- # Enable / disable all Rack middlewares with a single setting.
11
- def self.enabled=(value)
12
- ErrorEvent.enabled = value
13
- HTTPContext.enabled = value
14
- HTTPEvents.enabled = value
15
- SessionContext.enabled = value
16
- UserContext.enabled = value
17
- end
18
-
19
- # All enabled middlewares. The order is relevant. Middlewares that set
20
- # context are added first so that context is included in subsequent log lines.
21
- def self.middlewares
22
- @middlewares ||= [HTTPContext, SessionContext, UserContext,
23
- HTTPEvents, ErrorEvent].select(&:enabled?)
24
- end
25
- end
26
- end
27
- end
@@ -1,64 +0,0 @@
1
- begin
2
- # Rails 3.2 requires you to require all of Rails before requiring
3
- # the exception wrapper.
4
- require "rails"
5
- require "action_dispatch/middleware/exception_wrapper"
6
- rescue Exception
7
- end
8
-
9
- require "timber/config"
10
- require "timber/events/error"
11
- require "timber/integrations/rack/middleware"
12
- require "timber/util"
13
-
14
- module Timber
15
- module Integrations
16
- module Rack
17
- # A Rack middleware that is reponsible for capturing exception and error events
18
- # {Timber::Events::Error}.
19
- class ErrorEvent < Middleware
20
- # We determine this when the app loads to avoid the overhead on a per request basis.
21
- EXCEPTION_WRAPPER_TAKES_CLEANER = defined?(::ActionDispatch::ExceptionWrapper) &&
22
- !::ActionDispatch::ExceptionWrapper.instance_methods.include?(:env)
23
-
24
- def call(env)
25
- begin
26
- status, headers, body = @app.call(env)
27
- rescue Exception => exception
28
- Config.instance.logger.fatal do
29
- backtrace = extract_backtrace(env, exception)
30
-
31
- Events::Error.new(
32
- name: exception.class.name,
33
- error_message: exception.message,
34
- backtrace: backtrace
35
- )
36
- end
37
-
38
- raise exception
39
- end
40
- end
41
-
42
- private
43
- # Rails provides a backtrace cleaner, so we use it here.
44
- def extract_backtrace(env, exception)
45
- if defined?(::ActionDispatch::ExceptionWrapper)
46
- wrapper = if EXCEPTION_WRAPPER_TAKES_CLEANER
47
- request = Util::Request.new(env)
48
- backtrace_cleaner = request.get_header("action_dispatch.backtrace_cleaner")
49
- ::ActionDispatch::ExceptionWrapper.new(backtrace_cleaner, exception)
50
- else
51
- ::ActionDispatch::ExceptionWrapper.new(env, exception)
52
- end
53
-
54
- trace = wrapper.application_trace
55
- trace = wrapper.framework_trace if trace.empty?
56
- trace
57
- else
58
- exception.backtrace
59
- end
60
- end
61
- end
62
- end
63
- end
64
- end
@@ -1,27 +0,0 @@
1
- require "timber/contexts/http"
2
- require "timber/current_context"
3
- require "timber/integrations/rack/middleware"
4
- require "timber/util"
5
-
6
- module Timber
7
- module Integrations
8
- module Rack
9
- # A Rack middleware that is reponsible for adding the HTTP context {Timber::Contexts::HTTP}.
10
- class HTTPContext < Middleware
11
- def call(env)
12
- request = Util::Request.new(env)
13
- context = Contexts::HTTP.new(
14
- host: request.host,
15
- method: request.request_method,
16
- path: request.path,
17
- remote_addr: request.ip,
18
- request_id: request.request_id
19
- )
20
- CurrentContext.with(context) do
21
- @app.call(env)
22
- end
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,210 +0,0 @@
1
- require "set"
2
-
3
- require "timber/config"
4
- require "timber/contexts/http"
5
- require "timber/current_context"
6
- require "timber/events/http_request"
7
- require "timber/events/http_response"
8
- require "timber/integrations/rack/middleware"
9
-
10
- module Timber
11
- module Integrations
12
- module Rack
13
- # A Rack middleware that is reponsible for capturing and logging HTTP server requests and
14
- # response events. The {Events::HTTPRequest} and {Events::HTTPResponse} events
15
- # respectively.
16
- class HTTPEvents < Middleware
17
- class << self
18
- # Allows you to capture the HTTP request body, default is off (false).
19
- #
20
- # Capturing HTTP bodies can be extremely helpful when debugging issues,
21
- # but please proceed with caution:
22
- #
23
- # 1. Capturing HTTP bodies can use quite a bit of data (this can be mitigated, see below)
24
- # 2. The {Events::ControllerCall} event captures the parsed parmaters sent to
25
- # the controller. This is a parsed representation of the body, which is usually more
26
- # helpful and redundant to the body captured here.
27
- #
28
- # If you opt to capture bodies, you can also truncate the size to reduce the data
29
- # captured. See {Events::HTTPRequest}.
30
- #
31
- # @example
32
- # Timber::Integrations::Rack::HTTPEvents.capture_request_body = true
33
- def capture_request_body=(value)
34
- @capture_request_body = value
35
- end
36
-
37
- # Accessor method for {#capture_request_body=}
38
- def capture_request_body?
39
- @capture_request_body == true
40
- end
41
-
42
- # Just like {#capture_request_body=} but for the {Events::HTTPResponse} event.
43
- # Please see {#capture_request_body=} for more details. The documentation there also
44
- # applies here.
45
- def capture_response_body=(value)
46
- @capture_response_body = value
47
- end
48
-
49
- # Accessor method for {#capture_response_body=}
50
- def capture_response_body?
51
- @capture_response_body == true
52
- end
53
-
54
- # Collapse both the HTTP request and response events into a single log line event.
55
- # While we don't recommend this, it can help to reduce log volume if desired.
56
- # The reason we don't recommend this, is because the logging service you use should
57
- # not be so expensive that you need to strip out useful logs. It should also provide
58
- # the tools necessary to properly search your logs and reduce noise. Such as viewing
59
- # logs for a specific request.
60
- #
61
- # To provide an example. This setting turns this:
62
- #
63
- # Started GET "/" for 127.0.0.1 at 2012-03-10 14:28:14 +0100
64
- # Completed 200 OK in 79ms (Views: 78.8ms | ActiveRecord: 0.0ms)
65
- #
66
- # Into this:
67
- #
68
- # Get "/" sent 200 OK in 79ms
69
- #
70
- # The single event is still a {Timber::Events::HTTPResponse} event. Because
71
- # we capture HTTP context, you still get the HTTP details, but you will not get
72
- # all of the request details that the {Timber::Events::HTTPRequest} event would
73
- # provide.
74
- #
75
- # @example
76
- # Timber::Integrations::Rack::HTTPEvents.collapse_into_single_event = true
77
- def collapse_into_single_event=(value)
78
- @collapse_into_single_event = value
79
- end
80
-
81
- # Accessor method for {#collapse_into_single_event=}.
82
- def collapse_into_single_event?
83
- @collapse_into_single_event == true
84
- end
85
-
86
- # This setting allows you to silence requests based on any conditions you desire.
87
- # We require a block because it gives you complete control over how you want to
88
- # silence requests. The first parameter being the traditional Rack env hash, the
89
- # second being a [Rack Request](http://www.rubydoc.info/gems/rack/Rack/Request) object.
90
- #
91
- # @example
92
- # Integrations::Rack::HTTPEvents.silence_request = lambda do |rack_env, rack_request|
93
- # rack_request.path == "/_health"
94
- # end
95
- def silence_request=(proc)
96
- if proc && !proc.is_a?(Proc)
97
- raise ArgumentError.new("The value passed to #silence_request must be a Proc")
98
- end
99
-
100
- @silence_request = proc
101
- end
102
-
103
- # Accessor method for {#silence_request=}
104
- def silence_request
105
- @silence_request
106
- end
107
- end
108
-
109
- CONTENT_LENGTH_KEY = 'Content-Length'.freeze
110
-
111
- def call(env)
112
- request = Util::Request.new(env)
113
-
114
- if silenced?(env, request)
115
- if Config.instance.logger.respond_to?(:silence)
116
- Config.instance.logger.silence do
117
- @app.call(env)
118
- end
119
- else
120
- @app.call(env)
121
- end
122
-
123
- elsif collapse_into_single_event?
124
- start = Time.now
125
-
126
- status, headers, body = @app.call(env)
127
-
128
- Config.instance.logger.info do
129
- http_context_key = Contexts::HTTP.keyspace
130
- http_context = CurrentContext.fetch(http_context_key)
131
- content_length = headers[CONTENT_LENGTH_KEY]
132
- time_ms = (Time.now - start) * 1000.0
133
-
134
- Events::HTTPResponse.new(
135
- content_length: content_length,
136
- headers: headers,
137
- http_context: http_context,
138
- request_id: request.request_id,
139
- status: status,
140
- time_ms: time_ms
141
- )
142
- end
143
-
144
- [status, headers, body]
145
-
146
- else
147
- start = Time.now
148
-
149
- Config.instance.logger.info do
150
- event_body = capture_request_body? ? request.body_content : nil
151
-
152
- Events::HTTPRequest.new(
153
- body: event_body,
154
- content_length: request.content_length,
155
- headers: request.headers,
156
- host: request.host,
157
- method: request.request_method,
158
- path: request.path,
159
- port: request.port,
160
- query_string: request.query_string,
161
- request_id: request.request_id, # we insert this middleware after ActionDispatch::RequestId
162
- scheme: request.scheme
163
- )
164
- end
165
-
166
- status, headers, body = @app.call(env)
167
-
168
- Config.instance.logger.info do
169
- event_body = capture_response_body? ? body : nil
170
- content_length = headers[CONTENT_LENGTH_KEY]
171
- time_ms = (Time.now - start) * 1000.0
172
-
173
- Events::HTTPResponse.new(
174
- body: event_body,
175
- content_length: content_length,
176
- headers: headers,
177
- request_id: request.request_id,
178
- status: status,
179
- time_ms: time_ms
180
- )
181
- end
182
-
183
- [status, headers, body]
184
- end
185
- end
186
-
187
- private
188
- def capture_request_body?
189
- self.class.capture_request_body?
190
- end
191
-
192
- def capture_response_body?
193
- self.class.capture_response_body?
194
- end
195
-
196
- def collapse_into_single_event?
197
- self.class.collapse_into_single_event?
198
- end
199
-
200
- def silenced?(env, request)
201
- if !self.class.silence_request.nil?
202
- self.class.silence_request.call(env, request)
203
- else
204
- false
205
- end
206
- end
207
- end
208
- end
209
- end
210
- end