waterdrop 2.8.16 → 2.10.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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -1
  3. data/.rubocop.yml +2 -41
  4. data/.ruby-version +1 -1
  5. data/.yard-lint.yml +1 -1
  6. data/CHANGELOG.md +17 -0
  7. data/Gemfile +2 -1
  8. data/Gemfile.lint +2 -2
  9. data/Gemfile.lint.lock +11 -26
  10. data/Gemfile.lock +43 -66
  11. data/Rakefile +12 -0
  12. data/bin/integrations +5 -3
  13. data/bin/verify_kafka_warnings +1 -0
  14. data/config/locales/errors.yml +6 -0
  15. data/docker-compose.oauth.yml +3 -3
  16. data/docker-compose.sasl.yml +26 -0
  17. data/docker-compose.yml +1 -1
  18. data/lib/waterdrop/clients/rdkafka.rb +153 -31
  19. data/lib/waterdrop/config.rb +23 -6
  20. data/lib/waterdrop/contracts/config.rb +3 -0
  21. data/lib/waterdrop/contracts/tombstone.rb +21 -0
  22. data/lib/waterdrop/errors.rb +7 -0
  23. data/lib/waterdrop/instrumentation/callbacks/statistics.rb +4 -2
  24. data/lib/waterdrop/instrumentation/monitor.rb +61 -0
  25. data/lib/waterdrop/polling/latch.rb +1 -0
  26. data/lib/waterdrop/polling/poller.rb +4 -0
  27. data/lib/waterdrop/producer/tombstone.rb +78 -0
  28. data/lib/waterdrop/producer/variant.rb +3 -2
  29. data/lib/waterdrop/producer.rb +1 -0
  30. data/lib/waterdrop/version.rb +1 -1
  31. data/package-lock.json +3 -3
  32. data/renovate.json +6 -3
  33. data/waterdrop.gemspec +2 -2
  34. metadata +7 -14
  35. data/.github/CODEOWNERS +0 -3
  36. data/.github/FUNDING.yml +0 -1
  37. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -43
  38. data/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  39. data/.github/workflows/ci.yml +0 -322
  40. data/.github/workflows/push.yml +0 -35
  41. data/.github/workflows/trigger-wiki-refresh.yml +0 -30
  42. data/.github/workflows/verify-action-pins.yml +0 -16
  43. data/.rspec +0 -2
  44. data/log/.gitkeep +0 -0
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: waterdrop
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.16
4
+ version: 2.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maciej Mensfeld
@@ -15,7 +15,7 @@ dependencies:
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: 2.4.9
18
+ version: 2.5.12
19
19
  - - "<"
20
20
  - !ruby/object:Gem::Version
21
21
  version: 3.0.0
@@ -25,7 +25,7 @@ dependencies:
25
25
  requirements:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
- version: 2.4.9
28
+ version: 2.5.12
29
29
  - - "<"
30
30
  - !ruby/object:Gem::Version
31
31
  version: 3.0.0
@@ -64,16 +64,7 @@ executables: []
64
64
  extensions: []
65
65
  extra_rdoc_files: []
66
66
  files:
67
- - ".github/CODEOWNERS"
68
- - ".github/FUNDING.yml"
69
- - ".github/ISSUE_TEMPLATE/bug_report.md"
70
- - ".github/ISSUE_TEMPLATE/feature_request.md"
71
- - ".github/workflows/ci.yml"
72
- - ".github/workflows/push.yml"
73
- - ".github/workflows/trigger-wiki-refresh.yml"
74
- - ".github/workflows/verify-action-pins.yml"
75
67
  - ".gitignore"
76
- - ".rspec"
77
68
  - ".rubocop.yml"
78
69
  - ".ruby-gemset"
79
70
  - ".ruby-version"
@@ -91,6 +82,7 @@ files:
91
82
  - bin/verify_topics_naming
92
83
  - config/locales/errors.yml
93
84
  - docker-compose.oauth.yml
85
+ - docker-compose.sasl.yml
94
86
  - docker-compose.yml
95
87
  - lib/waterdrop.rb
96
88
  - lib/waterdrop/clients/buffered.rb
@@ -102,6 +94,7 @@ files:
102
94
  - lib/waterdrop/contracts/config.rb
103
95
  - lib/waterdrop/contracts/message.rb
104
96
  - lib/waterdrop/contracts/poller_config.rb
97
+ - lib/waterdrop/contracts/tombstone.rb
105
98
  - lib/waterdrop/contracts/transactional_offset.rb
106
99
  - lib/waterdrop/contracts/variant.rb
107
100
  - lib/waterdrop/errors.rb
@@ -134,10 +127,10 @@ files:
134
127
  - lib/waterdrop/producer/status.rb
135
128
  - lib/waterdrop/producer/sync.rb
136
129
  - lib/waterdrop/producer/testing.rb
130
+ - lib/waterdrop/producer/tombstone.rb
137
131
  - lib/waterdrop/producer/transactions.rb
138
132
  - lib/waterdrop/producer/variant.rb
139
133
  - lib/waterdrop/version.rb
140
- - log/.gitkeep
141
134
  - package-lock.json
142
135
  - package.json
143
136
  - renovate.json
@@ -167,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
167
160
  - !ruby/object:Gem::Version
168
161
  version: '0'
169
162
  requirements: []
170
- rubygems_version: 4.0.3
163
+ rubygems_version: 4.0.6
171
164
  specification_version: 4
172
165
  summary: Kafka messaging made easy!
173
166
  test_files: []
data/.github/CODEOWNERS DELETED
@@ -1,3 +0,0 @@
1
- /.github @mensfeld
2
- /.github/workflows/ @mensfeld
3
- /.github/actions/ @mensfeld
data/.github/FUNDING.yml DELETED
@@ -1 +0,0 @@
1
- custom: ['https://karafka.io/#become-pro']
@@ -1,43 +0,0 @@
1
- ---
2
- name: Bug Report
3
- about: Report an issue within the Karafka ecosystem you've discovered.
4
- ---
5
-
6
- To make this process smoother for everyone involved, please read the following information before filling out the template.
7
-
8
- Scope of the OSS Support
9
- ===========
10
-
11
- We do not provide OSS support for outdated versions of Karafka and its components.
12
-
13
- Please ensure that you are using a version that is still actively supported. We cannot assist with any no longer maintained versions unless you support us with our Pro offering (https://karafka.io/docs/Pro-Support/).
14
-
15
- We acknowledge that understanding the specifics of your application and its configuration can be essential for resolving certain issues. However, due to the extensive time and resources such analysis can require, this may fall beyond our Open Source Support scope.
16
-
17
- If Karafka or its components are critical to your infrastructure, we encourage you to consider our Pro Offering.
18
-
19
- By backing us up, you can gain direct assistance and ensure your use case receives the dedicated attention it deserves.
20
-
21
-
22
- Important Links to Read
23
- ===========
24
-
25
- Please take a moment to review the following resources before submitting your report:
26
-
27
- - Issue Reporting Guide: https://karafka.io/docs/Support/#issue-reporting-guide
28
- - Support Policy: https://karafka.io/docs/Support/
29
- - Versions, Lifecycle, and EOL: https://karafka.io/docs/Versions-Lifecycle-and-EOL/
30
-
31
-
32
- Bug Report Details
33
- ===========
34
-
35
- Please provide all the details per our Issue Reporting Guide: https://karafka.io/docs/Support/#issue-reporting-guide
36
-
37
- Failing to provide the required details may result in the issue being closed. Please include all necessary information to help us understand and resolve your issue effectively.
38
-
39
-
40
- Additional Context
41
- ===========
42
-
43
- Add any other context about the problem here.
@@ -1,20 +0,0 @@
1
- ---
2
- name: Feature Request
3
- about: Suggest new WaterDrop features or improvements to existing features.
4
- ---
5
-
6
- ## Is your feature request related to a problem? Please describe.
7
-
8
- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
9
-
10
- ## Describe the solution you'd like
11
-
12
- A clear and concise description of what you want to happen.
13
-
14
- ## Describe alternatives you've considered
15
-
16
- A clear and concise description of any alternative solutions or features you've considered.
17
-
18
- ## Additional context
19
-
20
- Add any other context or screenshots about the feature request here.
@@ -1,322 +0,0 @@
1
- name: CI
2
-
3
- concurrency:
4
- group: ${{ github.workflow }}-${{ github.ref }}
5
- cancel-in-progress: true
6
-
7
- on:
8
- pull_request:
9
- branches: [ master ]
10
- schedule:
11
- - cron: '0 1 * * *'
12
-
13
- permissions:
14
- contents: read
15
-
16
- jobs:
17
- specs:
18
- timeout-minutes: 15
19
- runs-on: ubuntu-latest
20
- strategy:
21
- fail-fast: false
22
- matrix:
23
- ruby:
24
- - '4.0'
25
- - '3.4'
26
- - '3.3'
27
- - '3.2'
28
- polling_mode:
29
- - 'thread'
30
- - 'fiber'
31
- include:
32
- - ruby: '3.4'
33
- polling_mode: 'thread'
34
- coverage: 'true'
35
- steps:
36
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
37
- with:
38
- fetch-depth: 0
39
-
40
- - name: Install package dependencies
41
- run: "[ -e $APT_DEPS ] || sudo apt-get install -y --no-install-recommends $APT_DEPS"
42
-
43
- - name: Set up Ruby
44
- uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
45
- with:
46
- ruby-version: ${{matrix.ruby}}
47
- bundler-cache: true
48
- bundler: 'latest'
49
- self-hosted: false
50
-
51
- - name: Run Kafka with Docker Compose
52
- run: |
53
- docker compose up -d || (sleep 5 && docker compose up -d)
54
-
55
- - name: Wait for Kafka
56
- run: sleep 15
57
-
58
- - name: Install latest bundler
59
- run: |
60
- gem install bundler --no-document
61
- gem update --system --no-document
62
- bundle config set without 'tools benchmarks docs'
63
-
64
- - name: Bundle install
65
- run: |
66
- bundle config set without development
67
- bundle install --jobs 4 --retry 3
68
-
69
- - name: Run all tests
70
- env:
71
- GITHUB_COVERAGE: ${{matrix.coverage}}
72
- FD_POLLING: ${{ matrix.polling_mode == 'fiber' && 'true' || 'false' }}
73
- run: bundle exec rspec
74
-
75
- - name: Run integration tests
76
- env:
77
- FD_POLLING: ${{ matrix.polling_mode == 'fiber' && 'true' || 'false' }}
78
- # Exclude oauth_token_refresh - requires separate Keycloak + OAuth Kafka infrastructure
79
- run: ./bin/integrations --exclude oauth_token_refresh
80
-
81
- - name: Check Kafka logs for unexpected warnings
82
- run: bin/verify_kafka_warnings
83
-
84
- - name: Check test topics naming convention
85
- run: bin/verify_topics_naming
86
-
87
- rubocop:
88
- timeout-minutes: 5
89
- runs-on: ubuntu-latest
90
- env:
91
- BUNDLE_GEMFILE: Gemfile.lint
92
- steps:
93
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
94
- with:
95
- fetch-depth: 0
96
- - name: Set up Ruby
97
- uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
98
- with:
99
- ruby-version: '4.0.1'
100
- bundler-cache: true
101
- - name: Run rubocop
102
- run: bundle exec rubocop
103
-
104
- yard-lint:
105
- timeout-minutes: 5
106
- runs-on: ubuntu-latest
107
- env:
108
- BUNDLE_GEMFILE: Gemfile.lint
109
- steps:
110
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
111
- with:
112
- fetch-depth: 0
113
- - name: Set up Ruby
114
- uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
115
- with:
116
- ruby-version: '4.0.1'
117
- bundler-cache: true
118
- - name: Run yard-lint
119
- run: bundle exec yard-lint lib/
120
-
121
- lostconf:
122
- timeout-minutes: 5
123
- runs-on: ubuntu-latest
124
- steps:
125
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
126
- with:
127
- fetch-depth: 0
128
- - name: Set up Node.js
129
- uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
130
- with:
131
- node-version: '20'
132
- cache: 'npm'
133
- - name: Install dependencies
134
- run: npm ci
135
- - name: Run lostconf
136
- run: npx lostconf --fail-on-stale
137
-
138
- oauth-integration:
139
- timeout-minutes: 10
140
- runs-on: ubuntu-latest
141
- strategy:
142
- fail-fast: false
143
- matrix:
144
- polling_mode:
145
- - 'thread'
146
- - 'fiber'
147
- steps:
148
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
149
- with:
150
- fetch-depth: 0
151
-
152
- - name: Set up Ruby
153
- uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
154
- with:
155
- ruby-version: '4.0.1'
156
- bundler-cache: true
157
- bundler: 'latest'
158
-
159
- - name: Start OAuth infrastructure (Keycloak + Kafka with SASL/OAUTHBEARER)
160
- run: docker compose -f docker-compose.oauth.yml up -d
161
-
162
- - name: Wait for Keycloak to be ready
163
- run: |
164
- echo "Waiting for Keycloak to be ready..."
165
- for i in {1..60}; do
166
- if curl -sf http://localhost:8080/realms/kafka > /dev/null 2>&1; then
167
- echo "Keycloak is ready!"
168
- break
169
- fi
170
- echo "Waiting... ($i/60)"
171
- sleep 2
172
- done
173
-
174
- - name: Wait for Kafka OAuth broker to be ready
175
- run: |
176
- echo "Waiting for Kafka OAuth broker..."
177
- sleep 10
178
-
179
- - name: Install dependencies
180
- run: |
181
- gem install bundler --no-document
182
- bundle config set without 'tools benchmarks docs development'
183
- bundle install --jobs 4 --retry 3
184
-
185
- - name: Run OAuth integration test
186
- env:
187
- FD_POLLING: ${{ matrix.polling_mode == 'fiber' && 'true' || 'false' }}
188
- run: ./bin/integrations oauth_token_refresh
189
-
190
- - name: Show Keycloak logs on failure
191
- if: failure()
192
- run: docker compose -f docker-compose.oauth.yml logs keycloak
193
-
194
- - name: Show Kafka OAuth logs on failure
195
- if: failure()
196
- run: docker compose -f docker-compose.oauth.yml logs kafka-oauth
197
-
198
- specs-macos:
199
- timeout-minutes: 30
200
- runs-on: macos-15
201
- env:
202
- CONFLUENT_VERSION: "8.0.0"
203
- strategy:
204
- fail-fast: false
205
- matrix:
206
- polling_mode:
207
- - 'thread'
208
- - 'fiber'
209
- steps:
210
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
211
- with:
212
- fetch-depth: 0
213
-
214
- - name: Install Bash 4+
215
- run: |
216
- brew install bash
217
- echo "/opt/homebrew/bin" >> $GITHUB_PATH
218
-
219
- - name: Set up Ruby
220
- uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
221
- with:
222
- ruby-version: '4.0.1'
223
- bundler-cache: true
224
- bundler: 'latest'
225
-
226
- - name: Install and Start Confluent Community Kafka (KRaft)
227
- run: |
228
- brew install openjdk@17
229
- export PATH="/opt/homebrew/opt/openjdk@17/bin:$PATH"
230
- export JAVA_HOME="/opt/homebrew/opt/openjdk@17"
231
-
232
- curl -O "https://packages.confluent.io/archive/8.0/confluent-community-${CONFLUENT_VERSION}.tar.gz"
233
- tar -xzf "confluent-community-${CONFLUENT_VERSION}.tar.gz"
234
-
235
- export CONFLUENT_HOME="$(pwd)/confluent-${CONFLUENT_VERSION}"
236
- export PATH="$CONFLUENT_HOME/bin:$PATH"
237
- cd "$CONFLUENT_HOME"
238
-
239
- KRAFT_CONFIG=""
240
- for config in "etc/kafka/kraft/server.properties" "config/kraft/server.properties" "etc/kafka/server.properties"; do
241
- if [ -f "$config" ]; then
242
- KRAFT_CONFIG="$config"
243
- echo "Found config: $KRAFT_CONFIG"
244
- break
245
- fi
246
- done
247
-
248
- if [ -z "$KRAFT_CONFIG" ]; then
249
- echo "❌ No server config found"
250
- exit 1
251
- fi
252
-
253
- cat >> "$KRAFT_CONFIG" << 'EOF'
254
-
255
- process.roles=broker,controller
256
- node.id=1
257
- controller.quorum.voters=1@127.0.0.1:9093
258
- listeners=PLAINTEXT://127.0.0.1:9092,CONTROLLER://127.0.0.1:9093
259
- advertised.listeners=PLAINTEXT://127.0.0.1:9092
260
- controller.listener.names=CONTROLLER
261
- inter.broker.listener.name=PLAINTEXT
262
- log.dirs=/tmp/kraft-combined-logs
263
- authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer
264
- super.users=User:ANONYMOUS
265
- allow.everyone.if.no.acl.found=true
266
- EOF
267
-
268
- CLUSTER_ID=$(bin/kafka-storage random-uuid)
269
- bin/kafka-storage format -t "$CLUSTER_ID" -c "$KRAFT_CONFIG"
270
- bin/kafka-server-start "$KRAFT_CONFIG" &
271
-
272
- sleep 20
273
-
274
- for i in {1..30}; do
275
- if bin/kafka-topics --bootstrap-server 127.0.0.1:9092 --list >/dev/null 2>&1; then
276
- echo "✅ Confluent Community ${CONFLUENT_VERSION} (KRaft) is ready!"
277
- break
278
- fi
279
- [ $i -eq 30 ] && { echo "❌ Kafka failed to start"; exit 1; }
280
- sleep 2
281
- done
282
-
283
- - name: Install latest bundler
284
- run: |
285
- gem install bundler --no-document
286
- gem update --system --no-document
287
- bundle config set without 'tools benchmarks docs'
288
-
289
- - name: Bundle install
290
- run: |
291
- bundle config set without development
292
- bundle install --jobs 4 --retry 3
293
-
294
- - name: Run all tests
295
- env:
296
- FD_POLLING: ${{ matrix.polling_mode == 'fiber' && 'true' || 'false' }}
297
- run: bundle exec rspec
298
-
299
- - name: Run integration tests
300
- env:
301
- FD_POLLING: ${{ matrix.polling_mode == 'fiber' && 'true' || 'false' }}
302
- run: ./bin/integrations --exclude oauth_token_refresh
303
-
304
- ci-success:
305
- name: CI Success
306
- runs-on: ubuntu-latest
307
- if: always()
308
- needs:
309
- - rubocop
310
- - specs
311
- - specs-macos
312
- - yard-lint
313
- - lostconf
314
- - oauth-integration
315
- steps:
316
- - name: Check all jobs passed
317
- if: |
318
- contains(needs.*.result, 'failure') ||
319
- contains(needs.*.result, 'cancelled') ||
320
- contains(needs.*.result, 'skipped')
321
- run: exit 1
322
- - run: echo "All CI checks passed!"
@@ -1,35 +0,0 @@
1
- name: Push Gem
2
-
3
- on:
4
- push:
5
- tags:
6
- - v*
7
-
8
- permissions:
9
- contents: read
10
-
11
- jobs:
12
- push:
13
- if: github.repository_owner == 'karafka'
14
- runs-on: ubuntu-latest
15
- environment: deployment
16
-
17
- permissions:
18
- contents: write
19
- id-token: write
20
-
21
- steps:
22
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
23
- with:
24
- fetch-depth: 0
25
-
26
- - name: Set up Ruby
27
- uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
28
- with:
29
- bundler-cache: false
30
-
31
- - name: Bundle install
32
- run: |
33
- bundle install --jobs 4 --retry 3
34
-
35
- - uses: rubygems/release-gem@1c162a739e8b4cb21a676e97b087e8268d8fc40b # v1.1.2
@@ -1,30 +0,0 @@
1
- name: Trigger Wiki Refresh
2
-
3
- on:
4
- release:
5
- types: [published]
6
- push:
7
- branches: [master]
8
-
9
- jobs:
10
- trigger-wiki-refresh:
11
- runs-on: ubuntu-latest
12
- environment: wiki-trigger
13
- if: github.repository_owner == 'karafka'
14
- steps:
15
- - name: Trigger wiki refresh
16
- uses: peter-evans/repository-dispatch@28959ce8df70de7be546dd1250a005dd32156697 # v4.0.1
17
- with:
18
- token: ${{ secrets.WIKI_REPO_TOKEN }}
19
- repository: karafka/wiki
20
- event-type: sync-trigger
21
- client-payload: |
22
- {
23
- "repository": "${{ github.repository }}",
24
- "event_name": "${{ github.event_name }}",
25
- "release_tag": "${{ github.event.release.tag_name || '' }}",
26
- "release_name": "${{ github.event.release.name || '' }}",
27
- "commit_sha": "${{ github.sha }}",
28
- "commit_message": "Trigger Wiki Refresh",
29
- "triggered_by": "${{ github.actor }}"
30
- }
@@ -1,16 +0,0 @@
1
- name: Verify Action Pins
2
- on:
3
- pull_request:
4
- paths:
5
- - '.github/workflows/**'
6
- jobs:
7
- verify_action_pins:
8
- runs-on: ubuntu-latest
9
- steps:
10
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
11
- - name: Check SHA pins
12
- run: |
13
- if grep -E -r "uses: .*/.*@(v[0-9]+|main|master)($|[[:space:]]|$)" --include="*.yml" --include="*.yaml" .github/workflows/ | grep -v "#"; then
14
- echo "::error::Actions should use SHA pins, not tags or branch names"
15
- exit 1
16
- fi
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --require spec_helper
2
- --exclude-pattern "spec/integrations/**/*_spec.rb"
data/log/.gitkeep DELETED
File without changes