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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 53937398073ee3f5631e620826bf44817fbcf1a8
4
- data.tar.gz: 3354b6e712d11dddda85a201dcfbd0d4db108178
3
+ metadata.gz: d419d25f742a37c372a20ce4a1c6c2134f8f615f
4
+ data.tar.gz: a3e0b73a1b9f0d8ba9e62a472cdf3a9edeb53ea4
5
5
  SHA512:
6
- metadata.gz: 31d968e7c533bb0bac15eb83f8f3133b05b1fa850f2111ae27313f9506edb021cd2a4b2c3825c83fe19e377845b50d2fe0145f29d23905226d67199d3ab04594
7
- data.tar.gz: 5a68ea826aaf1d1c079e82e2ae6aab2730832753d579a29f8f322dc2b5fe08ff4795e97c43c8b03d8c1df5b5fe9eab9e5548d924ad78896c26d6dabe78e4792a
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 'open-uri'
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 2)',
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: '2'
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
- current_machine_ips = get_current_machine_ipv4s
75
- event_store_ips = get_event_store_ips_from_dns cluster_dns
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
- check_node gossip_address, gossip_port, expected_nodes
82
- end
72
+ critical gossip_address unless helper.is_valid_v4_ip gossip_address
83
73
 
84
- def get_matching_ips(machine_ips, event_store_ips)
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
- critical_no_matching_ips machine_ips, event_store_ips unless matched_ips.one?
89
- matched_ips[0]
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 'open-uri'
26
- require 'socket'
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 MetricsStats < Sensu::Plugin::Check::CLI
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 add_metrics(json_stats, stats_dict, stat_name_mappings)
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 create_stat_mapping(source_name, new_suffix)
43
- prefix = "eventstore"
44
-
120
+ def create_metric_mapping(source_name, target_name)
45
121
  {
46
122
  source_name: source_name,
47
- target_name:"#{prefix}.#{new_suffix}"
123
+ target_name:"eventstore.#{target_name}"
48
124
  }
49
125
  end
50
126
 
51
- def add_standard_stats(json_stats, stats_dict)
127
+ def parse_json_stats(json_stats)
52
128
  name_mappings = [
53
- create_stat_mapping("proc-mem", "memory"),
54
- create_stat_mapping("proc-cpu", "cpu"),
55
- create_stat_mapping("proc-threadsCount", "threadsCount"),
56
- create_stat_mapping("proc-contentionsRate", "contentionsRate"),
57
- create_stat_mapping("proc-thrownExceptionsRate", "thrownExceptionsRate"),
58
- create_stat_mapping("proc-diskIo-readBytes", "diskIo.readBytes"),
59
- create_stat_mapping("proc-diskIo-writtenBytes", "diskIo.writtenBytes"),
60
- create_stat_mapping("proc-diskIo-readOps", "diskIo.readOps"),
61
- create_stat_mapping("proc-diskIo-writeOps", "diskIo.writeOps"),
62
- create_stat_mapping("proc-tcp-connection", "tcp.connection"),
63
- create_stat_mapping("proc-tcp-receivingSpeed", "tcp.receivingSpeed"),
64
- create_stat_mapping("proc-tcp-sendingSpeed", "tcp.sendingSpeed"),
65
- create_stat_mapping("proc-tcp-inSend", "tcp.inSend"),
66
- create_stat_mapping("proc-tcp-measureTime", "tcp.measureTime"),
67
- create_stat_mapping("proc-tcp-receivedBytesSinceLastRun", "tcp.receivedBytesSinceLastRun"),
68
- create_stat_mapping("proc-tcp-sentBytesSinceLastRun", "tcp.sentBytesSinceLastRun"),
69
- create_stat_mapping("proc-gc-gen0Size", "gc.gen0Size"),
70
- create_stat_mapping("proc-gc-gen1Size", "gc.gen1Size"),
71
- create_stat_mapping("proc-gc-gen2Size", "gc.gen2Size"),
72
- create_stat_mapping("proc-gc-largeHeapSize", "gc.largeHeapSize"),
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
- add_metrics json_stats, stats_dict, name_mappings
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 add_queue_stats(json_stats, stats_dict)
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
- def run
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
- stats_dict = Hash.new
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
- add_standard_stats stats, stats_dict
167
+ queue_metrics.each { |queue| add_metrics_for_queue queue, json_stats, stats_dict }
168
+ end
96
169
 
97
- add_queue_stats stats, stats_dict
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
- puts stats_dict
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.6
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-18 00:00:00.000000000 Z
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