govuk_app_config 2.4.0 → 2.6.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.
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