sensu-plugins-eventstore 0.0.6 → 0.0.9
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 +4 -4
- data/bin/check-gossip.rb +9 -45
- data/bin/metrics-stats.rb +129 -50
- data/lib/ip-helper.rb +58 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d419d25f742a37c372a20ce4a1c6c2134f8f615f
|
4
|
+
data.tar.gz: a3e0b73a1b9f0d8ba9e62a472cdf3a9edeb53ea4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 40b5d91e364a9cc07378624aafece4fb185b57d36a865f1895adac66357961438dddd5d579cb076879a1eadc6840b54d7ae273437ffd9663339d8e66331dff81
|
7
|
+
data.tar.gz: 01a2ba9b8483d9a6efeb2fb5dab2f28868dbd3430876a741a3f8da7331c1b6ad9e613400835b8956162e3196bba5e01ba2bedc8d1cc29ddd2ab892b30447de0d
|
data/bin/check-gossip.rb
CHANGED
@@ -14,9 +14,6 @@
|
|
14
14
|
# gem: sensu-plugin
|
15
15
|
# gem: nokogiri
|
16
16
|
#
|
17
|
-
# USAGE:
|
18
|
-
# #YELLOW
|
19
|
-
#
|
20
17
|
# NOTES:
|
21
18
|
#
|
22
19
|
# LICENSE:
|
@@ -25,9 +22,7 @@
|
|
25
22
|
#
|
26
23
|
|
27
24
|
require 'nokogiri'
|
28
|
-
require '
|
29
|
-
require 'socket'
|
30
|
-
require 'resolv'
|
25
|
+
require '../lib/ip-helper.rb'
|
31
26
|
require 'sensu-plugin/check/cli'
|
32
27
|
|
33
28
|
|
@@ -57,10 +52,10 @@ class CheckGossip < Sensu::Plugin::Check::CLI
|
|
57
52
|
default: '2113'
|
58
53
|
|
59
54
|
option :expected_nodes,
|
60
|
-
description: 'The total number of nodes we expect to be gossiping, including this one. (Default
|
55
|
+
description: 'The total number of nodes we expect to be gossiping, including this one. (Default 4)',
|
61
56
|
short: '-e',
|
62
57
|
long: '--expected_nodes expected_nodes',
|
63
|
-
default: '
|
58
|
+
default: '4'
|
64
59
|
|
65
60
|
def run
|
66
61
|
discover_via_dns = config[:discover_via_dns]
|
@@ -71,22 +66,15 @@ class CheckGossip < Sensu::Plugin::Check::CLI
|
|
71
66
|
if discover_via_dns
|
72
67
|
cluster_dns = config[:cluster_dns]
|
73
68
|
|
74
|
-
|
75
|
-
|
76
|
-
critical_no_event_store_ips cluster_dns unless event_store_ips.any?
|
77
|
-
gossip_address = get_matching_ips current_machine_ips, event_store_ips
|
78
|
-
expected_nodes = event_store_ips.count
|
79
|
-
end
|
69
|
+
helper = IpHelper.new
|
70
|
+
gossip_address = helper.get_local_ip_that_also_on_cluster cluster_dns
|
80
71
|
|
81
|
-
|
82
|
-
end
|
72
|
+
critical gossip_address unless helper.is_valid_v4_ip gossip_address
|
83
73
|
|
84
|
-
|
85
|
-
matched_ips = machine_ips.select do |ip_to_look_for|
|
86
|
-
event_store_ips.find { |ip_to_match| ip_to_look_for == ip_to_match }
|
74
|
+
expected_nodes = helper.get_ips_in_cluster cluster_dns
|
87
75
|
end
|
88
|
-
|
89
|
-
|
76
|
+
|
77
|
+
check_node gossip_address, gossip_port, expected_nodes
|
90
78
|
end
|
91
79
|
|
92
80
|
def get_master_count(document)
|
@@ -123,12 +111,6 @@ class CheckGossip < Sensu::Plugin::Check::CLI
|
|
123
111
|
nodes.all? { |node| node_is_alive? node }
|
124
112
|
end
|
125
113
|
|
126
|
-
def critical_no_matching_ips(machine_ips, event_store_ips)
|
127
|
-
critical "this machine has ips of #{machine_ips}, event store (according to dns lookup) has ips of #{event_store_ips}. There should be exactly one match, but wasn't. "
|
128
|
-
end
|
129
|
-
def critical_no_event_store_ips(dns_name)
|
130
|
-
critical "could not find any ips at dns name #{dns_name} so cannot check gossips"
|
131
|
-
end
|
132
114
|
def critical_missing_nodes(xml_doc, expected_nodes)
|
133
115
|
critical "Wrong number of nodes, was #{get_members(xml_doc).count} should be #{expected_nodes}"
|
134
116
|
end
|
@@ -149,30 +131,12 @@ class CheckGossip < Sensu::Plugin::Check::CLI
|
|
149
131
|
node.content == 'true'
|
150
132
|
end
|
151
133
|
|
152
|
-
def get_event_store_ips_from_dns(dns_name)
|
153
|
-
Resolv::DNS.open { |dns|
|
154
|
-
resources = dns.getresources dns_name, Resolv::DNS::Resource::IN::A
|
155
|
-
resources.map { |res| res.address.to_s }
|
156
|
-
}
|
157
|
-
end
|
158
|
-
|
159
|
-
def get_current_machine_ipv4s
|
160
|
-
loopback_regex = /^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$/
|
161
|
-
ipv4_regex = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/
|
162
|
-
|
163
|
-
potential_ips = Socket.ip_address_list.map{|info| info.ip_address}
|
164
|
-
.select {|info| not loopback_regex.match(info)}
|
165
|
-
|
166
|
-
potential_ips.select { |info| ipv4_regex.match(info)}
|
167
|
-
end
|
168
|
-
|
169
134
|
def check_node(gossip_address, gossip_port, expected_nodes)
|
170
135
|
puts "\nchecking gossip at #{gossip_address}:#{gossip_port}"
|
171
136
|
|
172
137
|
begin
|
173
138
|
connection_url = "http://#{gossip_address}:#{gossip_port}/gossip?format=xml"
|
174
139
|
gossip = open(connection_url)
|
175
|
-
|
176
140
|
rescue StandardError
|
177
141
|
critical "Could not connect to #{connection_url} to check gossip, has event store fallen over on this node? "
|
178
142
|
end
|
data/bin/metrics-stats.rb
CHANGED
@@ -22,82 +22,161 @@
|
|
22
22
|
#
|
23
23
|
|
24
24
|
require 'nokogiri'
|
25
|
-
require '
|
26
|
-
require '
|
27
|
-
require 'resolv'
|
28
|
-
require 'sensu-plugin/check/cli'
|
25
|
+
require 'sensu-plugin/metric/cli'
|
26
|
+
require '../lib/ip-helper.rb'
|
29
27
|
require 'json'
|
30
28
|
|
31
|
-
class
|
29
|
+
class Stats < Sensu::Plugin::Metric::CLI::Graphite
|
30
|
+
option :discover_via_dns,
|
31
|
+
description: 'Whether to use DNS lookup to discover other cluster nodes. (Default: true)',
|
32
|
+
short: '-v',
|
33
|
+
long: '--discover_via_dns discover_via_dns',
|
34
|
+
default: 'true'
|
35
|
+
|
36
|
+
option :cluster_dns,
|
37
|
+
description: 'DNS name from which other nodes can be discovered.',
|
38
|
+
short: '-d',
|
39
|
+
long: '--cluster_dns cluster_dns',
|
40
|
+
default: 'localhost'
|
41
|
+
|
42
|
+
option :address,
|
43
|
+
description: 'If discover_via_dns is set to false then this address will be used. (Default localhost)',
|
44
|
+
short: '-a',
|
45
|
+
long: '--address address',
|
46
|
+
default: 'localhost'
|
47
|
+
|
48
|
+
option :port,
|
49
|
+
description: 'What port to use. (Default 2113)',
|
50
|
+
short: '-p',
|
51
|
+
long: '--port port',
|
52
|
+
default: '2113'
|
53
|
+
|
54
|
+
def run
|
55
|
+
discover_via_dns = config[:discover_via_dns]
|
56
|
+
address = config[:address]
|
57
|
+
port = config[:port]
|
58
|
+
|
59
|
+
if discover_via_dns
|
60
|
+
cluster_dns = config[:cluster_dns]
|
61
|
+
|
62
|
+
helper = IpHelper.new
|
63
|
+
address = helper.get_local_ip_that_also_on_cluster cluster_dns
|
64
|
+
|
65
|
+
critical address unless helper.is_valid_v4_ip address
|
66
|
+
end
|
67
|
+
|
68
|
+
force_downloaded_files_to_be_temp_files
|
69
|
+
collect_metrics address, port
|
70
|
+
end
|
71
|
+
|
72
|
+
def force_downloaded_files_to_be_temp_files
|
73
|
+
# Don't allow downloaded files to be created as StringIO. Force a tempfile to be created.
|
74
|
+
OpenURI::Buffer.send :remove_const, 'StringMax' if OpenURI::Buffer.const_defined?('StringMax')
|
75
|
+
OpenURI::Buffer.const_set 'StringMax', -1
|
76
|
+
end
|
77
|
+
|
78
|
+
def collect_metrics(address, port)
|
79
|
+
stream_url = "http://#{address}:#{port}/streams/$stats-#{address}:#{port}"
|
80
|
+
|
81
|
+
stream_temp_file = open stream_url, "Accept" => "application/atom+xml"
|
82
|
+
|
83
|
+
namespace_regex = / xmlns="[A-Za-z:\/.0-9]+"/
|
84
|
+
|
85
|
+
#if we don't remove the namespace nokogiri parsing fails
|
86
|
+
xml_stream_without_namespace = stream_temp_file.read.sub namespace_regex, ''
|
87
|
+
|
88
|
+
xml_doc = Nokogiri::XML xml_stream_without_namespace
|
89
|
+
|
90
|
+
puts xml_doc
|
91
|
+
|
92
|
+
latest_entry = xml_doc.xpath('.//entry')
|
93
|
+
.sort { |node| DateTime.parse node.xpath('.//updated').text }
|
94
|
+
.last
|
95
|
+
|
96
|
+
event_number_regex = /[0-9]+$/
|
97
|
+
event_number = event_number_regex.match latest_entry.at_xpath('.//id').content
|
98
|
+
|
99
|
+
latest_event_url = "#{stream_url}/#{event_number.to_s.to_i}"
|
100
|
+
|
101
|
+
element_temp_file = open latest_event_url, "Accept" => "application/json"
|
102
|
+
json_stats = JSON.parse element_temp_file.read
|
103
|
+
|
104
|
+
stats_dict = parse_json_stats json_stats
|
105
|
+
|
106
|
+
stats_dict.each { |stat| output stat[0], stat[1]}
|
107
|
+
|
108
|
+
ok
|
109
|
+
end
|
32
110
|
|
33
111
|
def add_metric(json_stats, stats_dict, stat_name_mapping)
|
34
112
|
stat_value = json_stats[stat_name_mapping[:source_name]]
|
35
113
|
stats_dict[stat_name_mapping[:target_name]] = stat_value
|
36
114
|
end
|
37
115
|
|
38
|
-
def
|
116
|
+
def add_standard_metrics(json_stats, stats_dict, stat_name_mappings)
|
39
117
|
stat_name_mappings.each {|stat_mapping| add_metric json_stats, stats_dict, stat_mapping}
|
40
118
|
end
|
41
119
|
|
42
|
-
def
|
43
|
-
prefix = "eventstore"
|
44
|
-
|
120
|
+
def create_metric_mapping(source_name, target_name)
|
45
121
|
{
|
46
122
|
source_name: source_name,
|
47
|
-
target_name:"
|
123
|
+
target_name:"eventstore.#{target_name}"
|
48
124
|
}
|
49
125
|
end
|
50
126
|
|
51
|
-
def
|
127
|
+
def parse_json_stats(json_stats)
|
52
128
|
name_mappings = [
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
create_stat_mapping("proc-gc-totalBytesInHeaps", "gc.totalBytesInHeaps")
|
129
|
+
create_metric_mapping("proc-mem", "memory"),
|
130
|
+
create_metric_mapping("proc-cpu", "cpu"),
|
131
|
+
create_metric_mapping("proc-threadsCount", "threadsCount"),
|
132
|
+
create_metric_mapping("proc-contentionsRate", "contentionsRate"),
|
133
|
+
create_metric_mapping("proc-thrownExceptionsRate", "thrownExceptionsRate"),
|
134
|
+
create_metric_mapping("proc-diskIo-readBytes", "diskIo.readBytes"),
|
135
|
+
create_metric_mapping("proc-diskIo-writtenBytes", "diskIo.writtenBytes"),
|
136
|
+
create_metric_mapping("proc-diskIo-readOps", "diskIo.readOps"),
|
137
|
+
create_metric_mapping("proc-diskIo-writeOps", "diskIo.writeOps"),
|
138
|
+
create_metric_mapping("proc-tcp-receivingSpeed", "tcp.receivingSpeed"),
|
139
|
+
create_metric_mapping("proc-tcp-sendingSpeed", "tcp.sendingSpeed"),
|
140
|
+
create_metric_mapping("proc-tcp-inSend", "tcp.inSend"),
|
141
|
+
create_metric_mapping("proc-tcp-measureTime", "tcp.measureTime"),
|
142
|
+
create_metric_mapping("proc-tcp-receivedBytesSinceLastRun", "tcp.receivedBytesSinceLastRun"),
|
143
|
+
create_metric_mapping("proc-tcp-sentBytesSinceLastRun", "tcp.sentBytesSinceLastRun"),
|
144
|
+
create_metric_mapping("proc-gc-gen0Size", "gc.gen0Size"),
|
145
|
+
create_metric_mapping("proc-gc-gen1Size", "gc.gen1Size"),
|
146
|
+
create_metric_mapping("proc-gc-gen2Size", "gc.gen2Size"),
|
147
|
+
create_metric_mapping("proc-gc-largeHeapSize", "gc.largeHeapSize"),
|
148
|
+
create_metric_mapping("proc-gc-totalBytesInHeaps", "gc.totalBytesInHeaps")
|
74
149
|
]
|
75
|
-
|
76
|
-
|
150
|
+
stats_dict = Hash.new
|
151
|
+
add_standard_metrics json_stats, stats_dict, name_mappings
|
152
|
+
add_metrics_for_queues json_stats, stats_dict
|
153
|
+
return stats_dict
|
77
154
|
end
|
78
155
|
|
79
|
-
def
|
80
|
-
|
81
|
-
|
82
|
-
"es-queue-{queueName}-queueName": "Master Replication Service",
|
83
|
-
"es-queue-{queueName}-groupName": "",
|
84
|
-
"es-queue-{queueName}-avgItemsPerSecond": 0,
|
85
|
-
"es-queue-{queueName}-avgProcessingTime": 0.0,
|
86
|
-
"es-queue-{queueName}-idleTimePercent": 98.433272489548671,
|
87
|
-
"es-queue-{queueName}-totalItemsProcessed": 0
|
88
|
-
end
|
156
|
+
def add_metrics_for_queues(json_stats, stats_dict)
|
157
|
+
metrics_wanted = %w(avgItemsPerSecond avgProcessingTime currentIdleTime idleTimePercent length lengthCurrentTryPeak lengthLifetimePeak totalItemsProcessed)
|
89
158
|
|
90
|
-
|
91
|
-
stats = JSON.parse '{ "proc-startTime": "2016-02-10T13:21:58Z", "proc-id": 26613, "proc-mem": 494968832, "proc-cpu": 0.0, "proc-cpuScaled": 0.0, "proc-threadsCount": 0, "proc-contentionsRate": 0.0, "proc-thrownExceptionsRate": 0.0, "sys-cpu": 11.4026785, "sys-freeMem": 183107584, "proc-diskIo-readBytes": 1734651904, "proc-diskIo-writtenBytes": 34955264, "proc-diskIo-readOps": 459692, "proc-diskIo-writeOps": 9638, "proc-tcp-connections": 2, "proc-tcp-receivingSpeed": 28.403300796143856, "proc-tcp-sendingSpeed": 1065.1570389898163, "proc-tcp-inSend": 0, "proc-tcp-measureTime": "00:00:30.0669280", "proc-tcp-pendingReceived": 0, "proc-tcp-pendingSend": 0, "proc-tcp-receivedBytesSinceLastRun": 854, "proc-tcp-receivedBytesTotal": 14412940, "proc-tcp-sentBytesSinceLastRun": 32026, "proc-tcp-sentBytesTotal": 8499466, "proc-gc-allocationSpeed": 0.0, "proc-gc-gen0ItemsCount": 0, "proc-gc-gen0Size": 0, "proc-gc-gen1ItemsCount": 0, "proc-gc-gen1Size": 0, "proc-gc-gen2ItemsCount": 0, "proc-gc-gen2Size": 0, "proc-gc-largeHeapSize": 0, "proc-gc-timeInGc": 0.0, "proc-gc-totalBytesInHeaps": 0, "es-checksum": 2775762783, "es-checksumNonFlushed": 2775762783, "sys-drive-/var-availableBytes": 1793228800, "sys-drive-/var-totalBytes": 6159654912, "sys-drive-/var-usage": "70%", "sys-drive-/var-usedBytes": 4366426112, "es-queue-MainQueue-queueName": "MainQueue", "es-queue-MainQueue-groupName": "", "es-queue-MainQueue-avgItemsPerSecond": 26, "es-queue-MainQueue-avgProcessingTime": 0.063112862547288776, "es-queue-MainQueue-currentIdleTime": "0:00:00:00.0123288", "es-queue-MainQueue-currentItemProcessingTime": null, "es-queue-MainQueue-idleTimePercent": 99.83352707437956, "es-queue-MainQueue-length": 0, "es-queue-MainQueue-lengthCurrentTryPeak": 5, "es-queue-MainQueue-lengthLifetimePeak": 1154, "es-queue-MainQueue-totalItemsProcessed": 993316, "es-queue-MainQueue-inProgressMessage": "<none>", "es-queue-MainQueue-lastProcessedMessage": "Schedule", "es-queue-Master Replication Service-queueName": "Master Replication Service", "es-queue-Master Replication Service-groupName": "", "es-queue-Master Replication Service-avgItemsPerSecond": 0, "es-queue-Master Replication Service-avgProcessingTime": 0.0, "es-queue-Master Replication Service-currentIdleTime": "0:00:00:00.0004328", "es-queue-Master Replication Service-currentItemProcessingTime": null, "es-queue-Master Replication Service-idleTimePercent": 98.433272489548671, "es-queue-Master Replication Service-length": 2, "es-queue-Master Replication Service-lengthCurrentTryPeak": 0, "es-queue-Master Replication Service-lengthLifetimePeak": 0, "es-queue-Master Replication Service-totalItemsProcessed": 0, "es-queue-Master Replication Service-inProgressMessage": "<none>", "es-queue-Master Replication Service-lastProcessedMessage": "<none>", "es-queue-MonitoringQueue-queueName": "MonitoringQueue", "es-queue-MonitoringQueue-groupName": "", "es-queue-MonitoringQueue-avgItemsPerSecond": 0, "es-queue-MonitoringQueue-avgProcessingTime": 0.0, "es-queue-MonitoringQueue-currentIdleTime": "0:01:25:06.3000363", "es-queue-MonitoringQueue-currentItemProcessingTime": null, "es-queue-MonitoringQueue-idleTimePercent": 100.0, "es-queue-MonitoringQueue-length": 0, "es-queue-MonitoringQueue-lengthCurrentTryPeak": 0, "es-queue-MonitoringQueue-lengthLifetimePeak": 2, "es-queue-MonitoringQueue-totalItemsProcessed": 26, "es-queue-MonitoringQueue-inProgressMessage": "<none>", "es-queue-MonitoringQueue-lastProcessedMessage": "WriteEventsCompleted", "es-queue-Projection Core #0-queueName": "Projection Core #0", "es-queue-Projection Core #0-groupName": "Projection Core", "es-queue-Projection Core #0-avgItemsPerSecond": 0, "es-queue-Projection Core #0-avgProcessingTime": 0.0, "es-queue-Projection Core #0-currentIdleTime": "0:01:25:06.4274620", "es-queue-Projection Core #0-currentItemProcessingTime": null, "es-queue-Projection Core #0-idleTimePercent": 99.999999667417313, "es-queue-Projection Core #0-length": 0, "es-queue-Projection Core #0-lengthCurrentTryPeak": 0, "es-queue-Projection Core #0-lengthLifetimePeak": 0, "es-queue-Projection Core #0-totalItemsProcessed": 5, "es-queue-Projection Core #0-inProgressMessage": "<none>", "es-queue-Projection Core #0-lastProcessedMessage": "StartReader", "es-queue-Projections Master-queueName": "Projections Master", "es-queue-Projections Master-groupName": "", "es-queue-Projections Master-avgItemsPerSecond": 0, "es-queue-Projections Master-avgProcessingTime": 0.0, "es-queue-Projections Master-currentIdleTime": "0:01:25:06.3265243", "es-queue-Projections Master-currentItemProcessingTime": null, "es-queue-Projections Master-idleTimePercent": 100.0, "es-queue-Projections Master-length": 0, "es-queue-Projections Master-lengthCurrentTryPeak": 0, "es-queue-Projections Master-lengthLifetimePeak": 1, "es-queue-Projections Master-totalItemsProcessed": 19, "es-queue-Projections Master-inProgressMessage": "<none>", "es-queue-Projections Master-lastProcessedMessage": "RegularTimeout", "es-queue-Storage Chaser-queueName": "Storage Chaser", "es-queue-Storage Chaser-groupName": "", "es-queue-Storage Chaser-avgItemsPerSecond": 10, "es-queue-Storage Chaser-avgProcessingTime": 0.016086798679867988, "es-queue-Storage Chaser-currentIdleTime": "0:00:00:00.0460818", "es-queue-Storage Chaser-currentItemProcessingTime": null, "es-queue-Storage Chaser-idleTimePercent": 99.983877720833746, "es-queue-Storage Chaser-length": 0, "es-queue-Storage Chaser-lengthCurrentTryPeak": 0, "es-queue-Storage Chaser-lengthLifetimePeak": 0, "es-queue-Storage Chaser-totalItemsProcessed": 316000, "es-queue-Storage Chaser-inProgressMessage": "<none>", "es-queue-Storage Chaser-lastProcessedMessage": "ChaserCheckpointFlush", "es-queue-StorageReaderQueue #1-queueName": "StorageReaderQueue #1", "es-queue-StorageReaderQueue #1-groupName": "StorageReaderQueue", "es-queue-StorageReaderQueue #1-avgItemsPerSecond": 0, "es-queue-StorageReaderQueue #1-avgProcessingTime": 0.1688375, "es-queue-StorageReaderQueue #1-currentIdleTime": "0:00:00:02.9902373", "es-queue-StorageReaderQueue #1-currentItemProcessingTime": null, "es-queue-StorageReaderQueue #1-idleTimePercent": 99.995503814347856, "es-queue-StorageReaderQueue #1-length": 0, "es-queue-StorageReaderQueue #1-lengthCurrentTryPeak": 0, "es-queue-StorageReaderQueue #1-lengthLifetimePeak": 0, "es-queue-StorageReaderQueue #1-totalItemsProcessed": 7884, "es-queue-StorageReaderQueue #1-inProgressMessage": "<none>", "es-queue-StorageReaderQueue #1-lastProcessedMessage": "ReadStreamEventsForward", "es-queue-StorageReaderQueue #2-queueName": "StorageReaderQueue #2", "es-queue-StorageReaderQueue #2-groupName": "StorageReaderQueue", "es-queue-StorageReaderQueue #2-avgItemsPerSecond": 0, "es-queue-StorageReaderQueue #2-avgProcessingTime": 0.169975, "es-queue-StorageReaderQueue #2-currentIdleTime": "0:00:00:01.9896212", "es-queue-StorageReaderQueue #2-currentItemProcessingTime": null, "es-queue-StorageReaderQueue #2-idleTimePercent": 99.9954838587244, "es-queue-StorageReaderQueue #2-length": 0, "es-queue-StorageReaderQueue #2-lengthCurrentTryPeak": 0, "es-queue-StorageReaderQueue #2-lengthLifetimePeak": 0, "es-queue-StorageReaderQueue #2-totalItemsProcessed": 7884, "es-queue-StorageReaderQueue #2-inProgressMessage": "<none>", "es-queue-StorageReaderQueue #2-lastProcessedMessage": "ReadStreamEventsForward", "es-queue-StorageReaderQueue #3-queueName": "StorageReaderQueue #3", "es-queue-StorageReaderQueue #3-groupName": "StorageReaderQueue", "es-queue-StorageReaderQueue #3-avgItemsPerSecond": 0, "es-queue-StorageReaderQueue #3-avgProcessingTime": 0.18105, "es-queue-StorageReaderQueue #3-currentIdleTime": "0:00:00:00.9881607", "es-queue-StorageReaderQueue #3-currentItemProcessingTime": null, "es-queue-StorageReaderQueue #3-idleTimePercent": 99.995188192444189, "es-queue-StorageReaderQueue #3-length": 0, "es-queue-StorageReaderQueue #3-lengthCurrentTryPeak": 0, "es-queue-StorageReaderQueue #3-lengthLifetimePeak": 0, "es-queue-StorageReaderQueue #3-totalItemsProcessed": 7884, "es-queue-StorageReaderQueue #3-inProgressMessage": "<none>", "es-queue-StorageReaderQueue #3-lastProcessedMessage": "ReadStreamEventsForward", "es-queue-StorageReaderQueue #4-queueName": "StorageReaderQueue #4", "es-queue-StorageReaderQueue #4-groupName": "StorageReaderQueue", "es-queue-StorageReaderQueue #4-avgItemsPerSecond": 0, "es-queue-StorageReaderQueue #4-avgProcessingTime": 0.16297142857142857, "es-queue-StorageReaderQueue #4-currentIdleTime": "0:00:00:03.9916165", "es-queue-StorageReaderQueue #4-currentItemProcessingTime": null, "es-queue-StorageReaderQueue #4-idleTimePercent": 99.996207225933688, "es-queue-StorageReaderQueue #4-length": 0, "es-queue-StorageReaderQueue #4-lengthCurrentTryPeak": 0, "es-queue-StorageReaderQueue #4-lengthLifetimePeak": 0, "es-queue-StorageReaderQueue #4-totalItemsProcessed": 7883, "es-queue-StorageReaderQueue #4-inProgressMessage": "<none>", "es-queue-StorageReaderQueue #4-lastProcessedMessage": "ReadStreamEventsForward", "es-queue-StorageWriterQueue-queueName": "StorageWriterQueue", "es-queue-StorageWriterQueue-groupName": "", "es-queue-StorageWriterQueue-avgItemsPerSecond": 0, "es-queue-StorageWriterQueue-avgProcessingTime": 6.0735, "es-queue-StorageWriterQueue-currentIdleTime": "0:00:00:30.0562357", "es-queue-StorageWriterQueue-currentItemProcessingTime": null, "es-queue-StorageWriterQueue-idleTimePercent": 99.979799919461087, "es-queue-StorageWriterQueue-length": 0, "es-queue-StorageWriterQueue-lengthCurrentTryPeak": 0, "es-queue-StorageWriterQueue-lengthLifetimePeak": 24, "es-queue-StorageWriterQueue-totalItemsProcessed": 1977, "es-queue-StorageWriterQueue-inProgressMessage": "<none>", "es-queue-StorageWriterQueue-lastProcessedMessage": "WritePrepares", "es-queue-Subscriptions-queueName": "Subscriptions", "es-queue-Subscriptions-groupName": "", "es-queue-Subscriptions-avgItemsPerSecond": 1, "es-queue-Subscriptions-avgProcessingTime": 0.037046875, "es-queue-Subscriptions-currentIdleTime": "0:00:00:00.0123960", "es-queue-Subscriptions-currentItemProcessingTime": null, "es-queue-Subscriptions-idleTimePercent": 99.996039604171145, "es-queue-Subscriptions-length": 0, "es-queue-Subscriptions-lengthCurrentTryPeak": 0, "es-queue-Subscriptions-lengthLifetimePeak": 1111, "es-queue-Subscriptions-totalItemsProcessed": 213721, "es-queue-Subscriptions-inProgressMessage": "<none>", "es-queue-Subscriptions-lastProcessedMessage": "CheckPollTimeout", "es-queue-Timer-queueName": "Timer", "es-queue-Timer-groupName": "", "es-queue-Timer-avgItemsPerSecond": 19, "es-queue-Timer-avgProcessingTime": 0.2103560732113145, "es-queue-Timer-currentIdleTime": "0:00:00:00.0001258", "es-queue-Timer-currentItemProcessingTime": null, "es-queue-Timer-idleTimePercent": 99.577986697785988, "es-queue-Timer-length": 14, "es-queue-Timer-lengthCurrentTryPeak": 14, "es-queue-Timer-lengthLifetimePeak": 17, "es-queue-Timer-totalItemsProcessed": 555432, "es-queue-Timer-inProgressMessage": "<none>", "es-queue-Timer-lastProcessedMessage": "ExecuteScheduledTasks", "es-queue-Worker #1-queueName": "Worker #1", "es-queue-Worker #1-groupName": "Workers", "es-queue-Worker #1-avgItemsPerSecond": 3, "es-queue-Worker #1-avgProcessingTime": 0.25345267857142856, "es-queue-Worker #1-currentIdleTime": "0:00:00:00.0133278", "es-queue-Worker #1-currentItemProcessingTime": null, "es-queue-Worker #1-idleTimePercent": 99.905856789454674, "es-queue-Worker #1-length": 0, "es-queue-Worker #1-lengthCurrentTryPeak": 1, "es-queue-Worker #1-lengthLifetimePeak": 2, "es-queue-Worker #1-totalItemsProcessed": 145988, "es-queue-Worker #1-inProgressMessage": "<none>", "es-queue-Worker #1-lastProcessedMessage": "PurgeTimedOutRequests", "es-queue-Worker #2-queueName": "Worker #2", "es-queue-Worker #2-groupName": "Workers", "es-queue-Worker #2-avgItemsPerSecond": 3, "es-queue-Worker #2-avgProcessingTime": 0.220705, "es-queue-Worker #2-currentIdleTime": "0:00:00:00.0132287", "es-queue-Worker #2-currentItemProcessingTime": null, "es-queue-Worker #2-idleTimePercent": 99.91183064198367, "es-queue-Worker #2-length": 0, "es-queue-Worker #2-lengthCurrentTryPeak": 1, "es-queue-Worker #2-lengthLifetimePeak": 3, "es-queue-Worker #2-totalItemsProcessed": 146278, "es-queue-Worker #2-inProgressMessage": "<none>", "es-queue-Worker #2-lastProcessedMessage": "PurgeTimedOutRequests", "es-queue-Worker #3-queueName": "Worker #3", "es-queue-Worker #3-groupName": "Workers", "es-queue-Worker #3-avgItemsPerSecond": 3, "es-queue-Worker #3-avgProcessingTime": 0.14876902654867258, "es-queue-Worker #3-currentIdleTime": "0:00:00:00.0130986", "es-queue-Worker #3-currentItemProcessingTime": null, "es-queue-Worker #3-idleTimePercent": 99.9440366273687, "es-queue-Worker #3-length": 0, "es-queue-Worker #3-lengthCurrentTryPeak": 1, "es-queue-Worker #3-lengthLifetimePeak": 2, "es-queue-Worker #3-totalItemsProcessed": 147177, "es-queue-Worker #3-inProgressMessage": "<none>", "es-queue-Worker #3-lastProcessedMessage": "PurgeTimedOutRequests", "es-queue-Worker #4-queueName": "Worker #4", "es-queue-Worker #4-groupName": "Workers", "es-queue-Worker #4-avgItemsPerSecond": 3, "es-queue-Worker #4-avgProcessingTime": 0.12049732142857142, "es-queue-Worker #4-currentIdleTime": "0:00:00:00.0131623", "es-queue-Worker #4-currentItemProcessingTime": null, "es-queue-Worker #4-idleTimePercent": 99.955079040395148, "es-queue-Worker #4-length": 0, "es-queue-Worker #4-lengthCurrentTryPeak": 1, "es-queue-Worker #4-lengthLifetimePeak": 2, "es-queue-Worker #4-totalItemsProcessed": 145948, "es-queue-Worker #4-inProgressMessage": "<none>", "es-queue-Worker #4-lastProcessedMessage": "PurgeTimedOutRequests", "es-queue-Worker #5-queueName": "Worker #5", "es-queue-Worker #5-groupName": "Workers", "es-queue-Worker #5-avgItemsPerSecond": 3, "es-queue-Worker #5-avgProcessingTime": 0.18515221238938054, "es-queue-Worker #5-currentIdleTime": "0:00:00:00.0130835", "es-queue-Worker #5-currentItemProcessingTime": null, "es-queue-Worker #5-idleTimePercent": 99.9303564968982, "es-queue-Worker #5-length": 0, "es-queue-Worker #5-lengthCurrentTryPeak": 1, "es-queue-Worker #5-lengthLifetimePeak": 2, "es-queue-Worker #5-totalItemsProcessed": 146073, "es-queue-Worker #5-inProgressMessage": "<none>", "es-queue-Worker #5-lastProcessedMessage": "PurgeTimedOutRequests", "es-writer-lastFlushSize": 15486, "es-writer-lastFlushDelayMs": 5.558, "es-writer-meanFlushSize": 9025, "es-writer-meanFlushDelayMs": 3.19490869140625, "es-writer-maxFlushSize": 186369, "es-writer-maxFlushDelayMs": 9646.2947, "es-writer-queuedFlushMessages": 0, "es-readIndex-cachedRecord": 23764, "es-readIndex-notCachedRecord": 159691, "es-readIndex-cachedStreamInfo": 94434, "es-readIndex-notCachedStreamInfo": 23, "es-readIndex-cachedTransInfo": 0, "es-readIndex-notCachedTransInfo": 0 }'
|
159
|
+
split_on_queues = json_stats.keys
|
160
|
+
.select { |key| key.start_with? "es-queue-" }
|
161
|
+
.map { |key| key.split '-' }
|
162
|
+
.select { |split_key| metrics_wanted.any? { |metric| metric == split_key[3] } }
|
163
|
+
.group_by { |split_key| split_key[2] }
|
92
164
|
|
93
|
-
|
165
|
+
queue_metrics = split_on_queues.map { |queue_with_metrics| [queue_with_metrics[0], queue_with_metrics[1].map { |metrics| metrics[3] }]}
|
94
166
|
|
95
|
-
|
167
|
+
queue_metrics.each { |queue| add_metrics_for_queue queue, json_stats, stats_dict }
|
168
|
+
end
|
96
169
|
|
97
|
-
|
170
|
+
def add_metrics_for_queue(queue, json_stats, stats_dict)
|
171
|
+
queue_name = queue[0]
|
98
172
|
|
173
|
+
metric_mappings = queue[1].map { |metric_name| create_metric_mapping "es-queue-#{queue_name}-#{metric_name}", "#{cleaned_name queue_name}.#{metric_name}" }
|
99
174
|
|
100
|
-
|
175
|
+
metric_mappings.each {|mapping| add_metric json_stats, stats_dict, mapping}
|
101
176
|
end
|
102
177
|
|
178
|
+
def cleaned_name(queue_name)
|
179
|
+
character_regex = /[^A-Za-z0-9]+|es-queue/
|
180
|
+
queue_name.gsub character_regex, ''
|
181
|
+
end
|
103
182
|
end
|
data/lib/ip-helper.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'socket'
|
3
|
+
require 'resolv'
|
4
|
+
|
5
|
+
|
6
|
+
class IpHelper
|
7
|
+
def get_local_ip_that_also_on_cluster(cluster_dns)
|
8
|
+
current_machine_ips = get_current_machine_ipv4s
|
9
|
+
event_store_ips = get_event_store_ips_from_dns cluster_dns
|
10
|
+
|
11
|
+
return no_event_store_ips_error cluster_dns unless event_store_ips.any?
|
12
|
+
|
13
|
+
get_matching_ips current_machine_ips, event_store_ips
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_ips_in_cluster(cluster_dns)
|
17
|
+
event_store_ips = get_event_store_ips_from_dns cluster_dns
|
18
|
+
return event_store_ips.count unless event_store_ips == nil
|
19
|
+
return 0
|
20
|
+
end
|
21
|
+
|
22
|
+
def is_valid_v4_ip(potential_ip)
|
23
|
+
/^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/.match potential_ip
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_current_machine_ipv4s
|
27
|
+
loopback_regex = /^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$/
|
28
|
+
|
29
|
+
potential_ips = Socket.ip_address_list.map{|info| info.ip_address}
|
30
|
+
.select {|info| not loopback_regex.match(info)}
|
31
|
+
|
32
|
+
potential_ips.select { |info| is_valid_v4_ip info}
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_matching_ips(machine_ips, event_store_ips)
|
36
|
+
matched_ips = machine_ips.select do |ip_to_look_for|
|
37
|
+
event_store_ips.find { |ip_to_match| ip_to_look_for == ip_to_match }
|
38
|
+
end
|
39
|
+
return no_matching_ip_error machine_ips, event_store_ips unless matched_ips.one?
|
40
|
+
|
41
|
+
matched_ips[0]
|
42
|
+
end
|
43
|
+
|
44
|
+
def get_event_store_ips_from_dns(dns_name)
|
45
|
+
Resolv::DNS.open { |dns|
|
46
|
+
resources = dns.getresources dns_name, Resolv::DNS::Resource::IN::A
|
47
|
+
resources.map { |res| res.address.to_s }
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
def no_matching_ip_error(machine_ips, event_store_ips)
|
52
|
+
"this machine has ips of #{machine_ips}, event store (according to dns lookup) has ips of #{event_store_ips}. There should be exactly one match, but wasn't. "
|
53
|
+
end
|
54
|
+
|
55
|
+
def no_event_store_ips_error(dns_name)
|
56
|
+
"could not find any ips at dns name #{dns_name} so cannot check gossips"
|
57
|
+
end
|
58
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sensu-plugins-eventstore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamie Wroe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yard
|
@@ -79,6 +79,7 @@ files:
|
|
79
79
|
- README.md
|
80
80
|
- bin/check-gossip.rb
|
81
81
|
- bin/metrics-stats.rb
|
82
|
+
- lib/ip-helper.rb
|
82
83
|
homepage: https://github.com/JWroe/sensu-plugins-eventstore
|
83
84
|
licenses:
|
84
85
|
- MIT
|