service-status 0.0.4
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.
- checksums.yaml +15 -0
- data/.gitignore +77 -0
- data/.rspec +2 -0
- data/.rubocop.yml +5 -0
- data/.travis.yml +18 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +123 -0
- data/Guardfile +30 -0
- data/LICENSE +675 -0
- data/README.md +80 -0
- data/Rakefile +35 -0
- data/lib/service_status/status.rb +93 -0
- data/lib/service_status/version.rb +3 -0
- data/service-status.gemspec +37 -0
- data/spec/cassettes/ServiceStatus_Status/add_http_get_check/ok.yml +917 -0
- data/spec/service_status_spec.rb +130 -0
- data/spec/spec_helper.rb +118 -0
- metadata +276 -0
data/README.md
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
# Service::Status
|
2
|
+
|
3
|
+
[](https://travis-ci.org/TheBookPeople/service-status-ruby) [](https://codeclimate.com/github/TheBookPeople/service-status-ruby) [](https://codeclimate.com/github/TheBookPeople/service-status-ruby) [](http://badge.fury.io/rb/service-status) [](https://gemnasium.com/TheBookPeople/service-status-ruby)
|
4
|
+
|
5
|
+
|
6
|
+
Provides an object representing the status of a service, suitable for exposing
|
7
|
+
as JSON as part of a REST api.
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
Add this line to your application's Gemfile:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem 'service-status'
|
15
|
+
```
|
16
|
+
|
17
|
+
And then execute:
|
18
|
+
|
19
|
+
$ bundle
|
20
|
+
|
21
|
+
Or install it yourself as:
|
22
|
+
|
23
|
+
$ gem install service-status
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
status = ServiceStatus::Status.new("windows", '3.11', boot_time)
|
29
|
+
# boot_time is time the app was started
|
30
|
+
|
31
|
+
# check that we can connect to redis
|
32
|
+
redis_ok = true
|
33
|
+
begin
|
34
|
+
Redis.new.ping
|
35
|
+
rescue
|
36
|
+
redis_ok = false
|
37
|
+
end
|
38
|
+
|
39
|
+
status.add_check('redis', redis_ok)
|
40
|
+
|
41
|
+
JSON.pretty_generate(status) # render as JSON as required
|
42
|
+
```
|
43
|
+
## Format
|
44
|
+
|
45
|
+
As below. Checks are always part of the 'checks' array. If they have failed,
|
46
|
+
they are included in 'errors' as well.
|
47
|
+
|
48
|
+
'Status' is either "online" or "offline".
|
49
|
+
|
50
|
+
```javascript
|
51
|
+
{
|
52
|
+
"name": "windows",
|
53
|
+
"version": "3.11",
|
54
|
+
"hostname": "clippy",
|
55
|
+
"errors": [],
|
56
|
+
"checks": [
|
57
|
+
"redis"
|
58
|
+
],
|
59
|
+
"timestamp": "2015-05-07 14:35:17",
|
60
|
+
"uptime": "14d:23:11:21",
|
61
|
+
"diskusage": "64%",
|
62
|
+
"status": "online"
|
63
|
+
}
|
64
|
+
|
65
|
+
```
|
66
|
+
|
67
|
+
## Contributing
|
68
|
+
|
69
|
+
1. Fork it ( https://github.com/[my-github-username]/service-status/fork )
|
70
|
+
2. git flow init -d (assuming you have git flow)
|
71
|
+
2. Create your feature branch (`git flow feature start my-new-feature`)
|
72
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
73
|
+
4. Push to the branch (`git push origin feature/my-new-feature`)
|
74
|
+
5. Create a new Pull Request
|
75
|
+
|
76
|
+
## Copyright
|
77
|
+
|
78
|
+
Copyright (c) 2015 The Book People
|
79
|
+
|
80
|
+
See LICENSE (GPLv3)
|
data/Rakefile
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/clean'
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
require 'rubocop/rake_task'
|
6
|
+
require 'service_status/version'
|
7
|
+
|
8
|
+
desc 'Run Code quality checks and tests '
|
9
|
+
task default: [:clean, :rubocop, :test]
|
10
|
+
|
11
|
+
desc 'Run Code quality checks, tests and then create Gem File'
|
12
|
+
task build: [:clean, :rubocop, :test, :gem]
|
13
|
+
|
14
|
+
CLEAN.include("service-status-#{ServiceStatus::VERSION}.gem")
|
15
|
+
CLEAN.include('coverage')
|
16
|
+
|
17
|
+
task :test do
|
18
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
19
|
+
t.pattern = 'spec/**/*_spec.rb'
|
20
|
+
t.verbose = false
|
21
|
+
end
|
22
|
+
|
23
|
+
Rake::Task['spec'].execute
|
24
|
+
end
|
25
|
+
|
26
|
+
task :rubocop do
|
27
|
+
RuboCop::RakeTask.new(:rubocop) do |task|
|
28
|
+
task.patterns = ['lib/**/*.rb']
|
29
|
+
task.fail_on_error = true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
task :gem do
|
34
|
+
system 'gem build service-status.gemspec'
|
35
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'service_status/version'
|
2
|
+
|
3
|
+
require 'pp'
|
4
|
+
require 'net/http'
|
5
|
+
require 'uri'
|
6
|
+
require 'socket'
|
7
|
+
require 'sys/filesystem'
|
8
|
+
|
9
|
+
module ServiceStatus
|
10
|
+
class Status
|
11
|
+
attr_reader :name, :version, :hostname, :errors, :checks, :timestamp
|
12
|
+
|
13
|
+
def initialize(name, version, boot_time)
|
14
|
+
@boot_time = boot_time
|
15
|
+
@name = name
|
16
|
+
@version = version
|
17
|
+
@hostname = Socket.gethostname
|
18
|
+
@checks = []
|
19
|
+
@timestamp = Time.now.strftime('%Y-%m-%d %T')
|
20
|
+
@errors = []
|
21
|
+
end
|
22
|
+
|
23
|
+
def add_check(name, ok)
|
24
|
+
@checks << name
|
25
|
+
@errors << name unless ok
|
26
|
+
end
|
27
|
+
|
28
|
+
def add_http_get_check(name, url)
|
29
|
+
@checks << name
|
30
|
+
uri = URI(url)
|
31
|
+
begin
|
32
|
+
res = Net::HTTP.get_response(uri)
|
33
|
+
@errors << name unless res.is_a?(Net::HTTPSuccess)
|
34
|
+
rescue
|
35
|
+
@errors << name
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def status
|
40
|
+
online? ? 'online' : 'offline'
|
41
|
+
end
|
42
|
+
|
43
|
+
def online?
|
44
|
+
@errors.empty?
|
45
|
+
end
|
46
|
+
|
47
|
+
def uptime
|
48
|
+
total_seconds = Time.now - @boot_time
|
49
|
+
seconds = total_seconds % 60
|
50
|
+
minutes = (total_seconds / 60) % 60
|
51
|
+
hours = total_seconds / (60 * 60)
|
52
|
+
days = total_seconds / (60 * 60 * 24)
|
53
|
+
format('%01dd:%02d:%02d:%02d', days, hours, minutes, seconds)
|
54
|
+
end
|
55
|
+
|
56
|
+
def disk_usage
|
57
|
+
format('%01d%%', (disk_used / disk_size) * 100)
|
58
|
+
end
|
59
|
+
|
60
|
+
# rubocop:disable MethodLength
|
61
|
+
def to_json(*a)
|
62
|
+
{
|
63
|
+
name: name,
|
64
|
+
version: version,
|
65
|
+
hostname: hostname,
|
66
|
+
errors: errors,
|
67
|
+
checks: checks,
|
68
|
+
timestamp: timestamp,
|
69
|
+
uptime: uptime,
|
70
|
+
diskusage: disk_usage,
|
71
|
+
status: status
|
72
|
+
}.to_json(*a)
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def disk_used
|
78
|
+
disk_size - disk_available
|
79
|
+
end
|
80
|
+
|
81
|
+
def disk_available
|
82
|
+
@blocks_available ||= filesystem.blocks_available.to_f
|
83
|
+
end
|
84
|
+
|
85
|
+
def disk_size
|
86
|
+
@disk_size ||= filesystem.blocks.to_f
|
87
|
+
end
|
88
|
+
|
89
|
+
def filesystem
|
90
|
+
@stats ||= Sys::Filesystem.stat('/')
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'service_status/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'service-status'
|
8
|
+
spec.version = ServiceStatus::VERSION
|
9
|
+
spec.authors = ['William Griffiths', 'Luke Farrar']
|
10
|
+
spec.email = ['william.griffiths@thebookpeople.co.uk', 'luke.farrar@thebookpeople.co.uk']
|
11
|
+
spec.summary = 'Provides a simple JSON service status report.'
|
12
|
+
spec.description = 'When monitoring REST servers it is useful to have a standard /status page. This gem provides such content.'
|
13
|
+
spec.homepage = 'https://github.com/TheBookPeople/service-status-ruby'
|
14
|
+
spec.license = 'GPLv3'
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.required_ruby_version = '>= 2.0.0'
|
22
|
+
spec.add_dependency 'sys-filesystem', '~> 1.1'
|
23
|
+
spec.add_development_dependency 'rake', '~> 10.4'
|
24
|
+
spec.add_development_dependency 'bundler', '~> 1.7'
|
25
|
+
spec.add_development_dependency 'rspec', '~> 3.1'
|
26
|
+
spec.add_development_dependency 'guard-rspec', '~> 4.5'
|
27
|
+
spec.add_development_dependency 'rb-inotify', '~> 0.9'
|
28
|
+
spec.add_development_dependency 'rb-fsevent', '~> 0.9'
|
29
|
+
spec.add_development_dependency 'rb-fchange', '~> 0.0'
|
30
|
+
spec.add_development_dependency 'terminal-notifier-guard', '~> 1.6'
|
31
|
+
spec.add_development_dependency 'rubocop', '~> 0.28'
|
32
|
+
spec.add_development_dependency 'simplecov', '~> 0.9'
|
33
|
+
spec.add_development_dependency 'codeclimate-test-reporter', '~> 0.4'
|
34
|
+
spec.add_development_dependency 'webmock', '~> 1.21'
|
35
|
+
spec.add_development_dependency 'vcr', '~> 2.9'
|
36
|
+
spec.add_development_dependency 'timecop', '~> 0.7'
|
37
|
+
end
|