cronitor 1.1.3 → 3.1.0

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
- SHA1:
3
- metadata.gz: 8f2d92e9bff2665cff64e293fa9a2811fdd0f1ac
4
- data.tar.gz: cc05a4d335a3a7272e1fe5430cc8e8ba5526bdd6
2
+ SHA256:
3
+ metadata.gz: f4b5bc9e1efd7fb5247f7f473195589fb4cb822c52a1ee92f1b6c784086016f7
4
+ data.tar.gz: f617431b175f6c2e9263fc48fece1af7d7bff634285d703e5d3d57d548f70236
5
5
  SHA512:
6
- metadata.gz: 39b1571f0e348dadc27d5df8d36d53afeb8a65e2b750ec6e05dc93f1afa01b42d3da13adf629baa2c32509df988d74ce3717d810c4d70a90c2628943366c5a98
7
- data.tar.gz: 384b8b8dece34c4d81057eafa338d0f9c8374fcb5988acaeb6010ac9241774236065b1b5b37f9af24060aa686f0ac511c4667b0a1e65d2ffaea785c55bb6c5b8
6
+ metadata.gz: 88a42cddedfea16c32fe0ab3716684343f7c6e8adcfa9cd5018a43e28c6e1e86ba9ced38cfe361e1ecc184dde146f2b8b222320ce17c2e8e1194c4d698d55e20
7
+ data.tar.gz: 5ecb82ea549bd5a5ffb5d4298f493e40d3e2569d1517365156315a30f965fbe8b46629daf3bcae9cd029b93ad14c8363d6f06e0f543d8b26a0e270567446dc61
@@ -0,0 +1,15 @@
1
+ ---
2
+ Metrics/AbcSize:
3
+ Enabled: false
4
+
5
+ Metrics/BlockLength:
6
+ Enabled: false
7
+
8
+ Metrics/CyclomaticComplexity:
9
+ Enabled: false
10
+
11
+ Metrics/MethodLength:
12
+ Enabled: false
13
+
14
+ Style/Documentation:
15
+ Enabled: false
@@ -1,4 +1,5 @@
1
+ ---
1
2
  language: ruby
2
3
  rvm:
3
- - 2.2
4
- before_install: gem install bundler -v 1.10
4
+ - 2
5
+ - 2.4
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in cronitor.gemspec
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Cronitor
2
2
 
3
- [![Travis](https://img.shields.io/travis/evertrue/cronitor.svg)](https://github.com/evertrue/cronitor)
3
+ [![Travis](https://img.shields.io/travis/evertrue/cronitor.svg)](https://travis-ci.org/evertrue/cronitor)
4
4
  [![Gem Version](https://badge.fury.io/rb/cronitor.svg)](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: 'not_run_in',
47
- duration: 5
48
- rime_unit: 'seconds'
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
- You may optionally specify a `:human_readable` value for your rule(s), otherwise one will be crafted for you:
88
+ ### Updating an existing monitor
57
89
 
58
- ```ruby
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.new` may seem unnecessary (since it makes an HTTP request to check if a monitor exists, and you already know it does).
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
  require 'bump/tasks'
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'cronitor'
@@ -1,4 +1,6 @@
1
- lib = File.expand_path('../lib', __FILE__)
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
@@ -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 'unirest'
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/v1'
11
+ API_URL = 'https://cronitor.io/v3'
12
12
  PING_URL = 'https://cronitor.link'
13
13
 
14
- def initialize(token: nil, opts: {}, code: nil)
15
- @token = token
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
- fail(
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
- Hashie.symbolize_keys! @opts
36
+ @opts = symbolize_keys @opts
37
+
29
38
  exists? @opts[:name] if @opts.key? :name
30
- human_readable @opts[:rules] if @opts.key? :rules
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
- response = Unirest.post(
38
- "#{API_URL}/monitors",
39
- auth: { user: token },
40
- parameters: opts.to_json
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
- @code = response.body['code'] if valid? response
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
- response = Unirest.get(
48
- "#{API_URL}/monitors/#{URI.escape(name).gsub('[', '%5B').gsub(']', '%5D')}",
49
- auth: { user: token }
50
- )
51
- return false unless response.code == 200
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
- @code = response.body['code']
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
- url = "#{PING_URL}/#{code}/#{type}"
60
- url += "?msg=#{URI.escape msg}" if type == 'fail' && !msg.nil?
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
- response = Unirest.get url
63
- valid? response
64
- end
91
+ http = Net::HTTP.new uri.host, uri.port
92
+ http.use_ssl = uri.scheme == 'https'
65
93
 
66
- def human_readable(rules)
67
- rules.each do |rule|
68
- unless rule[:human_readable]
69
- rule[:human_readable] = "#{rule[:rule_type]} #{rule[:duration]} " \
70
- "#{rule[:time_unit]}"
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 [200, 201].include? response.code
79
- server_error? response
104
+ return true if response.is_a? Net::HTTPSuccess
80
105
 
81
- fail Cronitor::Error, error_msg(response.body)
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 server_error?(response)
99
- return unless [301, 302, 404, 500, 502, 503, 504].include? response.code
129
+ def default_headers
130
+ { 'Accept' => 'application/json' }
131
+ end
100
132
 
101
- fail(
102
- Cronitor::Error,
103
- "Something else has gone awry. HTTP status: #{response.code}"
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Cronitor
2
4
  class Error < StandardError
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Cronitor
2
- VERSION = '1.1.3'
4
+ VERSION = '3.1.0'
3
5
  end
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: 1.1.3
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: 2015-10-26 00:00:00.000000000 Z
11
+ date: 2020-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: unirest
14
+ name: bump
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.1'
20
- type: :runtime
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: '1.1'
26
+ version: '0.1'
27
27
  - !ruby/object:Gem::Dependency
28
- name: hashie
28
+ name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '3.4'
34
- type: :runtime
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: '3.4'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: bundler
42
+ name: pry
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.10'
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: '1.10'
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: '10.0'
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: '10.0'
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: '1.4'
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: '1.4'
96
+ version: '2.0'
125
97
  - !ruby/object:Gem::Dependency
126
- name: bump
98
+ name: webmock
127
99
  requirement: !ruby/object:Gem::Requirement
128
100
  requirements:
129
101
  - - "~>"
130
102
  - !ruby/object:Gem::Version
131
- version: '0.1'
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: '0.1'
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
- rubyforge_project:
179
- rubygems_version: 2.4.6
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: []