faulty 0.8.2 → 0.8.4

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: ff7d5c217cd03c4b1a752cef13a7547d0623f9810cb8c7602e91e8aa6a941358
4
- data.tar.gz: c6df02b5ac50a0078fb43cc03ee7fad9275f5fe41c471a4a649eda05e6fa1782
3
+ metadata.gz: 674bada595aee5985be78855425adc16fdb25faa2741cc548758e13ea002bb5a
4
+ data.tar.gz: 9144ec1b6051acbba1d4cc8cccd792826bd3aee831d4fa04c13b41a860150244
5
5
  SHA512:
6
- metadata.gz: 0bbd345bbfe4d1acd1ba941ae73ba51fdf7a954fe1ca7a87e214dcbb78f8b44de643cb8cc05d7eb7dbd95de9b767039dbe24535717712dcb4c22d641333a9e33
7
- data.tar.gz: afa9ccb28dec10f811c3076def8722323fb491b8e8e6ebf6f6917023a6c2a92eec515f0aaf86b74f9fd99f7947ce7e0e859358d6a16412675066a90e547d62ec
6
+ metadata.gz: 75a8f4cf1608f65f326c66c3682826542e469891cbad97ba31b3854e75899f1e694dc5925e072582c5ac35ce29c9838535f0aca0e17d24c05a2bc5b9796cecae
7
+ data.tar.gz: faa2361bc38bcb52917491eee6c499ef16114f100d844385e6eb799f531097e45780d2fc0db31447330cc1a3ef982fdd4bbfa45bb5a53fdec1ef776b7ae1f010
@@ -22,6 +22,11 @@ jobs:
22
22
  image: redis
23
23
  ports:
24
24
  - 6379:6379
25
+ elasticsearch:
26
+ image: elasticsearch:7.13.4
27
+ ports:
28
+ - 9200:9200
29
+ options: -e="discovery.type=single-node" --health-cmd="curl http://localhost:9200/_cluster/health" --health-interval=3s --health-timeout=5s --health-retries=20
25
30
  steps:
26
31
  - uses: actions/checkout@v2
27
32
  - uses: ruby/setup-ruby@v1
data/CHANGELOG.md CHANGED
@@ -1,8 +1,12 @@
1
- ## Releae v0.8.2
1
+ ## Release v0.8.4
2
+
3
+ * Add Elasticsearch client patch #44 justinhoward
4
+
5
+ ## Release v0.8.2
2
6
 
3
7
  * Fix crash for older versions of concurrent-ruby #42 justinhoward
4
8
 
5
- ## Releae v0.8.1
9
+ ## Release v0.8.1
6
10
 
7
11
  * Add cause message to CircuitTrippedError #40 justinhoward
8
12
  * Record failures for cache hits #41 justinhoward
data/Gemfile CHANGED
@@ -13,6 +13,8 @@ not_jruby = %i[ruby mingw x64_mingw].freeze
13
13
  gem 'activesupport', '>= 4.2'
14
14
  gem 'bundler', '>= 1.17', '< 3'
15
15
  gem 'byebug', platforms: not_jruby
16
+ # Open source licensed elasticsearch
17
+ gem 'elasticsearch', '> 7', '< 7.14'
16
18
  gem 'honeybadger', '>= 2.0'
17
19
  gem 'irb', '~> 1.0'
18
20
  # Minimum of 0.5.0 for specific error classes
data/README.md CHANGED
@@ -84,6 +84,7 @@ Also see "Release It!: Design and Deploy Production-Ready Software" by
84
84
  * [Patches](#patches)
85
85
  + [Patch::Redis](#patchredis)
86
86
  + [Patch::Mysql2](#patchmysql2)
87
+ + [Patch::Elasticsearch](#patchelasticsearch)
87
88
  * [Event Handling](#event-handling)
88
89
  + [CallbackListener](#callbacklistener)
89
90
  + [Other Built-in Listeners](#other-built-in-listeners)
@@ -1046,6 +1047,38 @@ mysql = Mysql2::Client.new(host: '127.0.0.1')
1046
1047
  mysql.query('SELECT * FROM users') # not protected by a circuit
1047
1048
  ```
1048
1049
 
1050
+ ### Patch::Elasticsearch
1051
+
1052
+ [`Faulty::Patch::Elasticsearch`](https://www.rubydoc.info/gems/faulty/Faulty/Patch/Elasticsearch)
1053
+ protects a `Elasticsearch::Client` with an internal circuit. Pass a `:faulty` key along
1054
+ with your client options to enable the circuit breaker.
1055
+
1056
+ ```ruby
1057
+ require 'faulty/patch/elasticsearch'
1058
+
1059
+ es = Elasticsearch::Client.new(url: 'localhost:9200', faulty: {
1060
+ # The name for the Elasticsearch::Client circuit
1061
+ name: 'elasticsearch'
1062
+
1063
+ # The faulty instance to use
1064
+ # This can also be a registered faulty instance or a constant name. See API
1065
+ # docs for more details
1066
+ instance: Faulty.default
1067
+
1068
+ # By default, circuit errors will be subclasses of
1069
+ # Elasticsearch::Transport::Transport::Error
1070
+ # To disable this behavior, set patch_errors to false and Faulty
1071
+ # will raise its default errors
1072
+ patch_errors: true
1073
+ })
1074
+ ```
1075
+
1076
+ If you're using Searchkick, you can configure Faulty with `client_options`.
1077
+
1078
+ ```ruby
1079
+ Searchkick.client_options[:faulty] = { name: 'searchkick' }
1080
+ ```
1081
+
1049
1082
  ## Event Handling
1050
1083
 
1051
1084
  Faulty uses an event-dispatching model to deliver notifications of internal
@@ -1300,7 +1333,8 @@ but there are and have been many other options:
1300
1333
  - [circuit_breaker-ruby](https://github.com/scripbox/circuit_breaker-ruby) (no
1301
1334
  recent activity)
1302
1335
  - [stoplight](https://github.com/orgsync/stoplight) (unmaintained)
1303
- - [circuit_breaker](https://github.com/wooga/circuit_breaker) (archived)
1336
+ - [circuit_breaker](https://github.com/wsargent/circuit_breaker) (no recent
1337
+ activity)
1304
1338
  - [simple_circuit_breaker](https://github.com/soundcloud/simple_circuit_breaker)
1305
1339
  (unmaintained)
1306
1340
  - [breaker](https://github.com/ahawkins/breaker) (unmaintained)
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'elasticsearch'
4
+
5
+ class Faulty
6
+ module Patch
7
+ # Patch Elasticsearch to run requests in a circuit
8
+ #
9
+ # This module is not required by default
10
+ #
11
+ # Pass a `:faulty` key into your Elasticsearch client options to enable
12
+ # circuit protection. See {Patch.circuit_from_hash} for the available
13
+ # options.
14
+ #
15
+ # By default, all circuit errors raised by this patch inherit from
16
+ # `::Elasticsearch::Transport::Transport::Error`. One side effect of the way
17
+ # this patch wraps errors is that `host_unreachable_exceptions` raised by
18
+ # the inner transport adapters are converted into
19
+ # `Elasticsearch::Transport::Transport::Error` instead of the transport
20
+ # error type such as `Faraday::ConnectionFailed`.
21
+ #
22
+ # @example
23
+ # require 'faulty/patch/elasticsearch'
24
+ #
25
+ # es = Elasticsearch::Client.new(url: 'http://localhost:9200', faulty: {})
26
+ # es.search(q: 'test') # raises Faulty::CircuitError if connection fails
27
+ #
28
+ # # If the faulty key is not given, no circuit is used
29
+ # es = Elasticsearch::Client.new(url: 'http://localhost:9200', faulty: {})
30
+ # es.search(q: 'test') # not protected by a circuit
31
+ #
32
+ # # With Searchkick
33
+ # Searchkick.client_options[:faulty] = {}
34
+ #
35
+ # @see Patch.circuit_from_hash
36
+ module Elasticsearch
37
+ include Base
38
+
39
+ Patch.define_circuit_errors(self, ::Elasticsearch::Transport::Transport::Error)
40
+
41
+ def initialize(arguments = {}, &block)
42
+ super
43
+
44
+ errors = [::Elasticsearch::Transport::Transport::Error]
45
+ errors.concat(@transport.host_unreachable_exceptions)
46
+
47
+ @faulty_circuit = Patch.circuit_from_hash(
48
+ 'elasticsearch',
49
+ arguments[:faulty],
50
+ errors: errors,
51
+ patched_error_module: Faulty::Patch::Elasticsearch
52
+ )
53
+ end
54
+
55
+ # Protect all elasticsearch requests
56
+ def perform_request(*args)
57
+ faulty_run { super }
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ ::Elasticsearch::Transport::Client.prepend(Faulty::Patch::Elasticsearch)
@@ -20,6 +20,9 @@ class Faulty
20
20
  # protected by the circuit. This is to allow open transactions to be closed
21
21
  # if possible.
22
22
  #
23
+ # By default, all circuit errors raised by this patch inherit from
24
+ # `::Mysql2::Error::ConnectionError`
25
+ #
23
26
  # @example
24
27
  # require 'faulty/patch/mysql2'
25
28
  #
@@ -12,6 +12,9 @@ class Faulty
12
12
  # circuit protection. See {Patch.circuit_from_hash} for the available
13
13
  # options.
14
14
  #
15
+ # By default, all circuit errors raised by this patch inherit from
16
+ # `::Redis::BaseConnectionError`
17
+ #
15
18
  # @example
16
19
  # require 'faulty/patch/redis'
17
20
  #
@@ -3,6 +3,6 @@
3
3
  class Faulty
4
4
  # The current Faulty version
5
5
  def self.version
6
- Gem::Version.new('0.8.2')
6
+ Gem::Version.new('0.8.4')
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faulty
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.2
4
+ version: 0.8.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Howard
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-18 00:00:00.000000000 Z
11
+ date: 2022-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -170,6 +170,7 @@ files:
170
170
  - lib/faulty/immutable_options.rb
171
171
  - lib/faulty/patch.rb
172
172
  - lib/faulty/patch/base.rb
173
+ - lib/faulty/patch/elasticsearch.rb
173
174
  - lib/faulty/patch/mysql2.rb
174
175
  - lib/faulty/patch/redis.rb
175
176
  - lib/faulty/result.rb