govuk_app_config 2.4.0 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8c0b9c8e27eb3dca58e8a3f69f8d450d40e8dd414955ed5813da2da0f354f065
4
- data.tar.gz: 9b31177222e5d6379c0fef90c8877315bd4d287050de76c73bbd1f5850735e71
3
+ metadata.gz: 42c7ced77e0c6592acdcbd98f489a2ed0ac60e7651aad238f4a4cdaa5f840952
4
+ data.tar.gz: 577864e98f093d456e3c3f911a8b67bd09dd7f25d9484da63fad8fb1473d19a9
5
5
  SHA512:
6
- metadata.gz: ecd1be01ef33495bf0c7475aa41c79961ce6cff6b8fe450fbb8705843da4b4ed713cf6dc67d04e16f0a950ead32d8705cd20ae7aabaab33de76a2d626f8d80e0
7
- data.tar.gz: e7af13588d6de9cd2ae2ba2e284001e1c6ff6f5cdf9f0fc07cc459905224aae076a5d4c25f1f208f6926f59717bf51328a27b3077f6d9c3bd358b61cb2659fdc
6
+ metadata.gz: 1b19a36fda15dd6a28ca60ab34bfd2b7f1c5ff0c078912f79b8a7936afe69723f5ce8812b3dc1d61afd3eb194eb6de56ecc8e2ac1de5ed7d0d81a507eb457393
7
+ data.tar.gz: 0ada829997c9a0f659b08dd5095c57420d37d1f0c47e6ddfc82ecbf4ab28e32ccd5a512d9907512020431b5ad6a80374bf9be622d4455ffa5f4e603888869d3e
@@ -1,11 +1,30 @@
1
+ # 2.6.0
2
+
3
+ * Ignore errors that occur in temporary environments (adds `active_sentry_environments` config) (https://github.com/alphagov/govuk_app_config/pull/168)
4
+
5
+ # 2.5.2
6
+
7
+ * Fix govuk_app_config in Ruby 2.7 environments by explicitly requiring the 'delegate' library (https://github.com/alphagov/govuk_app_config/pull/167)
8
+
9
+ # 2.5.1
10
+
11
+ * Increase scope of `data_sync_excluded_exceptions` so that it includes subclasses (https://github.com/alphagov/govuk_app_config/pull/165)
12
+
13
+ # 2.5.0
14
+
15
+ * Use delegator pattern for `GovukError.configure`, to allow custom `should_capture` (https://github.com/alphagov/govuk_app_config/pull/160)
16
+
17
+ # 2.4.1
18
+
19
+ * Bump 'sentry-raven' to 3.1.1 to improve grouping of errors (https://github.com/alphagov/govuk_app_config/pull/162)
20
+
1
21
  # 2.4.0
2
22
 
3
- * Add new GovukHealthcheck::Mongoid check
4
- * Add new GovukHealthcheck::RailsCache check
23
+ * Add new GovukHealthcheck::Mongoid and GovukHealthcheck::RailsCache health checks (https://github.com/alphagov/govuk_app_config/pull/161)
5
24
 
6
25
  # 2.3.0
7
26
 
8
- * Remove unused SidekiqQueueSizeCheck healthcheck base class
27
+ * Remove unused SidekiqQueueSizeCheck healthcheck base class (https://github.com/alphagov/govuk_app_config/pull/156)
9
28
 
10
29
  # 2.2.2
11
30
 
data/README.md CHANGED
@@ -51,7 +51,7 @@ If you include `govuk_app_config` in your `Gemfile`, Rails' autoloading mechanis
51
51
  Your app will have to have the following environment variables set:
52
52
 
53
53
  - `SENTRY_DSN` - the [Data Source Name (DSN)][dsn] for Sentry
54
- - `SENTRY_CURRENT_ENV` - production, staging or integration
54
+ - `SENTRY_CURRENT_ENV` - e.g. "production". Make sure it is [configured to be active](#active-sentry-environments).
55
55
  - `GOVUK_STATSD_PREFIX` - a Statsd prefix like `govuk.apps.application-name.hostname`
56
56
 
57
57
  [dsn]: https://docs.sentry.io/quickstart/#about-the-dsn
@@ -79,6 +79,18 @@ GovukError.notify(
79
79
  )
80
80
  ```
81
81
 
82
+ ### Active Sentry environments
83
+
84
+ GovukError will only send errors to Sentry if your `SENTRY_CURRENT_ENV` matches one of the 'active environments' in the [default configuration](https://github.com/alphagov/govuk_app_config/blob/master/lib/govuk_app_config/govuk_error/configure.rb). This is to prevent temporary test environments from flooding our Sentry account with errors.
85
+
86
+ You can add your environment to the list of active Sentry environments like so:
87
+
88
+ ```ruby
89
+ GovukError.configure do |config|
90
+ config.active_sentry_environments << "my-test-environment"
91
+ end
92
+ ```
93
+
82
94
  ### Error configuration
83
95
 
84
96
  You can exclude certain errors from being reported using this:
@@ -89,6 +101,27 @@ GovukError.configure do |config|
89
101
  end
90
102
  ```
91
103
 
104
+ And you can exclude errors from being reported if they occur during the nightly data sync (on integration and staging):
105
+
106
+ ```ruby
107
+ GovukError.configure do |config|
108
+ config.data_sync_excluded_exceptions << "PG::Error"
109
+ end
110
+ ```
111
+
112
+ Finally, you can pass your own callback to evaluate whether or not to capture the exception.
113
+ Note that if an exception is on the `excluded_exceptions` list, or on the `data_sync_excluded_exceptions`
114
+ and occurs at the time of a data sync, then it will be excluded even if the custom
115
+ `should_capture` callback returns `true`.
116
+
117
+ ```ruby
118
+ GovukError.configure do |config|
119
+ config.should_capture = lambda do |error_or_event|
120
+ error_or_event == "do capture"
121
+ end
122
+ end
123
+ ```
124
+
92
125
  `GovukError.configure` has the same options as the Sentry client, Raven. See [the Raven docs for all configuration options](https://docs.sentry.io/clients/ruby/config).
93
126
 
94
127
  ## Statsd
@@ -21,10 +21,11 @@ Gem::Specification.new do |spec|
21
21
  spec.require_paths = %w[lib]
22
22
 
23
23
  spec.add_dependency "logstasher", ">= 1.2.2", "< 1.4.0"
24
- spec.add_dependency "sentry-raven", ">= 2.7.1", "< 3.1.0"
24
+ spec.add_dependency "sentry-raven", "~> 3.1.1"
25
25
  spec.add_dependency "statsd-ruby", "~> 1.4.0"
26
26
  spec.add_dependency "unicorn", ">= 5.4", "< 5.8"
27
27
 
28
+ spec.add_development_dependency "byebug"
28
29
  spec.add_development_dependency "climate_control"
29
30
  spec.add_development_dependency "rack-test", "~> 1.1.0"
30
31
  spec.add_development_dependency "rails", "~> 6"
@@ -1,11 +1,11 @@
1
1
  require "govuk_app_config/version"
2
2
  require "govuk_app_config/govuk_statsd"
3
3
  require "govuk_app_config/govuk_error"
4
+ require "govuk_app_config/govuk_error/configure"
4
5
  require "govuk_app_config/govuk_healthcheck"
5
6
  # This require is deprecated and should be removed on next major version bump
6
7
  # and should be required by applications directly.
7
8
  require "govuk_app_config/govuk_unicorn"
8
- require "govuk_app_config/configure"
9
9
 
10
10
  if defined?(Rails)
11
11
  require "govuk_app_config/govuk_logging"
@@ -1,5 +1,6 @@
1
1
  require "sentry-raven"
2
2
  require "govuk_app_config/govuk_statsd"
3
+ require "govuk_app_config/govuk_error/configuration"
3
4
 
4
5
  module GovukError
5
6
  def self.notify(exception_or_message, args = {})
@@ -12,8 +13,7 @@ module GovukError
12
13
  end
13
14
 
14
15
  def self.configure
15
- Raven.configure do |config|
16
- yield(config)
17
- end
16
+ @configuration ||= Configuration.new(Raven.configuration)
17
+ yield @configuration
18
18
  end
19
19
  end
@@ -0,0 +1,55 @@
1
+ require "delegate"
2
+ require "govuk_app_config/govuk_error/govuk_data_sync"
3
+
4
+ module GovukError
5
+ class Configuration < SimpleDelegator
6
+ attr_reader :data_sync, :sentry_environment
7
+ attr_accessor :active_sentry_environments, :data_sync_excluded_exceptions
8
+
9
+ def initialize(_raven_configuration)
10
+ super
11
+ @sentry_environment = ENV["SENTRY_CURRENT_ENV"]
12
+ @data_sync = GovukDataSync.new(ENV["GOVUK_DATA_SYNC_PERIOD"])
13
+ self.active_sentry_environments = []
14
+ self.data_sync_excluded_exceptions = []
15
+ self.should_capture = ignore_exceptions_based_on_env_and_data_sync
16
+ end
17
+
18
+ def should_capture=(closure)
19
+ combined = lambda do |error_or_event|
20
+ (ignore_exceptions_based_on_env_and_data_sync.call(error_or_event) && closure.call(error_or_event))
21
+ end
22
+
23
+ super(combined)
24
+ end
25
+
26
+ protected
27
+
28
+ def ignore_exceptions_based_on_env_and_data_sync
29
+ lambda do |error_or_event|
30
+ ignore_exceptions_if_not_in_active_sentry_env.call(error_or_event) &&
31
+ ignore_excluded_exceptions_in_data_sync.call(error_or_event)
32
+ end
33
+ end
34
+
35
+ def ignore_exceptions_if_not_in_active_sentry_env
36
+ ->(_error_or_event) { active_sentry_environments.include?(sentry_environment) }
37
+ end
38
+
39
+ def ignore_excluded_exceptions_in_data_sync
40
+ lambda { |error_or_event|
41
+ data_sync_ignored_error = data_sync_excluded_exceptions.any? do |exception_to_ignore|
42
+ exception_to_ignore = Object.const_get(exception_to_ignore) unless exception_to_ignore.is_a?(Module)
43
+ exception_chain = Raven::Utils::ExceptionCauseChain.exception_to_array(error_or_event)
44
+ exception_chain.any? { |exception| exception.is_a?(exception_to_ignore) }
45
+ rescue NameError
46
+ # the exception type represented by the exception_to_ignore string
47
+ # doesn't even exist in this environment, so won't be found in the chain
48
+ false
49
+ end
50
+
51
+ !(data_sync.in_progress? && data_sync_ignored_error)
52
+ }
53
+ end
54
+ end
55
+ end
@@ -7,6 +7,16 @@ GovukError.configure do |config|
7
7
 
8
8
  config.silence_ready = !Rails.env.production? if defined?(Rails)
9
9
 
10
+ # These are the environments (described by the `SENTRY_CURRENT_ENV`
11
+ # ENV variable) where we want to capture Sentry errors. If
12
+ # `SENTRY_CURRENT_ENV` isn't in this list, or isn't defined, then
13
+ # don't capture the error.
14
+ config.active_sentry_environments = %w[
15
+ integration-blue-aws
16
+ staging
17
+ production
18
+ ]
19
+
10
20
  config.excluded_exceptions = [
11
21
  # Default ActionDispatch rescue responses
12
22
  "ActionController::RoutingError",
@@ -43,6 +53,15 @@ GovukError.configure do |config|
43
53
  # Rails will raise a ActionView::Template::Error, instead of the original error.
44
54
  config.inspect_exception_causes_for_exclusion = true
45
55
 
56
+ # List of exceptions to ignore if they take place during the data sync.
57
+ # Some errors are transient in nature, e.g. PostgreSQL databases being
58
+ # unavailable, and add little value. In fact, their presence can greatly
59
+ # increase the number of errors being sent and risk genuine errors being
60
+ # rate-limited by Sentry.
61
+ config.data_sync_excluded_exceptions = [
62
+ "PG::Error",
63
+ ]
64
+
46
65
  config.transport_failure_callback = proc {
47
66
  GovukStatsd.increment("error_reports_failed")
48
67
  }
@@ -0,0 +1,50 @@
1
+ require "time"
2
+
3
+ module GovukError
4
+ class GovukDataSync
5
+ class MalformedDataSyncPeriod < RuntimeError
6
+ attr_reader :invalid_value
7
+
8
+ def initialize(invalid_value)
9
+ @invalid_value = invalid_value
10
+ end
11
+
12
+ def message
13
+ "\"#{invalid_value}\" is not a valid value (should be of form '22:00-03:00')."
14
+ end
15
+ end
16
+
17
+ attr_reader :from, :to
18
+
19
+ def initialize(govuk_data_sync_period)
20
+ return if govuk_data_sync_period.nil?
21
+
22
+ parts = govuk_data_sync_period.split("-")
23
+ raise MalformedDataSyncPeriod, govuk_data_sync_period unless parts.count == 2
24
+
25
+ @from, @to = parts.map { |time| Time.parse(time) }
26
+ rescue ArgumentError
27
+ raise MalformedDataSyncPeriod, govuk_data_sync_period
28
+ end
29
+
30
+ def in_progress?
31
+ from.present? && to.present? && in_time_range?(from, to)
32
+ end
33
+
34
+ private
35
+
36
+ # `from`/`to` times are in relation to the local server time, which is expected to be in UTC as per:
37
+ # https://github.com/alphagov/govuk-puppet/blob/b588e4ade996e97b8975e69cb00800521fff4a48/modules/govuk_envsys/files/etc/environment#L3
38
+ def in_time_range?(from, to)
39
+ hour_is_in_range = Time.now.hour >= from.hour || Time.now.hour <= to.hour
40
+ minute_is_in_range = if Time.now.hour == from.hour
41
+ Time.now.min >= from.min
42
+ elsif Time.now.hour == to.hour
43
+ Time.now.min <= to.min
44
+ else
45
+ true
46
+ end
47
+ hour_is_in_range && minute_is_in_range
48
+ end
49
+ end
50
+ end
@@ -1,3 +1,3 @@
1
1
  module GovukAppConfig
2
- VERSION = "2.4.0".freeze
2
+ VERSION = "2.6.0".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: govuk_app_config
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0
4
+ version: 2.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GOV.UK Dev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-14 00:00:00.000000000 Z
11
+ date: 2020-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logstasher
@@ -34,22 +34,16 @@ dependencies:
34
34
  name: sentry-raven
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- version: 2.7.1
40
- - - "<"
37
+ - - "~>"
41
38
  - !ruby/object:Gem::Version
42
- version: 3.1.0
39
+ version: 3.1.1
43
40
  type: :runtime
44
41
  prerelease: false
45
42
  version_requirements: !ruby/object:Gem::Requirement
46
43
  requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- version: 2.7.1
50
- - - "<"
44
+ - - "~>"
51
45
  - !ruby/object:Gem::Version
52
- version: 3.1.0
46
+ version: 3.1.1
53
47
  - !ruby/object:Gem::Dependency
54
48
  name: statsd-ruby
55
49
  requirement: !ruby/object:Gem::Requirement
@@ -84,6 +78,20 @@ dependencies:
84
78
  - - "<"
85
79
  - !ruby/object:Gem::Version
86
80
  version: '5.8'
81
+ - !ruby/object:Gem::Dependency
82
+ name: byebug
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
87
95
  - !ruby/object:Gem::Dependency
88
96
  name: climate_control
89
97
  requirement: !ruby/object:Gem::Requirement
@@ -218,9 +226,11 @@ files:
218
226
  - docs/healthchecks.md
219
227
  - govuk_app_config.gemspec
220
228
  - lib/govuk_app_config.rb
221
- - lib/govuk_app_config/configure.rb
222
229
  - lib/govuk_app_config/govuk_content_security_policy.rb
223
230
  - lib/govuk_app_config/govuk_error.rb
231
+ - lib/govuk_app_config/govuk_error/configuration.rb
232
+ - lib/govuk_app_config/govuk_error/configure.rb
233
+ - lib/govuk_app_config/govuk_error/govuk_data_sync.rb
224
234
  - lib/govuk_app_config/govuk_healthcheck.rb
225
235
  - lib/govuk_app_config/govuk_healthcheck/active_record.rb
226
236
  - lib/govuk_app_config/govuk_healthcheck/checkup.rb