opstat-plugins 0.3.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.gitlab-ci.yml +17 -0
- data/LICENSE +675 -0
- data/lib/app/models/apache2.rb +192 -0
- data/lib/app/models/bsdnet/bytes_in_out.rb +54 -0
- data/lib/app/models/bsdnet/current_entries.rb +34 -0
- data/lib/app/models/bsdnet.rb +12 -0
- data/lib/app/models/cpu.rb +86 -0
- data/lib/app/models/disk.rb +51 -0
- data/lib/app/models/disk_io.rb +53 -0
- data/lib/app/models/facts.rb +30 -0
- data/lib/app/models/fpm.rb +138 -0
- data/lib/app/models/haproxy.rb +57 -0
- data/lib/app/models/jvm.rb +51 -0
- data/lib/app/models/load.rb +99 -0
- data/lib/app/models/memory.rb +55 -0
- data/lib/app/models/nagios.rb +51 -0
- data/lib/app/models/network.rb +58 -0
- data/lib/app/models/oracle_fras_sizes.rb +41 -0
- data/lib/app/models/oracle_sessions.rb +43 -0
- data/lib/app/models/oracle_tablespaces_sizes.rb +51 -0
- data/lib/app/models/temper.rb +51 -0
- data/lib/app/models/webobjects.rb +83 -0
- data/lib/app/models/xen.rb +99 -0
- data/lib/data/hp_pdu.yml +191 -0
- data/lib/logging.rb +29 -0
- data/lib/opstat-plugins.rb +44 -0
- data/lib/parsers/apache2.rb +19 -0
- data/lib/parsers/bsdnet.rb +29 -0
- data/lib/parsers/cpu.rb +42 -0
- data/lib/parsers/disk.rb +49 -0
- data/lib/parsers/facts.rb +12 -0
- data/lib/parsers/fpm.rb +31 -0
- data/lib/parsers/freeswitch_fifos.rb +63 -0
- data/lib/parsers/haproxy.rb +34 -0
- data/lib/parsers/haproxy_tables.rb +25 -0
- data/lib/parsers/hp_pdu.rb +36 -0
- data/lib/parsers/jvm.rb +22 -0
- data/lib/parsers/load.rb +20 -0
- data/lib/parsers/memory.rb +29 -0
- data/lib/parsers/nagios.rb +39 -0
- data/lib/parsers/network.rb +37 -0
- data/lib/parsers/oracle_fras_sizes.rb +25 -0
- data/lib/parsers/oracle_sessions.rb +20 -0
- data/lib/parsers/oracle_tablespaces_sizes.rb +22 -0
- data/lib/parsers/temper.rb +17 -0
- data/lib/parsers/webobjects.rb +33 -0
- data/lib/parsers/xen.rb +39 -0
- data/lib/plugins/apache2.rb +76 -0
- data/lib/plugins/bsdnet.rb +13 -0
- data/lib/plugins/cpu.rb +13 -0
- data/lib/plugins/custom_sql_statement.rb +24 -0
- data/lib/plugins/disk.rb +31 -0
- data/lib/plugins/facts.rb +30 -0
- data/lib/plugins/fpm.rb +33 -0
- data/lib/plugins/freeswitch_fifos.rb +27 -0
- data/lib/plugins/haproxy.rb +24 -0
- data/lib/plugins/haproxy_tables.rb +28 -0
- data/lib/plugins/hp_pdu.rb +28 -0
- data/lib/plugins/jvm.rb +23 -0
- data/lib/plugins/load.rb +20 -0
- data/lib/plugins/memory.rb +18 -0
- data/lib/plugins/nagios.rb +39 -0
- data/lib/plugins/network.rb +21 -0
- data/lib/plugins/oracle_fras_sizes.rb +48 -0
- data/lib/plugins/oracle_sessions.rb +47 -0
- data/lib/plugins/oracle_tablespaces_sizes.rb +59 -0
- data/lib/plugins/temper.rb +21 -0
- data/lib/plugins/webobjects.rb +42 -0
- data/lib/plugins/xen.rb +22 -0
- data/opstat-plugins.gemspec +20 -0
- data/spec/cpu_spec.rb +39 -0
- data/spec/disk_io_spec.rb +31 -0
- data/spec/disk_spec.rb +31 -0
- data/spec/fixtures/parser_cpu_16_core.txt +24 -0
- data/spec/fixtures/parser_cpu_16_core_corrupted.txt +24 -0
- data/spec/fixtures/parser_cpu_single_core.txt +10 -0
- data/spec/fixtures/parser_cpu_single_core_corrupted.txt +9 -0
- data/spec/fixtures/parser_disk_3_mounts.txt +9 -0
- data/spec/fixtures/parser_disk_corrupted.txt +9 -0
- data/spec/fixtures/parser_disk_io.txt +2 -0
- data/spec/fixtures/parser_disk_io_corrupted.txt +2 -0
- data/spec/fixtures/parser_haproxy_correct.txt +2 -0
- data/spec/fixtures/parser_haproxy_corrupted.txt +2 -0
- data/spec/fixtures/parser_haproxy_many_frontend_many_backend.txt +6 -0
- data/spec/fixtures/parser_haproxy_single_frontend_single_backend_with_single_svname.txt +5 -0
- data/spec/fixtures/parser_load.txt +1 -0
- data/spec/fixtures/parser_load_corrupted.txt +2 -0
- data/spec/fixtures/parser_memory.txt +43 -0
- data/spec/fixtures/parser_memory_corrupted.txt +43 -0
- data/spec/fixtures/parser_network.txt +5 -0
- data/spec/fixtures/parser_network_corrupted.txt +5 -0
- data/spec/fixtures/parser_webobjects_many_apps_many_instances.result.yml +590 -0
- data/spec/fixtures/parser_webobjects_many_apps_many_instances.txt +2 -0
- data/spec/fixtures/parser_webobjects_one_app_many_instances.result.yml +305 -0
- data/spec/fixtures/parser_webobjects_one_app_many_instances.txt +395 -0
- data/spec/haproxy_spec.rb +68 -0
- data/spec/load_spec.rb +21 -0
- data/spec/memory_spec.rb +21 -0
- data/spec/network_spec.rb +21 -0
- data/spec/spec_helper.rb +102 -0
- data/spec/webobjects_spec.rb +28 -0
- metadata +189 -0
@@ -0,0 +1,192 @@
|
|
1
|
+
class Apache2
|
2
|
+
include Mongoid::Document
|
3
|
+
include Mongoid::Attributes::Dynamic
|
4
|
+
include Mongoid::Timestamps
|
5
|
+
include Graphs::AreaStackedChart
|
6
|
+
store_in collection: "opstat.reports"
|
7
|
+
field :timestamp, type: DateTime
|
8
|
+
index({timestamp: 1, host_id: 1, plugin_id: 1},{background: true})
|
9
|
+
|
10
|
+
def self.chart_data(options = {})
|
11
|
+
charts = []
|
12
|
+
charts = self.all_vhosts_charts(options)
|
13
|
+
return charts
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.all_vhosts_charts(options)
|
17
|
+
charts = []
|
18
|
+
stats = Apache2.where( {:timestamp => { :$gte => options[:start],:$lt => options[:end]}, :host_id => options[:host_id], :plugin_id => options[:plugin_id] }).order(:timestamp).all.group_by{|v| v.vhost_name}
|
19
|
+
charts = self.vhosts_requests_and_bytes_per_sec(stats)
|
20
|
+
return charts
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.vhosts_requests_and_bytes_per_sec(stats)
|
24
|
+
charts = []
|
25
|
+
stats.each_pair do |vhost,data|
|
26
|
+
chart_bytes = self.chart_structure({:title => "Bytes sent per second for #{vhost} vhost", :value_axis => { :title => "Bytes sent per second"}})
|
27
|
+
chart_requests = self.chart_structure({:title => "Request sent per second for #{vhost} vhost", :value_axis => { :title => "request sent per second"}})
|
28
|
+
|
29
|
+
prev = {}
|
30
|
+
statuses = {}
|
31
|
+
data.each do |vhost_data|
|
32
|
+
current = {:bytes_sent_per_sec => {}, :requests_per_sec => {}}
|
33
|
+
current[:bytes_sent_per_sec]['timestamp'] = vhost_data['timestamp'].to_f * 1000
|
34
|
+
statuses.keys.each do |s|
|
35
|
+
current[:bytes_sent_per_sec][s] = 0
|
36
|
+
end
|
37
|
+
current[:requests_per_sec]['timestamp'] = vhost_data['timestamp'].to_f * 1000
|
38
|
+
statuses.keys.each do |s|
|
39
|
+
current[:requests_per_sec][s] = 0
|
40
|
+
end
|
41
|
+
vhost_data['stats'].each_pair do |status, values|
|
42
|
+
statuses[status] = true
|
43
|
+
unless prev.has_key?(status) then
|
44
|
+
prev[status] = values
|
45
|
+
prev[status]['timestamp'] = vhost_data['timestamp']
|
46
|
+
next
|
47
|
+
end
|
48
|
+
|
49
|
+
time_diff = vhost_data['timestamp'].to_i - prev[status]['timestamp'].to_i
|
50
|
+
bytes_sent_per_sec = ((values["bytes_sent"] - prev[status]['bytes_sent'])/time_diff.to_f).round(3)
|
51
|
+
requests_per_sec = ((values['requests'] - prev[status]['requests'])/time_diff.to_f).round(3)
|
52
|
+
#TODO Interpolation of no data intervals
|
53
|
+
#TODO take into account requests also
|
54
|
+
if bytes_sent_per_sec < 0
|
55
|
+
prev[status] = values
|
56
|
+
prev[status]['timestamp'] = vhost_data['timestamp']
|
57
|
+
next
|
58
|
+
end
|
59
|
+
|
60
|
+
current[:bytes_sent_per_sec][status] = bytes_sent_per_sec.to_f
|
61
|
+
current[:requests_per_sec][status] = requests_per_sec.to_f
|
62
|
+
prev[status] = values
|
63
|
+
prev[status]['timestamp'] = vhost_data['timestamp']
|
64
|
+
end
|
65
|
+
chart_requests[:graph_data] << current[:requests_per_sec]
|
66
|
+
chart_bytes[:graph_data] << current[:bytes_sent_per_sec]
|
67
|
+
end
|
68
|
+
statuses.keys.sort.each do |status|
|
69
|
+
properties = self.statuses_properties.select{|a| a[:value_field] == status.to_s}.first
|
70
|
+
p status
|
71
|
+
chart_requests[:graphs] << { :value_axis => 'valueAxis1', :value_field => status.to_s, :line_color => properties[:line_color], :balloon_text => "[[title]]: ([[value]])", :line_thickness => 1, :line_alpha => 1, :fill_alphas => 0.8, :graph_type => 'line' }
|
72
|
+
chart_bytes[:graphs] << { :value_axis => 'valueAxis1', :value_field => status.to_s, :line_color => properties[:line_color], :balloon_text => "[[title]]: ([[value]])", :line_thickness => 1, :line_alpha => 1, :fill_alphas => 0.8, :graph_type => 'line' }
|
73
|
+
end
|
74
|
+
charts << chart_bytes << chart_requests
|
75
|
+
end
|
76
|
+
charts
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.statuses_properties
|
80
|
+
[
|
81
|
+
{ :value_field => "200",
|
82
|
+
:hidden => false,
|
83
|
+
:line_color => "#00FF00",
|
84
|
+
:line_thickness => 3,
|
85
|
+
:title => "Status 200"},
|
86
|
+
{ :value_field => "202",
|
87
|
+
:hidden => false,
|
88
|
+
:line_color => "#00FF33",
|
89
|
+
:line_thickness => 3,
|
90
|
+
:title => "Status 202"},
|
91
|
+
{ :value_field => "204",
|
92
|
+
:hidden => false,
|
93
|
+
:line_color => "#00FF66",
|
94
|
+
:line_thickness => 3,
|
95
|
+
:title => "Status 204"},
|
96
|
+
{ :value_field => "206",
|
97
|
+
:hidden => false,
|
98
|
+
:line_color => "#00FF88",
|
99
|
+
:line_thickness => 3,
|
100
|
+
:title => "Status 206"},
|
101
|
+
{ :value_field => "300",
|
102
|
+
:hidden => false,
|
103
|
+
:line_color => "#FFFF00",
|
104
|
+
:line_thickness => 3,
|
105
|
+
:title => "Status 301"},
|
106
|
+
{ :value_field => "301",
|
107
|
+
:hidden => false,
|
108
|
+
:line_color => "#FFEE00",
|
109
|
+
:line_thickness => 3,
|
110
|
+
:title => "Status 300"},
|
111
|
+
{ :value_field => "302",
|
112
|
+
:hidden => false,
|
113
|
+
:line_color => "#FFDD00",
|
114
|
+
:line_thickness => 3,
|
115
|
+
:title => "Status 302"},
|
116
|
+
{ :value_field => "303",
|
117
|
+
:hidden => false,
|
118
|
+
:line_color => "#FFAA00",
|
119
|
+
:line_thickness => 3,
|
120
|
+
:title => "Status 303"},
|
121
|
+
{ :value_field => "304",
|
122
|
+
:hidden => false,
|
123
|
+
:line_color => "#FF9900",
|
124
|
+
:line_thickness => 3,
|
125
|
+
:title => "Status 304"},
|
126
|
+
{ :value_field => "400",
|
127
|
+
:hidden => false,
|
128
|
+
:line_color => "#FF8800",
|
129
|
+
:line_thickness => 3,
|
130
|
+
:title => "Status 400"},
|
131
|
+
{ :value_field => "403",
|
132
|
+
:hidden => false,
|
133
|
+
:line_color => "#FF6600",
|
134
|
+
:line_thickness => 3,
|
135
|
+
:title => "Status 403"},
|
136
|
+
{ :value_field => "404",
|
137
|
+
:hidden => false,
|
138
|
+
:line_color => "#FF4400",
|
139
|
+
:line_thickness => 3,
|
140
|
+
:title => "Status 404"},
|
141
|
+
{ :value_field => "405",
|
142
|
+
:hidden => false,
|
143
|
+
:line_color => "#EE0000",
|
144
|
+
:line_thickness => 3,
|
145
|
+
:title => "Status 405"},
|
146
|
+
{ :value_field => "406",
|
147
|
+
:hidden => false,
|
148
|
+
:line_color => "#CC0000",
|
149
|
+
:line_thickness => 3,
|
150
|
+
:title => "Status 406"},
|
151
|
+
{ :value_field => "407",
|
152
|
+
:hidden => false,
|
153
|
+
:line_color => "#BB0000",
|
154
|
+
:line_thickness => 3,
|
155
|
+
:title => "Status 407"},
|
156
|
+
{ :value_field => "408",
|
157
|
+
:hidden => false,
|
158
|
+
:line_color => "#AA0000",
|
159
|
+
:line_thickness => 3,
|
160
|
+
:title => "Status 408"},
|
161
|
+
{ :value_field => "420",
|
162
|
+
:hidden => false,
|
163
|
+
:line_color => "#550000",
|
164
|
+
:line_thickness => 3,
|
165
|
+
:title => "Status 420"},
|
166
|
+
{ :value_field => "500",
|
167
|
+
:hidden => false,
|
168
|
+
:line_color => "#FF0000",
|
169
|
+
:line_thickness => 3,
|
170
|
+
:title => "Status 500"},
|
171
|
+
{ :value_field => "501",
|
172
|
+
:hidden => false,
|
173
|
+
:line_color => "#FF2200",
|
174
|
+
:line_thickness => 3,
|
175
|
+
:title => "Status 501"},
|
176
|
+
{ :value_field => "502",
|
177
|
+
:hidden => false,
|
178
|
+
:line_color => "#FF4400",
|
179
|
+
:line_thickness => 3,
|
180
|
+
:title => "Status 502"},
|
181
|
+
{ :value_field => "503",
|
182
|
+
:hidden => false,
|
183
|
+
:line_color => "#FF6600",
|
184
|
+
:line_thickness => 3,
|
185
|
+
:title => "Status 503"}
|
186
|
+
]
|
187
|
+
end
|
188
|
+
|
189
|
+
def self.graphs
|
190
|
+
{}
|
191
|
+
end
|
192
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
class Bsdnet
|
2
|
+
class BytesInOut
|
3
|
+
include Mongoid::Document
|
4
|
+
include Mongoid::Attributes::Dynamic
|
5
|
+
include Mongoid::Timestamps
|
6
|
+
include Graphs::AreaNotStackedChart
|
7
|
+
store_in collection: "opstat.reports"
|
8
|
+
field :timestamp, type: DateTime
|
9
|
+
index({timestamp: 1, host_id: 1, plugin_id: 1},{background: true})
|
10
|
+
|
11
|
+
def self.chart_data(options = {})
|
12
|
+
charts = []
|
13
|
+
options[:interface] = 'vlan254'
|
14
|
+
charts << self.bytes_chart(options)
|
15
|
+
#TODO interfaces??
|
16
|
+
return charts
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.bytes_chart(options)
|
20
|
+
chart = self.chart_structure({:title => "Network traffic in/out", :value_axis => { :title => "Network traffic [Bytes]"}})
|
21
|
+
#TODO - sort by date
|
22
|
+
values = Bsdnet::BytesInOut.where(:timestamp.gte => options[:start]).
|
23
|
+
where(:timestamp.lt => options[:end]).
|
24
|
+
where(:host_id => options[:host_id]).
|
25
|
+
where(:plugin_id => options[:plugin_id]).
|
26
|
+
order(timestamp: :asc)
|
27
|
+
prev = nil
|
28
|
+
values.each do |data|
|
29
|
+
if prev.nil?
|
30
|
+
prev = data
|
31
|
+
next
|
32
|
+
end
|
33
|
+
bytes_in_per_sec = (data[:bytes_in_v4] - prev[:bytes_in_v4])/(data[:timestamp] - prev[:timestamp])
|
34
|
+
bytes_out_per_sec = (data[:bytes_out_v4] - prev[:bytes_out_v4])/(data[:timestamp] - prev[:timestamp])
|
35
|
+
chart[:graph_data] << {
|
36
|
+
:timestamp => data[:timestamp],
|
37
|
+
:bytes_out => bytes_out_per_sec.to_i,
|
38
|
+
:bytes_in => bytes_in_per_sec.to_i
|
39
|
+
}
|
40
|
+
prev = data
|
41
|
+
end
|
42
|
+
|
43
|
+
chart
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.graphs
|
47
|
+
{
|
48
|
+
:bytes_in => { :line_color => '#FF3300' },
|
49
|
+
:bytes_out => {:line_color => '#00FF00' }
|
50
|
+
}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class Bsdnet
|
2
|
+
class CurrentEntries
|
3
|
+
include Mongoid::Document
|
4
|
+
include Mongoid::Attributes::Dynamic
|
5
|
+
include Mongoid::Timestamps
|
6
|
+
include Graphs::AreaNotStackedChart
|
7
|
+
store_in collection: "opstat.reports"
|
8
|
+
field :timestamp, type: DateTime
|
9
|
+
|
10
|
+
def self.chart_data(options = {})
|
11
|
+
charts = []
|
12
|
+
options[:interface] = 'vlan254'
|
13
|
+
charts << self.entries_chart(options)
|
14
|
+
return charts
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.entries_chart(options)
|
18
|
+
chart = self.chart_structure({:title => "Network current entries", :value_axis => { :title => "Network entries []"}})
|
19
|
+
values = Bsdnet::CurrentEntries.where(:timestamp.gte => options[:start]).
|
20
|
+
where(:timestamp.lt => options[:end]).
|
21
|
+
where(:host_id => options[:host_id]).
|
22
|
+
where(:plugin_id => options[:plugin_id]).
|
23
|
+
order(timestamp: :asc)
|
24
|
+
chart[:graph_data] = values
|
25
|
+
chart
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.graphs
|
29
|
+
{
|
30
|
+
:current_entries => { :line_color => '#FF3300' },
|
31
|
+
}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
pwd = File.dirname(File.expand_path(__FILE__))
|
2
|
+
require "#{pwd}/bsdnet/bytes_in_out.rb"
|
3
|
+
require "#{pwd}/bsdnet/current_entries.rb"
|
4
|
+
|
5
|
+
class Bsdnet
|
6
|
+
def self.chart_data(options = {})
|
7
|
+
charts = []
|
8
|
+
charts += Bsdnet::BytesInOut.chart_data(options)
|
9
|
+
charts += Bsdnet::CurrentEntries.chart_data(options)
|
10
|
+
return charts
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
class Cpu
|
2
|
+
include Mongoid::Document
|
3
|
+
include Mongoid::Attributes::Dynamic
|
4
|
+
include Mongoid::Timestamps
|
5
|
+
store_in collection: "opstat.reports"
|
6
|
+
index({timestamp: 1, host_id: 1, plugin_id: 1},{background: true})
|
7
|
+
|
8
|
+
def self.chart_data(options = {})
|
9
|
+
charts = []
|
10
|
+
charts << self.cpu_chart(options)
|
11
|
+
return charts
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.cpu_chart(options)
|
15
|
+
cpu_utilization = {
|
16
|
+
:value_axes => [
|
17
|
+
{
|
18
|
+
:name => "valueAxis1",
|
19
|
+
:title => 'Cpu utilization in %',
|
20
|
+
:position => 'left',
|
21
|
+
:min_max_multiplier => 1,
|
22
|
+
:stack_type => '100%',
|
23
|
+
:include_guides_in_min_max => 'true',
|
24
|
+
:grid_alpha => 0.1
|
25
|
+
}
|
26
|
+
],
|
27
|
+
:graph_data => [],
|
28
|
+
:category_field => 'timestamp',
|
29
|
+
:graphs => [],
|
30
|
+
:title => "Host CPU usage",
|
31
|
+
:title_size => 20
|
32
|
+
}
|
33
|
+
|
34
|
+
#CHOOSE HERE which
|
35
|
+
# TODO ADD ALL TYPES
|
36
|
+
graphs = {
|
37
|
+
'system' => { :value_axis => 'valueAxis1', :line_color => "#FF0000", :balloon_text => "[[title]]: ([[percents]]%)", :line_thickness => 1, :line_alpha => 1, :fill_alphas => 0.8, :graph_type => 'line' },
|
38
|
+
'nice' => { :line_color => '#FF3300' },
|
39
|
+
'user' => { :line_color => '#FF7700' },
|
40
|
+
'iowait' => { :line_color => '#FFaa00' },
|
41
|
+
'irq' => { :line_color => '#FFdd00' },
|
42
|
+
'softirq' => { :line_color => '#FFFF00' },
|
43
|
+
'idle' => {:line_color => '#00FF00' }
|
44
|
+
}
|
45
|
+
prev = nil
|
46
|
+
self.cpu_aggregate(options).each do |data|
|
47
|
+
if prev.nil? then
|
48
|
+
prev = data
|
49
|
+
next
|
50
|
+
end
|
51
|
+
temp = {"timestamp" => data[:timestamp]}
|
52
|
+
graphs.each_key {|g| temp[g] = data[g] - prev[g]}
|
53
|
+
cpu_utilization[:graph_data] << temp
|
54
|
+
prev = data
|
55
|
+
end
|
56
|
+
|
57
|
+
graphs.each_pair do |graph, properties|
|
58
|
+
#TODO value_axis
|
59
|
+
#TODO merge set values with default
|
60
|
+
cpu_utilization[:graphs] << { :value_axis => 'valueAxis1', :value_field => graph, :line_color => properties[:line_color], :balloon_text => "[[title]]: ([[percents]]%)", :line_thickness => 1, :line_alpha => 1, :fill_alphas => 0.8, :graph_type => 'line', :title => graph}
|
61
|
+
end
|
62
|
+
cpu_utilization
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.cpu_detailed(options)
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.cpu_aggregate(options)
|
69
|
+
#data = Cpu.where( { :timestamp => {:$gte => options[:start],:$lt => options[:end]} , :cpu_id => 'cpu', :host_id => options[:host_id], :plugin_id => options[:plugin_id]} ).order_by(timestamp: asc).all
|
70
|
+
|
71
|
+
data = Cpu.where( :timestamp.gte => options[:start]).
|
72
|
+
where( :timestamp.lt => options[:end]).
|
73
|
+
where( :cpu_id => 'cpu').
|
74
|
+
where( :host_id => options[:host_id]).
|
75
|
+
where( :plugin_id => options[:plugin_id] ).order_by(timestamp: :asc)
|
76
|
+
data
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.graphs_defaults
|
80
|
+
[]
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.axes_defaults
|
84
|
+
[]
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class Disk
|
2
|
+
include Mongoid::Document
|
3
|
+
include Mongoid::Attributes::Dynamic
|
4
|
+
include Mongoid::Timestamps
|
5
|
+
include Graphs::AreaStackedChart
|
6
|
+
store_in collection: "opstat.reports"
|
7
|
+
field :timestamp, type: DateTime
|
8
|
+
index({timestamp: 1, host_id: 1, plugin_id: 1})
|
9
|
+
|
10
|
+
def self.chart_data(options = {})
|
11
|
+
charts = []
|
12
|
+
charts = self.all_disks_charts(options)
|
13
|
+
return charts
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.all_disks_charts(options)
|
17
|
+
charts = []
|
18
|
+
Disk.where(:timestamp.gte => options[:start]).
|
19
|
+
where(:timestamp.lt => options[:end]).
|
20
|
+
where(:host_id => options[:host_id]).
|
21
|
+
where(:plugin_id => options[:plugin_id]).
|
22
|
+
order_by(timestamp: :asc).group_by{|u| u.mount}.each_pair do |mount, values|
|
23
|
+
charts << self.disk_chart(mount, values)
|
24
|
+
end
|
25
|
+
return charts
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.disk_chart(mount, values)
|
29
|
+
chart = self.chart_structure({:title => "Disk space usage for #{mount}", :value_axis => { :title => "Disk usage in KB"}})
|
30
|
+
#TODO - get fields from above DRY
|
31
|
+
chart[:graph_data] = values
|
32
|
+
chart
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.graphs
|
36
|
+
{
|
37
|
+
:block_used => {
|
38
|
+
:hidden => false,
|
39
|
+
:line_color => "#FF0000",
|
40
|
+
:line_thickness => 3,
|
41
|
+
:title => "block used"
|
42
|
+
},
|
43
|
+
:block_free => {
|
44
|
+
:hidden => false,
|
45
|
+
:line_color => "#00FF00",
|
46
|
+
:line_thickness => 3,
|
47
|
+
:title => "block free"
|
48
|
+
}
|
49
|
+
}
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
class DiskIo
|
2
|
+
include Mongoid::Document
|
3
|
+
include Mongoid::Attributes::Dynamic
|
4
|
+
include Mongoid::Timestamps
|
5
|
+
include Graphs::LineChart
|
6
|
+
store_in collection: "opstat.reports"
|
7
|
+
field :timestamp, type: DateTime
|
8
|
+
index({timestamp: 1, hostname: 1, ip_address: 1},{background: true})
|
9
|
+
|
10
|
+
def self.chart_data(options = {})
|
11
|
+
charts = []
|
12
|
+
charts << self.disk_io_charts(options)
|
13
|
+
return charts
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.disk_io_charts(options)
|
17
|
+
chart = self.chart_structure({:title => "Host load average", :value_axis => { :title => "Memory size in KB"},:include_guides_in_min_max => false})
|
18
|
+
|
19
|
+
#CHOOSE HERE which
|
20
|
+
# TODO ADD ALL TYPES
|
21
|
+
#TODO ADD GUIDES - if num of cores from facter
|
22
|
+
graphs = [ :load_1m, :load_5m, :load_15m ]
|
23
|
+
|
24
|
+
#TODO cpu and here - sort by timestamp
|
25
|
+
chart[:graph_data] = DiskIo.where(:timestamp.gte => options[:start]).
|
26
|
+
where(:timestamp.lt => options[:end]).
|
27
|
+
where(:host_id => options[:host_id]).
|
28
|
+
where(:plugin_id => options[:plugin_id]).
|
29
|
+
order(timestamp: :asc)
|
30
|
+
|
31
|
+
chart
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.graphs
|
35
|
+
{
|
36
|
+
:load_15m => {
|
37
|
+
:hidden => false,
|
38
|
+
:line_color => "#FF0000",
|
39
|
+
:line_thickness => 3,
|
40
|
+
:title => "Load 15 minutes average"},
|
41
|
+
:load_5m => {
|
42
|
+
:hidden => false,
|
43
|
+
:line_color => "#FFFF00",
|
44
|
+
:line_thickness => 2,
|
45
|
+
:title => "Load 5 minutes average"},
|
46
|
+
:load_1m => {
|
47
|
+
:hidden => false,
|
48
|
+
:line_color => "#FFaa00",
|
49
|
+
:line_thickness => 1,
|
50
|
+
:title => "Load 1 minute average"}
|
51
|
+
}
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Facts
|
2
|
+
include Mongoid::Document
|
3
|
+
include Mongoid::Attributes::Dynamic
|
4
|
+
include Mongoid::Timestamps
|
5
|
+
store_in collection: "opstat.reports"
|
6
|
+
field :timestamp, type: DateTime
|
7
|
+
index({timestamp: 1, host_id: 1, plugin_id: 1, plugin_type: 1}, {background: true})
|
8
|
+
index({host_id: 1, plugin_id: 1},{background: true})
|
9
|
+
|
10
|
+
|
11
|
+
def self.chart_data(options = {})
|
12
|
+
facter_data = {}
|
13
|
+
self.where(:timestamp.gte => options[:start]).
|
14
|
+
where(:ip_address => options[:ip_address]).
|
15
|
+
where(:hostname => options[:hostname]).order_by(timestamp: :asc).each do |data|
|
16
|
+
facter_data[data[:name]] ||= data[:value]
|
17
|
+
end
|
18
|
+
{ :facter_data => facter_data }
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.get_latest_facts_for_host(host_id)
|
22
|
+
Facts.where(:host_id => host_id)
|
23
|
+
where(:plugin_type => 'facts').
|
24
|
+
last
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.legend
|
28
|
+
@legend = {}
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
class Fpm
|
2
|
+
include Mongoid::Document
|
3
|
+
include Mongoid::Attributes::Dynamic
|
4
|
+
include Mongoid::Timestamps
|
5
|
+
store_in collection: "opstat.reports"
|
6
|
+
field :timestamp, type: DateTime
|
7
|
+
|
8
|
+
def self.chart_data(options = {})
|
9
|
+
charts = self.fpms_charts(options)
|
10
|
+
return charts
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.fpms_charts(options = {})
|
14
|
+
charts = []
|
15
|
+
Fpm.where(:timestamp.gte => options[:start]).
|
16
|
+
where(:timestamp.lt => options[:end]).
|
17
|
+
where(:host_id => options[:host_id]).
|
18
|
+
where(:plugin_id => options[:plugin_id]).
|
19
|
+
order_by(timestamp: :asc).group_by{|u| u.pool}.each_pair do |pool, values|
|
20
|
+
charts << self.fpm_chart(pool,values)
|
21
|
+
end
|
22
|
+
return charts
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.fpm_chart(pool, values)
|
26
|
+
max_active_processes = 0
|
27
|
+
chart_data = {
|
28
|
+
:value_axes => self.axes,
|
29
|
+
:graph_data => [],
|
30
|
+
:graphs => self.graphs,
|
31
|
+
:title => "#{pool} FPM pool statistic",
|
32
|
+
:category_field => 'timestamp',
|
33
|
+
:title_size => 20,
|
34
|
+
:guides => {}
|
35
|
+
}
|
36
|
+
|
37
|
+
prev = nil
|
38
|
+
values.each do |value|
|
39
|
+
temp = {}
|
40
|
+
|
41
|
+
if prev.nil? then
|
42
|
+
prev = value
|
43
|
+
next
|
44
|
+
end
|
45
|
+
|
46
|
+
time_diff = value[:timestamp].to_i - prev[:timestamp].to_i
|
47
|
+
accepted_connections_per_sec = ((value[:accepted_connections] - prev[:accepted_connections])/time_diff.to_f).round(3)
|
48
|
+
#Interpolation of no data intervals
|
49
|
+
if accepted_connections_per_sec < 0
|
50
|
+
prev = value
|
51
|
+
next
|
52
|
+
end
|
53
|
+
|
54
|
+
max_active_processes = value[:processes_active_max] if value[:processes_active_max] > max_active_processes
|
55
|
+
|
56
|
+
temp = {'timestamp' => value[:timestamp]}
|
57
|
+
temp[:processes_active] = value[:processes_active]
|
58
|
+
temp[:processes_idle] = value[:processes_idle]
|
59
|
+
temp[:accepted_connections_per_sec] = accepted_connections_per_sec.to_f
|
60
|
+
prev = value
|
61
|
+
chart_data[:graph_data] << temp
|
62
|
+
end
|
63
|
+
chart_data[:guides] = [
|
64
|
+
{
|
65
|
+
:value => max_active_processes,
|
66
|
+
:value_axis => 'valueAxis2',
|
67
|
+
:line_color => "#FF0000",
|
68
|
+
:line_thickness => 1,
|
69
|
+
:dash_length => 5,
|
70
|
+
:label => "Max processes",
|
71
|
+
:inside => 'true',
|
72
|
+
:line_alpha => 1,
|
73
|
+
:position => 'bottom',
|
74
|
+
}
|
75
|
+
]
|
76
|
+
|
77
|
+
return chart_data
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.graphs
|
81
|
+
[
|
82
|
+
{ :value_field => "processes_active",
|
83
|
+
:graph_type => 'line',
|
84
|
+
:hidden => false,
|
85
|
+
:balloon_text => "[[title]]: ([[value]])",
|
86
|
+
:line_color => "#FF0000",
|
87
|
+
:line_thickness => 1,
|
88
|
+
:line_alpha => 1,
|
89
|
+
:fill_alphas => 0.6,
|
90
|
+
:title => "Active Processes",
|
91
|
+
:value_axis => "valueAxis2"},
|
92
|
+
{ :value_field => "processes_idle",
|
93
|
+
:graph_type => 'line',
|
94
|
+
:hidden => false,
|
95
|
+
:balloon_text => "[[title]]: ([[value]])",
|
96
|
+
:line_color => "#00FF00",
|
97
|
+
:line_thickness => 1,
|
98
|
+
:line_alpha => 1,
|
99
|
+
:fill_alphas => 0.6,
|
100
|
+
:title => "Idle processes",
|
101
|
+
:value_axis => "valueAxis2"},
|
102
|
+
{ :value_field => "accepted_connections_per_sec",
|
103
|
+
:graph_type => 'line',
|
104
|
+
:hidden => false,
|
105
|
+
:balloon_text => "[[title]]: ([[value]])",
|
106
|
+
:line_color => "#0000FF",
|
107
|
+
:line_thickness => 3,
|
108
|
+
:line_alpha => 1,
|
109
|
+
:fill_alphas => 0,
|
110
|
+
:title => "Accepted connections per second",
|
111
|
+
:value_axis => "valueAxis1"},
|
112
|
+
]
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.axes
|
116
|
+
[
|
117
|
+
{
|
118
|
+
:name => 'valueAxis1',
|
119
|
+
:title => 'Accepted connections per second',
|
120
|
+
:position => 'right',
|
121
|
+
:min_max_multiplier => 1,
|
122
|
+
:grid_alpha => 0.07,
|
123
|
+
:include_guides_in_min_max => 'true',
|
124
|
+
:stack_type => "none"
|
125
|
+
},
|
126
|
+
{
|
127
|
+
:name => 'valueAxis2',
|
128
|
+
:title => 'Active processes',
|
129
|
+
:position => 'left',
|
130
|
+
:grid_alpha => 0.07,
|
131
|
+
:min_max_multiplier => 1,
|
132
|
+
:include_guides_in_min_max => 'true',
|
133
|
+
:stack_type => "regular"
|
134
|
+
}
|
135
|
+
]
|
136
|
+
|
137
|
+
end
|
138
|
+
end
|