cronitor 1.1.3 → 3.1.0
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 +5 -5
- data/.rubocop.yml +15 -0
- data/.travis.yml +3 -2
- data/Gemfile +2 -0
- data/README.md +48 -17
- data/Rakefile +2 -0
- data/bin/console +1 -0
- data/cronitor.gemspec +9 -10
- data/lib/cronitor.rb +75 -43
- data/lib/cronitor/error.rb +2 -0
- data/lib/cronitor/version.rb +3 -1
- metadata +30 -58
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f4b5bc9e1efd7fb5247f7f473195589fb4cb822c52a1ee92f1b6c784086016f7
|
4
|
+
data.tar.gz: f617431b175f6c2e9263fc48fece1af7d7bff634285d703e5d3d57d548f70236
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88a42cddedfea16c32fe0ab3716684343f7c6e8adcfa9cd5018a43e28c6e1e86ba9ced38cfe361e1ecc184dde146f2b8b222320ce17c2e8e1194c4d698d55e20
|
7
|
+
data.tar.gz: 5ecb82ea549bd5a5ffb5d4298f493e40d3e2569d1517365156315a30f965fbe8b46629daf3bcae9cd029b93ad14c8363d6f06e0f543d8b26a0e270567446dc61
|
data/.rubocop.yml
ADDED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Cronitor
|
2
2
|
|
3
|
-
[](https://
|
3
|
+
[](https://travis-ci.org/evertrue/cronitor)
|
4
4
|
[](https://badge.fury.io/rb/cronitor)
|
5
5
|
|
6
6
|
[Cronitor](https://cronitor.io/) is a service for heartbeat-style monitoring of just about anything that can send an HTTP request.
|
@@ -25,15 +25,45 @@ Or install it yourself as:
|
|
25
25
|
|
26
26
|
## Usage
|
27
27
|
|
28
|
+
|
29
|
+
### Configure
|
30
|
+
|
31
|
+
You need to set Cronitor Token in order to create a monitor
|
32
|
+
|
33
|
+
#### Using configure
|
34
|
+
|
35
|
+
```ruby
|
36
|
+
require 'cronitor'
|
37
|
+
|
38
|
+
Cronitor.configure do |cronitor|
|
39
|
+
cronitor.default_token = 'token' # default token to be re-used by cronitor
|
40
|
+
end
|
41
|
+
```
|
42
|
+
|
43
|
+
#### Using ENV
|
44
|
+
|
45
|
+
```
|
46
|
+
# .env
|
47
|
+
CRONITOR_TOKEN: token
|
48
|
+
|
49
|
+
# bash
|
50
|
+
export CRONITOR_TOKEN='token'
|
51
|
+
```
|
52
|
+
|
28
53
|
### Creating a Monitor
|
29
54
|
|
30
55
|
A Cronitor monitor (hereafter referred to only as a monitor for brevity) is created if it does not already exist, and its ID returned.
|
31
56
|
|
57
|
+
Please see the [Cronitor Monitor API docs](https://cronitor.io/docs/monitor-api) for details of all the possible monitor options.
|
58
|
+
|
59
|
+
Example of creating a heartbeat monitor:
|
60
|
+
|
32
61
|
```ruby
|
33
62
|
require 'cronitor'
|
34
63
|
|
35
64
|
monitor_options = {
|
36
65
|
name: 'My Fancy Monitor',
|
66
|
+
type: 'heartbeat', # Optional: the gem defaults to this; the other value, 'healthcheck', is not yet supported by this gem
|
37
67
|
notifications: {
|
38
68
|
emails: ['test@example.com'],
|
39
69
|
slack: [],
|
@@ -43,29 +73,21 @@ monitor_options = {
|
|
43
73
|
},
|
44
74
|
rules: [
|
45
75
|
{
|
46
|
-
rule_type: '
|
47
|
-
|
48
|
-
|
76
|
+
rule_type: 'run_ping_not_received',
|
77
|
+
value: 5,
|
78
|
+
time_unit: 'seconds'
|
49
79
|
}
|
50
80
|
],
|
51
81
|
note: 'A human-friendly description of this monitor'
|
52
82
|
}
|
83
|
+
|
84
|
+
# The token parameter is optional; if omittted, ENV['CRONITOR_TOKEN'] will be used if not configured
|
53
85
|
my_monitor = Cronitor.new token: 'api_token', opts: monitor_options
|
54
86
|
```
|
55
87
|
|
56
|
-
|
88
|
+
### Updating an existing monitor
|
57
89
|
|
58
|
-
|
59
|
-
monitor_options = {
|
60
|
-
rules: [
|
61
|
-
{
|
62
|
-
rule_type: 'not_run_in',
|
63
|
-
duration: 5
|
64
|
-
time_unit: 'seconds',
|
65
|
-
human_readable: 'not_run_in 5 seconds'
|
66
|
-
}
|
67
|
-
],
|
68
|
-
```
|
90
|
+
Currently this gem does not support updating or deleting an existing monitor.
|
69
91
|
|
70
92
|
### Pinging a Monitor
|
71
93
|
|
@@ -79,7 +101,9 @@ my_monitor.ping 'fail', 'A short description of the failure'
|
|
79
101
|
|
80
102
|
### Pinging a monitor when you have a Cronitor code
|
81
103
|
|
82
|
-
You may already have the code for a monitor, in which case, the expense of `Cronitor.
|
104
|
+
You may already have the code for a monitor, in which case, the expense of `Cronitor.create` may seem unnecessary (since it makes an HTTP request to check if a monitor exists, and you already know it does).
|
105
|
+
|
106
|
+
Cronitor does not require a token for pinging a monitor unless you have enabled Ping API authentication in your account settings. At the moment, this gem does not support Ping API auth.
|
83
107
|
|
84
108
|
In that case:
|
85
109
|
|
@@ -102,3 +126,10 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
102
126
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
103
127
|
4. Push to the branch (`git push origin my-new-feature`)
|
104
128
|
5. Create a new Pull Request
|
129
|
+
|
130
|
+
## Release a new version
|
131
|
+
|
132
|
+
The `bump` gem makes this easy:
|
133
|
+
|
134
|
+
1. `rake bump:(major|minor|patch|pre)`
|
135
|
+
2. `rake release`
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
data/cronitor.gemspec
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
2
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
5
|
require 'cronitor/version'
|
4
6
|
|
@@ -18,14 +20,11 @@ Gem::Specification.new do |spec|
|
|
18
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
21
|
spec.require_paths = ['lib']
|
20
22
|
|
21
|
-
spec.add_dependency 'unirest', '~> 1.1'
|
22
|
-
spec.add_dependency 'hashie', '~> 3.4'
|
23
|
-
|
24
|
-
spec.add_development_dependency 'bundler', '~> 1.10'
|
25
|
-
spec.add_development_dependency 'rake', '~> 10.0'
|
26
|
-
spec.add_development_dependency 'rspec', '~> 3.3'
|
27
|
-
spec.add_development_dependency 'pry', '~> 0.10'
|
28
|
-
spec.add_development_dependency 'webmock', '~> 1.21'
|
29
|
-
spec.add_development_dependency 'sinatra', '~> 1.4'
|
30
23
|
spec.add_development_dependency 'bump', '~> 0.1'
|
24
|
+
spec.add_development_dependency 'bundler'
|
25
|
+
spec.add_development_dependency 'pry', '~> 0.10'
|
26
|
+
spec.add_development_dependency 'rake'
|
27
|
+
spec.add_development_dependency 'rspec', '~> 3.3'
|
28
|
+
spec.add_development_dependency 'sinatra', '~> 2.0'
|
29
|
+
spec.add_development_dependency 'webmock', '~> 3.1'
|
31
30
|
end
|
data/lib/cronitor.rb
CHANGED
@@ -1,23 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'cronitor/version'
|
2
4
|
require 'cronitor/error'
|
5
|
+
require 'json'
|
3
6
|
require 'net/http'
|
4
|
-
require '
|
5
|
-
|
6
|
-
Unirest.default_header 'Accept', 'application/json'
|
7
|
-
Unirest.default_header 'Content-Type', 'application/json'
|
7
|
+
require 'uri'
|
8
8
|
|
9
9
|
class Cronitor
|
10
10
|
attr_accessor :token, :opts, :code
|
11
|
-
API_URL = 'https://cronitor.io/
|
11
|
+
API_URL = 'https://cronitor.io/v3'
|
12
12
|
PING_URL = 'https://cronitor.link'
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
class << self
|
15
|
+
attr_accessor :default_token
|
16
|
+
|
17
|
+
def configure(&block)
|
18
|
+
block.call(self)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(token: ENV['CRONITOR_TOKEN'], opts: {}, code: nil)
|
23
|
+
@token = token || self.class.default_token
|
16
24
|
@opts = opts
|
17
25
|
@code = code
|
18
26
|
|
19
27
|
if @token.nil? && @code.nil?
|
20
|
-
|
28
|
+
raise(
|
21
29
|
Cronitor::Error,
|
22
30
|
'Either a Cronitor API token or an existing monitor code must be ' \
|
23
31
|
'provided'
|
@@ -25,60 +33,83 @@ class Cronitor
|
|
25
33
|
end
|
26
34
|
|
27
35
|
if @opts
|
28
|
-
|
36
|
+
@opts = symbolize_keys @opts
|
37
|
+
|
29
38
|
exists? @opts[:name] if @opts.key? :name
|
30
|
-
|
39
|
+
|
40
|
+
# README: Per Cronitor API v2, we need to specify a type. The "heartbeat"
|
41
|
+
# type corresponds to what the v1 API offered by default
|
42
|
+
# We allow other values to be injected, and let the API handle
|
43
|
+
# any errors.
|
44
|
+
@opts[:type] = 'heartbeat' unless @opts[:type]
|
31
45
|
end
|
32
46
|
|
33
47
|
create if @code.nil?
|
34
48
|
end
|
35
49
|
|
36
50
|
def create
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
51
|
+
uri = URI.parse "#{API_URL}/monitors"
|
52
|
+
|
53
|
+
http = Net::HTTP.new uri.host, uri.port
|
54
|
+
http.use_ssl = uri.scheme == 'https'
|
55
|
+
|
56
|
+
request = Net::HTTP::Post.new uri.path, default_headers
|
57
|
+
request.basic_auth token, nil
|
58
|
+
request.content_type = 'application/json'
|
59
|
+
request.body = JSON.generate opts
|
42
60
|
|
43
|
-
|
61
|
+
response = http.request request
|
62
|
+
|
63
|
+
@code = JSON.parse(response.body).fetch 'code' if valid? response
|
44
64
|
end
|
45
65
|
|
46
66
|
def exists?(name)
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
67
|
+
uri = URI.parse "#{API_URL}/monitors/#{URI.escape name}"
|
68
|
+
|
69
|
+
http = Net::HTTP.new uri.host, uri.port
|
70
|
+
http.use_ssl = uri.scheme == 'https'
|
71
|
+
|
72
|
+
request = Net::HTTP::Get.new uri.path, default_headers
|
73
|
+
request.basic_auth token, nil
|
52
74
|
|
53
|
-
|
75
|
+
response = http.request request
|
76
|
+
|
77
|
+
return false unless response.is_a? Net::HTTPSuccess
|
78
|
+
|
79
|
+
@code = JSON.parse(response.body).fetch 'code'
|
80
|
+
@opts = JSON.parse(response.body)
|
54
81
|
|
55
82
|
true
|
56
83
|
end
|
57
84
|
|
58
85
|
def ping(type, msg = nil)
|
59
|
-
|
60
|
-
|
86
|
+
uri = URI.parse "#{PING_URL}/#{URI.escape code}/#{URI.escape type}"
|
87
|
+
if %w[run complete fail].include?(type) && !msg.nil?
|
88
|
+
uri.query = URI.encode_www_form 'msg' => msg
|
89
|
+
end
|
61
90
|
|
62
|
-
|
63
|
-
|
64
|
-
end
|
91
|
+
http = Net::HTTP.new uri.host, uri.port
|
92
|
+
http.use_ssl = uri.scheme == 'https'
|
65
93
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
end
|
72
|
-
end
|
94
|
+
request = Net::HTTP::Get.new uri, default_headers
|
95
|
+
|
96
|
+
response = http.request request
|
97
|
+
|
98
|
+
valid? response
|
73
99
|
end
|
74
100
|
|
75
101
|
private
|
76
102
|
|
77
103
|
def valid?(response)
|
78
|
-
return true if
|
79
|
-
server_error? response
|
104
|
+
return true if response.is_a? Net::HTTPSuccess
|
80
105
|
|
81
|
-
|
106
|
+
msg = if response.content_type.match? 'json'
|
107
|
+
error_msg JSON.parse(response.body)
|
108
|
+
else
|
109
|
+
"Something else has gone awry. HTTP status: #{response.code}"
|
110
|
+
end
|
111
|
+
|
112
|
+
raise Cronitor::Error, msg
|
82
113
|
end
|
83
114
|
|
84
115
|
def error_msg(body, msg = [])
|
@@ -95,12 +126,13 @@ class Cronitor
|
|
95
126
|
msg.join ' '
|
96
127
|
end
|
97
128
|
|
98
|
-
def
|
99
|
-
|
129
|
+
def default_headers
|
130
|
+
{ 'Accept' => 'application/json' }
|
131
|
+
end
|
100
132
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
133
|
+
def symbolize_keys(hash)
|
134
|
+
hash.each_with_object({}) do |(k, v), h|
|
135
|
+
h[k.to_sym] = v.is_a?(Hash) ? symbolize_keys(v) : v
|
136
|
+
end
|
105
137
|
end
|
106
138
|
end
|
data/lib/cronitor/error.rb
CHANGED
data/lib/cronitor/version.rb
CHANGED
metadata
CHANGED
@@ -1,71 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cronitor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Byrnes
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-10-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: bump
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
-
type: :
|
19
|
+
version: '0.1'
|
20
|
+
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
34
|
-
type: :
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: pry
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '0.10'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '0.10'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,63 +80,35 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '3.3'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: pry
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0.10'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0.10'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: webmock
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '1.21'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '1.21'
|
111
83
|
- !ruby/object:Gem::Dependency
|
112
84
|
name: sinatra
|
113
85
|
requirement: !ruby/object:Gem::Requirement
|
114
86
|
requirements:
|
115
87
|
- - "~>"
|
116
88
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
89
|
+
version: '2.0'
|
118
90
|
type: :development
|
119
91
|
prerelease: false
|
120
92
|
version_requirements: !ruby/object:Gem::Requirement
|
121
93
|
requirements:
|
122
94
|
- - "~>"
|
123
95
|
- !ruby/object:Gem::Version
|
124
|
-
version: '
|
96
|
+
version: '2.0'
|
125
97
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
98
|
+
name: webmock
|
127
99
|
requirement: !ruby/object:Gem::Requirement
|
128
100
|
requirements:
|
129
101
|
- - "~>"
|
130
102
|
- !ruby/object:Gem::Version
|
131
|
-
version: '
|
103
|
+
version: '3.1'
|
132
104
|
type: :development
|
133
105
|
prerelease: false
|
134
106
|
version_requirements: !ruby/object:Gem::Requirement
|
135
107
|
requirements:
|
136
108
|
- - "~>"
|
137
109
|
- !ruby/object:Gem::Version
|
138
|
-
version: '
|
139
|
-
description:
|
110
|
+
version: '3.1'
|
111
|
+
description:
|
140
112
|
email:
|
141
113
|
- thejeffbyrnes@gmail.com
|
142
114
|
executables: []
|
@@ -146,6 +118,7 @@ files:
|
|
146
118
|
- ".editorconfig"
|
147
119
|
- ".gitignore"
|
148
120
|
- ".rspec"
|
121
|
+
- ".rubocop.yml"
|
149
122
|
- ".travis.yml"
|
150
123
|
- Gemfile
|
151
124
|
- LICENSE.txt
|
@@ -160,7 +133,7 @@ files:
|
|
160
133
|
homepage: https://github.com/evertrue/cronitor
|
161
134
|
licenses: []
|
162
135
|
metadata: {}
|
163
|
-
post_install_message:
|
136
|
+
post_install_message:
|
164
137
|
rdoc_options: []
|
165
138
|
require_paths:
|
166
139
|
- lib
|
@@ -175,9 +148,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
175
148
|
- !ruby/object:Gem::Version
|
176
149
|
version: '0'
|
177
150
|
requirements: []
|
178
|
-
|
179
|
-
|
180
|
-
signing_key:
|
151
|
+
rubygems_version: 3.1.4
|
152
|
+
signing_key:
|
181
153
|
specification_version: 4
|
182
154
|
summary: An interface for the Cronitor API
|
183
155
|
test_files: []
|