easymon 1.4.2 → 1.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/easymon/checks/active_record_mysql_writeable_check.rb +29 -0
- data/lib/easymon/checks/redis_writeable_check.rb +36 -0
- data/lib/easymon/checks/split_active_record_check.rb +12 -12
- data/lib/easymon/version.rb +1 -1
- data/lib/easymon.rb +2 -0
- data/test/dummy/app/assets/config/manifest.js +0 -0
- data/test/dummy/config/database.yml +2 -2
- data/test/dummy/config/storage.yml +0 -0
- data/test/dummy/log/development.log +24 -66
- data/test/dummy/log/test.log +6934 -1282
- data/test/dummy/tmp/cache/4D4/7A0/health_check +1 -1
- data/test/test_helper.rb +1 -1
- data/test/unit/checks/active_record_mysql_writeable_check_test.rb +27 -0
- data/test/unit/checks/redis_writeable_check_test.rb +28 -0
- data/test/unit/checks/split_active_record_check_test.rb +19 -19
- metadata +17 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a3712c0b6f801e51d8ea6c772e78822a34d3ceb96f8726ed7b1e49c9d176d89
|
4
|
+
data.tar.gz: 69578f0bf9e951c067a7fb4cdfae3ef5970ba93f22507199f1574d5cb27287fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5b5201d16b662203549c8c75187ee497be56340511633d65c0762ca880dc241c76f84fbea71dd23bc3bdcb9d190adf921b9016885dd2b66c7718aea1d56cfaae
|
7
|
+
data.tar.gz: 4abf477bdf728f078780a5ef85539dc38fd4810d3cff48a468220b78d088ff41e57579fdc6c6b9a5dfce8fc887ffabd0e6b9178c0eb34ed603e00384ebbd8100
|
data/README.md
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
module Easymon
|
2
|
+
class ActiveRecordMysqlWriteableCheck
|
3
|
+
attr_accessor :klass
|
4
|
+
|
5
|
+
def initialize(klass, makara = false)
|
6
|
+
self.klass = klass
|
7
|
+
@query = "SELECT @@read_only"
|
8
|
+
# Trick makara into using the primary db
|
9
|
+
@query += " for UPDATE" if makara
|
10
|
+
end
|
11
|
+
|
12
|
+
def check
|
13
|
+
check_status = database_writeable?
|
14
|
+
if check_status
|
15
|
+
message = "@@read_only is 0"
|
16
|
+
else
|
17
|
+
message = "@@read_only is 1"
|
18
|
+
end
|
19
|
+
[check_status, message]
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
def database_writeable?
|
24
|
+
klass.connection.execute(@query).entries.flatten.first == 0
|
25
|
+
rescue
|
26
|
+
false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require "redis"
|
2
|
+
|
3
|
+
module Easymon
|
4
|
+
class RedisWriteableCheck
|
5
|
+
attr_accessor :config
|
6
|
+
|
7
|
+
def initialize(config)
|
8
|
+
self.config = config
|
9
|
+
end
|
10
|
+
|
11
|
+
def check
|
12
|
+
check_status = redis_writeable?
|
13
|
+
message = check_status ? "Writeable" : "Read Only"
|
14
|
+
|
15
|
+
[check_status, message]
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def redis_writeable?
|
20
|
+
redis = Redis.new(@config)
|
21
|
+
key = "easymon_#{Time.now.to_i}"
|
22
|
+
reply = redis.set(key, "true")
|
23
|
+
redis.del(key)
|
24
|
+
|
25
|
+
reply == "OK"
|
26
|
+
rescue
|
27
|
+
false
|
28
|
+
ensure
|
29
|
+
if redis.respond_to? :close
|
30
|
+
redis.close # Redis 4+
|
31
|
+
else
|
32
|
+
redis.client.disconnect # Older redis
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -2,10 +2,10 @@ module Easymon
|
|
2
2
|
class SplitActiveRecordCheck
|
3
3
|
attr_accessor :block
|
4
4
|
attr_accessor :results
|
5
|
-
|
5
|
+
|
6
6
|
# Here we pass a block so we get a fresh instance of ActiveRecord::Base or
|
7
7
|
# whatever other class we might be using to make database connections
|
8
|
-
#
|
8
|
+
#
|
9
9
|
# For example, given the following other class:
|
10
10
|
# module Easymon
|
11
11
|
# class Base < ActiveRecord::Base
|
@@ -18,12 +18,12 @@ module Easymon
|
|
18
18
|
# end
|
19
19
|
#
|
20
20
|
# def database_configuration
|
21
|
-
# env = "#{Rails.env}
|
21
|
+
# env = "#{Rails.env}_replica"
|
22
22
|
# config = YAML.load_file(Rails.root.join('config/database.yml'))[env]
|
23
23
|
# end
|
24
24
|
# end
|
25
25
|
# end
|
26
|
-
#
|
26
|
+
#
|
27
27
|
# We would check both it and ActiveRecord::Base like so:
|
28
28
|
# check = Easymon::SplitActiveRecordCheck.new {
|
29
29
|
# [ActiveRecord::Base.connection, Easymon::Base.connection]
|
@@ -31,20 +31,20 @@ module Easymon
|
|
31
31
|
# Easymon::Repository.add("split-database", check)
|
32
32
|
def initialize(&block)
|
33
33
|
self.block = block
|
34
|
-
end
|
35
|
-
|
34
|
+
end
|
35
|
+
|
36
36
|
# Assumes only 2 connections
|
37
37
|
def check
|
38
38
|
connections = Array(@block.call)
|
39
39
|
|
40
40
|
results = connections.map{|connection| database_up?(connection) }
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
[(results.all? && results.count > 0), "#{
|
41
|
+
|
42
|
+
primary_status = results.first ? "Primary: Up" : "Primary: Down"
|
43
|
+
replica_status = results.last ? "Replica: Up" : "Replica: Down"
|
44
|
+
|
45
|
+
[(results.all? && results.count > 0), "#{primary_status} - #{replica_status}"]
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
private
|
49
49
|
def database_up?(connection)
|
50
50
|
connection.active?
|
data/lib/easymon/version.rb
CHANGED
data/lib/easymon.rb
CHANGED
@@ -8,8 +8,10 @@ require "easymon/repository"
|
|
8
8
|
require "easymon/result"
|
9
9
|
|
10
10
|
require "easymon/checks/active_record_check"
|
11
|
+
require "easymon/checks/active_record_mysql_writeable_check"
|
11
12
|
require "easymon/checks/split_active_record_check"
|
12
13
|
require "easymon/checks/redis_check"
|
14
|
+
require "easymon/checks/redis_writeable_check"
|
13
15
|
require "easymon/checks/memcached_check"
|
14
16
|
require "easymon/checks/semaphore_check"
|
15
17
|
require "easymon/checks/traffic_enabled_check"
|
File without changes
|
File without changes
|
@@ -1,66 +1,24 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
Started GET "/up/foobar" for 127.0.0.1 at 2018-11-08 22:49:15 -0500
|
26
|
-
Processing by Easymon::ChecksController#show as */*
|
27
|
-
Parameters: {"check"=>"foobar"}
|
28
|
-
Rendering text template
|
29
|
-
Rendered text template (0.0ms)
|
30
|
-
Completed 404 Not Found in 1ms (Views: 0.5ms)
|
31
|
-
|
32
|
-
|
33
|
-
DEPRECATION WARNING: Using `Rails::Application` subclass to start the server is deprecated and will be removed in Rails 6.0. Please change `run Dummy::Application` to `run Rails.application` in config.ru. (called from require at script/rails:6)
|
34
|
-
Started GET "/up/critical/foobar" for 127.0.0.1 at 2018-11-08 22:50:46 -0500
|
35
|
-
|
36
|
-
ActionController::RoutingError (No route matches [GET] "/up/critical/foobar"):
|
37
|
-
|
38
|
-
actionpack (5.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:65:in `call'
|
39
|
-
actionpack (5.2.1) lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
|
40
|
-
railties (5.2.1) lib/rails/rack/logger.rb:38:in `call_app'
|
41
|
-
railties (5.2.1) lib/rails/rack/logger.rb:26:in `block in call'
|
42
|
-
activesupport (5.2.1) lib/active_support/tagged_logging.rb:71:in `block in tagged'
|
43
|
-
activesupport (5.2.1) lib/active_support/tagged_logging.rb:28:in `tagged'
|
44
|
-
activesupport (5.2.1) lib/active_support/tagged_logging.rb:71:in `tagged'
|
45
|
-
railties (5.2.1) lib/rails/rack/logger.rb:26:in `call'
|
46
|
-
actionpack (5.2.1) lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
|
47
|
-
actionpack (5.2.1) lib/action_dispatch/middleware/request_id.rb:27:in `call'
|
48
|
-
rack (2.0.6) lib/rack/method_override.rb:22:in `call'
|
49
|
-
rack (2.0.6) lib/rack/runtime.rb:22:in `call'
|
50
|
-
activesupport (5.2.1) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
|
51
|
-
actionpack (5.2.1) lib/action_dispatch/middleware/executor.rb:14:in `call'
|
52
|
-
actionpack (5.2.1) lib/action_dispatch/middleware/static.rb:127:in `call'
|
53
|
-
rack (2.0.6) lib/rack/sendfile.rb:111:in `call'
|
54
|
-
railties (5.2.1) lib/rails/engine.rb:524:in `call'
|
55
|
-
rack (2.0.6) lib/rack/handler/webrick.rb:86:in `service'
|
56
|
-
/Users/nathan/.rbenv/versions/2.5.3/lib/ruby/2.5.0/webrick/httpserver.rb:140:in `service'
|
57
|
-
/Users/nathan/.rbenv/versions/2.5.3/lib/ruby/2.5.0/webrick/httpserver.rb:96:in `run'
|
58
|
-
/Users/nathan/.rbenv/versions/2.5.3/lib/ruby/2.5.0/webrick/server.rb:307:in `block in start_thread'
|
59
|
-
Started GET "/up/critical" for 127.0.0.1 at 2018-11-08 22:51:07 -0500
|
60
|
-
Processing by Easymon::ChecksController#show as */*
|
61
|
-
Parameters: {"check"=>"critical"}
|
62
|
-
Rendering text template
|
63
|
-
Rendered text template (0.0ms)
|
64
|
-
Completed 503 Service Unavailable in 29ms (Views: 0.5ms)
|
65
|
-
|
66
|
-
|
1
|
+
[1m[35m (0.3ms)[0m [1m[35mSET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483[0m
|
2
|
+
[1m[35m (1.4ms)[0m [1m[35mCREATE DATABASE `dummy_development` DEFAULT CHARACTER SET `utf8`[0m
|
3
|
+
[1m[35m (0.3ms)[0m [1m[35mSET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483[0m
|
4
|
+
[1m[35m (1.0ms)[0m [1m[35mCREATE DATABASE `dummy_test` DEFAULT CHARACTER SET `utf8`[0m
|
5
|
+
[1m[35m (0.3ms)[0m [1m[35mSET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483[0m
|
6
|
+
[1m[35m (0.3ms)[0m [1m[35mSET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483[0m
|
7
|
+
[1m[35m (25.9ms)[0m [1m[35mCREATE TABLE `schema_migrations` (`version` varchar(255) NOT NULL PRIMARY KEY)[0m
|
8
|
+
[1m[35m (20.9ms)[0m [1m[35mCREATE TABLE `ar_internal_metadata` (`key` varchar(255) NOT NULL PRIMARY KEY, `value` varchar(255), `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL)[0m
|
9
|
+
[1m[35m (0.1ms)[0m [1m[34mSELECT GET_LOCK('1721091371569202325', 0)[0m
|
10
|
+
[1m[35m (0.2ms)[0m [1m[34mSELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC[0m
|
11
|
+
[1m[36mActiveRecord::InternalMetadata Load (0.2ms)[0m [1m[34mSELECT `ar_internal_metadata`.* FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'environment' LIMIT 1[0m
|
12
|
+
[1m[35m (0.1ms)[0m [1m[35mBEGIN[0m
|
13
|
+
[1m[36mActiveRecord::InternalMetadata Create (0.2ms)[0m [1m[32mINSERT INTO `ar_internal_metadata` (`key`, `value`, `created_at`, `updated_at`) VALUES ('environment', 'development', '2022-05-04 18:01:28', '2022-05-04 18:01:28')[0m
|
14
|
+
[1m[35m (0.1ms)[0m [1m[35mCOMMIT[0m
|
15
|
+
[1m[35m (0.1ms)[0m [1m[34mSELECT RELEASE_LOCK('1721091371569202325')[0m
|
16
|
+
[1m[35m (0.3ms)[0m [1m[34mSELECT @@read_only[0m
|
17
|
+
[1m[35m (0.2ms)[0m [1m[34mSELECT @@read_only[0m
|
18
|
+
[1m[35m (0.1ms)[0m [1m[34mSELECT @@read_only[0m
|
19
|
+
[1m[35m (0.8ms)[0m [1m[34mSELECT @@read_only;[0m
|
20
|
+
[1m[35m (0.9ms)[0m [1m[34mSELECT @@read_only;[0m
|
21
|
+
[1m[35m (3.2ms)[0m [1m[34mSELECT @@read_only;[0m
|
22
|
+
[1m[35m (0.2ms)[0m [1m[34mSELECT @@read_only[0m
|
23
|
+
[1m[35m (0.2ms)[0m [1m[34mSELECT @@read_only;[0m
|
24
|
+
[1m[35m (0.2ms)[0m [1m[34mSELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC[0m
|