rboss 0.4.1 → 0.5.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.
- data/Gemfile +2 -0
- data/bin/jboss-profile +0 -0
- data/bin/twiddle +1 -1
- data/lib/rboss/bin/command_actions.rb +25 -17
- data/lib/rboss/table_builder.rb +174 -0
- data/lib/rboss/twiddle/monitor.rb +60 -11
- data/lib/rboss/version.rb +1 -1
- metadata +3 -2
data/Gemfile
CHANGED
data/bin/jboss-profile
CHANGED
File without changes
|
data/bin/twiddle
CHANGED
@@ -58,7 +58,7 @@ end
|
|
58
58
|
opts.on('--port PORT', 'Defines the JBoss jnp port') do |port|
|
59
59
|
params[:port] = port
|
60
60
|
end
|
61
|
-
opts.on('-c', '--
|
61
|
+
opts.on('-c', '--connect SERVER_NAME',
|
62
62
|
"Uses a configured server in #{servers_file}") do |server|
|
63
63
|
config = load_yaml[server]
|
64
64
|
abort "No configuration for #{server}" unless config
|
@@ -20,6 +20,8 @@
|
|
20
20
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
21
|
# THE SOFTWARE.
|
22
22
|
|
23
|
+
require_relative '../table_builder'
|
24
|
+
|
23
25
|
module JBoss
|
24
26
|
module CommandActions
|
25
27
|
class Twiddle
|
@@ -43,59 +45,66 @@ module JBoss
|
|
43
45
|
def set id, property, value
|
44
46
|
mbean, name = extract id
|
45
47
|
puts @twiddle.set :mbean => mbean.to_sym,
|
46
|
-
|
47
|
-
|
48
|
-
|
48
|
+
:name => name,
|
49
|
+
:property => property,
|
50
|
+
:value => value
|
49
51
|
end
|
50
52
|
|
51
53
|
def get id, property
|
52
54
|
mbean, name = extract id
|
53
55
|
puts @twiddle.get :mbean => mbean.to_sym,
|
54
|
-
|
55
|
-
|
56
|
+
:name => name,
|
57
|
+
:property => property
|
56
58
|
end
|
57
59
|
|
58
60
|
def invoke id, method, *args
|
59
61
|
mbean, name = extract id
|
60
62
|
puts @twiddle.invoke :mbean => mbean.to_sym,
|
61
|
-
|
62
|
-
|
63
|
-
|
63
|
+
:name => name,
|
64
|
+
:method => method,
|
65
|
+
:args => normalize(args)
|
64
66
|
end
|
65
67
|
|
66
68
|
def query id, *args
|
67
69
|
mbean, name = extract id
|
68
70
|
puts @twiddle.query :mbean => mbean.to_sym,
|
69
|
-
|
70
|
-
|
71
|
+
:name => name,
|
72
|
+
:args => normalize(args)
|
71
73
|
end
|
72
74
|
|
73
75
|
def info id, *args
|
74
76
|
mbean, name = extract id
|
75
77
|
puts @twiddle.info :mbean => mbean.to_sym,
|
76
|
-
|
77
|
-
|
78
|
+
:name => name,
|
79
|
+
:args => normalize(args)
|
78
80
|
end
|
79
81
|
|
80
82
|
def detail mbeans
|
81
83
|
mbeans.each do |mbean_id, resources|
|
82
|
-
|
84
|
+
table = TableBuilder::new @opts[:mbeans][mbean_id]
|
85
|
+
table.title = @opts[:mbeans][mbean_id][:description]
|
86
|
+
rows = []
|
83
87
|
if resources.is_a? TrueClass
|
88
|
+
row = []
|
84
89
|
@monitor.mbean(mbean_id).detail do |name, value|
|
85
|
-
|
90
|
+
row << value
|
86
91
|
end
|
92
|
+
rows << row
|
87
93
|
elsif @opts[:no_details]
|
88
94
|
@monitor.mbean(mbean_id).scan.each do |name|
|
89
95
|
puts " - #{name}"
|
90
96
|
end
|
91
97
|
else
|
92
98
|
@monitor.mbean(mbean_id).detail resources do |resource, detail|
|
93
|
-
|
99
|
+
row = [resource]
|
94
100
|
detail.each do |name, value|
|
95
|
-
|
101
|
+
row << value
|
96
102
|
end
|
103
|
+
rows << row
|
97
104
|
end
|
98
105
|
end
|
106
|
+
rows.each { |row| table.add :normal, *row }
|
107
|
+
table.print
|
99
108
|
end
|
100
109
|
end
|
101
110
|
|
@@ -104,4 +113,3 @@ module JBoss
|
|
104
113
|
end
|
105
114
|
|
106
115
|
end
|
107
|
-
|
@@ -0,0 +1,174 @@
|
|
1
|
+
# The MIT License
|
2
|
+
#
|
3
|
+
# Copyright (c) 2011 Marcelo Guimarães <ataxexe@gmail.com>
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
13
|
+
# all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
# THE SOFTWARE.
|
22
|
+
|
23
|
+
require 'wirble'
|
24
|
+
|
25
|
+
class TableBuilder
|
26
|
+
|
27
|
+
attr_writer :title
|
28
|
+
|
29
|
+
def initialize params = {}
|
30
|
+
params[:colors] ||= {}
|
31
|
+
@colors = {
|
32
|
+
:title => :yellow,
|
33
|
+
:header => :light_blue,
|
34
|
+
:good => :green,
|
35
|
+
:bad => :red,
|
36
|
+
:warn => :brown,
|
37
|
+
:line => :purple,
|
38
|
+
:normal => nil
|
39
|
+
}.merge! params[:colors]
|
40
|
+
@health = params[:health]
|
41
|
+
@header = params[:header]
|
42
|
+
@formatter = params[:formatter]
|
43
|
+
@print_type = (params[:print_as] or :table)
|
44
|
+
@single_result = params[:single_result]
|
45
|
+
|
46
|
+
@data = []
|
47
|
+
@types = []
|
48
|
+
@title = nil
|
49
|
+
end
|
50
|
+
|
51
|
+
def add(type, *args)
|
52
|
+
@types << type
|
53
|
+
@data << args
|
54
|
+
end
|
55
|
+
|
56
|
+
def print
|
57
|
+
build_header @header
|
58
|
+
check_health
|
59
|
+
puts colorize(:title, @title)
|
60
|
+
print_as_table if @print_type == :table
|
61
|
+
print_as_single_list if @print_type == :single_list
|
62
|
+
end
|
63
|
+
|
64
|
+
def print_as_single_list
|
65
|
+
header = @data[0]
|
66
|
+
data ||= @data[1]
|
67
|
+
type = @types[1]
|
68
|
+
format_row(1, type)
|
69
|
+
|
70
|
+
line = colorize :line, '-'
|
71
|
+
data.each_index do |i|
|
72
|
+
description = colorize :header, header[i]
|
73
|
+
value = colorize type, data[i]
|
74
|
+
puts " #{line} #{description} = #{value}"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def print_as_table colspan = 2
|
79
|
+
@data.each_index do |i|
|
80
|
+
type = @types[i]
|
81
|
+
format_row(i, type)
|
82
|
+
@data[i].each_index do |j|
|
83
|
+
column = @data[i][j]
|
84
|
+
width = max_width j
|
85
|
+
value = column.to_s.ljust(width) if j == 0
|
86
|
+
value ||= column.to_s.rjust(width)
|
87
|
+
printf colorize(type, value)
|
88
|
+
printf(" " * colspan)
|
89
|
+
end
|
90
|
+
puts
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def format_row(i, type)
|
95
|
+
if @formatter and type != :header
|
96
|
+
if @formatter.is_a? Hash
|
97
|
+
@formatter[:humanize].each do |index|
|
98
|
+
@data[i][index] = humanize @data[i][index]
|
99
|
+
end
|
100
|
+
else
|
101
|
+
@data[i] = @formatter.call(@data[i])
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def check_health
|
107
|
+
return unless @health
|
108
|
+
@data.each_index do |i|
|
109
|
+
if @types[i] == :normal
|
110
|
+
row = @data[i]
|
111
|
+
if @health.is_a? Hash
|
112
|
+
indexes = @health[:indexes]
|
113
|
+
@health[:max] = row[indexes[:max]].to_f
|
114
|
+
@health[:using] = row[indexes[:using]].to_f if indexes[:using]
|
115
|
+
@health[:free] = row[indexes[:free]].to_f if indexes[:free]
|
116
|
+
@types[i] = health @health
|
117
|
+
else
|
118
|
+
@types[i] = @health.call(row)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def health params
|
125
|
+
warn_limit = (params[:warn_at] or 0.3)
|
126
|
+
bad_limit = (params[:alert_at] or 0.15)
|
127
|
+
return :bad if under_limit? bad_limit, params
|
128
|
+
return :warn if warn_limit and under_limit? warn_limit, params
|
129
|
+
:good
|
130
|
+
end
|
131
|
+
|
132
|
+
def under_limit? threshold, params
|
133
|
+
if params[:free]
|
134
|
+
free = (params[:free] / params[:max].to_f)
|
135
|
+
(free < threshold)
|
136
|
+
elsif params[:using]
|
137
|
+
free = params[:max] - params[:using]
|
138
|
+
under_limit? threshold, :free => free, :max => params[:max]
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def humanize bytes
|
143
|
+
bytes = bytes.to_i
|
144
|
+
return (bytes / (1024 * 1024)).to_s << " MB" if bytes > (1024 * 1024)
|
145
|
+
(bytes / (1024)).to_s << " KB" if bytes > (1024)
|
146
|
+
end
|
147
|
+
|
148
|
+
def build_header header
|
149
|
+
return unless header
|
150
|
+
if header.is_a? Array
|
151
|
+
if header.first.is_a? Array
|
152
|
+
header.reverse.each do |value|
|
153
|
+
build_header value
|
154
|
+
end
|
155
|
+
else
|
156
|
+
@data = [header] + @data
|
157
|
+
@types = [:header] + @types
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def colorize(type, value)
|
163
|
+
Wirble::Colorize::colorize_string(value, @colors[type])
|
164
|
+
end
|
165
|
+
|
166
|
+
def max_width column
|
167
|
+
max = 0
|
168
|
+
@data.each do |row|
|
169
|
+
max = [row[column].to_s.length, max].max
|
170
|
+
end
|
171
|
+
max
|
172
|
+
end
|
173
|
+
|
174
|
+
end
|
@@ -34,6 +34,11 @@ module JBoss
|
|
34
34
|
:pattern => 'jboss.web:type=Manager,host=localhost,path=/#{resource}',
|
35
35
|
:properties => %W(activeSessions maxActive distributable maxActiveSessions
|
36
36
|
expiredSessions rejectedSessions),
|
37
|
+
:header => [
|
38
|
+
['Context', 'Active', 'Max', 'Distributable', 'Max Active', 'Expired', 'Rejected'],
|
39
|
+
['', 'Sessions', 'Active', '',
|
40
|
+
'Sessions', 'Sessions', 'Sessions'],
|
41
|
+
],
|
37
42
|
:scan => proc do
|
38
43
|
query "jboss.web:type=Manager,*" do |path|
|
39
44
|
path.gsub! "jboss.web:type=Manager,path=/", ""
|
@@ -50,6 +55,13 @@ module JBoss
|
|
50
55
|
:description => 'JBossWeb connector',
|
51
56
|
:pattern => 'jboss.web:type=ThreadPool,name=#{resource}',
|
52
57
|
:properties => %W(maxThreads currentThreadCount currentThreadsBusy),
|
58
|
+
:header => ['Connector', 'Max Threads', 'Current Threads', 'Busy Threads'],
|
59
|
+
:health => {
|
60
|
+
:indexes => {
|
61
|
+
:max => 1,
|
62
|
+
:using => 2
|
63
|
+
}
|
64
|
+
},
|
53
65
|
:scan => proc do
|
54
66
|
query "jboss.web:type=ThreadPool,*" do |path|
|
55
67
|
path.gsub "jboss.web:type=ThreadPool,name=", ""
|
@@ -59,7 +71,9 @@ module JBoss
|
|
59
71
|
:cached_connection_manager => {
|
60
72
|
:description => 'JBoss JCA cached connections',
|
61
73
|
:pattern => 'jboss.jca:service=CachedConnectionManager',
|
62
|
-
:properties => %W(InUseConnections)
|
74
|
+
:properties => %W(InUseConnections),
|
75
|
+
:header => ['In Use Connections'],
|
76
|
+
:print_as => :single_list
|
63
77
|
},
|
64
78
|
:main_deployer => {
|
65
79
|
:description => 'Main Deployer',
|
@@ -68,29 +82,47 @@ module JBoss
|
|
68
82
|
:engine => {
|
69
83
|
:description => 'JBossWeb engine',
|
70
84
|
:pattern => 'jboss.web:type=Engine',
|
71
|
-
:properties => %W(jvmRoute name defaultHost)
|
85
|
+
:properties => %W(jvmRoute name defaultHost),
|
86
|
+
:header => ['JVM Route', 'Name', 'Default Host'],
|
87
|
+
:print_as => :single_list
|
72
88
|
},
|
73
89
|
:log4j => {
|
74
90
|
:description => 'JBoss Log4J Service',
|
75
91
|
:pattern => 'jboss.system:service=Logging,type=Log4jService',
|
76
|
-
:properties => %W(DefaultJBossServerLogThreshold)
|
92
|
+
:properties => %W(DefaultJBossServerLogThreshold),
|
93
|
+
:header => ['Default Server Log Threshold'],
|
94
|
+
:print_as => :single_list
|
77
95
|
},
|
78
96
|
:server => {
|
79
97
|
:description => 'JBoss Server specifications',
|
80
98
|
:pattern => 'jboss.system:type=Server',
|
81
|
-
:properties => %W(VersionName VersionNumber Version)
|
99
|
+
:properties => %W(VersionName VersionNumber Version),
|
100
|
+
:header => ['Version Name', 'Version Number', 'Version'],
|
101
|
+
:print_as => :single_list
|
82
102
|
},
|
83
103
|
:server_info => {
|
84
104
|
:description => 'JBoss Server runtime info',
|
85
105
|
:pattern => 'jboss.system:type=ServerInfo',
|
86
106
|
:properties => %W(ActiveThreadCount MaxMemory FreeMemory AvailableProcessors
|
87
|
-
|
88
|
-
|
107
|
+
JavaVendor JavaVersion OSName OSArch),
|
108
|
+
:header => ['Active Threads', 'Max Memory', 'Free Memory',
|
109
|
+
'Processors', 'Java Vendor',
|
110
|
+
'Java Version', 'OS Name', 'OS Arch'],
|
111
|
+
:formatter => {:humanize => [1, 2]},
|
112
|
+
:print_as => :single_list,
|
113
|
+
:health => {
|
114
|
+
:indexes => {
|
115
|
+
:max => 1,
|
116
|
+
:free => 2
|
117
|
+
}
|
118
|
+
},
|
89
119
|
},
|
90
120
|
:server_config => {
|
91
121
|
:description => 'JBoss Server configuration',
|
92
122
|
:pattern => 'jboss.system:type=ServerConfig',
|
93
|
-
:properties => %W(ServerName HomeDir ServerLogDir ServerHomeURL)
|
123
|
+
:properties => %W(ServerName HomeDir ServerLogDir ServerHomeURL),
|
124
|
+
:header => ['Server Name', 'Home Dir', 'Log Dir', 'Home URL'],
|
125
|
+
:print_as => :single_list
|
94
126
|
},
|
95
127
|
:system_properties => {
|
96
128
|
:description => 'System properties',
|
@@ -100,6 +132,13 @@ module JBoss
|
|
100
132
|
:description => 'JBossWeb connector requests',
|
101
133
|
:pattern => 'jboss.web:type=GlobalRequestProcessor,name=#{resource}',
|
102
134
|
:properties => %W(requestCount errorCount maxTime),
|
135
|
+
:header => ['Connector', 'Requests', 'Errors', 'Max Time'],
|
136
|
+
:health => {
|
137
|
+
:indexes => {
|
138
|
+
:max => 1,
|
139
|
+
:using => 2
|
140
|
+
}
|
141
|
+
},
|
103
142
|
:scan => proc do
|
104
143
|
query "jboss.web:type=ThreadPool,*" do |path|
|
105
144
|
path.gsub "jboss.web:type=ThreadPool,name=", ""
|
@@ -111,6 +150,16 @@ module JBoss
|
|
111
150
|
:pattern => 'jboss.jca:service=ManagedConnectionPool,name=#{resource}',
|
112
151
|
:properties => %W(MinSize MaxSize AvailableConnectionCount
|
113
152
|
InUseConnectionCount ConnectionCount),
|
153
|
+
:header => [
|
154
|
+
['JNDI Name', 'Min', 'Max', 'Connections', 'Connections', 'Connection'],
|
155
|
+
['', 'Size', 'Size', 'Avaliable', 'In Use', 'Count']
|
156
|
+
],
|
157
|
+
:health => {
|
158
|
+
:indexes => {
|
159
|
+
:max => 2,
|
160
|
+
:using => 4
|
161
|
+
}
|
162
|
+
},
|
114
163
|
:scan => proc do
|
115
164
|
query "jboss.jca:service=ManagedConnectionPool,*" do |path|
|
116
165
|
path.gsub "jboss.jca:service=ManagedConnectionPool,name=", ""
|
@@ -120,8 +169,10 @@ module JBoss
|
|
120
169
|
:queue => {
|
121
170
|
:description => 'JMS Queue',
|
122
171
|
:pattern => 'jboss.messaging.destination:service=Queue,name=#{resource}',
|
123
|
-
:properties => %W(
|
172
|
+
:properties => %W(JNDIName MessageCount DeliveringCount
|
124
173
|
ScheduledMessageCount MaxSize FullSize Clustered ConsumerCount),
|
174
|
+
:header => ['Name', 'JNDI', 'Messages', 'Deliveries', 'Scheduleded', 'Max Size',
|
175
|
+
'Full Size', 'Clustered', 'Consumed'],
|
125
176
|
:scan => proc do
|
126
177
|
query "jboss.messaging.destination:service=Queue,*" do |path|
|
127
178
|
path.gsub "jboss.messaging.destination:service=Queue,name=", ""
|
@@ -136,6 +187,7 @@ module JBoss
|
|
136
187
|
:description => 'EJB',
|
137
188
|
:pattern => 'jboss.j2ee:#{resource},service=EJB3',
|
138
189
|
:properties => %W(CreateCount RemoveCount CurrentSize AvailableCount),
|
190
|
+
:header => ['EJB', 'Created', 'Removed', 'Current', 'Available'],
|
139
191
|
:scan => proc do
|
140
192
|
result = query "jboss.j2ee:*"
|
141
193
|
(result.find_all do |path|
|
@@ -146,14 +198,12 @@ module JBoss
|
|
146
198
|
end
|
147
199
|
}
|
148
200
|
}
|
149
|
-
@@defaults
|
150
201
|
end
|
151
202
|
|
152
203
|
module_function :defaults
|
153
204
|
|
154
205
|
def mbeans
|
155
206
|
@mbeans ||= {}
|
156
|
-
@mbeans
|
157
207
|
end
|
158
208
|
|
159
209
|
def monitor mbean_id, params
|
@@ -174,4 +224,3 @@ module JBoss
|
|
174
224
|
end
|
175
225
|
|
176
226
|
end
|
177
|
-
|
data/lib/rboss/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rboss
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-03-
|
12
|
+
date: 2012-03-22 00:00:00.000000000Z
|
13
13
|
dependencies: []
|
14
14
|
description: ! "A tool to create profiles for JBoss Application Server and use\n twiddle
|
15
15
|
to manage a running JBoss AS."
|
@@ -57,6 +57,7 @@ files:
|
|
57
57
|
- lib/rboss/resources/mod_cluster.sar/META-INF/mod_cluster-jboss-beans.xml
|
58
58
|
- lib/rboss/resources/mod_cluster.sar/mod_cluster-1.1.2.Final.jar
|
59
59
|
- lib/rboss/resources/run.conf.erb
|
60
|
+
- lib/rboss/table_builder.rb
|
60
61
|
- lib/rboss/twiddle.rb
|
61
62
|
- lib/rboss/twiddle/base_monitor.rb
|
62
63
|
- lib/rboss/twiddle/mbean.rb
|