mysql-heartbeat 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6e93ade565eea9f1b66486408985bfb44d5b79ac
4
- data.tar.gz: 9646d80688a80acbceabac57b5b50aa596fa878e
3
+ metadata.gz: 2228d01f5df78e6c69bd08f0a6720a3703d3fb60
4
+ data.tar.gz: 5261b1f8d8f138986ead23b3612ed0498812fc6b
5
5
  SHA512:
6
- metadata.gz: ed5e41132f88501024905824e6cf6ff5a99e55c592d38f1170658c74a7bfce9b00ca8ec8f72b0f8fa4914fbada56403cd3faf6aa60845c8e7587e1a0b7c25311
7
- data.tar.gz: 3efd5f6234c8b32451821f4d23017b8dbb052b1085dcc5d26f5f47d6d82cd8b180d18a6fbbbfc3ebae86539ec12ed43fd1464cdff28860d7ed89ffb82ba8237f
6
+ metadata.gz: b2ceedc9f2a3adfb14fdfdd9c804c240d7e9f555ab3db7c62afea45618e016f4e28115e25e57c37e62550541356716d6ef9b86385cbb4056a0b2fc317230c27b
7
+ data.tar.gz: 93c6b45405ed8b5ef8f438fc69f52c4fba8088fdfc8c6cb2179c3458d55d480d489b91dd0c49cd3522d3503c56167febae24535554d580583dc56487507a447e
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mysql-heartbeat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Barney
@@ -14,56 +14,56 @@ dependencies:
14
14
  name: sinatra
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.4'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.4'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: mysql2
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0.3'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0.3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: celluloid
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0.15'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0.15'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: thin
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '1.6'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.6'
69
69
  description: " Queries the replication health of a MySQL server.\n A health
@@ -71,26 +71,10 @@ description: " Queries the replication health of a MySQL server.\n A healt
71
71
  like HAProxy to check the\n health of replication, and load balance across read
72
72
  slaves.\n"
73
73
  email: johnb0011@gmail.com
74
- executables:
75
- - mysql-heartbeat
74
+ executables: []
76
75
  extensions: []
77
76
  extra_rdoc_files: []
78
- files:
79
- - .travis.yml
80
- - Gemfile
81
- - Gemfile.lock
82
- - Guardfile
83
- - README.md
84
- - bin/mysql-heartbeat
85
- - config/example_mysql.yml
86
- - config/travis.yml
87
- - lib/mysql-heartbeat.rb
88
- - lib/mysql-heartbeat/health.rb
89
- - lib/mysql-heartbeat/version.rb
90
- - lib/mysql-heartbeat/worker.rb
91
- - mysql-heartbeat.gemspec
92
- - spec/requests/base_spec.rb
93
- - spec/spec_helper.rb
77
+ files: []
94
78
  homepage: http://github.com/johnb0011/mysql_heartbeat
95
79
  licenses: []
96
80
  metadata: {}
@@ -100,17 +84,17 @@ require_paths:
100
84
  - lib
101
85
  required_ruby_version: !ruby/object:Gem::Requirement
102
86
  requirements:
103
- - - '>='
87
+ - - ">="
104
88
  - !ruby/object:Gem::Version
105
89
  version: 1.9.3
106
90
  required_rubygems_version: !ruby/object:Gem::Requirement
107
91
  requirements:
108
- - - '>='
92
+ - - ">="
109
93
  - !ruby/object:Gem::Version
110
94
  version: '0'
111
95
  requirements: []
112
96
  rubyforge_project:
113
- rubygems_version: 2.0.3
97
+ rubygems_version: 2.1.10
114
98
  signing_key:
115
99
  specification_version: 4
116
100
  summary: Queries the replication health of a MySQL server.
@@ -1,10 +0,0 @@
1
- language: ruby
2
- bundler_args: ""
3
- rvm:
4
- - 2.0.0
5
- - 1.9.3
6
- env:
7
- - "RACK_ENV=test"
8
- script:
9
- - bundle exec rspec --color --format progress
10
- - bundle exec rubocop
data/Gemfile DELETED
@@ -1,20 +0,0 @@
1
- source 'http://rubygems.org'
2
- gem 'sinatra'
3
- gem 'mysql2'
4
- gem 'celluloid'
5
- gem 'thin'
6
-
7
- group :test, :development do
8
- gem 'rspec'
9
- end
10
-
11
- group :development do
12
- gem 'guard'
13
- gem 'guard-rubocop'
14
- gem 'guard-rspec'
15
- end
16
-
17
- group :test do
18
- gem 'rubocop'
19
- gem 'rack-test'
20
- end
@@ -1,87 +0,0 @@
1
- GEM
2
- remote: http://rubygems.org/
3
- specs:
4
- ast (1.1.0)
5
- celluloid (0.15.2)
6
- timers (~> 1.1.0)
7
- coderay (1.0.9)
8
- daemons (1.1.9)
9
- diff-lcs (1.2.4)
10
- eventmachine (1.0.3)
11
- ffi (1.9.3)
12
- formatador (0.2.4)
13
- guard (2.2.2)
14
- formatador (>= 0.2.4)
15
- listen (~> 2.1)
16
- lumberjack (~> 1.0)
17
- pry (>= 0.9.12)
18
- thor (>= 0.18.1)
19
- guard-rspec (4.0.3)
20
- guard (>= 2.1.1)
21
- rspec (~> 2.14)
22
- guard-rubocop (1.0.0)
23
- guard (~> 2.0)
24
- rubocop (~> 0.10)
25
- listen (2.2.0)
26
- celluloid (>= 0.15.2)
27
- rb-fsevent (>= 0.9.3)
28
- rb-inotify (>= 0.9)
29
- lumberjack (1.0.4)
30
- method_source (0.8.2)
31
- mysql2 (0.3.13)
32
- parser (2.0.0)
33
- ast (~> 1.1)
34
- slop (~> 3.4, >= 3.4.5)
35
- powerpack (0.0.9)
36
- pry (0.9.12.2)
37
- coderay (~> 1.0.5)
38
- method_source (~> 0.8)
39
- slop (~> 3.4)
40
- rack (1.5.2)
41
- rack-protection (1.5.1)
42
- rack
43
- rack-test (0.6.2)
44
- rack (>= 1.0)
45
- rainbow (1.1.4)
46
- rb-fsevent (0.9.3)
47
- rb-inotify (0.9.2)
48
- ffi (>= 0.5.0)
49
- rspec (2.14.1)
50
- rspec-core (~> 2.14.0)
51
- rspec-expectations (~> 2.14.0)
52
- rspec-mocks (~> 2.14.0)
53
- rspec-core (2.14.7)
54
- rspec-expectations (2.14.3)
55
- diff-lcs (>= 1.1.3, < 2.0)
56
- rspec-mocks (2.14.4)
57
- rubocop (0.14.1)
58
- parser (~> 2.0)
59
- powerpack (~> 0.0.6)
60
- rainbow (>= 1.1.4)
61
- sinatra (1.4.4)
62
- rack (~> 1.4)
63
- rack-protection (~> 1.4)
64
- tilt (~> 1.3, >= 1.3.4)
65
- slop (3.4.6)
66
- thin (1.6.1)
67
- daemons (>= 1.0.9)
68
- eventmachine (>= 1.0.0)
69
- rack (>= 1.0.0)
70
- thor (0.18.1)
71
- tilt (1.4.1)
72
- timers (1.1.0)
73
-
74
- PLATFORMS
75
- ruby
76
-
77
- DEPENDENCIES
78
- celluloid
79
- guard
80
- guard-rspec
81
- guard-rubocop
82
- mysql2
83
- rack-test
84
- rspec
85
- rubocop
86
- sinatra
87
- thin
data/Guardfile DELETED
@@ -1,29 +0,0 @@
1
- # A sample Guardfile
2
- # More info at https://github.com/guard/guard#readme
3
-
4
- guard :rubocop do
5
- watch(%r{.+\.rb$})
6
- watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
7
- end
8
-
9
- guard :rspec do
10
- watch(%r{^spec/.+_spec\.rb$})
11
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
12
- watch('spec/spec_helper.rb') { "spec" }
13
-
14
- # Rails example
15
- watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
16
- watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
17
- watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
18
- watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
19
- watch('config/routes.rb') { "spec/routing" }
20
- watch('app/controllers/application_controller.rb') { "spec/controllers" }
21
-
22
- # Capybara features specs
23
- watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
24
-
25
- # Turnip features and steps
26
- watch(%r{^spec/acceptance/(.+)\.feature$})
27
- watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
28
- end
29
-
data/README.md DELETED
@@ -1,57 +0,0 @@
1
- [![Dependency Status](https://gemnasium.com/johnbarney/mysql-heartbeat.png)](https://gemnasium.com/johnbarney/mysql-heartbeat)
2
- [![Build Status](https://secure.travis-ci.org/johnbarney/mysql-heartbeat.png)](http://travis-ci.org/johnbarney/mysql-heartbeat)
3
- [![Gem Version](https://badge.fury.io/rb/mysql-heartbeat.png)](http://badge.fury.io/rb/mysql-heartbeat)
4
- # MySQL Heartbeat
5
-
6
- A health monitor for MySQL replication. This can be used in tandem with applications like HAProxy to check the health of replication, and load balance across read slaves.
7
-
8
- Installation
9
- ------------
10
-
11
- Installation is as easy as installing a gem.
12
-
13
- $ gem install mysql-heartbeat
14
- $ mysql-heartbeat yourconfig.yml
15
-
16
- Configuration
17
- -------------
18
-
19
- Make a copy of database.yml for each MySQL instance you want to watch. You can launch as many of these instances as you like as long as they each use a different local port.
20
-
21
- custom.yml:
22
-
23
- host: "localhost" # Address of MySQL instance
24
- username: "health" # Username of MySQL user
25
- password: "health99" # Password of MySQL user
26
- health_port: 6977 # Port this instance of MySQL health resides on
27
- tolerance: 5 # How far behind MySQL replication can be before healthchecks fail
28
-
29
- $ ruby heartbeat.rb custom.yml
30
-
31
- Note: The user must have REPLICATION CLIENT privileges for mysql_heartbeat to function.
32
-
33
- Example:
34
-
35
- mysql> create user 'health'@'localhost' identified by 'health99';
36
-
37
- mysql> grant REPLICATION CLIENT on *.* to 'health'@'localhost';
38
-
39
- Process Control
40
- ---------------
41
-
42
- I would recommend either [Supervisord](http://supervisord.org/ "Supervisord") or [Bluepill](https://github.com/bluepill-rb/bluepill "Bluepill") to manage forking and management of instances.
43
-
44
- HAProxy Configuration
45
- ---------------------
46
-
47
- Coming Soon!
48
-
49
- Work in Progress
50
- ----------------
51
-
52
- This project is primarily to teach myself how to write tests, and integrate with Travis. It's still a long way from complete. Contributions and suggestions are always welcome.
53
-
54
- Contributing
55
- ------------
56
-
57
- See GitHub's ["Fork A Repo"](https://help.github.com/articles/fork-a-repo "Forking a project") for more information.
@@ -1,15 +0,0 @@
1
- #! /usr/bin/env ruby
2
- # -*- encoding: utf-8 -*-
3
-
4
- if RUBY_VERSION >= '1.9.3'
5
- if ARGV[0].nil? && ENV['RACK_ENV'] != 'test'
6
- puts 'No configuration file specified'
7
- exit 1
8
- end
9
- $LOAD_PATH.unshift(File.dirname(File.realpath(__FILE__)) + '/../lib')
10
- require 'mysql-heartbeat'
11
- HeartBeat.run!
12
- else
13
- puts 'mysql-heartbeat supports only Ruby 1.9.3+'
14
- exit(-1)
15
- end
@@ -1,5 +0,0 @@
1
- host: "localhost"
2
- username: "health"
3
- password: "check99"
4
- tolerance: 5
5
- health_port: 6977
@@ -1,5 +0,0 @@
1
- host: 'localhost'
2
- username: 'travis'
3
- password: ''
4
- tolerance: 5
5
- health_port: 6977
@@ -1,26 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- require 'sinatra/base'
3
- require 'yaml'
4
- require 'rack/test' if ENV['RACK_ENV'] == 'test'
5
- require 'mysql-heartbeat/health'
6
- require 'mysql-heartbeat/worker'
7
- require 'mysql-heartbeat/version'
8
-
9
- # Heartbeat Class
10
- class HeartBeat < Sinatra::Base
11
- configure do
12
- if ENV['RACK_ENV'] == 'test'
13
- config = YAML.load_file("#{File.dirname(__FILE__)}/../config/travis.yml")
14
- else
15
- config = YAML.load_file(ARGV[0])
16
- end
17
- set :port, config['health_port'].to_i
18
- set :bind, '0.0.0.0'
19
- set :server, 'thin'
20
- set :process, HeartbeatWorker.new(config)
21
- end
22
-
23
- options '/' do
24
- settings.process.current_health
25
- end
26
- end
@@ -1,55 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- require 'mysql2'
3
-
4
- # Is MySQL healthy?
5
- class Health
6
- def initialize(config)
7
- @conn = Mysql2::Client.new(host: config['host'],
8
- username: config['username'],
9
- password: config['password']
10
- )
11
- @tolerance = config[:tolerance]
12
- get_status
13
- rescue => ex
14
- puts ex
15
- puts 'Could not connect to MySQL.'
16
- end
17
-
18
- def get_status
19
- results = @conn.query('show slave status;')
20
- results.each do |row|
21
- @sec_behind = row['Seconds_Behind_Master'].to_i
22
- @slave_sql = row['Slave_SQL_Running'] == 'Yes'
23
- @slave_io = row['Slave_IO_Running'] == 'Yes'
24
- @last_error = row['Last_Error']
25
- end
26
- rescue => ex
27
- puts ex
28
- puts 'Could not query slave status.'
29
- end
30
-
31
- def replicating?
32
- @slave_sql && @slave_io
33
- end
34
-
35
- def behind?
36
- @sec_behind > @tolerance unless @sec_behind.nil?
37
- end
38
-
39
- def healthy?
40
- if replicating? && !behind?
41
- return [200, "OK\n"]
42
- else
43
- reason = "Replication is not healthy!
44
- \nSlave_IO running: #{@slave_io}
45
- \nSlave_SQL running: #{@slave_sql}
46
- \nSeconds Behind: #{@sec_behind}
47
- \nLast Error: #{@last_error}"
48
- return [503, reason]
49
- end
50
- end
51
-
52
- def conn_close
53
- @conn.close unless @conn.nil?
54
- end
55
- end
@@ -1,5 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- # Version
3
- module MysqlHeartBeat
4
- VERSION = '0.1.1'.freeze
5
- end
@@ -1,25 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- require 'celluloid'
3
-
4
- # Celluloid worker
5
- class HeartbeatWorker
6
- include Celluloid
7
- attr_reader :current_health
8
-
9
- def initialize(config)
10
- @config = config
11
- async.worker
12
- end
13
-
14
- def worker
15
- loop do
16
- begin
17
- db = Health.new(@config)
18
- @current_health = db.healthy?
19
- sleep 15
20
- ensure
21
- db.conn_close unless db.nil?
22
- end
23
- end
24
- end
25
- end
@@ -1,29 +0,0 @@
1
- $LOAD_PATH.push File.expand_path("../lib", __FILE__)
2
-
3
- require "mysql-heartbeat/version"
4
-
5
- Gem::Specification.new do |s|
6
- s.name = 'mysql-heartbeat'
7
- s.version = MysqlHeartBeat::VERSION.dup
8
- s.date = '2013-10-28'
9
- s.summary = "Queries the replication health of a MySQL server."
10
- s.description = <<-EOF
11
- Queries the replication health of a MySQL server.
12
- A health monitor for MySQL replication. This can be used
13
- in tandem with applications like HAProxy to check the
14
- health of replication, and load balance across read slaves.
15
- EOF
16
-
17
- s.add_dependency 'sinatra', '~> 1.4'
18
- s.add_dependency 'mysql2', '~> 0.3'
19
- s.add_dependency 'celluloid', '~> 0.15'
20
- s.add_dependency 'thin', '~> 1.6'
21
-
22
- s.authors = ["John Barney"]
23
- s.email = 'johnb0011@gmail.com'
24
- s.required_ruby_version = '>= 1.9.3'
25
- s.platform = Gem::Platform::RUBY
26
- s.files = `git ls-files`.split("\n")
27
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
28
- s.homepage = 'http://github.com/johnb0011/mysql_heartbeat'
29
- end
@@ -1,14 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- # spec/features/base_spec.rb
3
- require_relative '../spec_helper'
4
-
5
- describe 'Root Path' do
6
- describe 'OPTIONS /' do
7
- before { options '/' }
8
-
9
- it 'is successful' do
10
- # Yep. I wrote a test to pass on a 503. Deal with it. (This will change)
11
- expect(last_response.status).to eq(503)
12
- end
13
- end
14
- end
@@ -1,13 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- # spec/spec_helper.rb
3
- ENV['RACK_ENV'] = 'test'
4
-
5
- require_relative File.join('..', 'lib/mysql-heartbeat')
6
-
7
- RSpec.configure do |config|
8
- include Rack::Test::Methods
9
-
10
- def app
11
- HeartBeat
12
- end
13
- end