sensu-extensions-system-profile-wmi 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6531b4394898319ca773b79139b4653f7316de92
4
+ data.tar.gz: a60898ca6eb50f15075d311d63af7e0b747208ee
5
+ SHA512:
6
+ metadata.gz: affe75ff3f9950630b2dbec0825fd250083471405ea54f63a40e8d13d09a065ce4b85b2db6c1b1e6d3c3ae76ba1572b390217f21277bbb509eba0d6203c7fa8e
7
+ data.tar.gz: 769f3bfcc620ae1d8da24022ab472c1927c524a96d556aa9814cef19aa93648ce55f450cd7f55c70cf9485bc7f53665f484179106f55413cdd8a601186d1989e
data/CHANGELOG.md ADDED
@@ -0,0 +1,26 @@
1
+ # Change Log
2
+
3
+ This project adheres to [Semantic Versioning](http://semver.org/).
4
+
5
+ This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachangelog.com/).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## 1.0.0 - 2016-01-01
10
+
11
+ ### Added
12
+
13
+ - Initial release.
14
+
15
+ ## The Before Time
16
+
17
+ This extension was originally committed to the now-defunct
18
+ sensu-community-plugins repository in April of 2014. With the advent of
19
+ extension gem loading in Sensu 0.26, [the most recent version of the
20
+ extension commited to that repo][community-repo-commit] is relesed here as version 1.0.0.
21
+
22
+ Complete change history prior to 1.0.0 is available [here][before-time-changes].
23
+
24
+ [community-repo-commit]: https://github.com/sensu/sensu-community-plugins/blob/14edca8b46753e1444363d5fc294f2502e70d198/extensions/checks/wmi_metrics.rb
25
+ [before-time-changes]: https://github.com/sensu/sensu-community-plugins/commits/e58c1f3ce39c6c0ca271fadd470c04362e92b190/extensions/checks/wmi_metrics.rb
26
+ [Unreleased]: https://github.com/sensu-extensions/sensu-extensions-system-profile-wmi/compare/v1.0.0...HEAD
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2016 Sensu-Extensions
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # Sensu::Extensions::SystemProfileWmi
2
+
3
+ This check extension collects Windows system metrics using the SVCHOST WMI
4
+ service, and formats them as plaintext Graphite data.
5
+
6
+ ## Installation
7
+
8
+ 1. Install this gem using sensu-install
9
+
10
+ ``` bash
11
+ $ sensu-install -e sensu-extensions-system-profile-wmi
12
+ ```
13
+
14
+ 2. Configure Sensu to load the extension, as [documented here][0].
15
+
16
+ ``` json
17
+ {
18
+ "extensions": {
19
+ "system-profile-wmi": {
20
+ "gem": "sensu-extensions-system-profile-wmi"
21
+ }
22
+ }
23
+ }
24
+ ```
25
+
26
+ ## Configuration
27
+
28
+ `/etc/sensu/conf.d/system_profile.json`:
29
+
30
+ ``` json
31
+ {
32
+ "wmi_metrics": {
33
+ "interval": 10,
34
+ "handler": "graphite",
35
+ "add_client_prefix": true,
36
+ "path_prefix": "system",
37
+ "prefix_at_start": true
38
+ }
39
+ }
40
+ ```
41
+
42
+ [0]: https://sensuapp.org/docs/latest/reference/extensions.html
@@ -0,0 +1,196 @@
1
+ # WMI Metrics
2
+ # ===
3
+ #
4
+ # Collects a variety of system metrics every 10 seconds (by default).
5
+ # Expects a "graphite" handler on the Sensu server, eg:
6
+ #
7
+ # "graphite": {
8
+ # "type": "tcp",
9
+ # "socket": {
10
+ # "host": "graphite.hw-ops.com",
11
+ # "port": 2003
12
+ # },
13
+ # "mutator": "only_check_output"
14
+ # }
15
+ #
16
+ # Copyright 2016 Heavy Water Operations, LLC.
17
+ #
18
+ # Changelog
19
+ # ----------
20
+ # 03/11/2015 - Alan Smith (@cloakedcode) added cumulative metric
21
+ # collection for network traffic over interval timespan.
22
+ #
23
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
24
+ # for details.
25
+
26
+ require 'sensu/extension'
27
+ require 'win32ole'
28
+
29
+ module Sensu
30
+ module Extension
31
+ class SystemProfileWMI < Check
32
+ def name
33
+ 'wmi_metrics'
34
+ end
35
+
36
+ def description
37
+ 'collects system metrics, using wmi and the graphite plain-text format'
38
+ end
39
+
40
+ def definition
41
+ {
42
+ type: 'metric',
43
+ name: name,
44
+ interval: options[:interval],
45
+ standalone: true,
46
+ handler: options[:handler]
47
+ }
48
+ end
49
+
50
+ def post_init
51
+ @metrics = {}
52
+ @wmi = WIN32OLE.connect('winmgmts://')
53
+
54
+ # setup timer for cumulative metrics
55
+ EM.add_periodic_timer(1) do
56
+ network_interface_metrics do
57
+ end
58
+ end
59
+ true
60
+ end
61
+
62
+ def run
63
+ memory_metrics do
64
+ disk_metrics do
65
+ cpu_metrics do
66
+ yield flush_metrics, 0
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ private
73
+
74
+ def options
75
+ return @options if @options
76
+ @options = {
77
+ interval: 60,
78
+ handler: 'graphite',
79
+ add_client_prefix: true,
80
+ path_prefix: 'WMI',
81
+ prefix_at_start: 0
82
+ }
83
+ if settings[:wmi_metrics].is_a?(Hash)
84
+ @options.merge!(settings[:wmi_metrics])
85
+ end
86
+ @options
87
+ end
88
+
89
+ def flush_metrics
90
+ metrics = @metrics.map { |k, v| [k, v, Time.now.to_i].join(' ') }
91
+ @metrics = {}
92
+ metrics.join("\n") + "\n"
93
+ end
94
+
95
+ def add_metric(*args)
96
+ value = args.pop
97
+ path = []
98
+ path << options[:path_prefix] if options[:prefix_at_start]
99
+ path << settings[:client][:name] if options[:add_client_prefix]
100
+ path << options[:path_prefix] unless options[:prefix_at_start]
101
+ path = (path + args).join('.')
102
+
103
+ @metrics[path] = 0 if @metrics[path].nil?
104
+ @metrics[path] += value.to_i
105
+ end
106
+
107
+ def formatted_perf_data(provider, &_callback)
108
+ full_provider = 'Win32_PerfFormattedData_' + provider
109
+ EM.next_tick do
110
+ result = []
111
+ begin
112
+ result = @wmi.ExecQuery('select * from ' + full_provider)
113
+ rescue => error
114
+ @logger.debug('wmi query error', error: error.to_s)
115
+ end
116
+ yield result
117
+ end
118
+ end
119
+
120
+ def memory_metrics
121
+ formatted_perf_data('PerfOS_Memory') do |result|
122
+ result.each do |data|
123
+ %w(
124
+ AvailableBytes
125
+ CacheBytes
126
+ CommittedBytes
127
+ ).each do |point|
128
+ add_metric('Memory', point, data.send(point.to_sym))
129
+ end
130
+ end
131
+ yield
132
+ end
133
+ end
134
+
135
+ def disk_metrics
136
+ formatted_perf_data('PerfDisk_LogicalDisk') do |disks|
137
+ disks.each do |data|
138
+ %w(
139
+ AvgDiskQueueLength
140
+ FreeMegabytes
141
+ PercentDiskTime
142
+ PercentFreeSpace
143
+ ).each do |point|
144
+ disk_name = data.Name.gsub(/[^0-9a-z]/i, '')
145
+ add_metric('Disk', disk_name, point, data.send(point.to_sym))
146
+ end
147
+ end
148
+ yield
149
+ end
150
+ end
151
+
152
+ def cpu_metrics
153
+ formatted_perf_data('PerfOS_Processor') do |processors|
154
+ processors.each do |data|
155
+ %w(
156
+ InterruptsPerSec
157
+ PercentIdleTime
158
+ PercentInterruptTime
159
+ PercentPrivilegedTime
160
+ PercentProcessorTime
161
+ PercentUserTime
162
+ ).each do |point|
163
+ cpu_name = data.Name.gsub(/[^0-9a-z]/i, '')
164
+ add_metric('CPU', cpu_name, point, data.send(point.to_sym))
165
+ end
166
+ end
167
+ yield
168
+ end
169
+ end
170
+
171
+ def network_interface_metrics
172
+ formatted_perf_data('Tcpip_NetworkInterface') do |interfaces|
173
+ interfaces.each do |data|
174
+ %w(
175
+ BytesReceivedPerSec
176
+ BytesSentPerSec
177
+ BytesTotalPerSec
178
+ OutputQueueLength
179
+ PacketsOutboundDiscarded
180
+ PacketsOutboundErrors
181
+ PacketsPerSec
182
+ PacketsReceivedDiscarded
183
+ PacketsReceivedErrors
184
+ PacketsReceivedPerSec
185
+ PacketsSentPerSec
186
+ ).each do |point|
187
+ interface_name = data.Name.gsub(/[^0-9a-z]/i, '')
188
+ add_metric('Interface', interface_name, point, data.send(point.to_sym))
189
+ end
190
+ end
191
+ yield
192
+ end
193
+ end
194
+ end
195
+ end
196
+ end
metadata ADDED
@@ -0,0 +1,131 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sensu-extensions-system-profile-wmi
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Sensu-Extensions and contributors
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-10-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sensu-extension
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.6'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: sensu-logger
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: sensu-settings
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: EXTENSION_TYPE extension to do X
98
+ email:
99
+ - "<sensu-users@googlegroups.com>"
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - CHANGELOG.md
105
+ - LICENSE
106
+ - README.md
107
+ - lib/sensu/extensions/system-profile-wmi.rb
108
+ homepage: https://github.com/sensu-extensions/sensu-extensions-system-profile-wmi
109
+ licenses: []
110
+ metadata: {}
111
+ post_install_message:
112
+ rdoc_options: []
113
+ require_paths:
114
+ - lib
115
+ required_ruby_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ required_rubygems_version: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ requirements: []
126
+ rubyforge_project:
127
+ rubygems_version: 2.6.13
128
+ signing_key:
129
+ specification_version: 4
130
+ summary: EXTENSION_TYPE extension to do X
131
+ test_files: []