karafka-web 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +3 -0
- data/.coditsu/ci.yml +3 -0
- data/.diffend.yml +3 -0
- data/.github/FUNDING.yml +1 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +50 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.github/workflows/ci.yml +49 -0
- data/.gitignore +69 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +9 -0
- data/CODE_OF_CONDUCT.md +46 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +52 -0
- data/LICENSE +17 -0
- data/README.md +29 -0
- data/bin/karafka-web +33 -0
- data/certs/cert_chain.pem +26 -0
- data/config/locales/errors.yml +9 -0
- data/karafka-web.gemspec +44 -0
- data/lib/karafka/web/app.rb +17 -0
- data/lib/karafka/web/config.rb +80 -0
- data/lib/karafka/web/deserializer.rb +20 -0
- data/lib/karafka/web/errors.rb +25 -0
- data/lib/karafka/web/installer.rb +124 -0
- data/lib/karafka/web/processing/consumer.rb +66 -0
- data/lib/karafka/web/processing/consumers/aggregator.rb +130 -0
- data/lib/karafka/web/processing/consumers/state.rb +32 -0
- data/lib/karafka/web/tracking/base_contract.rb +31 -0
- data/lib/karafka/web/tracking/consumers/contracts/consumer_group.rb +33 -0
- data/lib/karafka/web/tracking/consumers/contracts/job.rb +26 -0
- data/lib/karafka/web/tracking/consumers/contracts/partition.rb +22 -0
- data/lib/karafka/web/tracking/consumers/contracts/report.rb +95 -0
- data/lib/karafka/web/tracking/consumers/contracts/topic.rb +29 -0
- data/lib/karafka/web/tracking/consumers/listeners/base.rb +33 -0
- data/lib/karafka/web/tracking/consumers/listeners/errors.rb +107 -0
- data/lib/karafka/web/tracking/consumers/listeners/pausing.rb +45 -0
- data/lib/karafka/web/tracking/consumers/listeners/processing.rb +157 -0
- data/lib/karafka/web/tracking/consumers/listeners/statistics.rb +123 -0
- data/lib/karafka/web/tracking/consumers/listeners/status.rb +58 -0
- data/lib/karafka/web/tracking/consumers/sampler.rb +216 -0
- data/lib/karafka/web/tracking/memoized_shell.rb +48 -0
- data/lib/karafka/web/tracking/reporter.rb +144 -0
- data/lib/karafka/web/tracking/ttl_array.rb +59 -0
- data/lib/karafka/web/tracking/ttl_hash.rb +16 -0
- data/lib/karafka/web/ui/app.rb +78 -0
- data/lib/karafka/web/ui/base.rb +77 -0
- data/lib/karafka/web/ui/controllers/base.rb +40 -0
- data/lib/karafka/web/ui/controllers/become_pro.rb +17 -0
- data/lib/karafka/web/ui/controllers/cluster.rb +24 -0
- data/lib/karafka/web/ui/controllers/consumers.rb +27 -0
- data/lib/karafka/web/ui/controllers/errors.rb +43 -0
- data/lib/karafka/web/ui/controllers/jobs.rb +33 -0
- data/lib/karafka/web/ui/controllers/requests/params.rb +30 -0
- data/lib/karafka/web/ui/controllers/responses/data.rb +26 -0
- data/lib/karafka/web/ui/controllers/routing.rb +30 -0
- data/lib/karafka/web/ui/helpers/application_helper.rb +144 -0
- data/lib/karafka/web/ui/lib/hash_proxy.rb +66 -0
- data/lib/karafka/web/ui/lib/paginate_array.rb +38 -0
- data/lib/karafka/web/ui/models/consumer_group.rb +20 -0
- data/lib/karafka/web/ui/models/health.rb +44 -0
- data/lib/karafka/web/ui/models/job.rb +13 -0
- data/lib/karafka/web/ui/models/message.rb +99 -0
- data/lib/karafka/web/ui/models/partition.rb +13 -0
- data/lib/karafka/web/ui/models/process.rb +56 -0
- data/lib/karafka/web/ui/models/processes.rb +86 -0
- data/lib/karafka/web/ui/models/state.rb +67 -0
- data/lib/karafka/web/ui/models/topic.rb +19 -0
- data/lib/karafka/web/ui/pro/app.rb +120 -0
- data/lib/karafka/web/ui/pro/controllers/cluster.rb +16 -0
- data/lib/karafka/web/ui/pro/controllers/consumers.rb +54 -0
- data/lib/karafka/web/ui/pro/controllers/dlq.rb +44 -0
- data/lib/karafka/web/ui/pro/controllers/errors.rb +57 -0
- data/lib/karafka/web/ui/pro/controllers/explorer.rb +79 -0
- data/lib/karafka/web/ui/pro/controllers/health.rb +33 -0
- data/lib/karafka/web/ui/pro/controllers/jobs.rb +26 -0
- data/lib/karafka/web/ui/pro/controllers/routing.rb +26 -0
- data/lib/karafka/web/ui/pro/views/consumers/_breadcrumbs.erb +27 -0
- data/lib/karafka/web/ui/pro/views/consumers/_consumer.erb +60 -0
- data/lib/karafka/web/ui/pro/views/consumers/_counters.erb +50 -0
- data/lib/karafka/web/ui/pro/views/consumers/_summary.erb +81 -0
- data/lib/karafka/web/ui/pro/views/consumers/consumer/_consumer_group.erb +109 -0
- data/lib/karafka/web/ui/pro/views/consumers/consumer/_job.erb +26 -0
- data/lib/karafka/web/ui/pro/views/consumers/consumer/_metrics.erb +126 -0
- data/lib/karafka/web/ui/pro/views/consumers/consumer/_no_jobs.erb +9 -0
- data/lib/karafka/web/ui/pro/views/consumers/consumer/_no_subscriptions.erb +9 -0
- data/lib/karafka/web/ui/pro/views/consumers/consumer/_partition.erb +32 -0
- data/lib/karafka/web/ui/pro/views/consumers/consumer/_stopped.erb +10 -0
- data/lib/karafka/web/ui/pro/views/consumers/consumer/_tabs.erb +20 -0
- data/lib/karafka/web/ui/pro/views/consumers/index.erb +30 -0
- data/lib/karafka/web/ui/pro/views/consumers/jobs.erb +42 -0
- data/lib/karafka/web/ui/pro/views/consumers/subscriptions.erb +23 -0
- data/lib/karafka/web/ui/pro/views/dlq/_breadcrumbs.erb +5 -0
- data/lib/karafka/web/ui/pro/views/dlq/_no_topics.erb +9 -0
- data/lib/karafka/web/ui/pro/views/dlq/_topic.erb +12 -0
- data/lib/karafka/web/ui/pro/views/dlq/index.erb +16 -0
- data/lib/karafka/web/ui/pro/views/errors/_breadcrumbs.erb +25 -0
- data/lib/karafka/web/ui/pro/views/errors/_detail.erb +29 -0
- data/lib/karafka/web/ui/pro/views/errors/_error.erb +26 -0
- data/lib/karafka/web/ui/pro/views/errors/_partition_option.erb +7 -0
- data/lib/karafka/web/ui/pro/views/errors/index.erb +58 -0
- data/lib/karafka/web/ui/pro/views/errors/show.erb +56 -0
- data/lib/karafka/web/ui/pro/views/explorer/_breadcrumbs.erb +29 -0
- data/lib/karafka/web/ui/pro/views/explorer/_detail.erb +21 -0
- data/lib/karafka/web/ui/pro/views/explorer/_encryption_enabled.erb +18 -0
- data/lib/karafka/web/ui/pro/views/explorer/_failed_deserialization.erb +4 -0
- data/lib/karafka/web/ui/pro/views/explorer/_message.erb +16 -0
- data/lib/karafka/web/ui/pro/views/explorer/_partition_option.erb +7 -0
- data/lib/karafka/web/ui/pro/views/explorer/_topic.erb +12 -0
- data/lib/karafka/web/ui/pro/views/explorer/index.erb +17 -0
- data/lib/karafka/web/ui/pro/views/explorer/partition.erb +56 -0
- data/lib/karafka/web/ui/pro/views/explorer/show.erb +65 -0
- data/lib/karafka/web/ui/pro/views/health/_breadcrumbs.erb +5 -0
- data/lib/karafka/web/ui/pro/views/health/_partition.erb +35 -0
- data/lib/karafka/web/ui/pro/views/health/index.erb +60 -0
- data/lib/karafka/web/ui/pro/views/jobs/_breadcrumbs.erb +5 -0
- data/lib/karafka/web/ui/pro/views/jobs/_job.erb +31 -0
- data/lib/karafka/web/ui/pro/views/jobs/_no_jobs.erb +9 -0
- data/lib/karafka/web/ui/pro/views/jobs/index.erb +34 -0
- data/lib/karafka/web/ui/pro/views/shared/_navigation.erb +57 -0
- data/lib/karafka/web/ui/public/images/favicon.ico +0 -0
- data/lib/karafka/web/ui/public/images/logo.svg +28 -0
- data/lib/karafka/web/ui/public/javascripts/application.js +41 -0
- data/lib/karafka/web/ui/public/javascripts/bootstrap.min.js +7 -0
- data/lib/karafka/web/ui/public/javascripts/highlight.min.js +337 -0
- data/lib/karafka/web/ui/public/javascripts/live_poll.js +124 -0
- data/lib/karafka/web/ui/public/javascripts/timeago.min.js +1 -0
- data/lib/karafka/web/ui/public/stylesheets/application.css +106 -0
- data/lib/karafka/web/ui/public/stylesheets/bootstrap.min.css +7 -0
- data/lib/karafka/web/ui/public/stylesheets/bootstrap.min.css.map +1 -0
- data/lib/karafka/web/ui/public/stylesheets/highlight.min.css +10 -0
- data/lib/karafka/web/ui/views/cluster/_breadcrumbs.erb +5 -0
- data/lib/karafka/web/ui/views/cluster/_broker.erb +5 -0
- data/lib/karafka/web/ui/views/cluster/_partition.erb +22 -0
- data/lib/karafka/web/ui/views/cluster/index.erb +72 -0
- data/lib/karafka/web/ui/views/consumers/_breadcrumbs.erb +27 -0
- data/lib/karafka/web/ui/views/consumers/_consumer.erb +43 -0
- data/lib/karafka/web/ui/views/consumers/_counters.erb +44 -0
- data/lib/karafka/web/ui/views/consumers/_summary.erb +81 -0
- data/lib/karafka/web/ui/views/consumers/consumer/_consumer_group.erb +109 -0
- data/lib/karafka/web/ui/views/consumers/consumer/_job.erb +26 -0
- data/lib/karafka/web/ui/views/consumers/consumer/_metrics.erb +126 -0
- data/lib/karafka/web/ui/views/consumers/consumer/_no_jobs.erb +9 -0
- data/lib/karafka/web/ui/views/consumers/consumer/_no_subscriptions.erb +9 -0
- data/lib/karafka/web/ui/views/consumers/consumer/_partition.erb +32 -0
- data/lib/karafka/web/ui/views/consumers/consumer/_stopped.erb +10 -0
- data/lib/karafka/web/ui/views/consumers/consumer/_tabs.erb +20 -0
- data/lib/karafka/web/ui/views/consumers/index.erb +29 -0
- data/lib/karafka/web/ui/views/errors/_breadcrumbs.erb +19 -0
- data/lib/karafka/web/ui/views/errors/_detail.erb +29 -0
- data/lib/karafka/web/ui/views/errors/_error.erb +26 -0
- data/lib/karafka/web/ui/views/errors/index.erb +38 -0
- data/lib/karafka/web/ui/views/errors/show.erb +30 -0
- data/lib/karafka/web/ui/views/jobs/_breadcrumbs.erb +5 -0
- data/lib/karafka/web/ui/views/jobs/_job.erb +22 -0
- data/lib/karafka/web/ui/views/jobs/_no_jobs.erb +9 -0
- data/lib/karafka/web/ui/views/jobs/index.erb +31 -0
- data/lib/karafka/web/ui/views/layout.erb +23 -0
- data/lib/karafka/web/ui/views/routing/_breadcrumbs.erb +15 -0
- data/lib/karafka/web/ui/views/routing/_consumer_group.erb +34 -0
- data/lib/karafka/web/ui/views/routing/_detail.erb +25 -0
- data/lib/karafka/web/ui/views/routing/_topic.erb +18 -0
- data/lib/karafka/web/ui/views/routing/index.erb +10 -0
- data/lib/karafka/web/ui/views/routing/show.erb +26 -0
- data/lib/karafka/web/ui/views/shared/_become_pro.erb +13 -0
- data/lib/karafka/web/ui/views/shared/_brand.erb +3 -0
- data/lib/karafka/web/ui/views/shared/_content.erb +31 -0
- data/lib/karafka/web/ui/views/shared/_header.erb +20 -0
- data/lib/karafka/web/ui/views/shared/_navigation.erb +57 -0
- data/lib/karafka/web/ui/views/shared/_pagination.erb +21 -0
- data/lib/karafka/web/ui/views/shared/exceptions/not_found.erb +39 -0
- data/lib/karafka/web/ui/views/shared/exceptions/pro_only.erb +52 -0
- data/lib/karafka/web/version.rb +8 -0
- data/lib/karafka/web.rb +60 -0
- data.tar.gz.sig +0 -0
- metadata +328 -0
- metadata.gz.sig +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1f1a21a4136ff16a20aabb6e3d39777d9dc93943ad335ab15381b8e9ccdc1a8a
|
4
|
+
data.tar.gz: 68b24c874186d4800e08f059cdc9bdb6ee6269b4b9374d52c3cf41d233873bca
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 285a69c0999734181949672a51aa4f38e6cbe5c64c5cbc869a92a8647aac7a285fadfc08bd98e53d30d2526ad1fd8ebee6289f22f46ab2b8280aa23e036a9816
|
7
|
+
data.tar.gz: 7f5ee73bcbc904f1c4c6f7922cb631f9b55075c2a2b0912668489c89d63cd02106594e92520e1848b5ba2fe2e155b37aedcc04f601c2c5b6f571f1ec14230959
|
checksums.yaml.gz.sig
ADDED
@@ -0,0 +1,3 @@
|
|
1
|
+
4zﳒ$)-_ͧwIGeo����`�F$b�ڰ�t9�
|
2
|
+
����lg��3:S�dd)��Γ���Uylp��b'��o�Jv��?��;����'��7 ~�Un:k���^ѹ��k�Y�ˑ �O��<%����J��C�F�\�VSJ���m�v�,
|
3
|
+
��j��ȕ��c�I$�5F!I�1#��F�<��B�����5����?\!�]�X��M������"��<b2�%��� ��s�E�cc��>n�ՑH�0�� �Q'����s����)�[�ߌ�k)�����5�{f��w�Y)�����T�'͜��7�$o��.���a�h��ɏX�3ډ� �t#eW���^w0��ԙ&��Q�
|
data/.coditsu/ci.yml
ADDED
data/.diffend.yml
ADDED
data/.github/FUNDING.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
custom: ['https://karafka.io/#become-pro']
|
@@ -0,0 +1,50 @@
|
|
1
|
+
---
|
2
|
+
name: Bug Report
|
3
|
+
about: Report an issue with Karafka you've discovered.
|
4
|
+
---
|
5
|
+
|
6
|
+
*Be clear, concise and precise in your description of the problem.
|
7
|
+
Open an issue with a descriptive title and a summary in grammatically correct,
|
8
|
+
complete sentences.*
|
9
|
+
|
10
|
+
*Use the template below when reporting bugs. Please, make sure that
|
11
|
+
you're running the latest stable Karafka and that the problem you're reporting
|
12
|
+
hasn't been reported (and potentially fixed) already.*
|
13
|
+
|
14
|
+
*Before filing the ticket you should replace all text above the horizontal
|
15
|
+
rule with your own words.*
|
16
|
+
|
17
|
+
--------
|
18
|
+
|
19
|
+
## Expected behavior
|
20
|
+
|
21
|
+
Describe here how you expected Karafka to behave in this particular situation.
|
22
|
+
|
23
|
+
## Actual behavior
|
24
|
+
|
25
|
+
Describe here what actually happened.
|
26
|
+
|
27
|
+
## Steps to reproduce the problem
|
28
|
+
|
29
|
+
This is extremely important! Providing us with a reliable way to reproduce
|
30
|
+
a problem will expedite its solution.
|
31
|
+
|
32
|
+
## Your setup details
|
33
|
+
|
34
|
+
Please provide kafka version and the output of `karafka info` or `bundle exec karafka info` if using Bundler.
|
35
|
+
|
36
|
+
Here's an example:
|
37
|
+
|
38
|
+
```
|
39
|
+
$ [bundle exec] karafka info
|
40
|
+
Karafka version: 1.3.0
|
41
|
+
Ruby version: 2.6.3
|
42
|
+
Ruby-kafka version: 0.7.9
|
43
|
+
Application client id: karafka-local
|
44
|
+
Backend: inline
|
45
|
+
Batch fetching: true
|
46
|
+
Batch consuming: true
|
47
|
+
Boot file: /app/karafka/karafka.rb
|
48
|
+
Environment: development
|
49
|
+
Kafka seed brokers: ["kafka://kafka:9092"]
|
50
|
+
```
|
@@ -0,0 +1,20 @@
|
|
1
|
+
---
|
2
|
+
name: Feature Request
|
3
|
+
about: Suggest new Karafka 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.
|
@@ -0,0 +1,49 @@
|
|
1
|
+
name: ci
|
2
|
+
|
3
|
+
concurrency: ci-${{ github.ref }}
|
4
|
+
|
5
|
+
on:
|
6
|
+
pull_request:
|
7
|
+
push:
|
8
|
+
schedule:
|
9
|
+
- cron: '0 1 * * *'
|
10
|
+
|
11
|
+
env:
|
12
|
+
BUNDLE_RETRY: 6
|
13
|
+
BUNDLE_JOBS: 4
|
14
|
+
|
15
|
+
jobs:
|
16
|
+
diffend:
|
17
|
+
runs-on: ubuntu-latest
|
18
|
+
strategy:
|
19
|
+
fail-fast: false
|
20
|
+
steps:
|
21
|
+
- uses: actions/checkout@v3
|
22
|
+
with:
|
23
|
+
fetch-depth: 0
|
24
|
+
|
25
|
+
- name: Set up Ruby
|
26
|
+
uses: ruby/setup-ruby@v1
|
27
|
+
with:
|
28
|
+
ruby-version: 3.2
|
29
|
+
bundler-cache: true
|
30
|
+
|
31
|
+
- name: Install Diffend plugin
|
32
|
+
run: bundle plugin install diffend
|
33
|
+
|
34
|
+
- name: Bundle Secure
|
35
|
+
run: bundle secure
|
36
|
+
|
37
|
+
coditsu:
|
38
|
+
runs-on: ubuntu-latest
|
39
|
+
strategy:
|
40
|
+
fail-fast: false
|
41
|
+
steps:
|
42
|
+
- uses: actions/checkout@v3
|
43
|
+
with:
|
44
|
+
fetch-depth: 0
|
45
|
+
- name: Run Coditsu
|
46
|
+
env:
|
47
|
+
CODITSU_API_KEY: ${{ secrets.CODITSU_API_KEY }}
|
48
|
+
CODITSU_API_SECRET: ${{ secrets.CODITSU_API_SECRET }}
|
49
|
+
run: \curl -sSL https://api.coditsu.io/run/ci | bash
|
data/.gitignore
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
# bundler state
|
2
|
+
/.bundle
|
3
|
+
/vendor/bundle/
|
4
|
+
/vendor/ruby/
|
5
|
+
/ruby/
|
6
|
+
app.god
|
7
|
+
|
8
|
+
# minimal Rails specific artifacts
|
9
|
+
/.coditsu/local.yml
|
10
|
+
db/*.sqlite3
|
11
|
+
/log/development.log
|
12
|
+
/log/production.log
|
13
|
+
/log/test.log
|
14
|
+
/tmp/*
|
15
|
+
*.gem
|
16
|
+
*.~
|
17
|
+
|
18
|
+
# various artifacts
|
19
|
+
**.war
|
20
|
+
*.rbc
|
21
|
+
*.sassc
|
22
|
+
.byebug_history
|
23
|
+
.redcar/
|
24
|
+
.capistrano/
|
25
|
+
.sass-cache
|
26
|
+
/config/god/sidekiq.rb
|
27
|
+
/config/puma.rb
|
28
|
+
/coverage.data
|
29
|
+
/coverage/
|
30
|
+
/doc/api/
|
31
|
+
/doc/app/
|
32
|
+
/doc/yard
|
33
|
+
/doc/features.html
|
34
|
+
/doc/specs.html
|
35
|
+
/spec/tmp/*
|
36
|
+
/cache
|
37
|
+
/capybara*
|
38
|
+
/capybara-*.html
|
39
|
+
/gems
|
40
|
+
/specifications
|
41
|
+
rerun.txt
|
42
|
+
pickle-email-*.html
|
43
|
+
|
44
|
+
# If you find yourself ignoring temporary files generated by your text editor
|
45
|
+
# or operating system, you probably want to add a global ignore instead:
|
46
|
+
# git config --global core.excludesfile ~/.gitignore_global
|
47
|
+
#
|
48
|
+
# Here are some files you may want to ignore globally:
|
49
|
+
|
50
|
+
# scm revert files
|
51
|
+
**.orig
|
52
|
+
|
53
|
+
# Mac finder artifacts
|
54
|
+
.DS_Store
|
55
|
+
|
56
|
+
# Netbeans project directory
|
57
|
+
/nbproject
|
58
|
+
|
59
|
+
# RubyMine project files
|
60
|
+
.idea
|
61
|
+
|
62
|
+
# Textmate project files
|
63
|
+
/*.tmproj
|
64
|
+
|
65
|
+
# vim artifacts
|
66
|
+
**.swp
|
67
|
+
|
68
|
+
# documentation
|
69
|
+
.yardoc
|
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
karafka-web
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
3.2.0
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# Karafka Web changelog
|
2
|
+
|
3
|
+
## 0.1.1 (Unreleased)
|
4
|
+
- Rename `Karafka::Web.bootstrap_topics!` to `Karafka::Web.bootstrap!` and expand it with the zero state injection.
|
5
|
+
- Require Karafka `2.0.28` due to some instrumentation fixes.
|
6
|
+
- Provide an auto-installer under the `bundle exec karafka-web install` command.
|
7
|
+
|
8
|
+
## 0.1.0
|
9
|
+
- Initial code of the Web and Web Pro
|
data/CODE_OF_CONDUCT.md
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# Contributor Covenant Code of Conduct
|
2
|
+
|
3
|
+
## Our Pledge
|
4
|
+
|
5
|
+
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
6
|
+
|
7
|
+
## Our Standards
|
8
|
+
|
9
|
+
Examples of behavior that contributes to creating a positive environment include:
|
10
|
+
|
11
|
+
* Using welcoming and inclusive language
|
12
|
+
* Being respectful of differing viewpoints and experiences
|
13
|
+
* Gracefully accepting constructive criticism
|
14
|
+
* Focusing on what is best for the community
|
15
|
+
* Showing empathy towards other community members
|
16
|
+
|
17
|
+
Examples of unacceptable behavior by participants include:
|
18
|
+
|
19
|
+
* The use of sexualized language or imagery and unwelcome sexual attention or advances
|
20
|
+
* Trolling, insulting/derogatory comments, and personal or political attacks
|
21
|
+
* Public or private harassment
|
22
|
+
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
23
|
+
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
24
|
+
|
25
|
+
## Our Responsibilities
|
26
|
+
|
27
|
+
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
|
28
|
+
|
29
|
+
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
|
30
|
+
|
31
|
+
## Scope
|
32
|
+
|
33
|
+
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
|
34
|
+
|
35
|
+
## Enforcement
|
36
|
+
|
37
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at maciej@mensfeld.pl. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
38
|
+
|
39
|
+
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
40
|
+
|
41
|
+
## Attribution
|
42
|
+
|
43
|
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
|
44
|
+
|
45
|
+
[homepage]: http://contributor-covenant.org
|
46
|
+
[version]: http://contributor-covenant.org/version/1/4/
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
karafka-web (0.1.0)
|
5
|
+
erubi (~> 1.4)
|
6
|
+
karafka (>= 2.0.29, < 3.0.0)
|
7
|
+
roda (~> 3.63)
|
8
|
+
tilt (~> 2.0)
|
9
|
+
|
10
|
+
GEM
|
11
|
+
remote: https://rubygems.org/
|
12
|
+
specs:
|
13
|
+
concurrent-ruby (1.2.0)
|
14
|
+
erubi (1.12.0)
|
15
|
+
ffi (1.15.5)
|
16
|
+
karafka (2.0.29)
|
17
|
+
karafka-core (>= 2.0.9, < 3.0.0)
|
18
|
+
thor (>= 0.20)
|
19
|
+
waterdrop (>= 2.4.10, < 3.0.0)
|
20
|
+
zeitwerk (~> 2.3)
|
21
|
+
karafka-core (2.0.9)
|
22
|
+
concurrent-ruby (>= 1.1)
|
23
|
+
karafka-rdkafka (>= 0.12)
|
24
|
+
karafka-rdkafka (0.12.0)
|
25
|
+
ffi (~> 1.15)
|
26
|
+
mini_portile2 (~> 2.6)
|
27
|
+
rake (> 12)
|
28
|
+
mini_portile2 (2.8.1)
|
29
|
+
rack (3.0.4.1)
|
30
|
+
rackup (0.2.3)
|
31
|
+
rack (>= 3.0.0.beta1)
|
32
|
+
webrick
|
33
|
+
rake (13.0.6)
|
34
|
+
roda (3.64.0)
|
35
|
+
rack
|
36
|
+
thor (1.2.1)
|
37
|
+
tilt (2.0.11)
|
38
|
+
waterdrop (2.4.10)
|
39
|
+
karafka-core (>= 2.0.9, < 3.0.0)
|
40
|
+
zeitwerk (~> 2.3)
|
41
|
+
webrick (1.8.1)
|
42
|
+
zeitwerk (2.6.6)
|
43
|
+
|
44
|
+
PLATFORMS
|
45
|
+
x86_64-linux
|
46
|
+
|
47
|
+
DEPENDENCIES
|
48
|
+
karafka-web!
|
49
|
+
rackup (~> 0.2)
|
50
|
+
|
51
|
+
BUNDLED WITH
|
52
|
+
2.4.5
|
data/LICENSE
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
Copyright (c) Maciej Mensfeld
|
2
|
+
|
3
|
+
Karafka Web is part of Karafka and it is an Open Source project licensed under the terms of
|
4
|
+
the LGPLv3 license. Please see <https://github.com/karafka/karafka/blob/master/LGPL>
|
5
|
+
for license text.
|
6
|
+
|
7
|
+
Karafka has also commercial-friendly license, commercial support and commercial components.
|
8
|
+
|
9
|
+
All of the commercial components are present in the lib/karafka/pro and lib/karafka/web/ui/pro
|
10
|
+
directory of this repository and their usage requires commercial license agreement.
|
11
|
+
|
12
|
+
By sending a pull request to the pro components, you are agreeing to transfer the copyright of your
|
13
|
+
code to Maciej Mensfeld.
|
14
|
+
|
15
|
+
You can find the commercial license in LICENSE-COMM.
|
16
|
+
|
17
|
+
Please see https://karafka.io for purchasing options.
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Karafka Web
|
2
|
+
|
3
|
+
[![Build Status](https://github.com/karafka/karafka-web/workflows/ci/badge.svg)](https://github.com/karafka/karafka-web/actions?query=workflow%3Aci)
|
4
|
+
[![Gem Version](https://badge.fury.io/rb/karafka-web.svg)](http://badge.fury.io/rb/karafka-web)
|
5
|
+
[![Join the chat at https://slack.karafka.io](https://raw.githubusercontent.com/karafka/misc/master/slack.svg)](https://slack.karafka.io)
|
6
|
+
|
7
|
+
Karafka Web UI is a user interface for the [Karafka framework](https://github.com/karafka/karafka). The Web UI provides a convenient way for developers to monitor and manage their Karafka-based applications, without the need to use the command line or third party software.
|
8
|
+
|
9
|
+
It allows for easy access to various metrics, such as the number of messages consumed, the number of errors, and the number of consumers operating. It also provides a way to view the different Kafka topics, consumers, and groups that are being used by the application.
|
10
|
+
|
11
|
+
## Getting started
|
12
|
+
|
13
|
+
Karafka Web UI documentation is part of the Karafka framework documentation and can be found [here](https://karafka.io/docs).
|
14
|
+
|
15
|
+
![karafka web ui dashboard](https://raw.githubusercontent.com/karafka/misc/master/printscreens/web-ui.png)
|
16
|
+
|
17
|
+
## Karafka Pro Enhanced Web UI
|
18
|
+
|
19
|
+
The Enhanced Web UI, aside from all the features from the OSS version, also offers additional features and capabilities not available in the free version, making it a better option for those looking for more robust monitoring and management capabilities for their Karafka applications. Some of the key benefits of the Enhanced Web UI version include the following:
|
20
|
+
|
21
|
+
- Enhanced consumers utilization metrics providing much better insights into processes resources utilization.
|
22
|
+
- Consumer process inspection to quickly analyze the state of a given consuming process.
|
23
|
+
- Consumer jobs inspection to view currently running jobs on a per-process basis.
|
24
|
+
- Health dashboard containing general consumption overview information
|
25
|
+
- Data Explorer allowing for viewing and exploring the data produced to Kafka topics. It understands the routing table and can deserialize data before it is displayed.
|
26
|
+
- Enhanced error reporting allowing for backtrace inspection and providing multi-partition support.
|
27
|
+
- DLQ / Dead insights allowing to navigate through DLQ topics and messages that were dispatched to them.
|
28
|
+
|
29
|
+
Help me provide high-quality open-source software. Please see the Karafka [homepage](https://karafka.io) for more details.
|
data/bin/karafka-web
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'karafka'
|
4
|
+
require 'karafka/web'
|
5
|
+
|
6
|
+
::Karafka::Cli::Base.load
|
7
|
+
include ::Karafka::Helpers::Colorize
|
8
|
+
|
9
|
+
case ARGV[0]
|
10
|
+
when 'install'
|
11
|
+
puts
|
12
|
+
puts 'Installing Karafka Web UI...'
|
13
|
+
puts
|
14
|
+
puts 'Creating necessary topics and populating state data...'
|
15
|
+
Karafka::Web.bootstrap!
|
16
|
+
puts 'Updating the Karafka boot file...'
|
17
|
+
|
18
|
+
enabler = 'Karafka::Web.enable!'
|
19
|
+
|
20
|
+
if File.read(Karafka.boot_file).include?(enabler)
|
21
|
+
puts "Web UI #{green('already')} installed."
|
22
|
+
else
|
23
|
+
File.open(Karafka.boot_file, 'a') do |f|
|
24
|
+
f << "\n#{enabler}\n"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
puts
|
29
|
+
puts("Installation #{green('completed')}. Have fun!")
|
30
|
+
puts
|
31
|
+
else
|
32
|
+
raise NotImplementedError, "#{ARGV[0]} is not supported"
|
33
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIEcDCCAtigAwIBAgIBATANBgkqhkiG9w0BAQsFADA/MRAwDgYDVQQDDAdjb250
|
3
|
+
YWN0MRcwFQYKCZImiZPyLGQBGRYHa2FyYWZrYTESMBAGCgmSJomT8ixkARkWAmlv
|
4
|
+
MB4XDTIyMDgxOTE3MjEzN1oXDTIzMDgxOTE3MjEzN1owPzEQMA4GA1UEAwwHY29u
|
5
|
+
dGFjdDEXMBUGCgmSJomT8ixkARkWB2thcmFma2ExEjAQBgoJkiaJk/IsZAEZFgJp
|
6
|
+
bzCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAODzeO3L6lxdATzMHKNW
|
7
|
+
jFA/GGunoPuylO/BMzy8RiQHh7VIvysAKs0tHhTx3g2D0STDpF+hcQcPELFikiT2
|
8
|
+
F+1wOHj/SsrK7VKqfA8+gq04hKc5sQoX2Egf9k3V0YJ3eZ6R/koHkQ8A0TVt0w6F
|
9
|
+
ZQckoV4MqnEAx0g/FZN3mnHTlJ3VFLSBqJEIe+S6FZMl92mSv+hTrlUG8VaYxSfN
|
10
|
+
lTCvnKk284F6QZq5XIENLRmcDd/3aPBLnLwNnyMyhB+6gK8cUO+CFlDO5tjo/aBA
|
11
|
+
rUnl++wGG0JooF1ed0v+evOn9KoMBG6rHewcf79qJbVOscbD8qSAmo+sCXtcFryr
|
12
|
+
KRMTB8gNbowJkFRJDEe8tfRy11u1fYzFg/qNO82FJd62rKAw2wN0C29yCeQOPRb1
|
13
|
+
Cw9Y4ZwK9VFNEcV9L+3pHTHn2XfuZHtDaG198VweiF6raFO4yiEYccodH/USP0L5
|
14
|
+
cbcCFtmu/4HDSxL1ByQXO84A0ybJuk3/+aPUSXe9C9U8fwIDAQABo3cwdTAJBgNV
|
15
|
+
HRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUSlcEakb7gfn/5E2WY6z73BF/
|
16
|
+
iZkwHQYDVR0RBBYwFIESY29udGFjdEBrYXJhZmthLmlvMB0GA1UdEgQWMBSBEmNv
|
17
|
+
bnRhY3RAa2FyYWZrYS5pbzANBgkqhkiG9w0BAQsFAAOCAYEA1aS+E7RXJ1w9g9mJ
|
18
|
+
G0NzFxe64OEuENosNlvYQCbRKGCXAU1qqelYkBQHseRgRKxLICrnypRo9IEobyHa
|
19
|
+
vDnJ4r7Tsb34dleqQW2zY/obG+cia3Ym2JsegXWF7dDOzCXJ4FN8MFoT2jHlqLLw
|
20
|
+
yrap0YO5zx0GSQ0Dwy8h2n2v2vanMEeCx7iNm3ERgR5WuN5sjzWoz2A/JLEEcK0C
|
21
|
+
EnAGKCWAd1fuG8IemDjT1edsd5FyYR4bIX0m+99oDuFZyPiiIbalmyYiSBBp59Yb
|
22
|
+
Q0P8zeBi4OfwCZNcxqz0KONmw9JLNv6DgyEAH5xe/4JzhMEgvIRiPj0pHfA7oqQF
|
23
|
+
KUNqvD1KlxbEC+bZfE5IZhnqYLdld/Ksqd22FI1RBhiS1Ejfsj99LVIm9cBuZEY2
|
24
|
+
Qf04B9ceLUaC4fPVEz10FyobjaFoY4i32xRto3XnrzeAgfEe4swLq8bQsR3w/EF3
|
25
|
+
MGU0FeSV2Yj7Xc2x/7BzLK8xQn5l7Yy75iPF+KP3vVmDHnNl
|
26
|
+
-----END CERTIFICATE-----
|
data/karafka-web.gemspec
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
require 'karafka/web/version'
|
7
|
+
|
8
|
+
Gem::Specification.new do |spec|
|
9
|
+
spec.name = 'karafka-web'
|
10
|
+
spec.version = ::Karafka::Web::VERSION
|
11
|
+
spec.platform = Gem::Platform::RUBY
|
12
|
+
spec.authors = ['Maciej Mensfeld']
|
13
|
+
spec.email = %w[contact@karafka.io]
|
14
|
+
spec.homepage = 'https://karafka.io'
|
15
|
+
spec.summary = 'Karafka ecosystem Web UI interface'
|
16
|
+
spec.description = 'Karafka ecosystem plug-and-play Web UI'
|
17
|
+
spec.licenses = %w[LGPL-3.0 Commercial]
|
18
|
+
|
19
|
+
spec.add_dependency 'erubi', '~> 1.4'
|
20
|
+
spec.add_dependency 'karafka', '>= 2.0.29', '< 3.0.0'
|
21
|
+
spec.add_dependency 'roda', '~> 3.63'
|
22
|
+
spec.add_dependency 'tilt', '~> 2.0'
|
23
|
+
|
24
|
+
spec.add_development_dependency 'rackup', '~> 0.2'
|
25
|
+
|
26
|
+
if $PROGRAM_NAME.end_with?('gem')
|
27
|
+
spec.signing_key = File.expand_path('~/.ssh/gem-private_key.pem')
|
28
|
+
end
|
29
|
+
|
30
|
+
spec.cert_chain = %w[certs/cert_chain.pem]
|
31
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec)/}) }
|
32
|
+
spec.executables = %w[karafka-web]
|
33
|
+
spec.require_paths = %w[lib]
|
34
|
+
|
35
|
+
spec.metadata = {
|
36
|
+
'funding_uri' => 'https://karafka.io/#become-pro',
|
37
|
+
'homepage_uri' => 'https://karafka.io',
|
38
|
+
'changelog_uri' => 'https://github.com/karafka/karafka-web/blob/master/CHANGELOG.md',
|
39
|
+
'bug_tracker_uri' => 'https://github.com/karafka/karafka-web/issues',
|
40
|
+
'source_code_uri' => 'https://github.com/karafka/karafka-web',
|
41
|
+
'documentation_uri' => 'https://karafka.io/docs',
|
42
|
+
'rubygems_mfa_required' => 'true'
|
43
|
+
}
|
44
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Karafka
|
4
|
+
module Web
|
5
|
+
# Proxy App that selects either Pro or regular app to handle the requests
|
6
|
+
class App
|
7
|
+
class << self
|
8
|
+
# @param env [Hash] Rack env
|
9
|
+
# @param block [Proc] Rack block
|
10
|
+
def call(env, &block)
|
11
|
+
handler = Karafka.pro? ? Ui::Pro::App : Ui::App
|
12
|
+
handler.call(env, &block)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Karafka
|
4
|
+
module Web
|
5
|
+
# Karafka::Web configuration
|
6
|
+
class Config
|
7
|
+
include ::Karafka::Core::Configurable
|
8
|
+
|
9
|
+
# How long do we consider the process alive without receiving status info about it
|
10
|
+
# For this long we also display dead processes (shutdown) in the UI
|
11
|
+
# This is used both in the processing for eviction and in the UI
|
12
|
+
setting :ttl, default: 30_000
|
13
|
+
|
14
|
+
# Topics naming - used for processing and UI
|
15
|
+
setting :topics do
|
16
|
+
# All the errors encountered will be dispatched to this topic for inspection
|
17
|
+
setting :errors, default: 'karafka_errors'
|
18
|
+
|
19
|
+
setting :consumers do
|
20
|
+
# Reports containing particular consumer processes. This topic contains the heartbeat
|
21
|
+
# information sent from each consumer process.
|
22
|
+
setting :reports, default: 'karafka_consumers_reports'
|
23
|
+
|
24
|
+
# Topic for storing states aggregated info
|
25
|
+
setting :states, default: 'karafka_consumers_states'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Tracking and reporting related settings
|
30
|
+
setting :tracking do
|
31
|
+
# Collects the metrics we will be dispatching
|
32
|
+
# Tracks and reports the collected metrics
|
33
|
+
setting :reporter, default: Tracking::Reporter.new
|
34
|
+
|
35
|
+
# How often should we report data from a single process
|
36
|
+
# You may set it to a lower value in development but in production and scale, every
|
37
|
+
# 5 seconds should be enough
|
38
|
+
setting :interval, default: 5_000
|
39
|
+
|
40
|
+
setting :consumers do
|
41
|
+
setting :sampler, default: Tracking::Consumers::Sampler.new
|
42
|
+
|
43
|
+
setting :listeners, default: [
|
44
|
+
Tracking::Consumers::Listeners::Status.new,
|
45
|
+
Tracking::Consumers::Listeners::Errors.new,
|
46
|
+
Tracking::Consumers::Listeners::Statistics.new,
|
47
|
+
Tracking::Consumers::Listeners::Pausing.new,
|
48
|
+
Tracking::Consumers::Listeners::Processing.new
|
49
|
+
]
|
50
|
+
end
|
51
|
+
|
52
|
+
setting :producers do
|
53
|
+
setting :listeners, default: []
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# States processing related settings
|
58
|
+
setting :processing do
|
59
|
+
# What should be the consumer group name for web consumer
|
60
|
+
setting :consumer_group, default: 'karafka_web'
|
61
|
+
|
62
|
+
# How often should we report the aggregated state
|
63
|
+
setting :interval, default: 1_000
|
64
|
+
|
65
|
+
setting :consumers do
|
66
|
+
setting :aggregator, default: Processing::Consumers::Aggregator.new
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
setting :ui do
|
71
|
+
# Should the payload be decrypted for the Pro Web UI. Default to `false` due to security
|
72
|
+
# reasons
|
73
|
+
setting :decrypt, default: false
|
74
|
+
|
75
|
+
# How many elements should we display on pages that support pagination
|
76
|
+
setting :per_page, default: 25
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Karafka
|
4
|
+
module Web
|
5
|
+
# Web reporting deserializer
|
6
|
+
#
|
7
|
+
# @note We use `symbolize_names` because we want to use the same convention of hash building
|
8
|
+
# for producing, consuming and displaying metrics related data
|
9
|
+
class Deserializer
|
10
|
+
# @param message [::Karafka::Messages::Message]
|
11
|
+
# @return [Object] deserialized data
|
12
|
+
def call(message)
|
13
|
+
::JSON.parse(
|
14
|
+
message.raw_payload,
|
15
|
+
symbolize_names: true
|
16
|
+
)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Karafka
|
4
|
+
module Web
|
5
|
+
# Karafka::Web related errors
|
6
|
+
module Errors
|
7
|
+
# Tracking related errors
|
8
|
+
module Tracking
|
9
|
+
# Raised when the a report is not valid for any reason
|
10
|
+
# This should never happen and if you see this, please open an issue.
|
11
|
+
ContractError = Class.new(::Karafka::Errors::BaseError)
|
12
|
+
end
|
13
|
+
|
14
|
+
# Ui related errors
|
15
|
+
module Ui
|
16
|
+
# Raised when we cannot display a given view.
|
17
|
+
# This may mean, that request topic was not present or partition or a message.
|
18
|
+
NotFoundError = Class.new(::Karafka::Errors::BaseError)
|
19
|
+
|
20
|
+
# Raised whe a given feature is available for Pro but not pro used
|
21
|
+
ProOnlyError = Class.new(::Karafka::Errors::BaseError)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|