Class: Bipbip::Plugin

Inherits:
Object
  • Object
show all
Includes:
InterruptibleSleep
Defined in:
lib/bipbip/plugin.rb

Direct Known Subclasses

Apache2, Gearman, Memcached, Mysql, Nginx, Redis

Defined Under Namespace

Classes: Apache2, Gearman, Memcached, Mysql, Nginx, Redis

Instance Method Summary collapse

Methods included from InterruptibleSleep

#interrupt_sleep, #interruptible_sleep

Constructor Details

#initialize(name) ⇒ Plugin

Returns a new instance of Plugin.



6
7
8
# File 'lib/bipbip/plugin.rb', line 6

def initialize(name)
  @name = name.to_s
end

Instance Method Details

#interruptObject



36
37
38
39
40
# File 'lib/bipbip/plugin.rb', line 36

def interrupt
  Bipbip.logger.info "Interrupting plugin process #{Process.pid}"
  @interrupted = true
  interrupt_sleep
end

#interrupted?Boolean

Returns:

  • (Boolean)


42
43
44
# File 'lib/bipbip/plugin.rb', line 42

def interrupted?
  @interrupted || Process.getpgid(Process.ppid) != Process.getpgrp
end

#metric_identifier(server) ⇒ Object



50
51
52
53
54
55
56
# File 'lib/bipbip/plugin.rb', line 50

def metric_identifier(server)
  identifier = Bipbip.fqdn
  unless server.empty?
    identifier += '::' + server.values.first
  end
  identifier
end

#metrics_namesObject



58
59
60
# File 'lib/bipbip/plugin.rb', line 58

def metrics_names
  metrics_schema.map {|metric| metric[:name] }
end

#metrics_schemaObject



62
63
64
# File 'lib/bipbip/plugin.rb', line 62

def metrics_schema
  raise 'Missing method metrics_schema'
end

#monitor(server) ⇒ Object



66
67
68
# File 'lib/bipbip/plugin.rb', line 66

def monitor(server)
  raise 'Missing method monitor'
end

#nameObject



46
47
48
# File 'lib/bipbip/plugin.rb', line 46

def name
  @name
end

#run(server, frequency) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/bipbip/plugin.rb', line 10

def run(server, frequency)
  child_pid = fork do
    ['INT', 'TERM'].each { |sig| trap(sig) {
      Thread.new { interrupt } if !@interrupted
    } }

    retry_delay = frequency
    metric_identifier = metric_identifier(server)
    begin
      until interrupted? do
        time = Time.now
        data = monitor(server)
        Bipbip.logger.debug "#{name} #{metric_identifier}: Data: #{data}"
        CopperEgg::MetricSample.save(name, metric_identifier, Time.now.to_i, data)
        retry_delay = frequency
        interruptible_sleep (frequency - (Time.now - time))
      end
    rescue => e
      Bipbip.logger.error "#{name} #{metric_identifier}: Error getting data: #{e.inspect}"
      interruptible_sleep retry_delay
      retry_delay += frequency if retry_delay < frequency * 10
      retry
    end
  end
end