experimental-influxdb-rails 1.0.0.beta5
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.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rspec +3 -0
- data/.rubocop.yml +78 -0
- data/.travis.yml +37 -0
- data/CHANGELOG.md +133 -0
- data/Gemfile +9 -0
- data/LICENSE.txt +22 -0
- data/README.md +292 -0
- data/Rakefile +34 -0
- data/config.ru +7 -0
- data/experimental-influxdb-rails.gemspec +35 -0
- data/gemfiles/Gemfile.rails-4.2.x +7 -0
- data/gemfiles/Gemfile.rails-5.0.x +7 -0
- data/gemfiles/Gemfile.rails-5.1.x +7 -0
- data/gemfiles/Gemfile.rails-5.2.x +7 -0
- data/lib/experimental-influxdb-rails.rb +123 -0
- data/lib/influxdb/rails/air_traffic_controller.rb +41 -0
- data/lib/influxdb/rails/backtrace.rb +44 -0
- data/lib/influxdb/rails/configuration.rb +211 -0
- data/lib/influxdb/rails/context.rb +51 -0
- data/lib/influxdb/rails/exception_presenter.rb +94 -0
- data/lib/influxdb/rails/instrumentation.rb +34 -0
- data/lib/influxdb/rails/logger.rb +16 -0
- data/lib/influxdb/rails/middleware/hijack_render_exception.rb +16 -0
- data/lib/influxdb/rails/middleware/hijack_rescue_action_everywhere.rb +31 -0
- data/lib/influxdb/rails/middleware/render_subscriber.rb +26 -0
- data/lib/influxdb/rails/middleware/request_subscriber.rb +59 -0
- data/lib/influxdb/rails/middleware/simple_subscriber.rb +49 -0
- data/lib/influxdb/rails/middleware/sql_subscriber.rb +38 -0
- data/lib/influxdb/rails/middleware/subscriber.rb +48 -0
- data/lib/influxdb/rails/rack.rb +24 -0
- data/lib/influxdb/rails/railtie.rb +51 -0
- data/lib/influxdb/rails/sql/normalizer.rb +27 -0
- data/lib/influxdb/rails/sql/query.rb +32 -0
- data/lib/influxdb/rails/version.rb +5 -0
- data/lib/rails/generators/influxdb/influxdb_generator.rb +15 -0
- data/lib/rails/generators/influxdb/templates/initializer.rb +11 -0
- data/spec/controllers/widgets_controller_spec.rb +15 -0
- data/spec/integration/exceptions_spec.rb +37 -0
- data/spec/integration/integration_helper.rb +1 -0
- data/spec/integration/metrics_spec.rb +28 -0
- data/spec/shared_examples/data.rb +67 -0
- data/spec/shared_examples/tags.rb +45 -0
- data/spec/spec_helper.rb +31 -0
- data/spec/support/rails4/app.rb +44 -0
- data/spec/support/rails5/app.rb +44 -0
- data/spec/support/views/widgets/_item.html.erb +1 -0
- data/spec/support/views/widgets/index.html.erb +5 -0
- data/spec/unit/backtrace_spec.rb +85 -0
- data/spec/unit/configuration_spec.rb +125 -0
- data/spec/unit/context_spec.rb +40 -0
- data/spec/unit/exception_presenter_spec.rb +23 -0
- data/spec/unit/influxdb_rails_spec.rb +78 -0
- data/spec/unit/middleware/render_subscriber_spec.rb +92 -0
- data/spec/unit/middleware/request_subscriber_spec.rb +94 -0
- data/spec/unit/middleware/sql_subscriber_spec.rb +95 -0
- data/spec/unit/sql/normalizer_spec.rb +15 -0
- data/spec/unit/sql/query_spec.rb +29 -0
- metadata +300 -0
data/Rakefile
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rubocop/rake_task"
|
3
|
+
RuboCop::RakeTask.new
|
4
|
+
|
5
|
+
targeted_files = ARGV.drop(1)
|
6
|
+
file_pattern = targeted_files.empty? ? "spec/**/*_spec.rb" : targeted_files
|
7
|
+
|
8
|
+
require "rspec/core"
|
9
|
+
require "rspec/core/rake_task"
|
10
|
+
|
11
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
12
|
+
t.pattern = FileList[file_pattern]
|
13
|
+
end
|
14
|
+
|
15
|
+
RSpec.configure do |config|
|
16
|
+
config.color = true
|
17
|
+
config.formatter = :documentation
|
18
|
+
end
|
19
|
+
|
20
|
+
task default: %i[spec rubocop]
|
21
|
+
|
22
|
+
task "test:all" => :default do
|
23
|
+
Dir.glob("gemfiles/Gemfile.rails-*.x") do |gemfile|
|
24
|
+
if RUBY_VERSION >= "2.6.0" && gemfile == "gemfiles/Gemfile.rails-4.2.x"
|
25
|
+
msg = "ignore #{gemfile} on Ruby #{RUBY_VERSION}"
|
26
|
+
puts RSpec::Core::Formatters::ConsoleCodes.wrap(msg, :yellow)
|
27
|
+
next
|
28
|
+
end
|
29
|
+
|
30
|
+
puts RSpec::Core::Formatters::ConsoleCodes.wrap(gemfile, :cyan)
|
31
|
+
sh({ "BUNDLE_GEMFILE" => gemfile }, "bundle", "install", "--quiet", "--retry=2", "--jobs=2")
|
32
|
+
sh({ "BUNDLE_GEMFILE" => gemfile }, "bundle", "exec", "rspec")
|
33
|
+
end
|
34
|
+
end
|
data/config.ru
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
lib = File.expand_path("lib", __dir__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "influxdb/rails/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "experimental-influxdb-rails"
|
7
|
+
spec.version = InfluxDB::Rails::VERSION
|
8
|
+
spec.authors = ["Dominik Menke", "Todd Persen"]
|
9
|
+
spec.email = ["dominik.menke@gmail.com", "todd@influxdb.com"]
|
10
|
+
spec.homepage = "https://influxdata.com"
|
11
|
+
spec.summary = "InfluxDB bindings for Ruby on Rails."
|
12
|
+
spec.description = "This gem automatically instruments your Ruby on Rails" \
|
13
|
+
" 4.2/5.x applications using InfluxDB for storage."
|
14
|
+
spec.licenses = ["MIT"]
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/) # rubocop:disable Style/SpecialGlobalVars
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features|smoke)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.required_ruby_version = ">= 2.3.0"
|
21
|
+
|
22
|
+
spec.add_runtime_dependency "influxdb", "~> 0.6", ">= 0.6.4"
|
23
|
+
spec.add_runtime_dependency "railties", ">= 4.2"
|
24
|
+
|
25
|
+
spec.add_development_dependency "activerecord"
|
26
|
+
spec.add_development_dependency "bundler", ">= 1.0.0"
|
27
|
+
spec.add_development_dependency "fakeweb"
|
28
|
+
spec.add_development_dependency "rake"
|
29
|
+
spec.add_development_dependency "rdoc"
|
30
|
+
spec.add_development_dependency "rspec"
|
31
|
+
spec.add_development_dependency "rspec-rails", ">= 3.0.0"
|
32
|
+
spec.add_development_dependency "rubocop", "~> 0.61.1"
|
33
|
+
spec.add_development_dependency "sqlite3"
|
34
|
+
spec.add_development_dependency "tzinfo"
|
35
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require "net/http"
|
2
|
+
require "net/https"
|
3
|
+
require "rubygems"
|
4
|
+
require "socket"
|
5
|
+
require "influxdb/rails/middleware/render_subscriber"
|
6
|
+
require "influxdb/rails/middleware/request_subscriber"
|
7
|
+
require "influxdb/rails/middleware/sql_subscriber"
|
8
|
+
require "influxdb/rails/sql/query"
|
9
|
+
require "influxdb/rails/version"
|
10
|
+
require "influxdb/rails/logger"
|
11
|
+
require "influxdb/rails/exception_presenter"
|
12
|
+
require "influxdb/rails/configuration"
|
13
|
+
require "influxdb/rails/backtrace"
|
14
|
+
require "influxdb/rails/context"
|
15
|
+
require "influxdb/rails/rack"
|
16
|
+
|
17
|
+
require "influxdb/rails/railtie" if defined?(Rails::Railtie)
|
18
|
+
|
19
|
+
module InfluxDB
|
20
|
+
# InfluxDB::Rails contains the glue code needed to integrate with
|
21
|
+
# InfluxDB and Rails. This is a singleton class.
|
22
|
+
module Rails
|
23
|
+
class << self
|
24
|
+
include InfluxDB::Rails::Logger
|
25
|
+
|
26
|
+
attr_writer :configuration
|
27
|
+
attr_writer :client
|
28
|
+
|
29
|
+
def configure(_silent = false)
|
30
|
+
yield(configuration)
|
31
|
+
|
32
|
+
# if we change configuration, reload the client
|
33
|
+
self.client = nil
|
34
|
+
|
35
|
+
InfluxDB::Logging.logger = configuration.logger unless configuration.logger.nil?
|
36
|
+
end
|
37
|
+
|
38
|
+
# rubocop:disable Metrics/MethodLength
|
39
|
+
# rubocop:disable Metrics/AbcSize
|
40
|
+
|
41
|
+
def client
|
42
|
+
@client ||= InfluxDB::Client.new \
|
43
|
+
database: configuration.influxdb_database,
|
44
|
+
username: configuration.influxdb_username,
|
45
|
+
password: configuration.influxdb_password,
|
46
|
+
hosts: configuration.influxdb_hosts,
|
47
|
+
port: configuration.influxdb_port,
|
48
|
+
async: configuration.async,
|
49
|
+
use_ssl: configuration.use_ssl,
|
50
|
+
retry: configuration.retry,
|
51
|
+
open_timeout: configuration.open_timeout,
|
52
|
+
read_timeout: configuration.read_timeout,
|
53
|
+
max_delay: configuration.max_delay,
|
54
|
+
time_precision: configuration.time_precision
|
55
|
+
end
|
56
|
+
|
57
|
+
# rubocop:enable Metrics/MethodLength
|
58
|
+
# rubocop:enable Metrics/AbcSize
|
59
|
+
|
60
|
+
def configuration
|
61
|
+
@configuration ||= InfluxDB::Rails::Configuration.new
|
62
|
+
end
|
63
|
+
|
64
|
+
def current
|
65
|
+
@current ||= InfluxDB::Rails::Context.new
|
66
|
+
end
|
67
|
+
|
68
|
+
def report_exception_unless_ignorable(ex, env = {})
|
69
|
+
report_exception(ex, env) unless ignorable_exception?(ex)
|
70
|
+
end
|
71
|
+
alias transmit_unless_ignorable report_exception_unless_ignorable
|
72
|
+
|
73
|
+
# rubocop:disable Metrics/MethodLength
|
74
|
+
# rubocop:disable Metrics/AbcSize
|
75
|
+
|
76
|
+
def report_exception(ex, env = {})
|
77
|
+
timestamp = InfluxDB::Rails.current_timestamp
|
78
|
+
env = influxdb_request_data if env.empty? && defined? influxdb_request_data
|
79
|
+
exception_presenter = ExceptionPresenter.new(ex, env)
|
80
|
+
log :info, "Exception: #{exception_presenter.to_json[0..512]}..."
|
81
|
+
tags = configuration.tags_middleware.call(
|
82
|
+
exception_presenter.context.merge(exception_presenter.dimensions)
|
83
|
+
)
|
84
|
+
|
85
|
+
client.write_point \
|
86
|
+
configuration.series_name_for_exceptions,
|
87
|
+
values: exception_presenter.values.merge(ts: timestamp),
|
88
|
+
tags: tags,
|
89
|
+
timestamp: timestamp
|
90
|
+
rescue StandardError => ex
|
91
|
+
log :info, "[InfluxDB::Rails] Something went terribly wrong." \
|
92
|
+
" Exception failed to take off! #{ex.class}: #{ex.message}"
|
93
|
+
end
|
94
|
+
alias transmit report_exception
|
95
|
+
|
96
|
+
# rubocop:enable Metrics/MethodLength
|
97
|
+
# rubocop:enable Metrics/AbcSize
|
98
|
+
|
99
|
+
def current_timestamp
|
100
|
+
InfluxDB.now(configuration.time_precision)
|
101
|
+
end
|
102
|
+
|
103
|
+
def ignorable_exception?(ex)
|
104
|
+
configuration.ignore_current_environment? || configuration.ignore_exception?(ex)
|
105
|
+
end
|
106
|
+
|
107
|
+
def rescue
|
108
|
+
yield
|
109
|
+
rescue StandardError => ex
|
110
|
+
raise ex if configuration.ignore_current_environment?
|
111
|
+
|
112
|
+
transmit_unless_ignorable(ex)
|
113
|
+
end
|
114
|
+
|
115
|
+
def rescue_and_reraise
|
116
|
+
yield
|
117
|
+
rescue StandardError => ex
|
118
|
+
transmit_unless_ignorable(ex)
|
119
|
+
raise ex
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module InfluxDB
|
2
|
+
module Rails
|
3
|
+
module AirTrafficController # :nodoc:
|
4
|
+
def influxdb_request_data # rubocop:disable Metrics/MethodLength
|
5
|
+
{
|
6
|
+
params: influxdb_filtered_params,
|
7
|
+
session_data: influxdb_session_data,
|
8
|
+
controller: params[:controller],
|
9
|
+
action: params[:action],
|
10
|
+
request_url: influxdb_request_url,
|
11
|
+
user_agent: request.env["HTTP_USER_AGENT"],
|
12
|
+
remote_ip: request.remote_ip,
|
13
|
+
referer: request.referer,
|
14
|
+
current_user: (current_user rescue nil),
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def influxdb_session_data
|
21
|
+
session.respond_to?(:to_hash) ? session.to_hash : session.data
|
22
|
+
end
|
23
|
+
|
24
|
+
def influxdb_request_url
|
25
|
+
url = "#{request.protocol}#{request.host}"
|
26
|
+
url << ":#{request.port}" unless [80, 443].include?(request.port)
|
27
|
+
url << request.fullpath
|
28
|
+
end
|
29
|
+
|
30
|
+
def influxdb_filtered_params
|
31
|
+
if respond_to?(:filter_parameters)
|
32
|
+
filter_parameters(unfiltered_params)
|
33
|
+
elsif defined?(request.filtered_parameters)
|
34
|
+
request.filtered_parameters
|
35
|
+
else
|
36
|
+
params.to_hash.except(:password, :password_confirmation)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module InfluxDB
|
2
|
+
module Rails
|
3
|
+
class Backtrace # rubocop:disable Style/Documentation
|
4
|
+
class Line # rubocop:disable Style/Documentation
|
5
|
+
FORMAT = /^((?:[a-zA-Z]:)?[^:]+):(\d+)(?::in `([^']+)')?$/.freeze
|
6
|
+
|
7
|
+
attr_reader :file
|
8
|
+
attr_reader :number
|
9
|
+
attr_reader :method
|
10
|
+
|
11
|
+
def initialize(line)
|
12
|
+
_, @file, @number, @method = line.match(FORMAT).to_a
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
"#{file}:#{number} in `#{method}'"
|
17
|
+
end
|
18
|
+
|
19
|
+
def inspect
|
20
|
+
"<Line: #{to_s}>" # rubocop:disable Lint/StringConversionInInterpolation
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
attr_reader :lines
|
25
|
+
|
26
|
+
def initialize(backtrace)
|
27
|
+
@lines = Array(backtrace).each.collect do |line|
|
28
|
+
InfluxDB::Rails.configuration.backtrace_filters.each do |filter|
|
29
|
+
line = filter.call(line)
|
30
|
+
end
|
31
|
+
Line.new(line)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_a
|
36
|
+
lines.map(&:to_s)
|
37
|
+
end
|
38
|
+
|
39
|
+
def inspect
|
40
|
+
"<Backtrace: " + lines.collect(&:to_s).join(", ") + ">"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,211 @@
|
|
1
|
+
module InfluxDB
|
2
|
+
module Rails
|
3
|
+
# rubocop:disable Metrics/ClassLength
|
4
|
+
|
5
|
+
class Configuration # rubocop:disable Style/Documentation
|
6
|
+
attr_accessor :influxdb_hosts
|
7
|
+
attr_accessor :influxdb_port
|
8
|
+
attr_accessor :influxdb_username
|
9
|
+
attr_accessor :influxdb_password
|
10
|
+
attr_accessor :influxdb_database
|
11
|
+
attr_accessor :async
|
12
|
+
attr_accessor :use_ssl
|
13
|
+
attr_accessor :retry
|
14
|
+
attr_accessor :open_timeout
|
15
|
+
attr_accessor :read_timeout
|
16
|
+
attr_accessor :max_delay
|
17
|
+
attr_accessor :time_precision
|
18
|
+
|
19
|
+
attr_accessor :series_name_for_controller_runtimes
|
20
|
+
attr_accessor :series_name_for_view_runtimes
|
21
|
+
attr_accessor :series_name_for_db_runtimes
|
22
|
+
attr_accessor :series_name_for_exceptions
|
23
|
+
attr_accessor :series_name_for_instrumentation
|
24
|
+
attr_accessor :series_name_for_render_template
|
25
|
+
attr_accessor :series_name_for_render_partial
|
26
|
+
attr_accessor :series_name_for_render_collection
|
27
|
+
attr_accessor :series_name_for_sql
|
28
|
+
|
29
|
+
attr_accessor :tags_middleware
|
30
|
+
attr_accessor :rails_app_name
|
31
|
+
|
32
|
+
attr_accessor :application_name
|
33
|
+
attr_accessor :application_root
|
34
|
+
|
35
|
+
attr_accessor :logger
|
36
|
+
attr_accessor :environment
|
37
|
+
attr_accessor :framework
|
38
|
+
attr_accessor :framework_version
|
39
|
+
attr_accessor :language
|
40
|
+
attr_accessor :language_version
|
41
|
+
attr_accessor :ignored_exceptions
|
42
|
+
attr_accessor :ignored_exception_messages
|
43
|
+
attr_accessor :ignored_reports
|
44
|
+
attr_accessor :ignored_environments
|
45
|
+
attr_accessor :ignored_user_agents
|
46
|
+
attr_accessor :backtrace_filters
|
47
|
+
attr_accessor :aggregated_exception_classes
|
48
|
+
attr_accessor :environment_variables
|
49
|
+
attr_accessor :environment_variable_filters
|
50
|
+
|
51
|
+
attr_accessor :instrumentation_enabled
|
52
|
+
attr_accessor :debug
|
53
|
+
|
54
|
+
DEFAULTS = {
|
55
|
+
influxdb_hosts: ["localhost"].freeze,
|
56
|
+
influxdb_port: 8086,
|
57
|
+
influxdb_username: "root".freeze,
|
58
|
+
influxdb_password: "root".freeze,
|
59
|
+
influxdb_database: nil,
|
60
|
+
async: true,
|
61
|
+
use_ssl: false,
|
62
|
+
retry: nil,
|
63
|
+
open_timeout: 5,
|
64
|
+
read_timeout: 300,
|
65
|
+
max_delay: 30,
|
66
|
+
time_precision: "s".freeze,
|
67
|
+
|
68
|
+
series_name_for_controller_runtimes: "rails.controller".freeze,
|
69
|
+
series_name_for_view_runtimes: "rails.view".freeze,
|
70
|
+
series_name_for_db_runtimes: "rails.db".freeze,
|
71
|
+
series_name_for_exceptions: "rails.exceptions".freeze,
|
72
|
+
series_name_for_instrumentation: "instrumentation".freeze,
|
73
|
+
series_name_for_render_template: "rails.render_template".freeze,
|
74
|
+
series_name_for_render_partial: "rails.render_partial".freeze,
|
75
|
+
series_name_for_render_collection: "rails.render_collection".freeze,
|
76
|
+
series_name_for_sql: nil,
|
77
|
+
|
78
|
+
tags_middleware: ->(tags) { tags },
|
79
|
+
rails_app_name: nil,
|
80
|
+
|
81
|
+
ignored_exceptions: %w[
|
82
|
+
ActiveRecord::RecordNotFound
|
83
|
+
ActionController::RoutingError
|
84
|
+
].freeze,
|
85
|
+
|
86
|
+
ignored_exception_messages: [].freeze,
|
87
|
+
ignored_reports: [].freeze,
|
88
|
+
ignored_environments: %w[test cucumber selenium].freeze,
|
89
|
+
ignored_user_agents: %w[GoogleBot].freeze,
|
90
|
+
environment_variable_filters: [
|
91
|
+
/password/i,
|
92
|
+
/key/i,
|
93
|
+
/secret/i,
|
94
|
+
/ps1/i,
|
95
|
+
/rvm_.*_clr/i,
|
96
|
+
/color/i,
|
97
|
+
].freeze,
|
98
|
+
|
99
|
+
backtrace_filters: [
|
100
|
+
->(line) { line.gsub(%r{^\./}, "") },
|
101
|
+
lambda { |line|
|
102
|
+
return line if InfluxDB::Rails.configuration.application_root.to_s.empty?
|
103
|
+
|
104
|
+
line.gsub(/#{InfluxDB::Rails.configuration.application_root}/, "[APP_ROOT]")
|
105
|
+
},
|
106
|
+
lambda { |line|
|
107
|
+
if defined?(Gem) && !Gem.path.nil? && !Gem.path.empty?
|
108
|
+
Gem.path.each { |path| line = line.gsub(/#{path}/, "[GEM_ROOT]") }
|
109
|
+
end
|
110
|
+
line
|
111
|
+
},
|
112
|
+
].freeze,
|
113
|
+
}.freeze
|
114
|
+
|
115
|
+
# rubocop:disable Metrics/MethodLength
|
116
|
+
# rubocop:disable Metrics/AbcSize
|
117
|
+
|
118
|
+
def initialize
|
119
|
+
@influxdb_hosts = DEFAULTS[:influxdb_hosts]
|
120
|
+
@influxdb_port = DEFAULTS[:influxdb_port]
|
121
|
+
@influxdb_username = DEFAULTS[:influxdb_username]
|
122
|
+
@influxdb_password = DEFAULTS[:influxdb_password]
|
123
|
+
@influxdb_database = DEFAULTS[:influxdb_database]
|
124
|
+
@async = DEFAULTS[:async]
|
125
|
+
@use_ssl = DEFAULTS[:use_ssl]
|
126
|
+
@retry = DEFAULTS[:retry]
|
127
|
+
@open_timeout = DEFAULTS[:open_timeout]
|
128
|
+
@read_timeout = DEFAULTS[:read_timeout]
|
129
|
+
@max_delay = DEFAULTS[:max_delay]
|
130
|
+
@time_precision = DEFAULTS[:time_precision]
|
131
|
+
|
132
|
+
@series_name_for_controller_runtimes = DEFAULTS[:series_name_for_controller_runtimes]
|
133
|
+
@series_name_for_view_runtimes = DEFAULTS[:series_name_for_view_runtimes]
|
134
|
+
@series_name_for_db_runtimes = DEFAULTS[:series_name_for_db_runtimes]
|
135
|
+
@series_name_for_exceptions = DEFAULTS[:series_name_for_exceptions]
|
136
|
+
@series_name_for_instrumentation = DEFAULTS[:series_name_for_instrumentation]
|
137
|
+
@series_name_for_render_template = DEFAULTS[:series_name_for_render_template]
|
138
|
+
@series_name_for_render_partial = DEFAULTS[:series_name_for_render_partial]
|
139
|
+
@series_name_for_render_collection = DEFAULTS[:series_name_for_render_collection]
|
140
|
+
@series_name_for_sql = DEFAULTS[:series_name_for_sql]
|
141
|
+
|
142
|
+
@tags_middleware = DEFAULTS[:tags_middleware]
|
143
|
+
@rails_app_name = DEFAULTS[:rails_app_name]
|
144
|
+
|
145
|
+
@ignored_exceptions = DEFAULTS[:ignored_exceptions].dup
|
146
|
+
@ignored_exception_messages = DEFAULTS[:ignored_exception_messages].dup
|
147
|
+
@ignored_reports = DEFAULTS[:ignored_reports].dup
|
148
|
+
@ignored_environments = DEFAULTS[:ignored_environments].dup
|
149
|
+
@ignored_user_agents = DEFAULTS[:ignored_user_agents].dup
|
150
|
+
@backtrace_filters = DEFAULTS[:backtrace_filters].dup
|
151
|
+
@environment_variable_filters = DEFAULTS[:environment_variable_filters]
|
152
|
+
@aggregated_exception_classes = []
|
153
|
+
|
154
|
+
@debug = false
|
155
|
+
@rescue_global_exceptions = false
|
156
|
+
@instrumentation_enabled = true
|
157
|
+
end
|
158
|
+
|
159
|
+
# rubocop:enable Metrics/MethodLength
|
160
|
+
# rubocop:enable Metrics/AbcSize
|
161
|
+
|
162
|
+
def debug?
|
163
|
+
!!@debug # rubocop:disable Style/DoubleNegation
|
164
|
+
end
|
165
|
+
|
166
|
+
def instrumentation_enabled?
|
167
|
+
!!@instrumentation_enabled # rubocop:disable Style/DoubleNegation
|
168
|
+
end
|
169
|
+
|
170
|
+
def ignore_user_agent?(incoming_user_agent)
|
171
|
+
return false if ignored_user_agents.nil?
|
172
|
+
|
173
|
+
ignored_user_agents.any? { |agent| incoming_user_agent =~ /#{agent}/ }
|
174
|
+
end
|
175
|
+
|
176
|
+
def ignore_current_environment?
|
177
|
+
ignored_environments.include?(environment)
|
178
|
+
end
|
179
|
+
|
180
|
+
def ignore_exception?(ex)
|
181
|
+
!ignored_exception_messages.find { |msg| /.*#{msg}.*/ =~ ex.message }.nil? ||
|
182
|
+
ignored_exceptions.include?(ex.class.to_s)
|
183
|
+
end
|
184
|
+
|
185
|
+
def define_custom_exception_data(&block)
|
186
|
+
@custom_exception_data_handler = block
|
187
|
+
end
|
188
|
+
|
189
|
+
def add_custom_exception_data(exception_presenter)
|
190
|
+
@custom_exception_data_handler&.call(exception_presenter)
|
191
|
+
end
|
192
|
+
|
193
|
+
def load_rails_defaults
|
194
|
+
@logger ||= ::Rails.logger
|
195
|
+
@environment ||= ::Rails.env
|
196
|
+
@application_root ||= ::Rails.root
|
197
|
+
@application_name ||= ::Rails.application.class.parent_name
|
198
|
+
@framework = "Rails"
|
199
|
+
@framework_version = ::Rails.version
|
200
|
+
end
|
201
|
+
|
202
|
+
private
|
203
|
+
|
204
|
+
def initialize_http_connection
|
205
|
+
Net::HTTP.new(@app_host, "80")
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
# rubocop:enable Metrics/ClassLength
|
210
|
+
end
|
211
|
+
end
|