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,36 @@
|
|
1
|
+
module Opstat
|
2
|
+
module Parsers
|
3
|
+
class HpPdu
|
4
|
+
include Opstat::Logging
|
5
|
+
|
6
|
+
def snmp_ids
|
7
|
+
@snmp_ids ||= YAML::load_file("#{File.dirname(File.expand_path(__FILE__))}/../data/hp_pdu.yml")
|
8
|
+
@snmp_ids
|
9
|
+
end
|
10
|
+
|
11
|
+
def parse_data(data:, time:)
|
12
|
+
return if data.nil? #TODO EVENT IN db
|
13
|
+
temp = {}
|
14
|
+
begin
|
15
|
+
ids = data.split("\n")
|
16
|
+
ids.each do |id|
|
17
|
+
k, v = id.split(' = ')
|
18
|
+
if self.snmp_ids.has_key?(k)
|
19
|
+
props = snmp_ids[k]
|
20
|
+
temp_key = "#{props[:meter_type]}#{props[:pdu]}"
|
21
|
+
temp[temp_key] ||= {:meter_type => props[:meter_type], :pdu => props[:pdu]}
|
22
|
+
temp[temp_key][props[:store_key]] = v.split(': ')[-1].to_i
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
rescue
|
27
|
+
#TODO find best way to deal with that kind of problems
|
28
|
+
#TODO check if timestamp > prev
|
29
|
+
return
|
30
|
+
end
|
31
|
+
reports = temp.values
|
32
|
+
return reports
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/parsers/jvm.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
module Opstat
|
2
|
+
module Parsers
|
3
|
+
class Jvm
|
4
|
+
include Opstat::Logging
|
5
|
+
|
6
|
+
def parse_data(data:, time:)
|
7
|
+
return if data.nil? #TODO EVENT IN db
|
8
|
+
|
9
|
+
begin
|
10
|
+
data.split("\n").each do |line|
|
11
|
+
oplogger.debug "parsing line #{line}"
|
12
|
+
end
|
13
|
+
rescue
|
14
|
+
#TODO find best way to deal with that kind of problems
|
15
|
+
#TODO check if timestamp > prev
|
16
|
+
return
|
17
|
+
end
|
18
|
+
return report
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/parsers/load.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Opstat
|
2
|
+
module Parsers
|
3
|
+
class Load
|
4
|
+
include Opstat::Logging
|
5
|
+
|
6
|
+
def parse_data(data:, time:)
|
7
|
+
data.find{|a| a =~ /^(?<load_1m>\S+)\s+(?<load_5m>\S+)\s+(?<load_15m>\S+)\s+(?<threads_running>\d+)\/(?<threads>\d+).*/}
|
8
|
+
return [] if $~.nil?
|
9
|
+
# TODO add some alert to system - bad input data
|
10
|
+
return [{
|
11
|
+
:load_1m => $~[:load_1m].to_f,
|
12
|
+
:load_5m => $~[:load_5m].to_f,
|
13
|
+
:load_15m => $~[:load_15m].to_f,
|
14
|
+
:threads_running => $~[:threads_running].to_i,
|
15
|
+
:threads => $~[:threads].to_i
|
16
|
+
}]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Opstat
|
4
|
+
module Parsers
|
5
|
+
class Memory
|
6
|
+
include Opstat::Logging
|
7
|
+
|
8
|
+
def parse_data(data:, time:)
|
9
|
+
memory = YAML::load(data.join)
|
10
|
+
oplogger.debug memory
|
11
|
+
begin
|
12
|
+
return [{
|
13
|
+
:total => memory["MemTotal"].split[0].to_i,
|
14
|
+
:free => memory["MemFree"].split[0].to_i,
|
15
|
+
:used => memory["MemTotal"].split[0].to_i - memory["MemFree"].split[0].to_i - (memory["Buffers"].to_i + memory["Cached"].split[0].to_i + memory["SReclaimable"].split[0].to_i - memory["Shmem"].split[0].to_i),
|
16
|
+
:cached => memory["Cached"].split[0].to_i + memory["SReclaimable"].split[0].to_i - memory["Shmem"].split[0].to_i,
|
17
|
+
:buffers => memory["Buffers"].split[0].to_i,
|
18
|
+
:swap_total => memory["SwapTotal"].split[0].to_i,
|
19
|
+
:swap_free => memory["SwapFree"].split[0].to_i,
|
20
|
+
:swap_used => memory["SwapTotal"].split[0].to_i - memory["SwapFree"].split[0].to_i
|
21
|
+
}]
|
22
|
+
rescue Exception => e
|
23
|
+
return []
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Opstat
|
2
|
+
module Parsers
|
3
|
+
class Nagios
|
4
|
+
include Opstat::Logging
|
5
|
+
|
6
|
+
def parse_data(data:, time:)
|
7
|
+
report = {}
|
8
|
+
begin
|
9
|
+
data.compact.each do |elem|
|
10
|
+
v = elem.strip.split(':')
|
11
|
+
next if v.length == 0
|
12
|
+
next if v.count != 2
|
13
|
+
key = v[0].strip
|
14
|
+
val = v[1].strip
|
15
|
+
report[key] = val
|
16
|
+
end
|
17
|
+
rescue
|
18
|
+
#TODO add errors to gui - bad data
|
19
|
+
return
|
20
|
+
end
|
21
|
+
report["Hosts Up"], report["Hosts Down"], report["Hosts Unreachable"] = report["Hosts Up/Down/Unreach"].split('/')
|
22
|
+
report["Services Ok"], report["Services Warning"], report["Services Unknown"], report["Services Critical"] = report["Services Ok/Warn/Unk/Crit"].split('/')
|
23
|
+
return [{
|
24
|
+
:services_total => report["Total Services"],
|
25
|
+
:hosts_total => report["Total Hosts"],
|
26
|
+
:services_checked => report["Services Checked"],
|
27
|
+
:hosts_checked => report["Hosts Checked"],
|
28
|
+
:services_ok => report["Services Ok"],
|
29
|
+
:services_warning => report["Services Warning"],
|
30
|
+
:services_critical => report["Services Critical"],
|
31
|
+
:services_unknown => report["Services Unknown"],
|
32
|
+
:hosts_up => report["Hosts Up"],
|
33
|
+
:hosts_down => report["Hosts Down"],
|
34
|
+
:hosts_unreachable => report ["Hosts Unreachable"]
|
35
|
+
}]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Opstat
|
2
|
+
module Parsers
|
3
|
+
class Network
|
4
|
+
include Opstat::Logging
|
5
|
+
|
6
|
+
def parse_data(data:, time:)
|
7
|
+
reports = []
|
8
|
+
interfaces_stats = data[2..-1].map{|u| u.lstrip}.join.split("\n")
|
9
|
+
interfaces_stats.each do |interface_stat|
|
10
|
+
interface, values = interface_stat.split(':')
|
11
|
+
next if values.nil?
|
12
|
+
v = values.split
|
13
|
+
reports << {
|
14
|
+
:OPSTAT_TAG_interface => interface,
|
15
|
+
:bytes_receive => v[0].to_i,
|
16
|
+
:packets_receive => v[1].to_i,
|
17
|
+
:errors_receive => v[2].to_i,
|
18
|
+
:drop_receive => v[3].to_i,
|
19
|
+
:fifo_receive => v[4].to_i,
|
20
|
+
:frame_receive => v[5].to_i,
|
21
|
+
:compressed_receive => v[6].to_i,
|
22
|
+
:multicast_receive => v[7].to_i,
|
23
|
+
:bytes_transmit => v[8].to_i,
|
24
|
+
:packets_transmit => v[9].to_i,
|
25
|
+
:errors_transmit => v[10].to_i,
|
26
|
+
:drop_transmit => v[11].to_i,
|
27
|
+
:fifo_transmit => v[12].to_i,
|
28
|
+
:frame_transmit => v[13].to_i,
|
29
|
+
:compressed_transmit => v[14].to_i,
|
30
|
+
:multicast_transmit => v[15].to_i
|
31
|
+
}
|
32
|
+
end
|
33
|
+
return reports
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Opstat
|
2
|
+
module Parsers
|
3
|
+
class OracleFrasSizes
|
4
|
+
include Opstat::Logging
|
5
|
+
|
6
|
+
#TODO - somehow check plugins version
|
7
|
+
def parse_data(data:, time:)
|
8
|
+
reports = []
|
9
|
+
data.split("\n")[3..-1].each do |line|
|
10
|
+
tablespace = line.split(/\s+/).delete_if{|t| t.empty?}
|
11
|
+
total = tablespace[1].to_i
|
12
|
+
used = tablespace[2].to_i
|
13
|
+
free = total - used
|
14
|
+
reports << {
|
15
|
+
:OPSTAT_TAG_path => tablespace[0],
|
16
|
+
:free => free,
|
17
|
+
:used => used,
|
18
|
+
:files => tablespace[3].to_i
|
19
|
+
}
|
20
|
+
end
|
21
|
+
return reports
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Opstat
|
2
|
+
module Parsers
|
3
|
+
class OracleSessions
|
4
|
+
include Opstat::Logging
|
5
|
+
|
6
|
+
#TODO - somehow check plugins version
|
7
|
+
def parse_data(data:, time:)
|
8
|
+
reports = []
|
9
|
+
data.split("\n")[3..-1].each do |line|
|
10
|
+
tablespace = line.split(/\s+/).delete_if{|t| t.empty?}
|
11
|
+
reports << {
|
12
|
+
:used => tablespace[0].to_i,
|
13
|
+
:free => tablespace[1].to_i
|
14
|
+
}
|
15
|
+
end
|
16
|
+
return reports
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Opstat
|
2
|
+
module Parsers
|
3
|
+
class OracleTablespacesSizes
|
4
|
+
include Opstat::Logging
|
5
|
+
|
6
|
+
#TODO - somehow check plugins version
|
7
|
+
def parse_data(data:, time:)
|
8
|
+
reports = []
|
9
|
+
data.split("\n")[3..-3].each do |line|
|
10
|
+
tablespace = line.split(/\s+/).delete_if{|t| t.empty?}
|
11
|
+
reports << {
|
12
|
+
:OPSTAT_TAG_tablespace => tablespace[0],
|
13
|
+
:total => tablespace[1].to_i,
|
14
|
+
:used => tablespace[2].to_i,
|
15
|
+
:free => tablespace[3].to_i
|
16
|
+
}
|
17
|
+
end
|
18
|
+
return reports
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Opstat
|
2
|
+
module Parsers
|
3
|
+
require 'json'
|
4
|
+
class Temper
|
5
|
+
include Opstat::Logging
|
6
|
+
|
7
|
+
def parse_data(data:, time:)
|
8
|
+
#TODO - mesg when empty
|
9
|
+
temperature = data.split(',')[1].to_f
|
10
|
+
temperature = JSON::parse(data)["temperature_celsius"]
|
11
|
+
return [{
|
12
|
+
:temperature => temperature
|
13
|
+
}]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Opstat
|
4
|
+
module Parsers
|
5
|
+
class Webobjects
|
6
|
+
include Opstat::Logging
|
7
|
+
|
8
|
+
def parse_data(data:, time:)
|
9
|
+
return if data.length == 0
|
10
|
+
reports = []
|
11
|
+
prepared_data = data.gsub('"id"','"instance_id"')
|
12
|
+
webobjects_json_stats = JSON::parse(prepared_data)
|
13
|
+
webobjects_json_stats.select{|s| s['state'] == 'ALIVE'}.each do |instance_stats|
|
14
|
+
webobjects_stats = {
|
15
|
+
'active_sessions': instance_stats['activeSessions'].to_i,
|
16
|
+
'transactions': instance_stats['transactions'].to_i,
|
17
|
+
'average_idle_period': instance_stats['averageIdlePeriod'].to_f,
|
18
|
+
'average_transaction_time': instance_stats['avgTransactionTime'].to_f,
|
19
|
+
'deaths': instance_stats['deaths'].to_i,
|
20
|
+
'refusing_new_sessions': instance_stats['refusingNewSessions'],
|
21
|
+
'auto_recover': instance_stats['autoRecover'].downcase == 'true',
|
22
|
+
'OPSTAT_TAG_wo_instance_id': instance_stats['instance_id'],
|
23
|
+
'OPSTAT_TAG_wo_host': instance_stats['host'],
|
24
|
+
'OPSTAT_TAG_wo_app': instance_stats['name']
|
25
|
+
}
|
26
|
+
reports << webobjects_stats
|
27
|
+
end
|
28
|
+
return reports
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
data/lib/parsers/xen.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
module Opstat
|
2
|
+
module Parsers
|
3
|
+
class Xen
|
4
|
+
include Opstat::Logging
|
5
|
+
|
6
|
+
def parse_data(data:, time:)
|
7
|
+
return if data.nil?
|
8
|
+
domains = []
|
9
|
+
|
10
|
+
begin
|
11
|
+
data.split("\n")[1..-1].each do |line|
|
12
|
+
oplogger.debug "parsing line #{line}"
|
13
|
+
domain = {}
|
14
|
+
stats = line.split
|
15
|
+
|
16
|
+
domain['domain'] = stats[0]
|
17
|
+
domain['cpu'] = stats[3].to_i
|
18
|
+
domain['memory'] = stats[4].to_i
|
19
|
+
domain['memory_max'] = stats[6].to_i
|
20
|
+
domain['nettx'] = stats[10].to_i
|
21
|
+
domain['netrx'] = stats[11].to_i
|
22
|
+
domain['vbd_oo'] = stats[13].to_i
|
23
|
+
domain['vbd_rd'] = stats[14].to_i
|
24
|
+
domain['vbd_wr'] = stats[15].to_i
|
25
|
+
domain['vbd_rsect'] = stats[16].to_i
|
26
|
+
domain['vbd_wsect'] = stats[17].to_i
|
27
|
+
domains << domain
|
28
|
+
end
|
29
|
+
rescue
|
30
|
+
#TODO find best way to deal with that kind of problems
|
31
|
+
#TODO check if timestamp > prev
|
32
|
+
return
|
33
|
+
end
|
34
|
+
#TODO batch import?
|
35
|
+
return domains
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Opstat
|
2
|
+
module Plugins
|
3
|
+
|
4
|
+
class Apache2 < Task
|
5
|
+
|
6
|
+
def initialize (name, queue, config)
|
7
|
+
super(name, queue, config)
|
8
|
+
self
|
9
|
+
end
|
10
|
+
|
11
|
+
def parse
|
12
|
+
return @external_plugin[:object].get
|
13
|
+
end
|
14
|
+
|
15
|
+
def set_external_plugin=(external)
|
16
|
+
@external_plugin[:object] = external
|
17
|
+
end
|
18
|
+
|
19
|
+
def external_plugin
|
20
|
+
return @external_plugin
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
module UDPExternalPlugins
|
25
|
+
class Apache2 < EventMachine::Connection
|
26
|
+
include Logging
|
27
|
+
def initialize(options)
|
28
|
+
@log_level = options['log_level'] if options.has_key?('log_level')
|
29
|
+
oplogger.info "Create external plugin"
|
30
|
+
oplogger.debug "External plugin options :#{options}"
|
31
|
+
require 'json'
|
32
|
+
require 'apachelogregex'
|
33
|
+
@log_format = options['log_format']
|
34
|
+
@log_format ||= '%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O'
|
35
|
+
@stat = Hash.new
|
36
|
+
@parser = ApacheLogRegex.new(@log_format)
|
37
|
+
end
|
38
|
+
def post_init
|
39
|
+
oplogger.debug "someone connected!"
|
40
|
+
end
|
41
|
+
|
42
|
+
#TODO - something with parse everty line - skips some correct lines
|
43
|
+
def receive_data data
|
44
|
+
oplogger.debug data
|
45
|
+
line = data.split(': ')[1]
|
46
|
+
parse(line)
|
47
|
+
end
|
48
|
+
|
49
|
+
def unbind
|
50
|
+
oplogger.debug "someone disconnected!"
|
51
|
+
end
|
52
|
+
|
53
|
+
def parse(line)
|
54
|
+
data = @parser.parse(line)
|
55
|
+
if data
|
56
|
+
oplogger.debug data
|
57
|
+
@stat[data['%v'] ] ||= Hash.new
|
58
|
+
@stat[data['%v'] ] [data['%>s']] ||= Hash.new
|
59
|
+
@stat[data['%v'] ] [data['%>s']] [:requests] ||= 0
|
60
|
+
@stat[data['%v'] ] [data['%>s']] [:requests] += 1
|
61
|
+
@stat[data['%v'] ] [data['%>s']] [:bytes_sent] ||= 0
|
62
|
+
@stat[data['%v'] ] [data['%>s']] [:bytes_sent] += data['%O'].to_i
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def get
|
67
|
+
@stat.to_json
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
#TO CHECK - port not used
|
75
|
+
# apache log format configured, apache logger configured
|
76
|
+
# TODO apachelogregex - installed?
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Opstat
|
2
|
+
module Plugins
|
3
|
+
class Bsdnet < Task
|
4
|
+
def parse
|
5
|
+
io = IO.popen("pfctl -sinfo")
|
6
|
+
report = io.readlines
|
7
|
+
io.close
|
8
|
+
return report
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
#TODO check if stats are activated - set logininterfacep works only for one interface
|
data/lib/plugins/cpu.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
|
3
|
+
module Opstat
|
4
|
+
module Plugins
|
5
|
+
class CustomSqlStatement < Task
|
6
|
+
|
7
|
+
def initialize (name, queue, config)
|
8
|
+
super(name, queue, config)
|
9
|
+
self
|
10
|
+
@db_config = config['db_config']
|
11
|
+
@query - config['sql_query']
|
12
|
+
ActiveRecord::Base.establish_connection @dbconfig
|
13
|
+
end
|
14
|
+
|
15
|
+
def parse
|
16
|
+
report = ActiveRecord::Base.connection.execute(@query)
|
17
|
+
return report
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
#need:
|
24
|
+
#activerecord gem
|
data/lib/plugins/disk.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
module Opstat
|
2
|
+
module Plugins
|
3
|
+
class Disk < Task
|
4
|
+
DISK_IO_STATS_FILE = "/proc/diskstats"
|
5
|
+
|
6
|
+
def initialize (name, queue, config)
|
7
|
+
super(name, queue, config)
|
8
|
+
self
|
9
|
+
end
|
10
|
+
|
11
|
+
#TODO in memory module io.close
|
12
|
+
def parse
|
13
|
+
@count_number += 1
|
14
|
+
report = {}
|
15
|
+
report['disk_space'] = space_usage
|
16
|
+
report['disk_io'] = disk_io_usage
|
17
|
+
return report
|
18
|
+
end
|
19
|
+
def space_usage
|
20
|
+
io = IO.popen('df --output=source,fstype,used,avail,itotal,iused,iavail,target|sed "s#/dev/root#/dev/$(readlink /dev/root)#"')
|
21
|
+
stats = io.readlines
|
22
|
+
io.close
|
23
|
+
return stats
|
24
|
+
end
|
25
|
+
def disk_io_usage
|
26
|
+
stats = File.open(DISK_IO_STATS_FILE).readlines
|
27
|
+
return stats
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
#set default FACTERDIR - omit libfacter not found on some systems
|
2
|
+
facter_paths = ['/usr','/usr/lib']
|
3
|
+
facter_paths << ENV['FACTERDIR'] unless ENV['FACTERDIR'].nil?
|
4
|
+
begin
|
5
|
+
facter_path = facter_paths.pop
|
6
|
+
ENV['FACTERDIR'] = facter_path
|
7
|
+
puts "Try to load facter lib with FACTERDIR path set to #{facter_path}"
|
8
|
+
require 'facter'
|
9
|
+
rescue LoadError => e
|
10
|
+
retry if facter_paths.count > 0
|
11
|
+
raise e
|
12
|
+
end
|
13
|
+
|
14
|
+
module Opstat
|
15
|
+
module Plugins
|
16
|
+
class Facts < Task
|
17
|
+
|
18
|
+
def initialize (name, queue, config)
|
19
|
+
super(name, queue, config)
|
20
|
+
self
|
21
|
+
end
|
22
|
+
|
23
|
+
#TODO in memory module io.close
|
24
|
+
def parse
|
25
|
+
@count_number += 1
|
26
|
+
return ::Facter.to_hash
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/plugins/fpm.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
module Opstat
|
2
|
+
module Plugins
|
3
|
+
class Fpm < Task
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
def initialize (name, queue, config)
|
7
|
+
super(name, queue, config)
|
8
|
+
@pools = config['pools']
|
9
|
+
self
|
10
|
+
end
|
11
|
+
|
12
|
+
def parse
|
13
|
+
report = []
|
14
|
+
@pools.each_pair do |pool,options|
|
15
|
+
oplogger.debug "getting #{pool} statistics"
|
16
|
+
env = {"REQUEST_METHOD" => options['request_method'], "SCRIPT_NAME" => options['status_url'], "SCRIPT_FILENAME" => options['status_url'], "QUERY_STRING" => 'json'}
|
17
|
+
oplogger.debug "cgi-fcgi environment: #{env.inspect}"
|
18
|
+
fpmIO = IO.popen([env, 'cgi-fcgi','-bind','-connect',options['fcgi_socket'] ])
|
19
|
+
pool_report = fpmIO.readlines
|
20
|
+
oplogger.debug "#{pool} statistics: #{pool_report}"
|
21
|
+
report << pool_report
|
22
|
+
fpmIO.close
|
23
|
+
end
|
24
|
+
return report
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
#TO CHECK -cgi-fcgi installed
|
31
|
+
#- pm.status_path property set in pool configuration
|
32
|
+
|
33
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'xmlhasher'
|
2
|
+
|
3
|
+
module Opstat
|
4
|
+
module Plugins
|
5
|
+
class FreeswitchFifos < Task
|
6
|
+
def initialize (name, queue, config)
|
7
|
+
merged_config = default_config.merge(config)
|
8
|
+
super(name, queue, merged_config)
|
9
|
+
@fifo_report_cmd = merged_config['fifo_report_cmd']
|
10
|
+
self
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse
|
14
|
+
@count_number += 1
|
15
|
+
report = `#{@fifo_report_cmd}`
|
16
|
+
return report
|
17
|
+
end
|
18
|
+
|
19
|
+
def default_config
|
20
|
+
{
|
21
|
+
'fifo_report_cmd' => 'fs_cli -x \'fifo list\''
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
module Opstat
|
3
|
+
module Plugins
|
4
|
+
|
5
|
+
class Haproxy < Task
|
6
|
+
def initialize (name, queue, config)
|
7
|
+
super(name, queue, config)
|
8
|
+
@haproxy_url = "#{config['url']}/;up/stats;csv;norefresh'"
|
9
|
+
self
|
10
|
+
end
|
11
|
+
def parse
|
12
|
+
report = []
|
13
|
+
begin
|
14
|
+
source = open(@haproxy_url,open_timeout: 1, read_timeout: 1).each do |line|
|
15
|
+
report << line
|
16
|
+
end
|
17
|
+
rescue
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
return report
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'socket'
|
2
|
+
|
3
|
+
module Opstat
|
4
|
+
module Plugins
|
5
|
+
|
6
|
+
class HaproxyTables < Task
|
7
|
+
def initialize (name, queue, config)
|
8
|
+
super(name, queue, config)
|
9
|
+
@haproxy_socket = config['socket']
|
10
|
+
raise ArgumentError, "Socket #{path} doesn't exists or is not a UNIX socket" unless File.exists?(@haproxy_socket) and File.socket?(@haproxy_socket)
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
def parse
|
15
|
+
report = []
|
16
|
+
begin
|
17
|
+
UNIXSocket.open(@haproxy_socket) do |socket|
|
18
|
+
socket.puts('show table')
|
19
|
+
report = socket.readlines
|
20
|
+
end
|
21
|
+
rescue
|
22
|
+
nil
|
23
|
+
end
|
24
|
+
return report
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
module Opstat
|
3
|
+
module Plugins
|
4
|
+
class HpPdu < Task
|
5
|
+
def initialize (name, queue, config)
|
6
|
+
super(name, queue, config)
|
7
|
+
@snmp_host = config['snmp_host']
|
8
|
+
@snmp_port = config['snmp_port']
|
9
|
+
pwd = File.dirname(File.expand_path(__FILE__))
|
10
|
+
snmp_ids = YAML::load_file("#{pwd}/../data/hp_pdu.yml").keys.join(' ')
|
11
|
+
@snmp_cmd = "snmpget -c public -v2c #{@snmp_host}:#{@snmp_port} #{snmp_ids}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def parse
|
15
|
+
snmpIO = IO.popen(@snmp_cmd)
|
16
|
+
report = snmpIO.readlines.join
|
17
|
+
snmpIO.close
|
18
|
+
return report
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
#for test
|
27
|
+
# check snmp is installed
|
28
|
+
# check port is open - snmp is accessible
|