opstat-plugins 0.3.8
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
- 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
|