karafka-web 0.1.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.
- 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
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<%== partial 'consumers/counters' %>
|
|
2
|
+
<%== partial 'consumers/summary' %>
|
|
3
|
+
|
|
4
|
+
<div class="container">
|
|
5
|
+
<div class="row">
|
|
6
|
+
<div class="col-sm-12">
|
|
7
|
+
<table class="processes bg-white table table-hover table-bordered table-striped mb-0 align-middle">
|
|
8
|
+
<thead>
|
|
9
|
+
<tr class="align-middle">
|
|
10
|
+
<th>Name</th>
|
|
11
|
+
<th class="col-sm-2">Started</th>
|
|
12
|
+
<th class="col-sm-1">Memory</th>
|
|
13
|
+
<th class="col-sm-1">Utilization</th>
|
|
14
|
+
<th class="col-sm-1">Total lag</th>
|
|
15
|
+
</tr>
|
|
16
|
+
</thead>
|
|
17
|
+
<tbody>
|
|
18
|
+
<%==
|
|
19
|
+
render_each(
|
|
20
|
+
@processes,
|
|
21
|
+
'consumers/_consumer',
|
|
22
|
+
local: :process
|
|
23
|
+
)
|
|
24
|
+
%>
|
|
25
|
+
</tbody>
|
|
26
|
+
</table>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<li class="breadcrumb-item">
|
|
2
|
+
<a href="<%= root_path('errors') %>">
|
|
3
|
+
Errors
|
|
4
|
+
</a>
|
|
5
|
+
</li>
|
|
6
|
+
|
|
7
|
+
<% if @error_message %>
|
|
8
|
+
<li class="breadcrumb-item">
|
|
9
|
+
<a href="<%= root_path('errors', @offset) %>">
|
|
10
|
+
<%=
|
|
11
|
+
type = @error_message.payload[:type]
|
|
12
|
+
error_class = @error_message.payload[:error_class]
|
|
13
|
+
offset = @error_message.offset
|
|
14
|
+
|
|
15
|
+
"#{type}: #{error_class} #{offset}"
|
|
16
|
+
%>
|
|
17
|
+
</a>
|
|
18
|
+
</li>
|
|
19
|
+
<% end %>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<% if v.is_a?(Hash) %>
|
|
2
|
+
<% v.each do |k2, v2| %>
|
|
3
|
+
<tr>
|
|
4
|
+
<td>
|
|
5
|
+
<%= "#{k}.#{k2}" %>
|
|
6
|
+
</td>
|
|
7
|
+
<td>
|
|
8
|
+
<% if k2.to_s.include?('ssl') %>
|
|
9
|
+
***
|
|
10
|
+
<% else %>
|
|
11
|
+
<%= v2 %>
|
|
12
|
+
<% end %>
|
|
13
|
+
</td>
|
|
14
|
+
</tr>
|
|
15
|
+
<% end %>
|
|
16
|
+
<% else %>
|
|
17
|
+
<tr>
|
|
18
|
+
<td>
|
|
19
|
+
<%= k %>
|
|
20
|
+
</td>
|
|
21
|
+
<td>
|
|
22
|
+
<% if k == :occurred_at %>
|
|
23
|
+
<%== relative_time v %>
|
|
24
|
+
<% else %>
|
|
25
|
+
<%= v %>
|
|
26
|
+
<% end %>
|
|
27
|
+
</td>
|
|
28
|
+
</tr>
|
|
29
|
+
<% end %>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<% error = error_msg.payload %>
|
|
2
|
+
|
|
3
|
+
<tr>
|
|
4
|
+
<td>
|
|
5
|
+
<% if error[:details].key?(:topic) %>
|
|
6
|
+
<%= error[:details][:topic] %>: <%= error[:details][:partition] %>
|
|
7
|
+
<% else %>
|
|
8
|
+
<%= error[:type] %>
|
|
9
|
+
<% end %>
|
|
10
|
+
</td>
|
|
11
|
+
<td>
|
|
12
|
+
<%== error[:process_name] %>
|
|
13
|
+
</td>
|
|
14
|
+
<td>
|
|
15
|
+
<%= error[:error_class] %>:
|
|
16
|
+
<%= error[:error_message].first(200) %>
|
|
17
|
+
</td>
|
|
18
|
+
<td>
|
|
19
|
+
<%== relative_time error[:occurred_at] %>
|
|
20
|
+
</td>
|
|
21
|
+
<td>
|
|
22
|
+
<a href="<%= root_path('errors', error_msg.offset) %>" class="btn btn-sm btn-secondary text-white">
|
|
23
|
+
Details
|
|
24
|
+
</a>
|
|
25
|
+
</td>
|
|
26
|
+
</tr>
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<div class="container mb-5">
|
|
2
|
+
<div class="row">
|
|
3
|
+
<div class="col">
|
|
4
|
+
<h3>
|
|
5
|
+
Errors
|
|
6
|
+
</h3>
|
|
7
|
+
</div>
|
|
8
|
+
</div>
|
|
9
|
+
|
|
10
|
+
<hr>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<div class="container">
|
|
14
|
+
<div class="row mb-5">
|
|
15
|
+
<div class="col-sm-12">
|
|
16
|
+
<table class="processes bg-white table table-hover table-bordered table-striped mb-0 align-middle">
|
|
17
|
+
<thead>
|
|
18
|
+
<tr class="align-middle">
|
|
19
|
+
<th>Origin</th>
|
|
20
|
+
<th>Process name</th>
|
|
21
|
+
<th>Error</th>
|
|
22
|
+
<th>Occurred at</th>
|
|
23
|
+
<th></th>
|
|
24
|
+
</tr>
|
|
25
|
+
</thead>
|
|
26
|
+
<tbody>
|
|
27
|
+
<%==
|
|
28
|
+
each_partial(
|
|
29
|
+
@error_messages,
|
|
30
|
+
'errors/error',
|
|
31
|
+
local: :error_msg
|
|
32
|
+
)
|
|
33
|
+
%>
|
|
34
|
+
</tbody>
|
|
35
|
+
</table>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<%==
|
|
2
|
+
type = @error_message.payload[:type]
|
|
3
|
+
error_class = @error_message.payload[:error_class]
|
|
4
|
+
offset = @error_message.offset
|
|
5
|
+
|
|
6
|
+
view_title("#{type}: #{error_class} #{offset}", hr: true)
|
|
7
|
+
%>
|
|
8
|
+
|
|
9
|
+
<div class="container">
|
|
10
|
+
<div class="row mb-5">
|
|
11
|
+
<div class="col-sm-12 table-responsive">
|
|
12
|
+
<table class="processes bg-white table table-hover table-bordered table-striped mb-0 align-middle">
|
|
13
|
+
<tbody>
|
|
14
|
+
<% @error_message.payload.each do |k, v| %>
|
|
15
|
+
<% next if k == :backtrace %>
|
|
16
|
+
<%==
|
|
17
|
+
partial(
|
|
18
|
+
'errors/detail',
|
|
19
|
+
locals: {
|
|
20
|
+
k: k,
|
|
21
|
+
v: v
|
|
22
|
+
}
|
|
23
|
+
)
|
|
24
|
+
%>
|
|
25
|
+
<% end %>
|
|
26
|
+
</tbody>
|
|
27
|
+
</table>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<tr>
|
|
2
|
+
<td>
|
|
3
|
+
<a href="<%= root_path('consumers', job.process.id, 'subscriptions') %>">
|
|
4
|
+
<%= job.process.name %>
|
|
5
|
+
</a>
|
|
6
|
+
</td>
|
|
7
|
+
<td>
|
|
8
|
+
<span class="badge bg-secondary badge-topic" title="Consumer group: <%= job.consumer_group %>">
|
|
9
|
+
<%= job.topic %>:
|
|
10
|
+
<%= job.partition %>
|
|
11
|
+
</span>
|
|
12
|
+
</td>
|
|
13
|
+
<td>
|
|
14
|
+
<code><%= job.consumer %></code>
|
|
15
|
+
</td>
|
|
16
|
+
<td>
|
|
17
|
+
<code>#<%= job.type %></code>
|
|
18
|
+
</td>
|
|
19
|
+
<td>
|
|
20
|
+
<%== relative_time job.started_at %>
|
|
21
|
+
</td>
|
|
22
|
+
</tr>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<%== view_title('Running jobs', hr: true) %>
|
|
2
|
+
|
|
3
|
+
<% if @jobs.empty? %>
|
|
4
|
+
<%== partial 'jobs/no_jobs' %>
|
|
5
|
+
<% else %>
|
|
6
|
+
<div class="container">
|
|
7
|
+
<div class="row mb-5">
|
|
8
|
+
<div class="col-sm-12">
|
|
9
|
+
<table class="processes bg-white table table-hover table-bordered table-striped mb-0 align-middle">
|
|
10
|
+
<thead>
|
|
11
|
+
<tr class="align-middle">
|
|
12
|
+
<th>Process</th>
|
|
13
|
+
<th>Topic</th>
|
|
14
|
+
<th>Consumer</th>
|
|
15
|
+
<th>Type</th>
|
|
16
|
+
<th>Started at</th>
|
|
17
|
+
</tr>
|
|
18
|
+
</thead>
|
|
19
|
+
<tbody>
|
|
20
|
+
<%==
|
|
21
|
+
each_partial(
|
|
22
|
+
@jobs,
|
|
23
|
+
'jobs/job'
|
|
24
|
+
)
|
|
25
|
+
%>
|
|
26
|
+
</tbody>
|
|
27
|
+
</table>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
<% end %>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<%== partial 'shared/header' %>
|
|
4
|
+
|
|
5
|
+
<body>
|
|
6
|
+
<script>0</script>
|
|
7
|
+
|
|
8
|
+
<% if @error %>
|
|
9
|
+
<%== yield %>
|
|
10
|
+
<% else %>
|
|
11
|
+
<nav class="navbar navbar-expand-lg navbar-dark shadow-sm mb-4">
|
|
12
|
+
<div class="container">
|
|
13
|
+
<%== partial 'shared/brand' %>
|
|
14
|
+
<%== partial 'shared/navigation' %>
|
|
15
|
+
</div>
|
|
16
|
+
</nav>
|
|
17
|
+
|
|
18
|
+
<%== partial 'shared/become_pro' %>
|
|
19
|
+
|
|
20
|
+
<%== partial 'shared/content', locals: { content: yield } %>
|
|
21
|
+
<% end %>
|
|
22
|
+
</body>
|
|
23
|
+
</html>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<li class="breadcrumb-item">
|
|
2
|
+
<a href="<%= root_path('routing') %>">
|
|
3
|
+
Routing details
|
|
4
|
+
</a>
|
|
5
|
+
</li>
|
|
6
|
+
|
|
7
|
+
<% if @topic %>
|
|
8
|
+
<li class="breadcrumb-item">
|
|
9
|
+
<a href="<%= root_path('routing', @topic.id) %>">
|
|
10
|
+
<%=
|
|
11
|
+
title = [@topic.consumer_group.id, @topic.subscription_group, @topic.name].join(': ')
|
|
12
|
+
%>
|
|
13
|
+
</a>
|
|
14
|
+
</li>
|
|
15
|
+
<% end %>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<div class="row mb-4">
|
|
2
|
+
<div class="col-sm-12">
|
|
3
|
+
<h5 class="mb-2">
|
|
4
|
+
<%= consumer_group.id %>
|
|
5
|
+
</h5>
|
|
6
|
+
<hr/>
|
|
7
|
+
</div>
|
|
8
|
+
</div>
|
|
9
|
+
|
|
10
|
+
<div class="row mb-5">
|
|
11
|
+
<div class="col-sm-12">
|
|
12
|
+
<table class="processes bg-white table table-hover table-bordered table-striped mb-0 align-middle">
|
|
13
|
+
<thead>
|
|
14
|
+
<tr class="align-middle">
|
|
15
|
+
<th>Subscription group</th>
|
|
16
|
+
<th>Topic</th>
|
|
17
|
+
<th>Active</th>
|
|
18
|
+
<th></th>
|
|
19
|
+
</tr>
|
|
20
|
+
</thead>
|
|
21
|
+
<tbody>
|
|
22
|
+
<% consumer_group.subscription_groups.each do |subscription_group| %>
|
|
23
|
+
<%==
|
|
24
|
+
each_partial(
|
|
25
|
+
subscription_group.topics,
|
|
26
|
+
'routing/topic',
|
|
27
|
+
locals: { subscription_group: subscription_group }
|
|
28
|
+
)
|
|
29
|
+
%>
|
|
30
|
+
<% end %>
|
|
31
|
+
</tbody>
|
|
32
|
+
</table>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<% if v.is_a?(Hash) %>
|
|
2
|
+
<% v.each do |k2, v2| %>
|
|
3
|
+
<tr>
|
|
4
|
+
<td>
|
|
5
|
+
<%= "#{k}.#{k2}" %>
|
|
6
|
+
</td>
|
|
7
|
+
<td>
|
|
8
|
+
<% if k2.to_s.include?('ssl') %>
|
|
9
|
+
***
|
|
10
|
+
<% else %>
|
|
11
|
+
<%= v2 %>
|
|
12
|
+
<% end %>
|
|
13
|
+
</td>
|
|
14
|
+
</tr>
|
|
15
|
+
<% end %>
|
|
16
|
+
<% else %>
|
|
17
|
+
<tr>
|
|
18
|
+
<td>
|
|
19
|
+
<%= k %>
|
|
20
|
+
</td>
|
|
21
|
+
<td>
|
|
22
|
+
<%= object_value_to_s(v) %>
|
|
23
|
+
</td>
|
|
24
|
+
</tr>
|
|
25
|
+
<% end %>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<tr>
|
|
2
|
+
<td>
|
|
3
|
+
<%= subscription_group.id %>
|
|
4
|
+
</td>
|
|
5
|
+
<td>
|
|
6
|
+
<%= topic.name %>
|
|
7
|
+
</td>
|
|
8
|
+
<td>
|
|
9
|
+
<span class="badge bg-<%= topic.active? ? 'success' : 'warning text-dark' %>">
|
|
10
|
+
<%= topic.active? %>
|
|
11
|
+
</span>
|
|
12
|
+
</td>
|
|
13
|
+
<td class="text-center">
|
|
14
|
+
<a href="<%= root_path('routing', topic.id) %>" class="btn btn-sm btn-secondary text-white">
|
|
15
|
+
Details
|
|
16
|
+
</a>
|
|
17
|
+
</td>
|
|
18
|
+
</tr>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<%==
|
|
2
|
+
title = [@topic.consumer_group.name, @topic.subscription_group, @topic.name].join(': ')
|
|
3
|
+
view_title(title, hr: true)
|
|
4
|
+
%>
|
|
5
|
+
|
|
6
|
+
<div class="container">
|
|
7
|
+
<div class="row mb-5">
|
|
8
|
+
<div class="col-sm-12">
|
|
9
|
+
<table class="processes bg-white table table-hover table-bordered table-striped mb-0 align-middle">
|
|
10
|
+
<tbody>
|
|
11
|
+
<% @topic.to_h.each do |k, v| %>
|
|
12
|
+
<%==
|
|
13
|
+
partial(
|
|
14
|
+
'routing/detail',
|
|
15
|
+
locals: {
|
|
16
|
+
k: k,
|
|
17
|
+
v: v
|
|
18
|
+
}
|
|
19
|
+
)
|
|
20
|
+
%>
|
|
21
|
+
<% end %>
|
|
22
|
+
</tbody>
|
|
23
|
+
</table>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<% unless Karafka.pro? %>
|
|
2
|
+
<div id="help-us">
|
|
3
|
+
<div class="mb-4">
|
|
4
|
+
<div class="container">
|
|
5
|
+
<div class="alert alert-light">
|
|
6
|
+
Please help us make the Karafka ecosystem better by subscribing to our
|
|
7
|
+
<a target="_blank" href="https://karafka.io/#become-pro">Pro</a>
|
|
8
|
+
offering.
|
|
9
|
+
</div>
|
|
10
|
+
</div>
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
13
|
+
<% end %>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<div id="content">
|
|
2
|
+
<main class="mb-5">
|
|
3
|
+
<% if @breadcrumbs != false %>
|
|
4
|
+
<div class="container mb-5">
|
|
5
|
+
<nav aria-label="breadcrumb">
|
|
6
|
+
<ol class="breadcrumb">
|
|
7
|
+
<li class="breadcrumb-item">
|
|
8
|
+
<a href="<%= root_path %>">
|
|
9
|
+
Home
|
|
10
|
+
</a>
|
|
11
|
+
</li>
|
|
12
|
+
|
|
13
|
+
<%== render_breadcrumbs %>
|
|
14
|
+
|
|
15
|
+
<% if @current_page && @current_page > 1 %>
|
|
16
|
+
<li class="breadcrumb-item">
|
|
17
|
+
<a href="<%= current_path(page: @current_page) %>">
|
|
18
|
+
Page <%= @current_page %>
|
|
19
|
+
</a>
|
|
20
|
+
</li>
|
|
21
|
+
<% end %>
|
|
22
|
+
</ol>
|
|
23
|
+
</nav>
|
|
24
|
+
</div>
|
|
25
|
+
<% end %>
|
|
26
|
+
|
|
27
|
+
<%== content %>
|
|
28
|
+
</main>
|
|
29
|
+
|
|
30
|
+
<%== partial 'shared/pagination' %>
|
|
31
|
+
</div>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<head>
|
|
2
|
+
<meta charset="utf-8">
|
|
3
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
4
|
+
<meta name="description" content="Karafka application dashboard">
|
|
5
|
+
<meta name="author" content="Maciej Mensfeld">
|
|
6
|
+
|
|
7
|
+
<title>Karafka</title>
|
|
8
|
+
|
|
9
|
+
<script type="text/javascript" src="<%= root_path('javascripts/timeago.min.js') %>"></script>
|
|
10
|
+
<script type="text/javascript" src="<%= root_path('javascripts/bootstrap.min.js') %>"></script>
|
|
11
|
+
<script type="text/javascript" src="<%= root_path('javascripts/highlight.min.js') %>"></script>
|
|
12
|
+
<script type="text/javascript" src="<%= root_path('javascripts/live_poll.js') %>"></script>
|
|
13
|
+
<script type="text/javascript" src="<%= root_path('javascripts/application.js') %>"></script>
|
|
14
|
+
|
|
15
|
+
<link href="<%= root_path('stylesheets/bootstrap.min.css') %>" rel="stylesheet">
|
|
16
|
+
<link href="<%= root_path('stylesheets/highlight.min.css') %>" rel="stylesheet">
|
|
17
|
+
<link href="<%= root_path('stylesheets/application.css') %>" rel="stylesheet">
|
|
18
|
+
|
|
19
|
+
<link rel="icon" href="<%= root_path('images/favicon.ico') %>">
|
|
20
|
+
</head>
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
|
|
2
|
+
<span class="navbar-toggler-icon"></span>
|
|
3
|
+
</button>
|
|
4
|
+
|
|
5
|
+
<div class="collapse navbar-collapse" id="navbarNav">
|
|
6
|
+
<ul class="navbar-nav">
|
|
7
|
+
<li class="nav-item ms-3">
|
|
8
|
+
<a class="nav-link <%= nav_class(start_with: '/consumers') %>" href="<%= root_path('consumers') %>">
|
|
9
|
+
Consumers
|
|
10
|
+
</a>
|
|
11
|
+
</li>
|
|
12
|
+
<li class="nav-item ms-3">
|
|
13
|
+
<a class="nav-link <%= nav_class(start_with: '/jobs') %>" href="<%= root_path('jobs') %>">
|
|
14
|
+
Jobs
|
|
15
|
+
</a>
|
|
16
|
+
</li>
|
|
17
|
+
|
|
18
|
+
<li class="nav-item ms-3">
|
|
19
|
+
<a class="nav-link text-muted <%= nav_class(start_with: '/health') %>" href="<%= root_path('health') %>" title="Pro feature">
|
|
20
|
+
Health
|
|
21
|
+
</a>
|
|
22
|
+
</li>
|
|
23
|
+
<li class="nav-item ms-3">
|
|
24
|
+
<a class="nav-link <%= nav_class(start_with: '/routing') %>" href="<%= root_path('routing') %>">
|
|
25
|
+
Routing
|
|
26
|
+
</a>
|
|
27
|
+
</li>
|
|
28
|
+
<li class="nav-item ms-3">
|
|
29
|
+
<a class="nav-link text-muted <%= nav_class(start_with: '/explorer') %>" href="<%= root_path('explorer') %>" title="Pro feature">
|
|
30
|
+
Explorer
|
|
31
|
+
</a>
|
|
32
|
+
</li>
|
|
33
|
+
<li class="nav-item ms-3">
|
|
34
|
+
<a class="nav-link <%= nav_class(start_with: '/errors') %>" href="<%= root_path('errors') %>">
|
|
35
|
+
Errors
|
|
36
|
+
</a>
|
|
37
|
+
</li>
|
|
38
|
+
<li class="nav-item ms-3">
|
|
39
|
+
<a class="nav-link text-muted <%= nav_class(start_with: '/dlq') %>" href="<%= root_path('dlq') %>" title="Pro feature">
|
|
40
|
+
Dead
|
|
41
|
+
</a>
|
|
42
|
+
</li>
|
|
43
|
+
<li class="nav-item ms-3">
|
|
44
|
+
<a class="nav-link <%= nav_class(start_with: '/cluster') %>" href="<%= root_path('cluster') %>">
|
|
45
|
+
Cluster
|
|
46
|
+
</a>
|
|
47
|
+
</li>
|
|
48
|
+
</ul>
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
<ul class="nav navbar-nav navbar-right">
|
|
52
|
+
<li>
|
|
53
|
+
<span class="btn btn-secondary btn-sm" id="live-poll" data-on="Live polling" data-off="Live poll">
|
|
54
|
+
Live poll
|
|
55
|
+
</a>
|
|
56
|
+
</li>
|
|
57
|
+
</ul>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<% if @current_page && (@current_page > 1 || @next_page) %>
|
|
2
|
+
<div id="pagination" class="container mb-5">
|
|
3
|
+
<div class="row">
|
|
4
|
+
<nav>
|
|
5
|
+
<ul class="pagination justify-content-center">
|
|
6
|
+
<li class="page-item <%= 'disabled' if @current_page <= 1 %>">
|
|
7
|
+
<a class="page-link" href="<%= current_path(page: @current_page - 1) %>">
|
|
8
|
+
<span>« Prev</span>
|
|
9
|
+
</a>
|
|
10
|
+
</li>
|
|
11
|
+
|
|
12
|
+
<li class="page-item <%= 'disabled' unless @next_page %>">
|
|
13
|
+
<a class="page-link" href="<%= current_path(page: @next_page) %>">
|
|
14
|
+
<span>Next »</span>
|
|
15
|
+
</a>
|
|
16
|
+
</li>
|
|
17
|
+
</ul>
|
|
18
|
+
</nav>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
<% end %>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<div id="content">
|
|
2
|
+
<div class="d-flex align-items-center justify-content-center vh-100">
|
|
3
|
+
<div class="error-message text-center">
|
|
4
|
+
<h1 class="display-1 fw-bold">404</h1>
|
|
5
|
+
|
|
6
|
+
<p class="fs-3 md-5">
|
|
7
|
+
<span class="text-danger">
|
|
8
|
+
Oops!
|
|
9
|
+
</span>
|
|
10
|
+
Page not found.
|
|
11
|
+
</p>
|
|
12
|
+
|
|
13
|
+
<div class="lead">
|
|
14
|
+
<p class="mb-5">
|
|
15
|
+
The page you're looking for doesn't exist.
|
|
16
|
+
</p>
|
|
17
|
+
|
|
18
|
+
<p>
|
|
19
|
+
Please make sure, that:
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
<ul class="mb-5 text-start">
|
|
23
|
+
<li>All the topics required by Karafka Web exist</li>
|
|
24
|
+
<li>You have used <code>bundle exec karafka-web install</code> to initialize the Web UI</li>
|
|
25
|
+
<li>You have a working connection with your Kafka cluster</li>
|
|
26
|
+
<li>The resource you requested exists</li>
|
|
27
|
+
</ul>
|
|
28
|
+
|
|
29
|
+
<p class="mb-5">
|
|
30
|
+
If you were looking for a given process or other real-time information, the state might have changed, and the information you are looking for no longer exists.
|
|
31
|
+
</p>
|
|
32
|
+
|
|
33
|
+
<p>
|
|
34
|
+
<a href="<%= root_path %>" class="btn btn-primary">Go Home</a>
|
|
35
|
+
</p>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<div id="content">
|
|
2
|
+
<div class="d-flex align-items-center justify-content-center vh-100">
|
|
3
|
+
|
|
4
|
+
<div class="error-message text-center">
|
|
5
|
+
<h1 class="display-1 fw-bold">Pro feature</h1>
|
|
6
|
+
|
|
7
|
+
<p class="fs-3 md-5">
|
|
8
|
+
<span class="text-danger">
|
|
9
|
+
Oops!
|
|
10
|
+
</span>
|
|
11
|
+
This Web UI feature is available only to
|
|
12
|
+
<a href="karafka.io/#become-pro" target="_blank">Pro</a>
|
|
13
|
+
users.
|
|
14
|
+
</p>
|
|
15
|
+
|
|
16
|
+
<div class="lead">
|
|
17
|
+
<p class="mb-5">
|
|
18
|
+
Open Source software is great, but it is only sometimes sustainable, especially for projects with high-quality expectations.
|
|
19
|
+
|
|
20
|
+
Please help us make the Karafka ecosystem better by subscribing to our
|
|
21
|
+
<a target="_blank" href="https://karafka.io/#become-pro">Pro</a>
|
|
22
|
+
offering.
|
|
23
|
+
</p>
|
|
24
|
+
|
|
25
|
+
<p>
|
|
26
|
+
Karafka Pro includes:
|
|
27
|
+
</p>
|
|
28
|
+
|
|
29
|
+
<ul class="mb-5 text-start">
|
|
30
|
+
<li>Enhanced Web UI with all the features</li>
|
|
31
|
+
<li>Topics data explorer</li>
|
|
32
|
+
<li>Enhanced metrics reporting</li>
|
|
33
|
+
<li>High throughput data processing-related features</li>
|
|
34
|
+
<li>At Rest Encryption</li>
|
|
35
|
+
<li>Commercial-friendly license</li>
|
|
36
|
+
<li>Priority support</li>
|
|
37
|
+
<li>Architecture consultations</li>
|
|
38
|
+
</ul>
|
|
39
|
+
|
|
40
|
+
<p class="mb-5">
|
|
41
|
+
If you were looking for a given process or other real-time information, the state might have changed, and the information you are looking for no longer exists.
|
|
42
|
+
</p>
|
|
43
|
+
|
|
44
|
+
<p>
|
|
45
|
+
<a href="<%= root_path %>" class="btn btn-primary">Go Home</a>
|
|
46
|
+
<a href="https://karafka.io/#become-pro" class="btn btn-success" target="_blank">Become Pro!</a>
|
|
47
|
+
</p>
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|