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 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