karafka-web 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (178) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +3 -0
  3. data/.coditsu/ci.yml +3 -0
  4. data/.diffend.yml +3 -0
  5. data/.github/FUNDING.yml +1 -0
  6. data/.github/ISSUE_TEMPLATE/bug_report.md +50 -0
  7. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  8. data/.github/workflows/ci.yml +49 -0
  9. data/.gitignore +69 -0
  10. data/.ruby-gemset +1 -0
  11. data/.ruby-version +1 -0
  12. data/CHANGELOG.md +9 -0
  13. data/CODE_OF_CONDUCT.md +46 -0
  14. data/Gemfile +7 -0
  15. data/Gemfile.lock +52 -0
  16. data/LICENSE +17 -0
  17. data/README.md +29 -0
  18. data/bin/karafka-web +33 -0
  19. data/certs/cert_chain.pem +26 -0
  20. data/config/locales/errors.yml +9 -0
  21. data/karafka-web.gemspec +44 -0
  22. data/lib/karafka/web/app.rb +17 -0
  23. data/lib/karafka/web/config.rb +80 -0
  24. data/lib/karafka/web/deserializer.rb +20 -0
  25. data/lib/karafka/web/errors.rb +25 -0
  26. data/lib/karafka/web/installer.rb +124 -0
  27. data/lib/karafka/web/processing/consumer.rb +66 -0
  28. data/lib/karafka/web/processing/consumers/aggregator.rb +130 -0
  29. data/lib/karafka/web/processing/consumers/state.rb +32 -0
  30. data/lib/karafka/web/tracking/base_contract.rb +31 -0
  31. data/lib/karafka/web/tracking/consumers/contracts/consumer_group.rb +33 -0
  32. data/lib/karafka/web/tracking/consumers/contracts/job.rb +26 -0
  33. data/lib/karafka/web/tracking/consumers/contracts/partition.rb +22 -0
  34. data/lib/karafka/web/tracking/consumers/contracts/report.rb +95 -0
  35. data/lib/karafka/web/tracking/consumers/contracts/topic.rb +29 -0
  36. data/lib/karafka/web/tracking/consumers/listeners/base.rb +33 -0
  37. data/lib/karafka/web/tracking/consumers/listeners/errors.rb +107 -0
  38. data/lib/karafka/web/tracking/consumers/listeners/pausing.rb +45 -0
  39. data/lib/karafka/web/tracking/consumers/listeners/processing.rb +157 -0
  40. data/lib/karafka/web/tracking/consumers/listeners/statistics.rb +123 -0
  41. data/lib/karafka/web/tracking/consumers/listeners/status.rb +58 -0
  42. data/lib/karafka/web/tracking/consumers/sampler.rb +216 -0
  43. data/lib/karafka/web/tracking/memoized_shell.rb +48 -0
  44. data/lib/karafka/web/tracking/reporter.rb +144 -0
  45. data/lib/karafka/web/tracking/ttl_array.rb +59 -0
  46. data/lib/karafka/web/tracking/ttl_hash.rb +16 -0
  47. data/lib/karafka/web/ui/app.rb +78 -0
  48. data/lib/karafka/web/ui/base.rb +77 -0
  49. data/lib/karafka/web/ui/controllers/base.rb +40 -0
  50. data/lib/karafka/web/ui/controllers/become_pro.rb +17 -0
  51. data/lib/karafka/web/ui/controllers/cluster.rb +24 -0
  52. data/lib/karafka/web/ui/controllers/consumers.rb +27 -0
  53. data/lib/karafka/web/ui/controllers/errors.rb +43 -0
  54. data/lib/karafka/web/ui/controllers/jobs.rb +33 -0
  55. data/lib/karafka/web/ui/controllers/requests/params.rb +30 -0
  56. data/lib/karafka/web/ui/controllers/responses/data.rb +26 -0
  57. data/lib/karafka/web/ui/controllers/routing.rb +30 -0
  58. data/lib/karafka/web/ui/helpers/application_helper.rb +144 -0
  59. data/lib/karafka/web/ui/lib/hash_proxy.rb +66 -0
  60. data/lib/karafka/web/ui/lib/paginate_array.rb +38 -0
  61. data/lib/karafka/web/ui/models/consumer_group.rb +20 -0
  62. data/lib/karafka/web/ui/models/health.rb +44 -0
  63. data/lib/karafka/web/ui/models/job.rb +13 -0
  64. data/lib/karafka/web/ui/models/message.rb +99 -0
  65. data/lib/karafka/web/ui/models/partition.rb +13 -0
  66. data/lib/karafka/web/ui/models/process.rb +56 -0
  67. data/lib/karafka/web/ui/models/processes.rb +86 -0
  68. data/lib/karafka/web/ui/models/state.rb +67 -0
  69. data/lib/karafka/web/ui/models/topic.rb +19 -0
  70. data/lib/karafka/web/ui/pro/app.rb +120 -0
  71. data/lib/karafka/web/ui/pro/controllers/cluster.rb +16 -0
  72. data/lib/karafka/web/ui/pro/controllers/consumers.rb +54 -0
  73. data/lib/karafka/web/ui/pro/controllers/dlq.rb +44 -0
  74. data/lib/karafka/web/ui/pro/controllers/errors.rb +57 -0
  75. data/lib/karafka/web/ui/pro/controllers/explorer.rb +79 -0
  76. data/lib/karafka/web/ui/pro/controllers/health.rb +33 -0
  77. data/lib/karafka/web/ui/pro/controllers/jobs.rb +26 -0
  78. data/lib/karafka/web/ui/pro/controllers/routing.rb +26 -0
  79. data/lib/karafka/web/ui/pro/views/consumers/_breadcrumbs.erb +27 -0
  80. data/lib/karafka/web/ui/pro/views/consumers/_consumer.erb +60 -0
  81. data/lib/karafka/web/ui/pro/views/consumers/_counters.erb +50 -0
  82. data/lib/karafka/web/ui/pro/views/consumers/_summary.erb +81 -0
  83. data/lib/karafka/web/ui/pro/views/consumers/consumer/_consumer_group.erb +109 -0
  84. data/lib/karafka/web/ui/pro/views/consumers/consumer/_job.erb +26 -0
  85. data/lib/karafka/web/ui/pro/views/consumers/consumer/_metrics.erb +126 -0
  86. data/lib/karafka/web/ui/pro/views/consumers/consumer/_no_jobs.erb +9 -0
  87. data/lib/karafka/web/ui/pro/views/consumers/consumer/_no_subscriptions.erb +9 -0
  88. data/lib/karafka/web/ui/pro/views/consumers/consumer/_partition.erb +32 -0
  89. data/lib/karafka/web/ui/pro/views/consumers/consumer/_stopped.erb +10 -0
  90. data/lib/karafka/web/ui/pro/views/consumers/consumer/_tabs.erb +20 -0
  91. data/lib/karafka/web/ui/pro/views/consumers/index.erb +30 -0
  92. data/lib/karafka/web/ui/pro/views/consumers/jobs.erb +42 -0
  93. data/lib/karafka/web/ui/pro/views/consumers/subscriptions.erb +23 -0
  94. data/lib/karafka/web/ui/pro/views/dlq/_breadcrumbs.erb +5 -0
  95. data/lib/karafka/web/ui/pro/views/dlq/_no_topics.erb +9 -0
  96. data/lib/karafka/web/ui/pro/views/dlq/_topic.erb +12 -0
  97. data/lib/karafka/web/ui/pro/views/dlq/index.erb +16 -0
  98. data/lib/karafka/web/ui/pro/views/errors/_breadcrumbs.erb +25 -0
  99. data/lib/karafka/web/ui/pro/views/errors/_detail.erb +29 -0
  100. data/lib/karafka/web/ui/pro/views/errors/_error.erb +26 -0
  101. data/lib/karafka/web/ui/pro/views/errors/_partition_option.erb +7 -0
  102. data/lib/karafka/web/ui/pro/views/errors/index.erb +58 -0
  103. data/lib/karafka/web/ui/pro/views/errors/show.erb +56 -0
  104. data/lib/karafka/web/ui/pro/views/explorer/_breadcrumbs.erb +29 -0
  105. data/lib/karafka/web/ui/pro/views/explorer/_detail.erb +21 -0
  106. data/lib/karafka/web/ui/pro/views/explorer/_encryption_enabled.erb +18 -0
  107. data/lib/karafka/web/ui/pro/views/explorer/_failed_deserialization.erb +4 -0
  108. data/lib/karafka/web/ui/pro/views/explorer/_message.erb +16 -0
  109. data/lib/karafka/web/ui/pro/views/explorer/_partition_option.erb +7 -0
  110. data/lib/karafka/web/ui/pro/views/explorer/_topic.erb +12 -0
  111. data/lib/karafka/web/ui/pro/views/explorer/index.erb +17 -0
  112. data/lib/karafka/web/ui/pro/views/explorer/partition.erb +56 -0
  113. data/lib/karafka/web/ui/pro/views/explorer/show.erb +65 -0
  114. data/lib/karafka/web/ui/pro/views/health/_breadcrumbs.erb +5 -0
  115. data/lib/karafka/web/ui/pro/views/health/_partition.erb +35 -0
  116. data/lib/karafka/web/ui/pro/views/health/index.erb +60 -0
  117. data/lib/karafka/web/ui/pro/views/jobs/_breadcrumbs.erb +5 -0
  118. data/lib/karafka/web/ui/pro/views/jobs/_job.erb +31 -0
  119. data/lib/karafka/web/ui/pro/views/jobs/_no_jobs.erb +9 -0
  120. data/lib/karafka/web/ui/pro/views/jobs/index.erb +34 -0
  121. data/lib/karafka/web/ui/pro/views/shared/_navigation.erb +57 -0
  122. data/lib/karafka/web/ui/public/images/favicon.ico +0 -0
  123. data/lib/karafka/web/ui/public/images/logo.svg +28 -0
  124. data/lib/karafka/web/ui/public/javascripts/application.js +41 -0
  125. data/lib/karafka/web/ui/public/javascripts/bootstrap.min.js +7 -0
  126. data/lib/karafka/web/ui/public/javascripts/highlight.min.js +337 -0
  127. data/lib/karafka/web/ui/public/javascripts/live_poll.js +124 -0
  128. data/lib/karafka/web/ui/public/javascripts/timeago.min.js +1 -0
  129. data/lib/karafka/web/ui/public/stylesheets/application.css +106 -0
  130. data/lib/karafka/web/ui/public/stylesheets/bootstrap.min.css +7 -0
  131. data/lib/karafka/web/ui/public/stylesheets/bootstrap.min.css.map +1 -0
  132. data/lib/karafka/web/ui/public/stylesheets/highlight.min.css +10 -0
  133. data/lib/karafka/web/ui/views/cluster/_breadcrumbs.erb +5 -0
  134. data/lib/karafka/web/ui/views/cluster/_broker.erb +5 -0
  135. data/lib/karafka/web/ui/views/cluster/_partition.erb +22 -0
  136. data/lib/karafka/web/ui/views/cluster/index.erb +72 -0
  137. data/lib/karafka/web/ui/views/consumers/_breadcrumbs.erb +27 -0
  138. data/lib/karafka/web/ui/views/consumers/_consumer.erb +43 -0
  139. data/lib/karafka/web/ui/views/consumers/_counters.erb +44 -0
  140. data/lib/karafka/web/ui/views/consumers/_summary.erb +81 -0
  141. data/lib/karafka/web/ui/views/consumers/consumer/_consumer_group.erb +109 -0
  142. data/lib/karafka/web/ui/views/consumers/consumer/_job.erb +26 -0
  143. data/lib/karafka/web/ui/views/consumers/consumer/_metrics.erb +126 -0
  144. data/lib/karafka/web/ui/views/consumers/consumer/_no_jobs.erb +9 -0
  145. data/lib/karafka/web/ui/views/consumers/consumer/_no_subscriptions.erb +9 -0
  146. data/lib/karafka/web/ui/views/consumers/consumer/_partition.erb +32 -0
  147. data/lib/karafka/web/ui/views/consumers/consumer/_stopped.erb +10 -0
  148. data/lib/karafka/web/ui/views/consumers/consumer/_tabs.erb +20 -0
  149. data/lib/karafka/web/ui/views/consumers/index.erb +29 -0
  150. data/lib/karafka/web/ui/views/errors/_breadcrumbs.erb +19 -0
  151. data/lib/karafka/web/ui/views/errors/_detail.erb +29 -0
  152. data/lib/karafka/web/ui/views/errors/_error.erb +26 -0
  153. data/lib/karafka/web/ui/views/errors/index.erb +38 -0
  154. data/lib/karafka/web/ui/views/errors/show.erb +30 -0
  155. data/lib/karafka/web/ui/views/jobs/_breadcrumbs.erb +5 -0
  156. data/lib/karafka/web/ui/views/jobs/_job.erb +22 -0
  157. data/lib/karafka/web/ui/views/jobs/_no_jobs.erb +9 -0
  158. data/lib/karafka/web/ui/views/jobs/index.erb +31 -0
  159. data/lib/karafka/web/ui/views/layout.erb +23 -0
  160. data/lib/karafka/web/ui/views/routing/_breadcrumbs.erb +15 -0
  161. data/lib/karafka/web/ui/views/routing/_consumer_group.erb +34 -0
  162. data/lib/karafka/web/ui/views/routing/_detail.erb +25 -0
  163. data/lib/karafka/web/ui/views/routing/_topic.erb +18 -0
  164. data/lib/karafka/web/ui/views/routing/index.erb +10 -0
  165. data/lib/karafka/web/ui/views/routing/show.erb +26 -0
  166. data/lib/karafka/web/ui/views/shared/_become_pro.erb +13 -0
  167. data/lib/karafka/web/ui/views/shared/_brand.erb +3 -0
  168. data/lib/karafka/web/ui/views/shared/_content.erb +31 -0
  169. data/lib/karafka/web/ui/views/shared/_header.erb +20 -0
  170. data/lib/karafka/web/ui/views/shared/_navigation.erb +57 -0
  171. data/lib/karafka/web/ui/views/shared/_pagination.erb +21 -0
  172. data/lib/karafka/web/ui/views/shared/exceptions/not_found.erb +39 -0
  173. data/lib/karafka/web/ui/views/shared/exceptions/pro_only.erb +52 -0
  174. data/lib/karafka/web/version.rb +8 -0
  175. data/lib/karafka/web.rb +60 -0
  176. data.tar.gz.sig +0 -0
  177. metadata +328 -0
  178. 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
@@ -0,0 +1,3 @@
1
+ repository_id: '1f6176a1-ea6b-4927-96e5-a6bea52dbab9'
2
+ api_key: <%= ENV['CODITSU_API_KEY'] %>
3
+ api_secret: <%= ENV['CODITSU_API_SECRET'] %>
data/.diffend.yml ADDED
@@ -0,0 +1,3 @@
1
+ project_id: 'b06f89cd-51df-4ccb-96b3-a48f010f64b5'
2
+ shareable_id: 'b0e304f8-fc9c-4eac-bb1e-b076c8d05100'
3
+ shareable_key: 'a695a444-1509-470e-9e62-96479c3efd8b'
@@ -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
@@ -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
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ plugin 'diffend'
6
+
7
+ gemspec
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-----
@@ -0,0 +1,9 @@
1
+ en:
2
+ validations:
3
+ config:
4
+ missing: needs to be present
5
+
6
+ web:
7
+ missing: needs to be present
8
+ id_format: needs to be a String
9
+ format: is invalid
@@ -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