riemann-tools 0.2.5 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require 'fog'
4
+ require 'date'
5
+ require 'time'
6
+ require 'json'
7
+
8
+ require File.expand_path('../../lib/riemann/tools', __FILE__)
9
+
10
+ $0 = __FILE__ # Let's not expose our AWS keys in the process list
11
+
12
+ class Riemann::Tools::AWS
13
+ include Riemann::Tools
14
+
15
+ opt :access_key, "AWS access key", :type => String
16
+ opt :secret_key, "Secret access key", :type => String
17
+ opt :region, "AWS region", :type => String, :default => 'eu-west-1'
18
+ opt :dbinstance_identifier, "DBInstanceIdentifier", :type => String
19
+ def initialize
20
+ abort "FATAL: specify a DB instance name, see --help for usage" unless opts[:dbinstance_identifier]
21
+ @cloudwatch = Fog::AWS::CloudWatch.new(:aws_access_key_id => opts[:access_key],
22
+ :aws_secret_access_key => opts[:secret_key],
23
+ :region => opts[:region])
24
+ end
25
+
26
+ def tick
27
+ time = Time.new
28
+ ['DatabaseConnections', 'FreeableMemory', 'FreeStorageSpace', 'NetworkReceiveThroughput', 'NetworkTransmitThroughput', 'ReadThroughput', 'CPUUtilization'].each do |metric|
29
+ result = @cloudwatch.get_metric_statistics({"Namespace" => 'AWS/RDS', "MetricName" => "#{metric}", "Statistics" => 'Average', "Dimensions" => [{"Name" => "DBInstanceIdentifier", "Value" => "#{opts[:dbinstance_identifier]}"}], "StartTime" => (time-120).to_time.iso8601, "EndTime" => time.to_time.iso8601, "Period" => 60})
30
+ metricsResult = result.data[:body]['GetMetricStatisticsResult']
31
+ puts JSON.dump(metricsResult)
32
+ if (metricsResult['Datapoints'].length>0)
33
+ datapoint = metricsResult['Datapoints'][0]
34
+ ev = {:metric => datapoint['Average'],
35
+ :service => "#{opts[:dbinstance_identifier]}.#{metric} (#{datapoint['Unit']})",
36
+ :description => JSON.dump(metricsResult),
37
+ :state => "ok",
38
+ :ttl => 300}
39
+
40
+
41
+ report ev
42
+ end
43
+
44
+ end
45
+ end
46
+ end
47
+
48
+ Riemann::Tools::AWS.run
@@ -9,8 +9,8 @@ class Riemann::Tools::DirFilesCount
9
9
 
10
10
  opt :directory, "", :default => '/var/log'
11
11
  opt :service_prefix, "The first part of the service name, before the directory path", :default => "dir-files-count"
12
- opt :warning, "Dir files number warning threshold"
13
- opt :critical, "Dir files number critical threshold"
12
+ opt :warning, "Dir files number warning threshold", :type => Integer
13
+ opt :critical, "Dir files number critical threshold", :type => Integer
14
14
  opt :alert_on_missing, "Send a critical metric if the directory is missing?", :default => true
15
15
 
16
16
  def initialize
@@ -9,8 +9,8 @@ class Riemann::Tools::DirSpace
9
9
 
10
10
  opt :directory, "", :default => '/var/log'
11
11
  opt :service_prefix, "The first part of the service name, before the directory path", :default => "dir-space"
12
- opt :warning, "Dir space warning threshold (in bytes)"
13
- opt :critical, "Dir space critical threshold (in bytes)"
12
+ opt :warning, "Dir space warning threshold (in bytes)", :type => Integer
13
+ opt :critical, "Dir space critical threshold (in bytes)", :type => Integer
14
14
  opt :alert_on_missing, "Send a critical metric if the directory is missing?", :default => true
15
15
 
16
16
  def initialize
data/bin/riemann-net CHANGED
@@ -67,7 +67,15 @@ class Riemann::Tools::Net
67
67
  state = self.state
68
68
 
69
69
  if @old_state
70
+ # Report services from `@old_state` that don't exist in `state` as expired
71
+ @old_state.reject { |k| state.has_key?(k) }.each do |service, metric|
72
+ report(:service => service.dup, :state => 'expired')
73
+ end
74
+
75
+ # Report delta for services that have values in both `@old_state` and `state`
70
76
  state.each do |service, metric|
77
+ next unless @old_state.has_key?(service)
78
+
71
79
  delta = metric - @old_state[service]
72
80
  svc_state = case service
73
81
  when /drop$/
data/bin/riemann-ntp ADDED
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Reports NTP stats to Riemann.
4
+
5
+ require File.expand_path('../../lib/riemann/tools', __FILE__)
6
+
7
+ class Riemann::Tools::Ntp
8
+ include Riemann::Tools
9
+
10
+ def initialize
11
+ @hostname = `hostname`.chomp
12
+ end
13
+
14
+ def tick
15
+ stats = `ntpq -p -n`
16
+ stats.each_line do |stat|
17
+ m = stat.split()
18
+ next if m.grep(/^===/).any? || m.grep(/^remote/).any?
19
+ @ntp_host = m[0].gsub("*","").gsub("-","").gsub("+","")
20
+ send("delay",m[7])
21
+ send("offset",m[8])
22
+ send("jitter",m[9])
23
+ end
24
+ end
25
+
26
+ def send(type,metric)
27
+ report(
28
+ :host => @hostname,
29
+ :service => "ntp peer #{@ntp_host} #{type}",
30
+ :metric => metric.to_f,
31
+ :state => "ok",
32
+ :description => "ntp peer #{@ntp_host} #{type}",
33
+ :tags => ["ntp"]
34
+ )
35
+ end
36
+ end
37
+
38
+ Riemann::Tools::Ntp.run
data/bin/riemann-proc CHANGED
@@ -32,11 +32,12 @@ class Riemann::Tools::Proc
32
32
 
33
33
  def linux_proc
34
34
  process = opts[:proc_regex]
35
- running = Integer(`ps axo args | grep '#{process}' | grep -v grep | grep -v riemann-proc | wc -l`)
35
+ found = `ps axo args | grep '#{process}' | grep -v grep | grep -v riemann-proc`
36
+ running = found.count("\n")
36
37
  if running > @limits[:critical][:max] or running < @limits[:critical][:min]
37
- alert "proc #{process}", :critical, running, "process #{process} is running #{running} instances"
38
+ alert "proc #{process}", :critical, running, "process #{process} is running #{running} instances:\n" + found
38
39
  else
39
- alert "proc #{process}", :ok, running, "process #{process} is running #{running} instances"
40
+ alert "proc #{process}", :ok, running, "process #{process} is running #{running} instances:\n" + found
40
41
  end
41
42
  end
42
43
 
data/bin/riemann-rabbitmq CHANGED
@@ -107,11 +107,11 @@ class Riemann::Tools::Rabbitmq
107
107
  svc = "rabbitmq.queue.#{queue['vhost']}.#{queue['name']}"
108
108
  errs = []
109
109
 
110
- if queue['messages_ready'] > 0 and queue['consumers'] == 0
110
+ if queue['messages_ready']!=nil and queue['messages_ready'] > 0 and queue['consumers'] == 0
111
111
  errs << "Queue has jobs but no consumers"
112
112
  end
113
113
 
114
- if (max_size_check_filter.nil? or queue['name'] !~ max_size_check_filter) and queue['messages_ready'] > options[:max_queue_size]
114
+ if (max_size_check_filter.nil? or queue['name'] !~ max_size_check_filter) and queue['messages_ready']!=nil and queue['messages_ready'] > options[:max_queue_size]
115
115
  errs << "Queue has #{queue['messages_ready']} jobs"
116
116
  end
117
117
 
@@ -142,7 +142,7 @@ class Riemann::Tools::Rabbitmq
142
142
 
143
143
  stats.each_pair do |k,v|
144
144
  service = "#{svc}.#{k}"
145
- if k =~ /details$/
145
+ if k =~ /details$/ and v!=nil
146
146
  metric = v['rate']
147
147
  else
148
148
  metric = v
data/bin/riemann-varnish CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  # Reports varnish stats to Riemann.
4
4
 
5
+ require 'open3'
5
6
  require File.expand_path('../../lib/riemann/tools', __FILE__)
6
7
 
7
8
  class Riemann::Tools::Varnish
@@ -10,15 +11,32 @@ class Riemann::Tools::Varnish
10
11
  opt :varnish_host, "Varnish hostname", :default => `hostname`.chomp
11
12
 
12
13
  def initialize
13
- @vstats = [ "client_conn",
14
+ cmd = 'varnishstat -V'
15
+ Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
16
+ @ver = /varnishstat \(varnish-(\d+)/.match(stderr.read)[1].to_i
17
+ end
18
+
19
+ if @ver >= 4
20
+ @vstats = [ "MAIN.sess_conn",
21
+ "MAIN.sess_drop ",
22
+ "MAIN.client_req",
23
+ "MAIN.cache_hit",
24
+ "MAIN.cache_miss" ]
25
+ else
26
+ @vstats = [ "client_conn",
14
27
  "client_drop",
15
28
  "client_req",
16
29
  "cache_hit",
17
30
  "cache_miss" ]
31
+ end
18
32
  end
19
33
 
20
34
  def tick
21
- stats = `varnishstat -1 -f #{@vstats.join(",")}`
35
+ if @ver >= 4
36
+ stats = `varnishstat -1 -f #{@vstats.join(" -f ")}`
37
+ else
38
+ stats = `varnishstat -1 -f #{@vstats.join(",")}`
39
+ end
22
40
  stats.each_line do |stat|
23
41
  m = stat.split()
24
42
  report(
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riemann-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.2.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-01-26 00:00:00.000000000 Z
12
+ date: 2015-04-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: riemann-client
@@ -132,6 +132,7 @@ executables:
132
132
  - riemann-zookeeper
133
133
  - riemann-resmon
134
134
  - riemann-bench
135
+ - riemann-aws-rds-status
135
136
  - riemann-proc
136
137
  - riemann-freeswitch
137
138
  - riemann-aws-billing
@@ -150,6 +151,7 @@ executables:
150
151
  - riemann-cloudant
151
152
  - riemann-nginx-status
152
153
  - riemann-rabbitmq
154
+ - riemann-ntp
153
155
  - riemann-kvminstance
154
156
  - riemann-net
155
157
  - riemann-apache-status
@@ -159,6 +161,7 @@ files:
159
161
  - lib/riemann/tools.rb
160
162
  - bin/riemann-apache-status
161
163
  - bin/riemann-aws-billing
164
+ - bin/riemann-aws-rds-status
162
165
  - bin/riemann-aws-status
163
166
  - bin/riemann-bench
164
167
  - bin/riemann-cloudant
@@ -176,6 +179,7 @@ files:
176
179
  - bin/riemann-munin
177
180
  - bin/riemann-net
178
181
  - bin/riemann-nginx-status
182
+ - bin/riemann-ntp
179
183
  - bin/riemann-proc
180
184
  - bin/riemann-rabbitmq
181
185
  - bin/riemann-resmon