pg_easy_replicate 0.3.2 → 0.3.3

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: 62d1f99ef5e2e12aa5969d9bda1a0e9d4df32a61102d712e3409386ca9e35697
4
- data.tar.gz: 074aaabbd3be3ceef65bc3949f91d694d9d597ba7e49000c8fcf01d8ccb425a7
3
+ metadata.gz: 5861f7f038a1d9c632eeab71e7195019041846f98f22297d3e148070e150f3f0
4
+ data.tar.gz: f3187c00bc0625954ac3c1b9f5a6847782383d198e5c04f2b6597d61a7d83e4d
5
5
  SHA512:
6
- metadata.gz: d504dfa0c0d41e3f095186a65e0103ce297a65104d6c130b479dae199992455e0732215d9748914f71c3b2fb33db9735d619b3ad59226f0103f78a9b47701bad
7
- data.tar.gz: d99b662637e65c6e9547f081dcecb51fc34ef29c3c5ed38e23f3b4e12d94c1861c8a3420f1bef1fbc79167dd9d709f1c9ba191cb16e57882c385083cf3d88951
6
+ metadata.gz: 60fe3ae088cab65b1a1ec5168e62cfed7f1ef1141a85a438481b05b798e143d2728f970771092094ee9ef643fdced7373a361fee5dca36a27074799370f142e7
7
+ data.tar.gz: 4267418bfd99ab8327f0d89e20a85062d06e1b8a0b5d6086afdb531ce7f3f91229015c611c9629bb2c471fedddada07974954bffa0cbd3ca18cd1bf7c7ac6a05
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## [0.3.2] - 2024-08-31
2
+
3
+ - DDL: Support table column rename - #157
4
+
5
+ ## [0.3.0] - 2024-08-31
6
+
7
+ - Support DDL Tracking by - #155
8
+ - `recreate-indices-post-copy` now defaults to `false`
9
+
1
10
  ## [0.2.6] - 2024-06-04
2
11
 
3
12
  - Quote table name in the VACUUM SQL - #118
data/Gemfile.lock CHANGED
@@ -1,11 +1,11 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pg_easy_replicate (0.3.2)
4
+ pg_easy_replicate (0.3.3)
5
5
  ougai (~> 2.0.0)
6
6
  pg (~> 1.5.3)
7
7
  pg_query (~> 5.1.0)
8
- sequel (>= 5.69, < 5.84)
8
+ sequel (>= 5.69, < 5.87)
9
9
  thor (>= 1.2.2, < 1.4.0)
10
10
 
11
11
  GEM
@@ -15,10 +15,10 @@ GEM
15
15
  bigdecimal (3.1.8)
16
16
  coderay (1.1.3)
17
17
  diff-lcs (1.5.1)
18
- google-protobuf (4.28.0-arm64-darwin)
18
+ google-protobuf (4.28.2-arm64-darwin)
19
19
  bigdecimal
20
20
  rake (>= 13)
21
- google-protobuf (4.28.0-x86_64-linux)
21
+ google-protobuf (4.28.2-x86_64-linux)
22
22
  bigdecimal
23
23
  rake (>= 13)
24
24
  haml (6.1.1)
@@ -31,24 +31,23 @@ GEM
31
31
  oj (3.14.3)
32
32
  ougai (2.0.0)
33
33
  oj (~> 3.10)
34
- parallel (1.25.1)
35
- parser (3.3.3.0)
34
+ parallel (1.26.3)
35
+ parser (3.3.5.0)
36
36
  ast (~> 2.4.1)
37
37
  racc
38
- pg (1.5.7)
38
+ pg (1.5.9)
39
39
  pg_query (5.1.0)
40
40
  google-protobuf (>= 3.22.3)
41
41
  prettier_print (1.2.1)
42
42
  pry (0.14.2)
43
43
  coderay (~> 1.1)
44
44
  method_source (~> 1.0)
45
- racc (1.8.0)
45
+ racc (1.8.1)
46
46
  rainbow (3.1.1)
47
47
  rake (13.2.1)
48
48
  rbs (3.1.0)
49
49
  regexp_parser (2.9.2)
50
- rexml (3.3.6)
51
- strscan
50
+ rexml (3.3.9)
52
51
  rspec (3.13.0)
53
52
  rspec-core (~> 3.13.0)
54
53
  rspec-expectations (~> 3.13.0)
@@ -73,7 +72,7 @@ GEM
73
72
  rubocop-ast (>= 1.31.1, < 2.0)
74
73
  ruby-progressbar (~> 1.7)
75
74
  unicode-display_width (>= 2.4.0, < 3.0)
76
- rubocop-ast (1.31.3)
75
+ rubocop-ast (1.32.3)
77
76
  parser (>= 3.3.1.0)
78
77
  rubocop-capybara (2.20.0)
79
78
  rubocop (~> 1.41)
@@ -81,7 +80,7 @@ GEM
81
80
  rubocop (~> 1.41)
82
81
  rubocop-packaging (0.5.2)
83
82
  rubocop (>= 1.33, < 2.0)
84
- rubocop-performance (1.21.1)
83
+ rubocop-performance (1.22.1)
85
84
  rubocop (>= 1.48.1, < 2.0)
86
85
  rubocop-ast (>= 1.31.1, < 2.0)
87
86
  rubocop-rake (0.6.0)
@@ -94,9 +93,8 @@ GEM
94
93
  rubocop-rspec_rails (2.28.2)
95
94
  rubocop (~> 1.40)
96
95
  ruby-progressbar (1.13.0)
97
- sequel (5.83.1)
96
+ sequel (5.86.0)
98
97
  bigdecimal
99
- strscan (3.1.0)
100
98
  syntax_tree (6.2.0)
101
99
  prettier_print (>= 1.2.0)
102
100
  syntax_tree-haml (4.0.3)
@@ -108,9 +106,9 @@ GEM
108
106
  rbs
109
107
  syntax_tree (>= 2.0.1)
110
108
  temple (0.10.1)
111
- thor (1.3.1)
109
+ thor (1.3.2)
112
110
  tilt (2.1.0)
113
- unicode-display_width (2.5.0)
111
+ unicode-display_width (2.6.0)
114
112
 
115
113
  PLATFORMS
116
114
  arm64-darwin-22
data/README.md CHANGED
@@ -26,6 +26,7 @@ Battle tested in production at [Tines](https://www.tines.com/) 🚀
26
26
  - [Listing DDL Changes](#listing-ddl-changes)
27
27
  - [Applying DDL Changes](#applying-ddl-changes)
28
28
  - [Stats](#stats)
29
+ - [Notify](#notify)
29
30
  - [Performing switchover](#performing-switchover)
30
31
  - [Replicating single database with custom tables](#replicating-single-database-with-custom-tables)
31
32
  - [Exclude tables from replication](#exclude-tables-from-replication)
@@ -120,6 +121,7 @@ pg_easy_replicate commands:
120
121
  pg_easy_replicate help [COMMAND] # Describe available commands or one specific command
121
122
  pg_easy_replicate start_sync -g, --group-name=GROUP_NAME # Starts the logical replication from source database to target database provisioned in the group
122
123
  pg_easy_replicate stats -g, --group-name=GROUP_NAME # Prints the statistics in JSON for the group
124
+ pg_easy_replicate notify -g, --group-name=GROUP_NAME, -u --url=URL_TO_NOTIFY # Sends notifications of all stats values for a group to a specified url
123
125
  pg_easy_replicate stop_sync -g, --group-name=GROUP_NAME # Stop the logical replication from source database to target database provisioned in the group
124
126
  pg_easy_replicate switchover -g, --group-name=GROUP_NAME # Puts the source database in read only mode after all the data is flushed and written
125
127
  pg_easy_replicate version # Prints the version
@@ -276,6 +278,14 @@ $ pg_easy_replicate stats --group-name database-cluster-1
276
278
  ....
277
279
  ```
278
280
 
281
+ ### Notify
282
+
283
+ You can send stats to an endpoint on an interval using notify. This can be configured to receieve the stats to this url on a frequency (default 10s). A timeout can also be configured for the request to the endpoint (default 10s). This gives you greater control over processing different events in the replication cycle in your workflow.
284
+
285
+ ```bash
286
+ $ pg_easy_replicate notify --group-name database-cluster-1 --url https://example.com/webhook --frequency 10 --timeout 10
287
+ ```
288
+
279
289
  ### Performing switchover
280
290
 
281
291
  `pg_easy_replicate` doesn't kick off the switchover on its own. When you start the sync via `start_sync`, it starts the replication between the two databases. Once you have had the time to monitor stats and any other key metrics, you can kick off the `switchover`.
@@ -163,6 +163,16 @@ module PgEasyReplicate
163
163
  end
164
164
  end
165
165
 
166
+ desc "notify", "Sends a notification with replication status to a specified url"
167
+ method_option :group_name, aliases: "-g", required: true, desc: "Name of the group previously provisioned"
168
+ method_option :url, aliases: "-u", required: true, desc: "URL for notification"
169
+ method_option :frequency, aliases: "-f", type: :numeric, default: 10, desc: "Frequency for sending stats to the endpoint provided"
170
+ method_option :timeout, aliases: "-t", type: :numeric, default: 10, desc: "Timeout for the notify request"
171
+
172
+ def notify
173
+ PgEasyReplicate::Stats.notify(options[:group_name], options[:url], options[:frequency], options[:timeout])
174
+ end
175
+
166
176
  desc "list_ddl_changes", "Lists recent DDL changes in the source database"
167
177
  method_option :group_name,
168
178
  aliases: "-g",
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "net/http"
4
+
3
5
  module PgEasyReplicate
4
6
  class Stats
5
7
  REPLICATION_STATE_MAP = {
@@ -39,6 +41,30 @@ module PgEasyReplicate
39
41
  end
40
42
  end
41
43
 
44
+ def notify(group_name, url, frequency = 10, timeout = 10)
45
+ loop do
46
+ stats = object(group_name)
47
+ uri = URI.parse(url)
48
+
49
+ http = Net::HTTP.new(uri.host, uri.port)
50
+ http.use_ssl = (uri.scheme == "https")
51
+ http.open_timeout = timeout
52
+ http.read_timeout = timeout
53
+
54
+ request = Net::HTTP::Post.new(uri.request_uri)
55
+ request.content_type = "application/json"
56
+ request.body = stats.to_json
57
+
58
+ response = http.request(request)
59
+
60
+ puts "Notification sent: #{response.code} #{response.message}"
61
+
62
+ sleep(frequency)
63
+ end
64
+ rescue StandardError => e
65
+ abort_with("Notify failed with: #{e.message}")
66
+ end
67
+
42
68
  # Get
43
69
  def lag_stats(group_name)
44
70
  sql = <<~SQL
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PgEasyReplicate
4
- VERSION = "0.3.2"
4
+ VERSION = "0.3.3"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_easy_replicate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shayon Mukherjee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-31 00:00:00.000000000 Z
11
+ date: 2024-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ougai
@@ -61,7 +61,7 @@ dependencies:
61
61
  version: '5.69'
62
62
  - - "<"
63
63
  - !ruby/object:Gem::Version
64
- version: '5.84'
64
+ version: '5.87'
65
65
  type: :runtime
66
66
  prerelease: false
67
67
  version_requirements: !ruby/object:Gem::Requirement
@@ -71,7 +71,7 @@ dependencies:
71
71
  version: '5.69'
72
72
  - - "<"
73
73
  - !ruby/object:Gem::Version
74
- version: '5.84'
74
+ version: '5.87'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: thor
77
77
  requirement: !ruby/object:Gem::Requirement