banter 0.5.0 → 0.7.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 +4 -4
- data/.travis.yml +6 -0
- data/Gemfile +9 -0
- data/README.md +37 -3
- data/lib/banter.rb +4 -0
- data/lib/banter/cli.rb +13 -3
- data/lib/banter/configuration.rb +10 -0
- data/lib/banter/middleware.rb +9 -1
- data/lib/banter/publisher.rb +45 -4
- data/lib/banter/rabbit_logger.rb +22 -4
- data/lib/banter/railtie.rb +6 -1
- data/lib/banter/server/client_queue_listener.rb +31 -7
- data/lib/banter/server/rabbit_mq_subscriber.rb +2 -1
- data/lib/banter/server/subscriber_server.rb +55 -23
- data/lib/banter/subscriber.rb +0 -1
- data/lib/banter/version.rb +1 -1
- data/lib/banter/web.rb +28 -0
- data/lib/banter/web/application.rb +36 -0
- data/lib/banter/web/helpers.rb +9 -0
- data/lib/banter/web/models/banter_message.rb +82 -0
- data/lib/banter/web/models/banter_worker.rb +68 -0
- data/spec/banter/cli_spec.rb +28 -6
- data/spec/banter/publisher_spec.rb +78 -0
- data/spec/banter/rabbit_logger_spec.rb +27 -2
- data/spec/banter/server/client_queue_listener_spec.rb +86 -22
- data/spec/banter/server/subscriber_server_spec.rb +87 -0
- data/spec/banter/web/application_spec.rb +10 -0
- data/spec/factories/banter_workers.rb +13 -0
- data/spec/mongoid.yml +7 -0
- data/spec/spec_helper.rb +28 -9
- data/web/assets/stylesheets/banter.css +66 -0
- data/web/views/index.haml +32 -0
- data/web/views/layout.haml +45 -0
- data/web/views/message.haml +52 -0
- data/web/views/messages.haml +20 -0
- data/web/views/subscribers.haml +17 -0
- data/web/views/worker.haml +51 -0
- metadata +24 -2
@@ -0,0 +1,32 @@
|
|
1
|
+
%h2 Workers
|
2
|
+
|
3
|
+
.table.table-responsive
|
4
|
+
%table.table.table-striped.table-bordered.table-hover
|
5
|
+
%thead
|
6
|
+
%tr
|
7
|
+
%th Hostname
|
8
|
+
%th Process Name
|
9
|
+
%th PID
|
10
|
+
%th Started
|
11
|
+
%th Subscribers
|
12
|
+
%th Current Job
|
13
|
+
%tbody
|
14
|
+
- @workers.each do |worker|
|
15
|
+
%tr{class: (worker.executing? ? 'success' : '')}
|
16
|
+
%td
|
17
|
+
%a{href: "#{root_path}workers/#{worker.id}"}= worker.hostname
|
18
|
+
%td= worker.process_name
|
19
|
+
%td= worker.pid
|
20
|
+
%td= worker.started_at.strftime("%m/%d/%Y %I:%M%p")
|
21
|
+
%td
|
22
|
+
- subscribers= Array.wrap(worker.worker_classes)
|
23
|
+
- if subscribers.size > 2
|
24
|
+
%a{href: "#{root_path}workers/#{worker.id}"}= "#{subscribers.size} subscribers"
|
25
|
+
- else
|
26
|
+
= subscribers.join('<br/>').html_safe
|
27
|
+
%td
|
28
|
+
- if worker.current_message
|
29
|
+
= worker.current_message[:subscriber_class]
|
30
|
+
%span.glyphicon.glyphicon-refresh.spin
|
31
|
+
|
32
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
!!! 5
|
2
|
+
%html(lang="en")
|
3
|
+
%head
|
4
|
+
%meta(charset="utf-8")
|
5
|
+
%meta(http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1")
|
6
|
+
%meta(name="viewport" content="width=device-width, initial-scale=1.0")
|
7
|
+
%title Banter
|
8
|
+
/ Le HTML5 shim, for IE6-8 support of HTML elements
|
9
|
+
/[if lt IE 9]
|
10
|
+
%script{src: "//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.6.1/html5shiv.js" }
|
11
|
+
%link{:href=>"//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css", :rel=>"stylesheet"}
|
12
|
+
-#= favicon_link_tag 'apple-touch-icon-144x144-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '144x144'
|
13
|
+
-#= favicon_link_tag 'apple-touch-icon-114x114-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '114x114'
|
14
|
+
-#= favicon_link_tag 'apple-touch-icon-72x72-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png', :sizes => '72x72'
|
15
|
+
-#= favicon_link_tag 'apple-touch-icon-precomposed.png', :rel => 'apple-touch-icon-precomposed', :type => 'image/png'
|
16
|
+
-#= favicon_link_tag 'favicon.ico', :rel => 'shortcut icon'
|
17
|
+
%script{:src=>"//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"}
|
18
|
+
%script{src: '//ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular.min.js' }
|
19
|
+
%link{href: 'http://fonts.googleapis.com/css?family=Open+Sans:700,800,400', rel: 'stylesheet', type:'text/css'}
|
20
|
+
%link{href: "#{root_path}stylesheets/banter.css", rel: 'stylesheet', type:'text/css'}
|
21
|
+
|
22
|
+
|
23
|
+
%body
|
24
|
+
%nav.navbar.navbar-default.navbar-fixed-top
|
25
|
+
.container
|
26
|
+
.navbar-header
|
27
|
+
%button.navbar-toggle{type: 'button', data: { toggle: 'collapse', target: '#banter-navbar-collapse'}}
|
28
|
+
%span.icon-bar
|
29
|
+
%span.icon-bar
|
30
|
+
%span.icon-bar
|
31
|
+
%a.navbar-brand{href: root_path} Banter
|
32
|
+
.collapse.navbar-collapse#banter-navbar-collapse
|
33
|
+
%ul.nav.navbar-nav
|
34
|
+
%li
|
35
|
+
%a{href: root_path} Workers
|
36
|
+
%li
|
37
|
+
%a{href: "#{root_path}subscribers"} Subscribers
|
38
|
+
|
39
|
+
.container{style: 'margin-top: 55px; padding-top: 10px'}
|
40
|
+
= yield
|
41
|
+
%footer
|
42
|
+
%p
|
43
|
+
Banter © #{Date.today.year} (Developed & Maintained by
|
44
|
+
%a{href: 'https://www.honest.com'} The Honest Company
|
45
|
+
)
|
@@ -0,0 +1,52 @@
|
|
1
|
+
.clearfix
|
2
|
+
%div.extra-bold.pull-right.padding-large.font-size-lg.rounded-corners-md{ class: (message.executing? ? "bg-info" : (message.succeeded? ? "bg-success" : "bg-danger")) }
|
3
|
+
- if message.executing?
|
4
|
+
%span.glyphicon.glyphicon-refresh.spin
|
5
|
+
WORKING
|
6
|
+
- elsif message.succeeded?
|
7
|
+
%span.glyphicon.glyphicon-ok
|
8
|
+
SUCCESSFUL
|
9
|
+
- elsif message.failed?
|
10
|
+
%span.glyphicon.glyphicon-remove
|
11
|
+
FAILED
|
12
|
+
%h2
|
13
|
+
Message
|
14
|
+
|
15
|
+
%ul.list-group
|
16
|
+
%li.list-group-item.row
|
17
|
+
.col-sm-3.bold Subscriber
|
18
|
+
.col-sm-9= message.subscriber_class
|
19
|
+
|
20
|
+
- worker = message.worker
|
21
|
+
- if worker
|
22
|
+
%li.list-group-item.row
|
23
|
+
.col-sm-3.bold Worker
|
24
|
+
.col-sm-9
|
25
|
+
%a{href: "#{root_path}workers/#{worker.id}"}= "#{worker.process_name} (PID: #{worker.pid})"
|
26
|
+
%li.list-group-item.row
|
27
|
+
.col-sm-3.bold Subscriber Key
|
28
|
+
.col-sm-9= message.subscribed_key
|
29
|
+
|
30
|
+
%li.list-group-item.row
|
31
|
+
.col-sm-3.bold Payload Key
|
32
|
+
.col-sm-9= message.payload_key
|
33
|
+
|
34
|
+
%li.list-group-item.row
|
35
|
+
.col-sm-3.bold Payload
|
36
|
+
.col-sm-9
|
37
|
+
%pre!= AwesomePrint::Inspector.new(html:true, sort_keys: true, index: false).awesome(message.payload)
|
38
|
+
%li.list-group-item.row
|
39
|
+
.col-sm-3.bold Context
|
40
|
+
.col-sm-9
|
41
|
+
%pre!= AwesomePrint::Inspector.new(html:true, sort_keys: true, index: false).awesome(message.context)
|
42
|
+
%li.list-group-item.row
|
43
|
+
.col-sm-3.bold Started Time
|
44
|
+
.col-sm-9= message.started_at.strftime("%m/%d/%Y %I:%M%p")
|
45
|
+
- if message.done_at
|
46
|
+
%li.list-group-item.row
|
47
|
+
.col-sm-3.bold Finished Time
|
48
|
+
.col-sm-9 #{message.done_at.strftime("%m/%d/%Y %I:%M%p")}. Took #{(message.done_at - message.started_at) * 1000}ms
|
49
|
+
%li.list-group-item.row
|
50
|
+
.col-sm-3.bold Queue
|
51
|
+
.col-sm-9= message.queue_name
|
52
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
%h2 Messages processed on #{worker.process_name} (PID: #{worker.pid})
|
2
|
+
.table.table-responsive
|
3
|
+
%table.table.table-striped.table-bordered.table-hover
|
4
|
+
%thead
|
5
|
+
%tr
|
6
|
+
%th Subscriber
|
7
|
+
%th Started
|
8
|
+
%th Finished
|
9
|
+
%th Status
|
10
|
+
%tbody
|
11
|
+
- messages.each do |message|
|
12
|
+
%tr{class: (message.failed? ? 'danger' : '')}
|
13
|
+
%td
|
14
|
+
%a{href: "#{root_path}messages/#{message.id}"}= message.subscriber_class
|
15
|
+
-#%td
|
16
|
+
-# %pre!= AwesomePrint::Inspector.new(html:true, sort_keys: true, index: false).awesome(message.payload)
|
17
|
+
%td= message.started_at.strftime("%m/%d/%Y %I:%M%p")
|
18
|
+
%td= message.done_at.strftime("%m/%d/%Y %I:%M%p") if message.done_at
|
19
|
+
%td= message.status.titleize
|
20
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
%h2 Subscribers
|
2
|
+
.table.table-responsive
|
3
|
+
%table.table.table-striped.table-bordered.table-hover
|
4
|
+
%thead
|
5
|
+
%tr
|
6
|
+
%th Subscriber
|
7
|
+
%th Messages Processed
|
8
|
+
%th Messages Succeeded
|
9
|
+
%tbody
|
10
|
+
- BanterMessage.distinct("subscriber_class").each do |subscriber|
|
11
|
+
%tr
|
12
|
+
%td
|
13
|
+
%a{href: "#{root_path}subscribers/#{subscriber}"}= subscriber
|
14
|
+
%td= BanterMessage.where(subscriber_class: subscriber).count
|
15
|
+
%td= BanterMessage.where(subscriber_class: subscriber, status: BanterMessage::STATUS_SUCCESS).count
|
16
|
+
|
17
|
+
|
@@ -0,0 +1,51 @@
|
|
1
|
+
.clearfix
|
2
|
+
%div.extra-bold.pull-right.padding-large.font-size-lg.rounded-corners-md{ class: (worker.executing? ? "bg-success" : "bg-info") }
|
3
|
+
- if worker.executing?
|
4
|
+
%span.glyphicon.glyphicon-refresh.spin
|
5
|
+
WORKING
|
6
|
+
- else
|
7
|
+
IDLE
|
8
|
+
%h2
|
9
|
+
Worker
|
10
|
+
|
11
|
+
%ul.list-group
|
12
|
+
%li.list-group-item.row
|
13
|
+
.col-sm-3.bold Host Name
|
14
|
+
.col-sm-9= worker.hostname
|
15
|
+
%li.list-group-item.row
|
16
|
+
.col-sm-3.bold Process Name
|
17
|
+
.col-sm-9= "#{worker.process_name} (PID: #{worker.pid})"
|
18
|
+
%li.list-group-item.row
|
19
|
+
.col-sm-3.bold Subscriber Classes
|
20
|
+
.col-sm-9= Array.wrap(worker.worker_classes).join("<br/>").html_safe
|
21
|
+
%li.list-group-item.row
|
22
|
+
.col-sm-3.bold Started Time
|
23
|
+
.col-sm-9= worker.started_at.strftime("%m/%d/%Y %I:%M%p")
|
24
|
+
- if worker.stopped_at
|
25
|
+
%li.list-group-item.row
|
26
|
+
.col-sm-3.bold Stopped Time
|
27
|
+
.col-sm-9= worker.stopped_at.strftime("%m/%d/%Y %I:%M%p")
|
28
|
+
%li.list-group-item.row
|
29
|
+
.col-sm-3.bold
|
30
|
+
%a{href: "#{root_path}workers/#{worker.id}/messages"} Messages Processed
|
31
|
+
.col-sm-9
|
32
|
+
%a{href: "#{root_path}workers/#{worker.id}/messages"}= worker.job_count
|
33
|
+
|
34
|
+
(
|
35
|
+
%span.text-success #{worker.success_count} Succeeded
|
36
|
+
\/
|
37
|
+
%span.text-warning #{worker.failed_count} Failed
|
38
|
+
)
|
39
|
+
- if worker.executing?
|
40
|
+
%li.list-group-item.row
|
41
|
+
.col-sm-3.bold
|
42
|
+
%a{href: "#{root_path}messages/#{worker.current_message['_id']}"} Current Job
|
43
|
+
.col-sm-9
|
44
|
+
= worker.current_message[:subscriber_class]
|
45
|
+
%li.list-group-item.row
|
46
|
+
.col-sm-3.bold Current Payload
|
47
|
+
.col-sm-9
|
48
|
+
%pre!= AwesomePrint::Inspector.new(html:true, sort_keys: true, index: false).awesome(worker.current_message[:payload])
|
49
|
+
|
50
|
+
|
51
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: banter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- The Honest Company
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2014-07-
|
14
|
+
date: 2014-07-15 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bundler
|
@@ -217,17 +217,34 @@ files:
|
|
217
217
|
- lib/banter/server/subscriber_server.rb
|
218
218
|
- lib/banter/subscriber.rb
|
219
219
|
- lib/banter/version.rb
|
220
|
+
- lib/banter/web.rb
|
221
|
+
- lib/banter/web/application.rb
|
222
|
+
- lib/banter/web/helpers.rb
|
223
|
+
- lib/banter/web/models/banter_message.rb
|
224
|
+
- lib/banter/web/models/banter_worker.rb
|
220
225
|
- lib/generators/banter/install_generator.rb
|
221
226
|
- lib/generators/banter/templates/banter.yml
|
222
227
|
- spec/banter/cli_spec.rb
|
223
228
|
- spec/banter/configuration_spec.rb
|
224
229
|
- spec/banter/message_spec.rb
|
230
|
+
- spec/banter/publisher_spec.rb
|
225
231
|
- spec/banter/rabbit_logger_spec.rb
|
226
232
|
- spec/banter/server/client_queue_listener_spec.rb
|
227
233
|
- spec/banter/server/rabbitmq_subscriber_spec.rb
|
234
|
+
- spec/banter/server/subscriber_server_spec.rb
|
228
235
|
- spec/banter/subscriber_spec.rb
|
236
|
+
- spec/banter/web/application_spec.rb
|
229
237
|
- spec/config.yml
|
238
|
+
- spec/factories/banter_workers.rb
|
239
|
+
- spec/mongoid.yml
|
230
240
|
- spec/spec_helper.rb
|
241
|
+
- web/assets/stylesheets/banter.css
|
242
|
+
- web/views/index.haml
|
243
|
+
- web/views/layout.haml
|
244
|
+
- web/views/message.haml
|
245
|
+
- web/views/messages.haml
|
246
|
+
- web/views/subscribers.haml
|
247
|
+
- web/views/worker.haml
|
231
248
|
homepage: https://github.com/honest/banter
|
232
249
|
licenses:
|
233
250
|
- MIT
|
@@ -256,9 +273,14 @@ test_files:
|
|
256
273
|
- spec/banter/cli_spec.rb
|
257
274
|
- spec/banter/configuration_spec.rb
|
258
275
|
- spec/banter/message_spec.rb
|
276
|
+
- spec/banter/publisher_spec.rb
|
259
277
|
- spec/banter/rabbit_logger_spec.rb
|
260
278
|
- spec/banter/server/client_queue_listener_spec.rb
|
261
279
|
- spec/banter/server/rabbitmq_subscriber_spec.rb
|
280
|
+
- spec/banter/server/subscriber_server_spec.rb
|
262
281
|
- spec/banter/subscriber_spec.rb
|
282
|
+
- spec/banter/web/application_spec.rb
|
263
283
|
- spec/config.yml
|
284
|
+
- spec/factories/banter_workers.rb
|
285
|
+
- spec/mongoid.yml
|
264
286
|
- spec/spec_helper.rb
|