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
@@ -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>
|