sensu-plugins-eventstore 0.0.6 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- 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
|