haproxy2rpm 0.0.1 → 0.0.2

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.
data/README.md CHANGED
@@ -4,11 +4,13 @@ such as erlang or node.js based applications
4
4
 
5
5
  ## Installation
6
6
 
7
+ gem install haproxy2rpm or clone it
8
+
7
9
  * copy your newrelic.yml file to $HOME/.newrelic/newrelic.yml
8
10
  * or set $NRCONFIG to point to your newrelic.yml file
9
11
 
10
12
  ## Running it
11
- haproxy2rpm /path/to/logfile
13
+ haproxy2rpm /path/to/logfile or ./bin/haproxy2rpm /path/to/log/file
12
14
 
13
15
  ## Analyzing it
14
16
 
@@ -28,5 +30,5 @@ At the moment, it only works with custom views
28
30
  ## Roadmap
29
31
 
30
32
  * daemonize option
31
- * syslog (udp maybe tcp) server with https://github.com/melito/em-syslog and then point HaProxy to that port. Why touch the disk if we don't have to?
33
+ * syslog (udp maybe tcp) server with https://github.com/loggly/logporter and then point HaProxy to that port. Why touch the disk if we don't have to?
32
34
  * Figure out how to report rpms and response times so that they show up inside the newrelic application view and not only as a custom metric
data/Rakefile CHANGED
@@ -2,6 +2,8 @@ require 'bundler/gem_tasks'
2
2
 
3
3
  require 'rake/testtask'
4
4
 
5
+ task :default => ['test:units']
6
+
5
7
  namespace :test do
6
8
  Rake::TestTask.new(:units) do |t|
7
9
  t.libs << "test"
data/bin/haproxy2rpm CHANGED
@@ -16,14 +16,17 @@ Basic Command Line Usage:
16
16
  Coniguration for newrelic is read from #{NEW_RELIC_CONFIG_PATH}
17
17
  HELP
18
18
 
19
- options = { :daemonize => false, :version => false }
19
+ options = { :daemonize => false, :version => false, :syslog => false }
20
20
 
21
21
  opts = OptionParser.new do |opts|
22
22
  opts.banner = help
23
23
  opts.on("-D", "--daemonize", "Daemonize") do
24
24
  options[:daemonize] = true
25
25
  end
26
-
26
+
27
+ opts.on("-s", "--syslog", "Run syslog server") do
28
+ options[:syslog] = true
29
+ end
27
30
  opts.on("-v", "--version", "Print the version number and exit") do
28
31
  options[:version] = true
29
32
  end
@@ -40,7 +43,7 @@ if(options[:version])
40
43
  exit(0)
41
44
  end
42
45
 
43
- unless File.exists?(log_file)
46
+ unless options[:syslog] || File.exists?(log_file)
44
47
  puts 'please proivde a valid path to a haproxy log file'
45
48
  puts ''
46
49
  puts help
@@ -52,12 +55,8 @@ unless File.exists?(NEW_RELIC_CONFIG_PATH)
52
55
  exit(1)
53
56
  end
54
57
 
55
- if(options[:daemonize])
56
- puts 'dameon mode not implemented yet'
57
- else
58
- trap("SIGINT") {
59
- Haproxy2Rpm.stop
60
- exit(0)
61
- }
62
- Haproxy2Rpm.run(log_file)
63
- end
58
+ trap("SIGINT") {
59
+ Haproxy2Rpm.stop
60
+ exit(0)
61
+ }
62
+ Haproxy2Rpm.run(log_file, options)
data/haproxy2rpm.gemspec CHANGED
@@ -12,6 +12,7 @@ Gem::Specification.new do |s|
12
12
  s.description = "Sending haproxy logs to new relic rpm"
13
13
  s.add_dependency "newrelic_rpm"
14
14
  s.add_dependency "eventmachine-tail"
15
+ s.add_development_dependency "rake"
15
16
  s.add_development_dependency "shoulda-context"
16
17
 
17
18
  s.files = `git ls-files`.split("\n")
@@ -0,0 +1,13 @@
1
+ module Haproxy2Rpm
2
+ class Rpm
3
+ def initialize()
4
+ NewRelic::Agent.manual_start
5
+ @stats_engine = NewRelic::Agent.agent.stats_engine
6
+ end
7
+
8
+ def send(line)
9
+ request = LineParser.new(line)
10
+ @stats_engine.get_stats('Custom/HAProxy/response_times',false).record_data_point(request.tr)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,50 @@
1
+ # Taken from
2
+ # https://raw.github.com/jordansissel/experiments/master/ruby/eventmachine-speed/basic.rb
3
+ module Haproxy2Rpm
4
+ class SyslogHandler < EventMachine::Connection
5
+ def initialize
6
+ @rpm = Rpm.new
7
+ @count = 0
8
+ @buffer = BufferedTokenizer.new
9
+ @start = Time.now
10
+
11
+ # The syslog parsing stuff here taken from the 'logporter' gem.
12
+ pri = "(?:<(?<pri>[0-9]{1,3})>)?"
13
+ month = "(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"
14
+ day = "(?: [1-9]|[12][0-9]|3[01])"
15
+ hour = "(?:[01][0-9]|2[0-4])"
16
+ minute = "(?:[0-5][0-9])"
17
+ second = "(?:[0-5][0-9])"
18
+ time = [hour, minute, second].join(":")
19
+ timestamp = "(?<timestamp>#{month} #{day} #{time})"
20
+ hostname = "(?<hostname>[A-Za-z0-9_.:]+)"
21
+ header = timestamp + " " + hostname
22
+ message = "(?<message>[ -~]+)" # ascii 32 to 126
23
+ re = "^#{pri}#{header} #{message}$"
24
+
25
+ if RUBY_VERSION =~ /^1\.8/
26
+ # Ruby 1.8 doesn't support named captures
27
+ # replace (?<foo> with (
28
+ re = re.gsub(/\(\?<[^>]+>/, "(")
29
+ end
30
+
31
+ @syslog3164_re = Regexp.new(re)
32
+ end # def initialize
33
+
34
+ def receive_data(data)
35
+ # In jruby+netty, we probaby should use the DelimiterBasedFrameDecoder
36
+ # But for the sake of simplicity, we'll use EM's BufferedTokenizer for
37
+ # all implementations.
38
+ @buffer.extract(data).each do |line|
39
+ receive_line(line.chomp)
40
+ end
41
+ end # def receive_event
42
+
43
+ def receive_line(line)
44
+ @count += 1
45
+ # Just try matching, don't need to do anything with it for this benchmark.
46
+ m = @syslog3164_re.match(line)
47
+ @rpm.send(m[:message])
48
+ end
49
+ end
50
+ end
@@ -1,3 +1,3 @@
1
1
  module Haproxy2Rpm
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/haproxy2rpm.rb CHANGED
@@ -6,15 +6,20 @@ require "eventmachine-tail"
6
6
  require "haproxy2rpm/version"
7
7
  require "haproxy2rpm/file_parser"
8
8
  require "haproxy2rpm/line_parser"
9
+ require "haproxy2rpm/syslog"
10
+ require "haproxy2rpm/rpm"
9
11
 
10
12
  module Haproxy2Rpm
11
- def self.run(log_file)
12
- NewRelic::Agent.manual_start
13
- stats_engine = NewRelic::Agent.agent.stats_engine
14
- EventMachine.run do
15
- EventMachine::file_tail(log_file) do |filetail, line|
16
- request = LineParser.new(line)
17
- stats_engine.get_stats('Custom/HAProxy/response_times',false).record_data_point(request.tr)
13
+ def self.run(log_file, options)
14
+ @rpm = Rpm.new
15
+ if(options[:daemonize])
16
+ puts 'daemonizing'
17
+ run_daemonized(log_file, options)
18
+ else
19
+ if(options[:syslog])
20
+ run_syslog_server(options)
21
+ else
22
+ default_run(log_file, options)
18
23
  end
19
24
  end
20
25
  end
@@ -23,4 +28,45 @@ module Haproxy2Rpm
23
28
  puts 'stopping new relic agent'
24
29
  NewRelic::Agent.shutdown
25
30
  end
26
- end
31
+
32
+ def self.run_syslog_server(options)
33
+ NewRelic::Agent.manual_start
34
+ EventMachine::run do
35
+ EventMachine.start_server("0.0.0.0", 3333, SyslogHandler)
36
+ end
37
+ end
38
+
39
+ def self.default_run(log_file,options)
40
+ EventMachine.run do
41
+ EventMachine::file_tail(log_file) do |filetail, line|
42
+ @rpm.send(line)
43
+ end
44
+ end
45
+ end
46
+
47
+ def self.run_daemonized(log_file, options)
48
+ Signal.trap('HUP') {}
49
+
50
+ pid = fork do
51
+ begin
52
+ if(options[:syslog])
53
+ run_syslog_server(options)
54
+ else
55
+ default_run(log_file, options)
56
+ end
57
+ rescue => e
58
+ puts e.message
59
+ puts e.backtrace.join("\n")
60
+ abort "There was a fatal system error while starting haproxy2rpm"
61
+ end
62
+ end
63
+
64
+ if options[:pid]
65
+ File.open(options[:pid], 'w') { |f| f.write pid }
66
+ end
67
+
68
+ ::Process.detach pid
69
+
70
+ exit
71
+ end
72
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: haproxy2rpm
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.1
5
+ version: 0.0.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Patrick Huesler
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-07-08 00:00:00 +02:00
13
+ date: 2011-07-09 00:00:00 +02:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -36,7 +36,7 @@ dependencies:
36
36
  type: :runtime
37
37
  version_requirements: *id002
38
38
  - !ruby/object:Gem::Dependency
39
- name: shoulda-context
39
+ name: rake
40
40
  prerelease: false
41
41
  requirement: &id003 !ruby/object:Gem::Requirement
42
42
  none: false
@@ -46,6 +46,17 @@ dependencies:
46
46
  version: "0"
47
47
  type: :development
48
48
  version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: shoulda-context
51
+ prerelease: false
52
+ requirement: &id004 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ type: :development
59
+ version_requirements: *id004
49
60
  description: Sending haproxy logs to new relic rpm
50
61
  email:
51
62
  - patrick.huesler@gmail.com
@@ -65,6 +76,8 @@ files:
65
76
  - lib/haproxy2rpm.rb
66
77
  - lib/haproxy2rpm/file_parser.rb
67
78
  - lib/haproxy2rpm/line_parser.rb
79
+ - lib/haproxy2rpm/rpm.rb
80
+ - lib/haproxy2rpm/syslog.rb
68
81
  - lib/haproxy2rpm/version.rb
69
82
  - test/fixtures/haproxy.log
70
83
  - test/haproxy2pm_test.rb