sensu-plugins-oracle 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e05bc65c5bf93831644ccdebae43ecc27f7a35ab
4
- data.tar.gz: 853e25216e18f24f0ec94d2c357f805dcfc1e228
3
+ metadata.gz: 3870e038023cfb7baa04fdaeb18d24e1cf5d620a
4
+ data.tar.gz: 374295249f2a24d15736fcfbf6c70b791b0ef8ac
5
5
  SHA512:
6
- metadata.gz: 95dbd868e884e2aa3692de4a8d8d37320f946c5b2b2fd62fd57745307653ba555d3d5a8dc082111a3182e9c74193c7cc5dd505440575cb8f2f5499451c8682a2
7
- data.tar.gz: 6e26c529fb09bb2c330d09155011b393e7327b12b4de2d2844d001dfc2ad25cd807490f886fbe77920ad0ed9b721bd7be4032e9c23546e989029bac770ff939a
6
+ metadata.gz: 4f40c0f3d54c7d5d007c10ae1783d0f6c67cdc0ad11b930b9bacf6216a7220303031cbc5575a0c686f049a5e1d449ff572975d9b29167e1216bc9eb929277bf6
7
+ data.tar.gz: bbffaeac68eef29e2da04fcbf82d1a81f05b8869beb7c02ee5feaae5e88a857843049d63f59d964934d01de65c4fbb33cd7c8146a121f86e4584e035c98f2d08
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 0.1.0 - 2016-08-04
2
+ ### Added
3
+ - first version which is able to check a single or multiple oracle connections
4
+
1
5
  ## 0.0.1 - 2016-08-03
2
6
  ### Added
3
7
  - initial release based on sensu-plugins-postgres (https://github.com/sensu-plugins/sensu-plugins-postgres)
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
1
 
2
+ [![Gem Version](https://badge.fury.io/rb/sensu-plugins-oracle.svg)](https://badge.fury.io/rb/sensu-plugins-oracle)
2
3
  [![Code Climate](https://codeclimate.com/github/thomis/sensu-plugins-oracle/badges/gpa.svg)](https://codeclimate.com/github/thomis/sensu-plugins-oracle)
3
4
  [![Dependency Status](https://gemnasium.com/badges/github.com/thomis/sensu-plugins-oracle.svg)](https://gemnasium.com/github.com/thomis/sensu-plugins-oracle)
4
5
 
@@ -7,25 +8,37 @@
7
8
  This sensu plugin provides native Oracle instrumentation.
8
9
 
9
10
  ## Files
10
- * bin/check-oracle-alive.rb
11
+ * bin/check-oracle-alive.rb
12
+ * bin/check-oracle-query.rb
11
13
 
12
14
  ## Usage
13
15
 
14
16
  ```
17
+ -- check a single connection
15
18
  check-oracle-alive.rb -u scott -p tiger -d hr
16
19
 
17
- check-oracle-alive.rb -u scott -p tiger -d ht -T 30
20
+ -- check a single connection with timeout
21
+ check-oracle-alive.rb -u scott -p tiger -d hr -T 30
18
22
  ```
19
23
 
20
24
  ```
25
+ -- check multiple connections as defined in a file
21
26
  check-oracle-alive.rb -f connections.csv
22
27
 
23
28
  > cat connections.csv
24
- # production connection
25
- example_connection_1,scott/tiger@hr
29
+ # production connection
30
+ example_connection_1,scott/tiger@hr
26
31
 
27
- # test connection
28
- example_connection_2,scott/tiger@hr_test
32
+ # test connection
33
+ example_connection_2,scott/tiger@hr_test
34
+ ```
35
+
36
+ ```
37
+ -- check for invalid objects in a schema, show type and name if there are invalid objects (-s), define a ciritical boundary only (-c)
38
+ check-oracle-query.rb -u scott -p tiger -d hr -t -s -query "select object_type, object_name from user_objects where status = 'INVALID'" -c 'value > 0'
39
+
40
+ -- same as above but check for all connections in a file
41
+ check-oracle-query.rb -f connections.csv -t -s -query "select object_type, object_name from user_objects where status = 'INVALID'" -c 'value > 0'
29
42
 
30
43
  ```
31
44
 
@@ -17,7 +17,7 @@
17
17
  # gem: ruby-oci8
18
18
  #
19
19
  # USAGE:
20
- # ./check-oracle-alive.rb -u db_user -p db_pass -h db_host -d db
20
+ # ./check-oracle-alive.rb -u USERNAME -p PASSWORD -d DATABASE -P PRIVILEGE -T TIMEOUT -f FILE
21
21
  #
22
22
  # NOTES:
23
23
  #
@@ -30,7 +30,7 @@
30
30
  require 'sensu-plugins-oracle'
31
31
  require 'sensu-plugin/check/cli'
32
32
 
33
- class CheckOracle < Sensu::Plugin::Check::CLI
33
+ class CheckOracleAlive < Sensu::Plugin::Check::CLI
34
34
  option :username,
35
35
  description: 'Oracle Username',
36
36
  short: '-u USERNAME',
@@ -0,0 +1,184 @@
1
+ #! /usr/bin/env ruby
2
+ #
3
+ # check-oracle-alive
4
+ #
5
+ # DESCRIPTION:
6
+ #
7
+ # This plugin attempts to login to oracle with provided credentials.
8
+ #
9
+ # OUTPUT:
10
+ # plain text
11
+ #
12
+ # PLATFORMS:
13
+ # Linux
14
+ #
15
+ # DEPENDENCIES:
16
+ # gem: sensu-plugin
17
+ # gem: ruby-oci8
18
+ #
19
+ # USAGE:
20
+ # ./check-oracle-alive.rb -u USERNAME -p PASSWORD -d DATABASE -P PRIVILEGE -T TIMEOUT -f FILE -q 'select foo from bar' -w 'value > 5' -c 'value > 10'
21
+ #
22
+ # NOTES:
23
+ #
24
+ # LICENSE:
25
+ # Copyright (c) 2016 Thomas Steiner
26
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
27
+ # for details.
28
+ #
29
+
30
+ require 'sensu-plugins-oracle'
31
+ require 'sensu-plugin/check/cli'
32
+
33
+ # Check Oracle Query
34
+ class CheckOracleQuery < Sensu::Plugin::Check::CLI
35
+ option :username,
36
+ description: 'Oracle Username',
37
+ short: '-u USERNAME',
38
+ long: '--username USERNAME'
39
+
40
+ option :password,
41
+ description: 'Oracle Password',
42
+ short: '-p PASSWORD',
43
+ long: '--password PASSWORD'
44
+
45
+ option :database,
46
+ description: 'Database schema to connect to',
47
+ short: '-d DATABASE',
48
+ long: '--database DATABASE'
49
+
50
+ option :privilege,
51
+ description: 'Connect to Oracle database by optional priviledge (SYSDBA, SYSOPER, SYSASM, , SYSDG or SYSKM)',
52
+ short: '-P PRIVILEGE',
53
+ long: '--privilege PRIVILEGE'
54
+
55
+ option :timeout,
56
+ description: 'Connection timeout (seconds)',
57
+ short: '-T TIMEOUT',
58
+ long: '--timeout TIMEOUT'
59
+
60
+ option :file,
61
+ description: 'File with connection strings to check',
62
+ short: '-f FILE',
63
+ long: '--file FILE'
64
+
65
+ option :query,
66
+ description: 'Database query to execute',
67
+ short: '-q QUERY',
68
+ long: '--query QUERY',
69
+ required: true
70
+
71
+ option :warning,
72
+ description: 'Warning threshold expression',
73
+ short: '-w WARNING',
74
+ long: '--warning WARNING',
75
+ default: nil
76
+
77
+ option :critical,
78
+ description: 'Critical threshold expression',
79
+ short: '-c CRITICAL',
80
+ long: '--critical CRITICAL',
81
+ default: nil
82
+
83
+ option :tuples,
84
+ description: 'Count the number of tuples (rows) returned by the query',
85
+ short: '-t',
86
+ long: '--tuples',
87
+ boolean: true,
88
+ default: false
89
+
90
+ option :show,
91
+ description: 'Show result records',
92
+ short: '-s',
93
+ long: '--show',
94
+ boolean: true,
95
+ default: false
96
+
97
+ def run
98
+ # handle OCI8 properties
99
+ OCI8.properties[:connect_timeout] = config[:timeout].to_i if config[:timeout]
100
+
101
+ if config[:file]
102
+ handle_connections_from_file
103
+ else
104
+ handle_connection
105
+ end
106
+ end
107
+
108
+ private
109
+
110
+ def handle_connection
111
+ session = SensuPluginsOracle::Session.new(
112
+ username: config[:username],
113
+ password: config[:password],
114
+ database: config[:database],
115
+ privilege: config[:privilege])
116
+
117
+ if session.query(config[:query].to_s)
118
+ method, message = session.handle_query_result(config)
119
+ self.send(method, message)
120
+ else
121
+ # issue with the query
122
+ critical session.error_message
123
+ end
124
+ end
125
+
126
+ def handle_connections_from_file
127
+ sessions = ::SensuPluginsOracle::Session.parse_from_file(config[:file])
128
+
129
+ sessions_total = sessions.size
130
+ results = Hash.new { |h, key| h[key] = [] }
131
+
132
+ thread_group = ThreadGroup.new
133
+ mutex = Mutex.new
134
+
135
+ sessions.each do |session|
136
+ thread_group.add Thread.new {
137
+
138
+ if session.query(config[:query].to_s)
139
+ method, message = session.handle_query_result(config)
140
+ mutex.synchronize do
141
+ results[method] << message
142
+ end
143
+ else
144
+ mutex.synchronize do
145
+ results[:critical] << session.error_message
146
+ end
147
+ end
148
+
149
+ }
150
+ end
151
+ thread_group.list.map(&:join)
152
+
153
+ # return summary plus warning and critical messages
154
+ sessions_ok = results[:ok].size
155
+
156
+ # default values
157
+ method = :ok
158
+ header = ["Total: #{sessions.size}"]
159
+ header << "Ok: #{results[:ok].size}" if results[:ok].size > 0
160
+ header << "Warning: #{results[:warning].size}" if results[:warning].size > 0
161
+ header << "Critical: #{results[:critical].size}" if results[:critical].size > 0
162
+
163
+ messages = [header.join(', ')]
164
+
165
+ if results[:warning].size > 0
166
+ method = :warning
167
+ messages << nil
168
+ messages << 'WARNING'
169
+ messages << results[:warning].compact.sort.join("\n\n")
170
+ end
171
+
172
+ if results[:critical].size > 0
173
+ method = :critical
174
+ messages << nil
175
+ messages << 'CRITICAL'
176
+ messages << results[:critical].compact.sort.join("\n\n")
177
+ end
178
+
179
+ send(method, messages.join("\n"))
180
+ rescue => e
181
+ unknown e.to_s
182
+ end
183
+
184
+ end
@@ -1,3 +1,5 @@
1
+ require 'dentaku'
2
+
1
3
  module SensuPluginsOracle
2
4
  class Session
3
5
 
@@ -7,11 +9,14 @@ module SensuPluginsOracle
7
9
 
8
10
  attr_reader :server_version
9
11
 
12
+ attr_accessor :rows
13
+
10
14
  PRIVILEDGES = [:SYSDBA, :SYSOPER, :SYSASM, :SYSBACKUP, :SYSDG, :SYSKM]
11
15
 
12
16
  def initialize(args)
13
17
  @name = args[:name]
14
18
  @error_message = nil
19
+ @rows = []
15
20
 
16
21
  @connect_string = args[:connect_string]
17
22
 
@@ -19,6 +24,8 @@ module SensuPluginsOracle
19
24
  @password = args[:password]
20
25
  @database = args[:database]
21
26
  @priviledge = args[:priviledge].upcase.to_sym if args[:priviledge] && PRIVILEDGES.include?(args[:priviledge].upcase.to_sym)
27
+
28
+ @provide_name_in_result = args[:provide_name_in_result] || false
22
29
  end
23
30
 
24
31
  def self.parse_from_file(file)
@@ -29,7 +36,7 @@ module SensuPluginsOracle
29
36
  line.strip!
30
37
  next if line.size == 0 || line =~ /^#/
31
38
  a = line.split(/:|,|;/)
32
- sessions << Session.new(name: a[0], connect_string: a[1])
39
+ sessions << Session.new(name: a[0], connect_string: a[1], provide_name_in_result: true)
33
40
  end
34
41
  end
35
42
 
@@ -37,17 +44,68 @@ module SensuPluginsOracle
37
44
  end
38
45
 
39
46
  def alive?
40
- connection = OCI8.new(@connect_string) if @connect_string
41
- connection = OCI8.new(@username, @password, @database) if @username
42
-
43
- @server_version = connection.oracle_server_version
44
-
47
+ connect
48
+ @server_version = @connection.oracle_server_version
45
49
  true
46
- rescue OCIError => e
50
+ rescue StandardError, OCIError => e
47
51
  @error_message = [@name, e.message.split("\n").first].compact.join(": ")
48
52
  false
49
53
  ensure
50
- connection.logoff if connection
54
+ disconnect
55
+ end
56
+
57
+ def query(query_string)
58
+ connect
59
+ @rows = []
60
+
61
+ cursor = @connection.exec(query_string)
62
+
63
+ @rows = []
64
+ while row = cursor.fetch
65
+ @rows << row
66
+ end
67
+ cursor.close
68
+
69
+ return true
70
+ rescue StandardError, OCIError => e
71
+ @error_message = [@name, e.message.split("\n").first].compact.join(": ")
72
+ return false
73
+ end
74
+
75
+ def handle_query_result(config={})
76
+ # check if query is ok, warning, or critical
77
+ value = @rows.size
78
+ value = @rows[0][0].to_f if @rows[0] && !config[:tuples]
79
+
80
+ calc = Dentaku::Calculator.new
81
+ return :critical, show(config[:show]) if config[:critical] && calc.evaluate(config[:critical], value: value)
82
+ return :warning, show(config[:show]) if config[:warning] && calc.evaluate(config[:warning], value: value)
83
+ return :ok, show(config[:show])
84
+ end
85
+
86
+ private
87
+
88
+ def show(show_records=true)
89
+ return nil unless show_records
90
+ buffer = []
91
+ buffer << "#{@name} (#{@rows.size})" if @provide_name_in_result
92
+ buffer += @rows.map{ |row| '- ' + row.join(', ')}
93
+ buffer.join("\n")
94
+ end
95
+
96
+ def connect
97
+ return if @connection
98
+
99
+ if @username
100
+ @connection = OCI8.new(@username.to_s, @password.to_s, @database.to_s)
101
+ else
102
+ @connection = OCI8.new(@connect_string.to_s)
103
+ end
104
+ end
105
+
106
+ def disconnect
107
+ @connection.logoff if @connection
108
+ @connection = nil
51
109
  end
52
110
 
53
111
  end
@@ -1,7 +1,7 @@
1
1
  module SensuPluginsOracle
2
2
  module Version
3
3
  MAJOR = 0
4
- MINOR = 1
4
+ MINOR = 3
5
5
  PATCH = 0
6
6
 
7
7
  VER_STRING = [MAJOR, MINOR, PATCH].compact.join('.')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu-plugins-oracle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sensu-Plugins and contributors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-04 00:00:00.000000000 Z
11
+ date: 2016-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sensu-plugin
@@ -28,16 +28,30 @@ dependencies:
28
28
  name: ruby-oci8
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '='
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: 2.2.2
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '='
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 2.2.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: dentaku
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 2.0.9
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 2.0.9
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -94,12 +108,27 @@ dependencies:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
110
  version: '3.1'
111
+ - !ruby/object:Gem::Dependency
112
+ name: codeclimate-test-reporter
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.6.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.6.0
97
125
  description: |-
98
126
  This plugin provides native Oracle
99
127
  instrumentation.
100
128
  email: "<thomas.steiner@ikey.ch>"
101
129
  executables:
102
130
  - check-oracle-alive.rb
131
+ - check-oracle-query.rb
103
132
  extensions: []
104
133
  extra_rdoc_files: []
105
134
  files:
@@ -107,6 +136,7 @@ files:
107
136
  - LICENSE
108
137
  - README.md
109
138
  - bin/check-oracle-alive.rb
139
+ - bin/check-oracle-query.rb
110
140
  - lib/sensu-plugins-oracle.rb
111
141
  - lib/sensu-plugins-oracle/session.rb
112
142
  - lib/sensu-plugins-oracle/version.rb
@@ -114,7 +144,7 @@ homepage: https://github.com/thomis/sensu-plugins-oracle
114
144
  licenses:
115
145
  - MIT
116
146
  metadata:
117
- maintainer: "@tas50"
147
+ maintainer: thomis
118
148
  development_status: active
119
149
  production_status: unstable - testing recommended
120
150
  release_draft: 'false'