Class: Fluent::Stackprof

Inherits:
Object
  • Object
show all
Defined in:
lib/fluent/stackprof.rb

Instance Method Summary collapse

Instance Method Details

#parse_options(argv = ARGV) ⇒ Object



6
7
8
9
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/fluent/stackprof.rb', line 6

def parse_options(argv = ARGV)
  op = OptionParser.new
  op.banner += ' <start/stop> [output_file]'

  (class<<self;self;end).module_eval do
    define_method(:usage) do |msg|
      puts op.to_s
      puts "error: #{msg}" if msg
      exit 1
    end
  end

  opts = {
    host: '127.0.0.1',
    port: 24230,
    unix: nil,
    command: nil, # start or stop
    output: '/tmp/fluent-stackprof.dump',
    mode: 'cpu',
  }

  op.on('-h', '--host HOST', "fluent host (default: #{opts[:host]})") {|v|
    opts[:host] = v
  }

  op.on('-p', '--port PORT', "debug_agent tcp port (default: #{opts[:host]})", Integer) {|v|
    opts[:port] = v
  }

  op.on('-u', '--unix PATH', "use unix socket instead of tcp") {|v|
    opts[:unix] = v
  }

  op.on('-o', '--output PATH', "output path (default: #{opts[:output]})") {|v|
    opts[:output] = v
  }

  op.on('-m', '--mode MODE', "stackprof measure mode (default: #{opts[:mode]})") {|v|
    opts[:mode] = v
  }

  op.parse!(argv)

  opts[:command] = argv.shift
  unless %w[start stop].include?(opts[:command])
    raise OptionParser::InvalidOption.new("`start` or `stop` must be specified as the 1st argument")
  end

  modes = %w[wall cpu object custom]
  unless modes.include?(opts[:mode])
    raise OptionParser::InvalidOption.new("-m allows one of #{modes.join(', ')}")
  end

  opts
end

#runObject



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/fluent/stackprof.rb', line 62

def run
  begin
    opts = parse_options
  rescue OptionParser::InvalidOption => e
    usage e.message
  end

  unless opts[:unix].nil?
    uri = "drbunix:#{opts[:unix]}"
  else
    uri = "druby://#{opts[:host]}:#{opts[:port]}"
  end

  $remote_engine = DRb::DRbObject.new_with_uri(uri)

  case opts[:command]
  when 'start'
    remote_code = "    require 'stackprof'\n    StackProf.start(mode: :\#{opts[:mode]})\n    CODE\n  when 'stop'\n    remote_code = <<-\"CODE\"\n    StackProf.stop\n    StackProf.results('\#{opts[:output]}')\n    CODE\n  end\n\n  puts remote_code\n  $remote_engine.method_missing(:instance_eval, remote_code)\n\n  case opts[:command]\n  when 'start'\n    $stdout.puts 'fluent-stackprof: started'\n  when 'stop'\n    $stdout.puts \"fluent-stackprof: outputs to \#{opts[:output]}\"\n  end\nend\n"