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,57 @@
|
|
|
1
|
+
class Haproxy
|
|
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
|
+
field :stot, type: Integer
|
|
9
|
+
index({timestamp: 1, host_id: 1, plugin_id: 1}, {background: true})
|
|
10
|
+
|
|
11
|
+
def self.chart_data(options = {})
|
|
12
|
+
charts = []
|
|
13
|
+
charts = self.haproxy_charts(options)
|
|
14
|
+
return charts
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self.haproxy_charts(options)
|
|
18
|
+
haproxy_instance =[]
|
|
19
|
+
charts = []
|
|
20
|
+
Haproxy.where(:timestamp.gte => options[:start]).
|
|
21
|
+
where(:timestamp.lt => options[:end]).
|
|
22
|
+
where(:host_id => options[:host_id]).
|
|
23
|
+
where(:plugin_id => options[:plugin_id]).
|
|
24
|
+
order_by(timestamp: :asc).group_by{|u| u[:name]}.each_pair do |instance, values|
|
|
25
|
+
charts << self.haproxy_chart(instance, values)
|
|
26
|
+
end
|
|
27
|
+
return charts
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.haproxy_chart(instance, values)
|
|
31
|
+
chart = self.chart_structure({:title => "Haproxy #{instance}", :value_axis => { :title => "Session per second"} })
|
|
32
|
+
prev = {}
|
|
33
|
+
chart_data = {}
|
|
34
|
+
instances = Hash.new
|
|
35
|
+
values.each do |value|
|
|
36
|
+
instances[value[:stot]] ||= true
|
|
37
|
+
unless prev.has_key?(value[:stot]) then
|
|
38
|
+
prev[value[:stot]] = value
|
|
39
|
+
next
|
|
40
|
+
end
|
|
41
|
+
time_diff = value[:timestamp].to_i - prev[value[:stot]][:timestamp].to_i
|
|
42
|
+
chart[:graph_data] << {
|
|
43
|
+
"timestamp" => value[:timestamp],
|
|
44
|
+
"session_per_sec" => (value[:summary][:stot] - prev[value[:stot]][:summary][:stot]).to_f/time_diff
|
|
45
|
+
}
|
|
46
|
+
prev[value[:stot]] = value
|
|
47
|
+
end
|
|
48
|
+
chart
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def self.graphs
|
|
52
|
+
{
|
|
53
|
+
:session_per_sec => { :line_color => '#00FFAC', :line_thickness => 4, :title => "session_per_second", :hidden => false},
|
|
54
|
+
}
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
class Jvm
|
|
2
|
+
include Mongoid::Document
|
|
3
|
+
include Mongoid::Attributes::Dynamic
|
|
4
|
+
include Mongoid::Timestamps
|
|
5
|
+
include Graphs::AreaNotStackedChart
|
|
6
|
+
store_in collection: "opstat.reports"
|
|
7
|
+
field :timestamp, type: DateTime
|
|
8
|
+
|
|
9
|
+
def self.chart_data(options = {})
|
|
10
|
+
charts = []
|
|
11
|
+
|
|
12
|
+
charts << self.threads_chart(options)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.threads_chart(options)
|
|
16
|
+
graphs = [:free, :swap_used]
|
|
17
|
+
graph_fields = graphs << :timestamp
|
|
18
|
+
chart = area_stacked_chart(:graphs => graphs, :value_axis_title => 'Number of threads', :chart_title => 'Java threads')
|
|
19
|
+
chart[:graph_data] = Jvm.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_by(timestamp: :asc)
|
|
24
|
+
return chart
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def area_stacked_chart(config)
|
|
29
|
+
chart = {
|
|
30
|
+
:value_axes => [
|
|
31
|
+
{
|
|
32
|
+
:name => "valueAxis1",
|
|
33
|
+
:title => config[:value_axis1_title],
|
|
34
|
+
:position => 'left',
|
|
35
|
+
:stack_type => 'regular',
|
|
36
|
+
:grid_alpha => 0.07,
|
|
37
|
+
:min_max_multiplier => 1,
|
|
38
|
+
:include_guides_in_min_max => 'true'
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
:category_field => 'timestamp',
|
|
42
|
+
:graph_data => [],
|
|
43
|
+
:graphs => [],
|
|
44
|
+
:title => config[:chart_title],
|
|
45
|
+
:title_size => 20
|
|
46
|
+
}
|
|
47
|
+
config[:graphs].each do |graph|
|
|
48
|
+
chart[:graphs] << { :value_axis => 'valueAxis1', :value_field => graph, :balloon_text => "[[title]]: ([[value]])", :line_thickness => 1, :line_alpha => 1, :fill_alphas => 0.8, :graph_type => 'line' }
|
|
49
|
+
end
|
|
50
|
+
return chart
|
|
51
|
+
end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
class Load
|
|
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.load_chart(options)
|
|
13
|
+
return charts
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.load_chart(options)
|
|
17
|
+
chart = self.chart_structure({:title => "Host load average", :value_axis => { :title => "Load averages"}, :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] = Load.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_by(timestamp: :asc)
|
|
30
|
+
|
|
31
|
+
host_facts = Facts.get_latest_facts_for_host(options[:host_id])
|
|
32
|
+
unless host_facts.nil?
|
|
33
|
+
cores_total = host_facts['facts']['processors']['count']
|
|
34
|
+
#TODO - find best way to set guides
|
|
35
|
+
# green zone - OK
|
|
36
|
+
guides = [ {
|
|
37
|
+
:value => 0,
|
|
38
|
+
:to_value => cores_total,
|
|
39
|
+
:value_axis => 'valueAxis1',
|
|
40
|
+
:line_color => "#00FF00",
|
|
41
|
+
:fill_color => "#00FF00",
|
|
42
|
+
:line_thickness => 1,
|
|
43
|
+
:dash_length => 5,
|
|
44
|
+
:label => "",
|
|
45
|
+
:inside => false,
|
|
46
|
+
:line_alpha => 1,
|
|
47
|
+
:fill_alpha => 0.1,
|
|
48
|
+
:position => 'bottom'},
|
|
49
|
+
# yellow zone - warn
|
|
50
|
+
{:value => cores_total,
|
|
51
|
+
:to_value => cores_total * 2,
|
|
52
|
+
:value_axis => 'valueAxis1',
|
|
53
|
+
:line_color => "#FFFF00",
|
|
54
|
+
:fill_color => "#FFFF00",
|
|
55
|
+
:line_thickness => 1,
|
|
56
|
+
:dash_length => 5,
|
|
57
|
+
:label => "",
|
|
58
|
+
:inside => false,
|
|
59
|
+
:line_alpha => 1,
|
|
60
|
+
:fill_alpha => 0.1,
|
|
61
|
+
:position => 'bottom'},
|
|
62
|
+
# red zone - critical
|
|
63
|
+
{:value => cores_total * 2,
|
|
64
|
+
:to_value => cores_total * 10,
|
|
65
|
+
:value_axis => 'valueAxis1',
|
|
66
|
+
:line_color => "#FF0000",
|
|
67
|
+
:fill_color => "#FF0000",
|
|
68
|
+
:line_thickness => 1,
|
|
69
|
+
:dash_length => 5,
|
|
70
|
+
:label => "",
|
|
71
|
+
:inside => false,
|
|
72
|
+
:line_alpha => 1,
|
|
73
|
+
:fill_alpha => 0.1,
|
|
74
|
+
:position => 'bottom'}]
|
|
75
|
+
end
|
|
76
|
+
chart[:guides] = guides
|
|
77
|
+
chart
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def self.graphs
|
|
81
|
+
{
|
|
82
|
+
:load_15m => {
|
|
83
|
+
:hidden => false,
|
|
84
|
+
:line_color => "#FF0000",
|
|
85
|
+
:line_thickness => 3,
|
|
86
|
+
:title => "Load 15 minutes average"},
|
|
87
|
+
:load_5m => {
|
|
88
|
+
:hidden => false,
|
|
89
|
+
:line_color => "#FFFF00",
|
|
90
|
+
:line_thickness => 2,
|
|
91
|
+
:title => "Load 5 minutes average"},
|
|
92
|
+
:load_1m => {
|
|
93
|
+
:hidden => false,
|
|
94
|
+
:line_color => "#FFaa00",
|
|
95
|
+
:line_thickness => 1,
|
|
96
|
+
:title => "Load 1 minute average"}
|
|
97
|
+
}
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
class Memory
|
|
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.memory_chart(options)
|
|
13
|
+
return charts
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.memory_chart(options)
|
|
17
|
+
chart = self.chart_structure({:title => "Host memory usage", :value_axis => { :title => "Memory size in KB"}})
|
|
18
|
+
#TODO - get fields from above DRY
|
|
19
|
+
chart[:graph_data] = Memory.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]).order_by(timestamp: :asc)
|
|
23
|
+
|
|
24
|
+
guides = []
|
|
25
|
+
host_facts = Facts.get_latest_facts_for_host(options[:host_id])
|
|
26
|
+
unless host_facts.nil?
|
|
27
|
+
memory_total_bytes = host_facts['facts']['memory']['system']['total_bytes']
|
|
28
|
+
memory_total_kibytes = memory_total_bytes/1024
|
|
29
|
+
guide = {}
|
|
30
|
+
require 'ruby-units'
|
|
31
|
+
guide[:value] = memory_total_kibytes
|
|
32
|
+
guide[:value_axis] = 'valueAxis1'
|
|
33
|
+
guide[:line_color] = "#FF0000"
|
|
34
|
+
guide[:line_thickness] = 1
|
|
35
|
+
guide[:dash_length] = 5
|
|
36
|
+
guide[:label] = "Total physical memory: #{memory_total_kibytes}KiB (by facter)"
|
|
37
|
+
guide[:inside] = true
|
|
38
|
+
guide[:line_alpha] = 1
|
|
39
|
+
guide[:position] = 'bottom'
|
|
40
|
+
guides << guide
|
|
41
|
+
end
|
|
42
|
+
chart[:guides] = guides
|
|
43
|
+
chart
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def self.graphs
|
|
47
|
+
{
|
|
48
|
+
:used => { :line_color => '#FF3300' },
|
|
49
|
+
:cached => {:line_color => '#FFFF00' },
|
|
50
|
+
:buffers => {:line_color => '#FFaa33' },
|
|
51
|
+
:free => {:line_color => '#00FF00' },
|
|
52
|
+
:swap_used => {:line_color => '#00FFFF' }
|
|
53
|
+
}
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
class Nagios
|
|
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
|
+
|
|
9
|
+
def self.chart_data(options = {})
|
|
10
|
+
charts = []
|
|
11
|
+
charts << self.nagios_chart(options)
|
|
12
|
+
return charts
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.nagios_chart(options)
|
|
16
|
+
chart = self.chart_structure({:title => "Nagios alerts statistic", :value_axis => { :title => "Number of services"}})
|
|
17
|
+
#TODO - get fields from above DRY
|
|
18
|
+
chart[:graph_data] = Nagios.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)
|
|
23
|
+
return chart
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def self.graphs
|
|
27
|
+
{
|
|
28
|
+
:services_critical => {
|
|
29
|
+
:line_color => "#FF0000",
|
|
30
|
+
:hidden => false,
|
|
31
|
+
:title => "Services with critical errors"
|
|
32
|
+
},
|
|
33
|
+
:services_warning => {
|
|
34
|
+
:line_color => "#FFFF00",
|
|
35
|
+
:hidden => false,
|
|
36
|
+
:title => "Services with warnings"
|
|
37
|
+
},
|
|
38
|
+
:services_unknown => {
|
|
39
|
+
:line_color => "#FFaa00",
|
|
40
|
+
:hidden => false,
|
|
41
|
+
:title => "Services in unknown state"
|
|
42
|
+
},
|
|
43
|
+
:services_ok => {
|
|
44
|
+
:line_color => "#00FF00",
|
|
45
|
+
:hidden => true,
|
|
46
|
+
:title => "Services with no problems"
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
}
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
class Network
|
|
2
|
+
include Mongoid::Document
|
|
3
|
+
include Mongoid::Attributes::Dynamic
|
|
4
|
+
include Mongoid::Timestamps
|
|
5
|
+
include Graphs::AreaNotStackedChart
|
|
6
|
+
store_in collection: "opstat.reports"
|
|
7
|
+
field :timestamp, type: DateTime
|
|
8
|
+
field :bytes_receive, type: Integer
|
|
9
|
+
field :bytes_transmit, type: Integer
|
|
10
|
+
index({timestamp: 1, host_id: 1 , plugin_id: 1},{background: true})
|
|
11
|
+
|
|
12
|
+
def self.chart_data(options = {})
|
|
13
|
+
charts = []
|
|
14
|
+
charts = self.all_interfaces_charts(options)
|
|
15
|
+
return charts
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.all_interfaces_charts(options)
|
|
19
|
+
charts = []
|
|
20
|
+
Network.where(:timestamp.gte => options[:start]).
|
|
21
|
+
where(:timestamp.lt => options[:end]).
|
|
22
|
+
where(:host_id => options[:host_id]).
|
|
23
|
+
where(:plugin_id => options[:plugin_id]).
|
|
24
|
+
order_by(timestamp: :asc).group_by{|u| u.interface}.each_pair do |interface, values|
|
|
25
|
+
charts << self.interface_chart(interface, values)
|
|
26
|
+
end
|
|
27
|
+
return charts
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.interface_chart(interface, values)
|
|
31
|
+
chart_data = self.chart_structure({:title => "Network traffic for #{interface}", :value_axis => { :title => "Network traffic for #{interface}"}})
|
|
32
|
+
|
|
33
|
+
prev = nil
|
|
34
|
+
values.each do |value|
|
|
35
|
+
if prev.nil? then
|
|
36
|
+
prev = value
|
|
37
|
+
next
|
|
38
|
+
end
|
|
39
|
+
time_diff = value[:timestamp].to_i - prev[:timestamp].to_i
|
|
40
|
+
chart_data[:graph_data] << {
|
|
41
|
+
"timestamp" => value[:timestamp],
|
|
42
|
+
"bytes_receive_per_sec" => ((value[:bytes_receive].to_i - prev[:bytes_receive].to_i)/time_diff).to_i,
|
|
43
|
+
"bytes_transmit_per_sec" => ((value[:bytes_transmit].to_i - prev[:bytes_transmit].to_i)/time_diff).to_i
|
|
44
|
+
}
|
|
45
|
+
prev = value
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
chart_data
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def self.graphs
|
|
53
|
+
{
|
|
54
|
+
:bytes_receive_per_sec => { :line_color => '#0033FF' },
|
|
55
|
+
:bytes_transmit_per_sec => {:line_color => '#00FF00' }
|
|
56
|
+
}
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
class OracleFrasSizes
|
|
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
|
+
|
|
9
|
+
#TODO - files chart
|
|
10
|
+
def self.chart_data(options = {})
|
|
11
|
+
charts = []
|
|
12
|
+
charts = self.all_fras_charts(options)
|
|
13
|
+
return charts
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.all_fras_charts(options)
|
|
17
|
+
charts = []
|
|
18
|
+
OracleFrasSizes.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.path}.each_pair do |path, values|
|
|
23
|
+
charts << self.fra_chart(path, values)
|
|
24
|
+
end
|
|
25
|
+
return charts
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.fra_chart(path, values)
|
|
29
|
+
chart = self.chart_structure({:title => "Flash Recovery Area #{path} space usage", :value_axis => { :title => "FRA space usage"}})
|
|
30
|
+
chart[:graph_data] = values
|
|
31
|
+
|
|
32
|
+
return chart
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.graphs
|
|
36
|
+
{
|
|
37
|
+
:used => { :line_color => '#FF0000' },
|
|
38
|
+
:free => {:line_color => '#00FF00' }
|
|
39
|
+
}
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
class OracleSessions
|
|
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
|
+
|
|
9
|
+
def self.chart_data(options = {})
|
|
10
|
+
charts = []
|
|
11
|
+
charts << self.sessions_chart(options)
|
|
12
|
+
return charts
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.sessions_chart(options)
|
|
16
|
+
chart = self.chart_structure({:title => "Oracle sessions", :value_axis => { :title => "Sessions count"}})
|
|
17
|
+
chart[:graph_data] = OracleSessions.where(:timestamp.gte => options[:start]).
|
|
18
|
+
where(:timestamp.lt => options[:end]).
|
|
19
|
+
where(:host_id => options[:host_id]).
|
|
20
|
+
where(:plugin_id => options[:plugin_id]).
|
|
21
|
+
order_by(timestamp: :asc)
|
|
22
|
+
return chart
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def self.graphs
|
|
26
|
+
{
|
|
27
|
+
:used => {
|
|
28
|
+
:hidden => false,
|
|
29
|
+
:line_color => "#FF0000",
|
|
30
|
+
:line_thickness => 3,
|
|
31
|
+
:balloon_text => "[[title]]: [[value]] ([[percents]]%)",
|
|
32
|
+
:title => "Session used"
|
|
33
|
+
},
|
|
34
|
+
:free => {
|
|
35
|
+
:hidden => false,
|
|
36
|
+
:line_color => "#00FF00",
|
|
37
|
+
:line_thickness => 3,
|
|
38
|
+
:balloon_text => "[[title]]: [[value]] ([[percents]]%)",
|
|
39
|
+
:title => "Sessions free"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
class OracleTablespacesSizes
|
|
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
|
+
|
|
9
|
+
def self.chart_data(options = {})
|
|
10
|
+
charts = []
|
|
11
|
+
charts = self.all_tablespaces_charts(options)
|
|
12
|
+
return charts
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.all_tablespaces_charts(options)
|
|
16
|
+
charts = []
|
|
17
|
+
OracleTablespacesSizes.where(:timestamp.gte => options[:start]).
|
|
18
|
+
where(:timestamp.lt => options[:end]).
|
|
19
|
+
where(:host_id => options[:host_id]).
|
|
20
|
+
where(:plugin_id => options[:plugin_id]).
|
|
21
|
+
order(timestamp: :asc).group_by{|u| u.name}.each_pair do |tablespace, values|
|
|
22
|
+
charts << self.tablespace_chart(tablespace, values)
|
|
23
|
+
end
|
|
24
|
+
return charts
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.tablespace_chart(tablespace, values)
|
|
28
|
+
chart = self.chart_structure({:title => "Tablespace #{tablespace} space usage", :value_axis => { :title => "Size in bytes"}})
|
|
29
|
+
chart[:graph_data] = values
|
|
30
|
+
return chart
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def self.graphs
|
|
34
|
+
{
|
|
35
|
+
:used => {
|
|
36
|
+
:hidden => false,
|
|
37
|
+
:line_color => "#FF0000",
|
|
38
|
+
:line_thickness => 3,
|
|
39
|
+
:balloon_text => "[[title]]: [[value]] ([[percents]]%)",
|
|
40
|
+
:title => "Bytes used"
|
|
41
|
+
},
|
|
42
|
+
:free => {
|
|
43
|
+
:hidden => false,
|
|
44
|
+
:line_color => "#00FF00",
|
|
45
|
+
:line_thickness => 3,
|
|
46
|
+
:balloon_text => "[[title]]: [[value]] ([[percents]]%)",
|
|
47
|
+
:title => "Bytes free"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
class Temper
|
|
2
|
+
include Mongoid::Document
|
|
3
|
+
include Mongoid::Attributes::Dynamic
|
|
4
|
+
include Mongoid::Timestamps
|
|
5
|
+
include Graphs::AreaNotStackedChart
|
|
6
|
+
store_in collection: "opstat.reports"
|
|
7
|
+
field :timestamp, type: DateTime
|
|
8
|
+
|
|
9
|
+
def self.chart_data(options = {})
|
|
10
|
+
charts = []
|
|
11
|
+
charts << self.temper_chart(options)
|
|
12
|
+
return charts
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.temper_chart(options)
|
|
16
|
+
chart = self.chart_structure({:title => "Temperature in [C]", :value_axis => { :title => "Temperature"}})
|
|
17
|
+
# data = {
|
|
18
|
+
# :value_axes => [
|
|
19
|
+
# {
|
|
20
|
+
## :stack_type => 'regular',
|
|
21
|
+
# }
|
|
22
|
+
# ],
|
|
23
|
+
# }
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
#TODO - get fields from above DRY
|
|
27
|
+
chart[:graph_data] = Temper.where(:timestamp.gte => options[:start]).
|
|
28
|
+
where(:timestamp.lt => options[:end]).
|
|
29
|
+
where(:host_id => options[:host_id]).
|
|
30
|
+
where(:plugin_id => options[:plugin_id]).
|
|
31
|
+
order_by(timestamp: :asc)
|
|
32
|
+
chart
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.axes_defaults
|
|
36
|
+
{
|
|
37
|
+
:value_axis => {:title => 'Temperature in C'}
|
|
38
|
+
}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def self.graphs
|
|
42
|
+
{
|
|
43
|
+
:temperature => {
|
|
44
|
+
:value_field => "Temperature",
|
|
45
|
+
:hidden => false,
|
|
46
|
+
:line_color => "#FF0000",
|
|
47
|
+
:title => "Temperature"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
class Webobjects
|
|
2
|
+
include Mongoid::Document
|
|
3
|
+
include Mongoid::Attributes::Dynamic
|
|
4
|
+
include Mongoid::Timestamps
|
|
5
|
+
include Graphs::AreaStackedChart
|
|
6
|
+
index({timestamp: 1, host_id: 1, plugin_id: 1},{background: true})
|
|
7
|
+
store_in collection: "opstat.reports"
|
|
8
|
+
|
|
9
|
+
def self.chart_data(options = {})
|
|
10
|
+
charts = []
|
|
11
|
+
charts = self.all_applications_charts(options)
|
|
12
|
+
return charts
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.all_sensors_applications_charts(options = {})
|
|
16
|
+
charts = []
|
|
17
|
+
Webobjects.where(:timestamp.gte => options[:start]).
|
|
18
|
+
where(:timestamp.lt => options[:end]).
|
|
19
|
+
where(:plugin_type => 'webobjects').
|
|
20
|
+
order_by(timestamp: :asc).group_by{|u| u.name}.each_pair do |app, stats|
|
|
21
|
+
charts << self.application_charts(app,stats)
|
|
22
|
+
end
|
|
23
|
+
return charts.flatten
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def self.all_applications_charts(options = {})
|
|
27
|
+
charts = []
|
|
28
|
+
Webobjects.where(:timestamp.gte => options[:start]).
|
|
29
|
+
where(:timestamp.lt => options[:end])
|
|
30
|
+
where(:host_id => options[:host_id]).
|
|
31
|
+
where(:plugin_id => options[:plugin_id]).
|
|
32
|
+
order_by(timestamp: :asc).group_by{|u| u.name}.each_pair do |app, stats|
|
|
33
|
+
charts << self.application_charts(app,stats)
|
|
34
|
+
end
|
|
35
|
+
return charts.flatten
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.application_charts(app,app_stats)
|
|
39
|
+
chart = self.chart_structure({:title => "Number of sessions - #{app} application", :value_axis => { :title => "Number of sessions"}})
|
|
40
|
+
prev = nil
|
|
41
|
+
instances = Hash.new
|
|
42
|
+
app_stats.group_by {|s| s.timestamp}.each do |timestamp, stats|
|
|
43
|
+
temp = {:timestamp => timestamp}
|
|
44
|
+
stats.each do |stat|
|
|
45
|
+
#<Webobjects _id: 201, created_at: nil, updated_at: nil, name: "ifirma", host: "ifirmaapp01", port: "2201", state: "ALIVE", deaths: "0", refusingNewSessions: false, scheduled: false, schedulingHourlyStartTime: 3, schedulingDailyStartTime: 3, schedulingWeeklyStartTime: 3, schedulingType: "DAILY", schedulingStartDay: 1, schedulingInterval: 12, transactions: "284487", activeSessions: "41", averageIdlePeriod: "0.646", avgTransactionTime: "0.054", autoRecover: "true", timestamp: 2018-10-17 06:16:31 UTC, host_id: BSON::ObjectId('5bc6d3bf7327d40cb44d9ad6'), plugin_id: BSON::ObjectId('5bc6d3c07327d40cb44d9af7'), plugin_type: "webobjects"
|
|
46
|
+
instances[stat[:instance_id]] ||= true
|
|
47
|
+
temp[stat[:instance_id]] = stat[:activeSessions].to_i
|
|
48
|
+
end
|
|
49
|
+
chart[:graph_data] << temp
|
|
50
|
+
end
|
|
51
|
+
instances.keys.each do |graph|
|
|
52
|
+
chart[:graphs] << { :value_axis => 'valueAxis1', :value_field => graph, :balloon_text => "[[title]]: ([[value]])", :line_thickness => 1, :line_alpha => 1, :fill_alphas => 0.1, :graph_type => 'line' }
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# tps = self.tps_graph(app)
|
|
56
|
+
# instances.keys.each do |graph|
|
|
57
|
+
# tps[:graphs] << { :value_axis => 'valueAxis1', :value_field => graph.to_s, :balloon_text => "[[title]]: ([[value]])", :line_thickness => 1, :line_alpha => 1, :fill_alphas => 0.1, :graph_type => 'line' }
|
|
58
|
+
# end
|
|
59
|
+
|
|
60
|
+
# sessions = sessions_graph(app)
|
|
61
|
+
# instances.keys.each do |graph|
|
|
62
|
+
# sessions[:graphs] << { :value_axis => 'valueAxis1', :value_field => graph, :balloon_text => "[[title]]: ([[value]])", :line_thickness => 1, :line_alpha => 1, :fill_alphas => 0.1, :graph_type => 'line' }
|
|
63
|
+
# end
|
|
64
|
+
# sessions[:graph_data] = chart_data[:sessions]
|
|
65
|
+
# tps[:graph_data] = chart_data[:tps]
|
|
66
|
+
# chart[:graph_data] = chart_data[:sessions]
|
|
67
|
+
p chart
|
|
68
|
+
return chart
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def self.tps_graph(app)
|
|
72
|
+
return self.chart_structure({:title => "Transactions per second - #{app} application", :value_axis => { :title => "Transactions/sec"}})
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def self.graphs
|
|
76
|
+
{
|
|
77
|
+
:sessions => { :line_color => '#0033FF' },
|
|
78
|
+
}
|
|
79
|
+
end
|
|
80
|
+
def self.sessions_graph(app)
|
|
81
|
+
return self.chart_structure({:title => "Number of sessions - #{app} application", :value_axis => { :title => "Number of sessions"}})
|
|
82
|
+
end
|
|
83
|
+
end
|