sbmt-outbox 6.3.0 → 6.4.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: d936531e4d8411170774717a4a325846ee05ad292027285a8a6dd1a337c7bb9f
4
- data.tar.gz: 46a7e007d5f3be785b7616e0eb683354cbdb6654663f744914e3309441aa1a52
3
+ metadata.gz: aed7afb062770ab592517d363d16fa57428a29b9e67ec83eb65c5ceacbfba714
4
+ data.tar.gz: eafe1f3ea486c9913a82508a7e20a423e6eb6789651d7cb0642e706fa233a609
5
5
  SHA512:
6
- metadata.gz: 5ff4f4b9b1d3e5e9260b227b4781a66233908c36023cae98d4ab8344baa612b9f0195a02d930054fa3ecf51f256518c7d05a36083887eccc67cb39cb25592c67
7
- data.tar.gz: 52d88f0391854c934059f21daff079f242e736536efd4ac0bfad2edb7b595f4027c0b3bdf44dd469a6058e26d5a7e4f9c1d811793af0f8a2ebfaf370d0da1f25
6
+ metadata.gz: e58e6a80a6bd1a2ec1f9f41816d2b70532ae2e58b29f8588d5c326d22617fdbeb8e321fa70d2d02773ac6d0ff07403047351eb7ea89ff1597b9708ff66b69909
7
+ data.tar.gz: fe734a0361f7a749b23f63074faa5c3c1d3b9c92fad1e997ca4603a64a2efb30550f7a62c22a96f2830c0ef8fb1be0650fb6cd7a3a62100a63245d3631834580
data/README.md CHANGED
@@ -3,12 +3,12 @@
3
3
 
4
4
  # Sbmt-Outbox
5
5
 
6
+ <img src="https://raw.githubusercontent.com/SberMarket-Tech/sbmt-outbox/master/.github/outbox-logo.png" alt="sbmt-outbox logo" height="220" align="right" />
7
+
6
8
  Microservices often publish messages after a transaction has been committed. Writing to the database and publishing a message are two separate transactions, so they must be atomic. A failed publication of a message could lead to a critical failure of the business process.
7
9
 
8
10
  The Outbox pattern provides a reliable solution for message publishing. The idea behind this approach is to have an "outgoing message table" in the service's database. Before the main transaction completes, a new message row is added to this table. As a result, two actions take place as part of a single transaction. An asynchronous process retrieves new rows from the database table and, if they exist, publishes the messages to the broker.
9
11
 
10
- Read more about the Outbox pattern at https://microservices.io/patterns/data/transactional-outbox.html
11
-
12
12
  ## Installation
13
13
 
14
14
  Add this line to your application's Gemfile:
@@ -224,7 +224,11 @@ The `outbox.yml` configuration file is the main configuration for the gem, where
224
224
  default: &default
225
225
  owner: foo-team # optional, used in Yabeda metrics
226
226
  bucket_size: 16 # optional, default 16, see into about the buckets at the #Concurrency section
227
+ metrics:
228
+ enabled: true # default false, yabeda server autostart with port: 9090 and path: /metrics
229
+ port: 9090 # optional, default, used in Yabeda metrics
227
230
  probes:
231
+ enabled: false # optional, default true
228
232
  port: 5555 # default, used for Kubernetes probes
229
233
 
230
234
  outbox_items: # outbox items section
@@ -6,7 +6,7 @@ module Sbmt
6
6
  class InboxClassesController < BaseController
7
7
  def index
8
8
  render_list(Sbmt::Outbox.inbox_item_classes.map do |item|
9
- Sbmt::Outbox::Api::InboxClass.find_or_initialize(item.box_name)
9
+ Sbmt::Outbox::Api::InboxClass.find_or_initialize(item.box_id)
10
10
  end)
11
11
  end
12
12
 
@@ -6,7 +6,7 @@ module Sbmt
6
6
  class OutboxClassesController < BaseController
7
7
  def index
8
8
  render_list(Sbmt::Outbox.outbox_item_classes.map do |item|
9
- Api::OutboxClass.find_or_initialize(item.box_name)
9
+ Api::OutboxClass.find_or_initialize(item.box_id)
10
10
  end)
11
11
  end
12
12
 
@@ -16,8 +16,12 @@ module Sbmt
16
16
  @box_name ||= name.underscore
17
17
  end
18
18
 
19
+ def box_id
20
+ @box_id ||= name.underscore.tr("/", "-").dasherize
21
+ end
22
+
19
23
  def config
20
- @config ||= lookup_config.new(box_name)
24
+ @config ||= lookup_config.new(box_id: box_id, box_name: box_name)
21
25
  end
22
26
 
23
27
  def calc_bucket_partitions(count)
@@ -8,7 +8,8 @@ module Sbmt
8
8
 
9
9
  delegate :yaml_config, :memory_store, to: "Sbmt::Outbox"
10
10
 
11
- def initialize(box_name)
11
+ def initialize(box_id:, box_name:)
12
+ self.box_id = box_id
12
13
  self.box_name = box_name
13
14
 
14
15
  validate!
@@ -109,7 +110,7 @@ module Sbmt
109
110
 
110
111
  private
111
112
 
112
- attr_accessor :box_name
113
+ attr_accessor :box_id, :box_name
113
114
 
114
115
  def options
115
116
  @options ||= lookup_config || {}
@@ -129,8 +130,8 @@ module Sbmt
129
130
  end
130
131
 
131
132
  def polling_enabled_for?(api_model)
132
- record = memory_store.fetch("sbmt/outbox/outbox_item_config/#{box_name}", expires_in: 10) do
133
- api_model.find(box_name)
133
+ record = memory_store.fetch("sbmt/outbox/outbox_item_config/#{box_id}", expires_in: 10) do
134
+ api_model.find(box_id)
134
135
  end
135
136
 
136
137
  if record.nil?
@@ -1,6 +1,8 @@
1
1
  default: &default
2
2
  owner: owner-team
3
3
  bucket_size: 16
4
+ metrics:
5
+ enabled: true
4
6
 
5
7
  probes:
6
8
  port: SET-UP-YOUR-HEALTHCHECK-PORT-HERE
@@ -69,8 +69,8 @@ module Sbmt
69
69
  $stdout.puts AsciiArt.logo
70
70
  $stdout.puts "Outbox/Inbox worker has been started"
71
71
  $stdout.puts "Version: #{VERSION}"
72
- $stdout.puts "Starting probes..."
73
72
  Sbmt::Outbox::Probes::Probe.run_probes
73
+ Sbmt::Outbox::Probes::Metrics.run_metrics
74
74
 
75
75
  worker.start
76
76
  end
@@ -22,7 +22,7 @@ module Sbmt
22
22
  c.ui = ActiveSupport::OrderedOptions.new.tap do |c|
23
23
  c.serve_local = false
24
24
  c.local_endpoint = "http://localhost:5173"
25
- c.cdn_url = "https://cdn.jsdelivr.net/npm/sbmt-outbox-ui@0.0.7/dist/assets/index.js"
25
+ c.cdn_url = "https://cdn.jsdelivr.net/npm/sbmt-outbox-ui@0.0.8/dist/assets/index.js"
26
26
  end
27
27
  c.process_items = ActiveSupport::OrderedOptions.new.tap do |c|
28
28
  c.general_timeout = 120
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sbmt
4
+ module Outbox
5
+ module Probes
6
+ class Metrics
7
+ DEFAULT_YABEDA_PORT = 9090
8
+ DEFAULT_YABEDA_PATH = "/metrics"
9
+ class << self
10
+ def run_metrics
11
+ return unless autostart_yabeda_server?
12
+
13
+ if defined?(Yabeda)
14
+ $stdout.puts "Starting metrics http-server..."
15
+
16
+ start_webrick(
17
+ Yabeda::Prometheus::Mmap::Exporter::NOT_FOUND_HANDLER,
18
+ middlewares: {::Yabeda::Prometheus::Exporter => {path: DEFAULT_YABEDA_PATH}},
19
+ port: yabeda_port
20
+ )
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def yabeda_port
27
+ Sbmt::Outbox.yaml_config.dig(:metrics, :port) || DEFAULT_YABEDA_PORT
28
+ end
29
+
30
+ def start_webrick(app, middlewares:, port:)
31
+ Thread.new do
32
+ ::Rack::Handler::WEBrick.run(
33
+ ::Rack::Builder.new do
34
+ middlewares.each do |middleware, options|
35
+ use middleware, **options
36
+ end
37
+ run app
38
+ end,
39
+ Host: "0.0.0.0",
40
+ Port: port
41
+ )
42
+ end
43
+ end
44
+
45
+ def autostart_yabeda_server?
46
+ Sbmt::Outbox.yaml_config.dig(:metrics, :enabled) || false
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -7,6 +7,10 @@ module Sbmt
7
7
  DEFAULT_PROBE_PORT = 5555
8
8
  class << self
9
9
  def run_probes
10
+ return unless autostart_probe?
11
+
12
+ $stdout.puts "Starting probes..."
13
+
10
14
  ::HttpHealthCheck.run_server_async(
11
15
  port: probe_port,
12
16
  rack_app: HttpHealthCheck::RackApp.configure do |c|
@@ -31,6 +35,12 @@ module Sbmt
31
35
 
32
36
  Sbmt::Outbox.yaml_config.fetch(:probes).fetch(:port)
33
37
  end
38
+
39
+ def autostart_probe?
40
+ value = Sbmt::Outbox.yaml_config.dig(:probes, :enabled)
41
+ value = true if value.nil?
42
+ value
43
+ end
34
44
  end
35
45
  end
36
46
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sbmt
4
4
  module Outbox
5
- VERSION = "6.3.0"
5
+ VERSION = "6.4.0"
6
6
  end
7
7
  end
data/lib/sbmt/outbox.rb CHANGED
@@ -38,6 +38,7 @@ require_relative "outbox/engine"
38
38
  require_relative "outbox/middleware/builder"
39
39
  require_relative "outbox/middleware/runner"
40
40
  require_relative "outbox/probes/probe"
41
+ require_relative "outbox/probes/metrics"
41
42
  require_relative "outbox/redis_client_factory"
42
43
 
43
44
  module Sbmt
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sbmt-outbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.3.0
4
+ version: 6.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sbermarket Ruby-Platform Team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-04-23 00:00:00.000000000 Z
11
+ date: 2024-05-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: connection_pool
@@ -586,6 +586,7 @@ files:
586
586
  - lib/sbmt/outbox/middleware/sentry/tracing_batch_process_middleware.rb
587
587
  - lib/sbmt/outbox/middleware/sentry/tracing_item_process_middleware.rb
588
588
  - lib/sbmt/outbox/middleware/sentry/transaction.rb
589
+ - lib/sbmt/outbox/probes/metrics.rb
589
590
  - lib/sbmt/outbox/probes/probe.rb
590
591
  - lib/sbmt/outbox/redis_client_factory.rb
591
592
  - lib/sbmt/outbox/tasks/delete_failed_items.rake