pagerduty 2.1.3 → 3.0.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
2
  SHA256:
3
- metadata.gz: d72d062459cac16c3caf4d7f16441317cb9f9321cdea1c22e159b0babc66104e
4
- data.tar.gz: f0f3f0774ea4c23775f71b15165b709f5b39d6a42ea8b8cdfecefd189b2f6de4
3
+ metadata.gz: 10e8332a28ba06cbed648d66d0ee4c367e9f179fe30ae4903846ab789070e596
4
+ data.tar.gz: 56d30e6a7276dceff80df33748def18474204b58c4835d2fd2c59cccace8df2f
5
5
  SHA512:
6
- metadata.gz: aaf6d784d1aafc96ab531bab1654f084b741ae60ff829409544455b05691b7244c395e9a4dc503d3ec48149281ff2782d8aac61e625784213d568b53af9f63da
7
- data.tar.gz: dd8d7ef4981e8504c0ceec06dceb783b03622dbf44dfbd0a47abe8bd4737099122d23f71679ed5fbbf6e9831c498dfa57a3e6273d422a75839ae09189b11f2fe
6
+ metadata.gz: 4fc9193a4582aae06a8bbd6c886b99086142c7e9a57a4f09230e7152931f227d04c84007190629a9772a4c4e3a1d4a2f8a8f5fcb023f271c287f27c89f15c69d
7
+ data.tar.gz: a10af69c0ea9fb5b8cb88bcde086e9abbba12fdade60e08255d2192e75450994527256d0bb47947bb05463871affc427874868c689ba9a87ececf671ec25a257
@@ -10,7 +10,123 @@ The format is based on [Keep a Changelog], and this project adheres to
10
10
 
11
11
  ## [Unreleased]
12
12
 
13
- [Unreleased]: https://github.com/envato/pagerduty/compare/v2.1.3...HEAD
13
+ [Unreleased]: https://github.com/envato/pagerduty/compare/v3.0.0...HEAD
14
+
15
+ ## [3.0.0] - 2020-04-20
16
+
17
+ ### Added
18
+
19
+ - A new mechanism for instantiating a Pagerduty instance ([#64]).
20
+
21
+ ```ruby
22
+ pagerduty = Pagerduty.build(integration_key: "<my-integration-key>",
23
+ api_version: 1)
24
+ ```
25
+
26
+ This new method will return an instance that implements requested PagerDuty
27
+ Events API version.
28
+
29
+ - Support for the [Pagerduty Events API version 2][events-v2-docs] ([#66]).
30
+
31
+ ```ruby
32
+ pagerduty = Pagerduty.build(
33
+ integration_key: "<my-integration-key>",
34
+ api_version: 2
35
+ )
36
+ incident = pagerduty.trigger(
37
+ summary: "summary",
38
+ source: "source",
39
+ severity: "critical"
40
+ )
41
+ incident.acknowledge
42
+ incident.resolve
43
+ ```
44
+
45
+ - Added an `incident` method to the Pagerduty Events API V1 instance ([#67]).
46
+ This is intended as a drop-in replacement for the now-deprecated
47
+ `get_incident` method.
48
+
49
+ ```ruby
50
+ pagerduty = Pagerduty.build(
51
+ integration_key: "<integration-key>",
52
+ api_version: 1
53
+ )
54
+ incident = pagerduty.incident("<incident-key>")
55
+ ```
56
+
57
+ ### Deprecated
58
+
59
+ - Using `new` on `Pagerduty` ([#64]). This works, but will be removed in the
60
+ next major version.
61
+
62
+ ```diff
63
+ - pagerduty = Pagerduty.new("<integration-key>")
64
+ + pagerduty = Pagerduty.build(integration_key: "<integration-key>", api_version: 1)
65
+ pagerduty.trigger("<incident description>")
66
+ incident.acknowledge
67
+ incident.resolve
68
+ ```
69
+
70
+ Instead, use the new `Pagerduty.build` method (see above).
71
+
72
+ - The `get_incident` method is now deprecated ([#67]). It still works, but
73
+ will be removed in the next major release. Please migrate to the new
74
+ `incident` method, that works in exactly the same way.
75
+
76
+ ```diff
77
+ pagerduty = Pagerduty.new("<integration-key>")
78
+ - incident = pagerduty.get_incident("<incident-key>")
79
+ + incident = pagerduty.incident("<incident-key>")
80
+ incident.trigger("<incident description>")
81
+ incident.acknowledge
82
+ incident.resolve
83
+ ```
84
+
85
+ ### Changed
86
+
87
+ - `Pagerduty` is no longer a class. It's now a Ruby module ([#64]). This will
88
+ break implementations that use `Pagerduty` in their inheritance tree.
89
+
90
+ - `PagerdutyIncident` no-longer inherits from `Pagerduty` and its initializer
91
+ parameters have changed ([#64]). Actually, it's now an alias of the
92
+ `Pagerduty::EventsApiV1:Incident` class.
93
+
94
+ ### Removed
95
+
96
+ - Can no longer specify a new incident key when triggering from an `Incident`
97
+ object ([#64]).
98
+
99
+ This will now raise an `ArgumentError`. eg.
100
+
101
+ ```ruby
102
+ incident1 = pagerduty.trigger('first incident', incident_key: 'one') # this'll work fine
103
+ incident2 = incident1.trigger('second incident', incident_key: 'two') # this no-longer works.
104
+ ```
105
+
106
+ The difference is in the object we're calling the method on.
107
+
108
+ Instead always use the pagerduty object when triggering new incidents (with
109
+ new incident keys).
110
+
111
+ This works with the Events API V1:
112
+
113
+ ```ruby
114
+ incident1 = pagerduty.trigger('first incident', incident_key: 'one')
115
+ incident2 = pagerduty.trigger('second incident', incident_key: 'two')
116
+ ```
117
+
118
+ And this is even better, as it works with both the Events API V1 and V2:
119
+
120
+ ```ruby
121
+ incident1 = pagerduty.incident('one').trigger('first incident')
122
+ incident2 = pagerduty.incident('two').trigger('second incident')
123
+ ```
124
+
125
+ [3.0.0]: https://github.com/envato/pagerduty/compare/v2.1.3...v3.0.0
126
+ [events-v2-docs]: https://v2.developer.pagerduty.com/docs/send-an-event-events-api-v2
127
+ [#64]: https://github.com/envato/pagerduty/pull/64
128
+ [#66]: https://github.com/envato/pagerduty/pull/66
129
+ [#67]: https://github.com/envato/pagerduty/pull/67
14
130
 
15
131
  ## [2.1.3] - 2020-02-10
16
132
 
data/README.md CHANGED
@@ -1,13 +1,14 @@
1
1
  # pagerduty
2
2
 
3
-
4
3
  [![License MIT](https://img.shields.io/badge/license-MIT-brightgreen.svg)](https://github.com/envato/pagerduty/blob/master/LICENSE.txt)
5
4
  [![Gem Version](https://img.shields.io/gem/v/pagerduty.svg?maxAge=2592000)](https://rubygems.org/gems/pagerduty)
6
5
  [![Gem Downloads](https://img.shields.io/gem/dt/pagerduty.svg?maxAge=2592000)](https://rubygems.org/gems/pagerduty)
7
6
  [![Build Status](https://travis-ci.org/envato/pagerduty.svg?branch=master)](https://travis-ci.org/envato/pagerduty)
8
7
 
9
- Provides a lightweight Ruby interface for calling the [PagerDuty
10
- Events API](https://v2.developer.pagerduty.com/docs/events-api).
8
+ Provides a lightweight Ruby interface for calling the [PagerDuty Events
9
+ API][events-v2-docs].
10
+
11
+ [events-v2-docs]: https://v2.developer.pagerduty.com/docs/send-an-event-events-api-v2
11
12
 
12
13
  ## Installation
13
14
 
@@ -27,58 +28,171 @@ Or install it yourself as:
27
28
 
28
29
  ## Usage
29
30
 
31
+ ### Events API V2
32
+
30
33
  ```ruby
31
- # Don't forget to require the library
32
- require "pagerduty"
34
+ # Instantiate a Pagerduty service object providing an integration key and the
35
+ # desired API version: 2
36
+ pagerduty = Pagerduty.build(
37
+ integration_key: "<integration-key>",
38
+ api_version: 2
39
+ )
33
40
 
34
- # Instantiate a Pagerduty with your specific service key
35
- pagerduty = Pagerduty.new("<my-service-key>")
41
+ # Trigger an incident providing minimal details
42
+ incident = pagerduty.trigger(
43
+ summary: "summary",
44
+ source: "source",
45
+ severity: "critical"
46
+ )
36
47
 
37
- # Trigger an incident
38
- incident = pagerduty.trigger("incident description")
48
+ # Trigger an incident providing full context
49
+ incident = pagerduty.trigger(
50
+ summary: "Example alert on host1.example.com",
51
+ source: "monitoringtool:cloudvendor:central-region-dc-01:852559987:cluster/api-stats-prod-003",
52
+ severity: %w[critical error warning info].sample,
53
+ timestamp: Time.now,
54
+ component: "postgres",
55
+ group: "prod-datapipe",
56
+ class: "deploy",
57
+ custom_details: {
58
+ ping_time: "1500ms",
59
+ load_avg: 0.75
60
+ },
61
+ images: [
62
+ {
63
+ src: "https://www.pagerduty.com/wp-content/uploads/2016/05/pagerduty-logo-green.png",
64
+ href: "https://example.com/",
65
+ alt: "Example text",
66
+ },
67
+ ],
68
+ links: [
69
+ {
70
+ href: "https://example.com/",
71
+ text: "Link text",
72
+ },
73
+ ],
74
+ client: "Sample Monitoring Service",
75
+ client_url: "https://monitoring.example.com"
76
+ )
39
77
 
40
78
  # Acknowledge and/or resolve the incident
41
79
  incident.acknowledge
42
80
  incident.resolve
43
81
 
44
- # Acknowledge and/or resolve an existing incident
45
- incident = pagerduty.get_incident("<unique-incident-key>")
82
+ # Provide a client-defined incident key
83
+ # (this can be used to update existing incidents)
84
+ incident = pagerduty.incident("<incident-key>")
85
+ incident.trigger(
86
+ summary: "summary",
87
+ source: "source",
88
+ severity: "critical"
89
+ )
46
90
  incident.acknowledge
47
91
  incident.resolve
48
92
  ```
49
93
 
50
- There are a whole bunch of properties you can send to PagerDuty when triggering
51
- an incident. See the [PagerDuty
52
- documentation](https://v2.developer.pagerduty.com/docs/trigger-events) for the
53
- specifics.
94
+ See the [PagerDuty Events API V2 documentation][events-v2-docs] for a
95
+ detailed description on the parameters you can send when triggering an
96
+ incident.
97
+
98
+ ### Events API V1
99
+
100
+ The following code snippet shows how to use the [Pagerduty Events API version
101
+ 1](https://v2.developer.pagerduty.com/docs/events-api).
54
102
 
55
103
  ```ruby
56
- pagerduty.trigger(
57
- "incident description",
58
- incident_key: "my unique incident identifier",
59
- client: "server in trouble",
60
- client_url: "http://server.in.trouble",
61
- details: { my: "extra details" }
104
+ # Instantiate a Pagerduty with a service integration key
105
+ pagerduty = Pagerduty.build(
106
+ integration_key: "<integration-key>",
107
+ api_version: 1,
108
+ )
109
+
110
+ # Trigger an incident
111
+ incident = pagerduty.trigger(
112
+ "FAILURE for production/HTTP on machine srv01.acme.com",
113
+ )
114
+
115
+ # Trigger an incident providing context and details
116
+ incident = pagerduty.trigger(
117
+ "FAILURE for production/HTTP on machine srv01.acme.com",
118
+ client: "Sample Monitoring Service",
119
+ client_url: "https://monitoring.service.com",
120
+ contexts: [
121
+ {
122
+ type: "link",
123
+ href: "http://acme.pagerduty.com",
124
+ text: "View the incident on PagerDuty",
125
+ },
126
+ {
127
+ type: "image",
128
+ src: "https://chart.googleapis.com/chart?chs=600x400&chd=t:6,2,9,5,2,5,7,4,8,2,1&cht=lc&chds=a&chxt=y&chm=D,0033FF,0,0,5,1",
129
+ }
130
+ ],
131
+ details: {
132
+ ping_time: "1500ms",
133
+ load_avg: 0.75,
134
+ },
62
135
  )
136
+
137
+ # Acknowledge the incident
138
+ incident.acknowledge
139
+
140
+ # Acknowledge, providing a description and extra details
141
+ incident.acknowledge(
142
+ "Engineers are investigating the incident",
143
+ {
144
+ ping_time: "1700ms",
145
+ load_avg: 0.71,
146
+ }
147
+ )
148
+
149
+ # Resolve the incident
150
+ incident.resolve
151
+
152
+ # Resolve, providing a description and extra details
153
+ incident.acknowledge(
154
+ "A fix has been deployed and the service has recovered",
155
+ {
156
+ ping_time: "120ms",
157
+ load_avg: 0.23,
158
+ }
159
+ )
160
+
161
+ # Provide a client defined incident key
162
+ # (this can be used to update existing incidents)
163
+ incident = pagerduty.incident("<incident-key>")
164
+ incident.trigger("Description of the event")
165
+ incident.acknowledge
166
+ incident.resolve
63
167
  ```
64
168
 
169
+ See the [PagerDuty Events API V1
170
+ documentation](https://v2.developer.pagerduty.com/docs/trigger-events) for a
171
+ detailed description of the parameters you can send when triggering an
172
+ incident.
173
+
65
174
  ### HTTP Proxy Support
66
175
 
67
176
  One can explicitly define an HTTP proxy like this:
68
177
 
69
178
  ```ruby
70
- # Instantiate a Pagerduty with your specific service key and proxy details
71
- pagerduty = Pagerduty.new(
72
- "<my-service-key>",
73
- proxy_host: "my.http.proxy.local",
74
- proxy_port: 3128,
75
- proxy_username: "<my-proxy-username>",
76
- proxy_password: "<my-proxy-password>",
179
+ pagerduty = Pagerduty.build(
180
+ integration_key: "<integration-key>",
181
+ api_version: 2, # The HTTP proxy settings work with either API version
182
+ http_proxy: {
183
+ host: "my.http.proxy.local",
184
+ port: 3128,
185
+ username: "<my-proxy-username>",
186
+ password: "<my-proxy-password>",
187
+ }
77
188
  )
78
189
 
79
- # Then proceed to trigger your incident
80
- # (sends the request to PagerDuty via the HTTP proxy)
81
- incident = pagerduty.trigger("incident description")
190
+ # Subsequent API calls will then be sent via the HTTP proxy
191
+ incident = pagerduty.trigger(
192
+ summary: "summary",
193
+ source: "source",
194
+ severity: "critical"
195
+ )
82
196
  ```
83
197
 
84
198
  ### Debugging Error Responses
@@ -88,7 +202,11 @@ go about debugging these unhappy cases:
88
202
 
89
203
  ```ruby
90
204
  begin
91
- pagerduty.trigger("incident description")
205
+ pagerduty.trigger(
206
+ summary: "summary",
207
+ source: "source",
208
+ severity: "critical"
209
+ )
92
210
  rescue Net::HTTPServerException => error
93
211
  error.response.code #=> "400"
94
212
  error.response.message #=> "Bad Request"
@@ -96,6 +214,23 @@ rescue Net::HTTPServerException => error
96
214
  end
97
215
  ```
98
216
 
217
+ ### Legacy Interface
218
+
219
+ The older Ruby interface from version 2 of the gem is still available.
220
+ However, this is deprecated and will be removed in the next major release.
221
+
222
+ ```ruby
223
+ # Instantiate a Pagerduty with your specific service key
224
+ pagerduty = Pagerduty.new("<my-integration-key>")
225
+
226
+ # Trigger an incident
227
+ incident = pagerduty.trigger("incident description")
228
+
229
+ # Acknowledge and resolve the incident
230
+ incident.acknowledge
231
+ incident.resolve
232
+ ```
233
+
99
234
  ## Contributing
100
235
 
101
236
  1. Fork it ( https://github.com/envato/pagerduty/fork )
@@ -2,6 +2,9 @@
2
2
 
3
3
  require "pagerduty/version"
4
4
  require "pagerduty/http_transport"
5
+ require "pagerduty/events_api_v1"
6
+ require "pagerduty/events_api_v2"
7
+ require "pagerduty/legacy"
5
8
 
6
9
  class PagerdutyException < StandardError
7
10
  attr_reader :pagerduty_instance, :api_response
@@ -13,179 +16,73 @@ class PagerdutyException < StandardError
13
16
  end
14
17
  end
15
18
 
16
- class Pagerduty
17
- attr_reader :service_key
18
-
19
- # @param [String] service_key The GUID of one of your "Generic API" services.
20
- # This is the "service key" listed on a Generic API's service detail page.
21
- #
22
- # @option options [String] :proxy_host The DNS name or IP address of the
23
- # proxy host. If nil or unprovided a proxy will not be used.
24
- #
25
- # @option options [String] :proxy_port The port to use to access the proxy.
26
- #
27
- # @option options [String] :proxy_username username if authorization is
19
+ module Pagerduty
20
+ # Build an instance that will send API calls to the specified Pagerduty
21
+ # Events API version.
22
+ #
23
+ # @example Build an instance for the Events API version 1
24
+ # pagerduty = Pagerduty.build(
25
+ # integration_key: "<integration-key>",
26
+ # api_version: 1,
27
+ # )
28
+ #
29
+ # @example Build an instance using an HTTP proxy for API requests
30
+ # pagerduty = Pagerduty.build(
31
+ # integration_key: "<integration-key>",
32
+ # api_version: 1,
33
+ # http_proxy: {
34
+ # host: "my.http.proxy.local",
35
+ # port: 3128,
36
+ # username: "<my-proxy-username>",
37
+ # password: "<my-proxy-password>",
38
+ # }
39
+ # )
40
+ #
41
+ # @option config [String] integration_key Authentication key for connecting
42
+ # to PagerDuty. A UUID expressed as a 32-digit hexadecimal number.
43
+ # Integration keys are generated by creating a new service, or creating a
44
+ # new integration for an existing service in PagerDuty, and can be found on
45
+ # a service's Integrations tab. This option is required.
46
+ #
47
+ # @option config [String] api_version The version of the Pagerduty events API.
48
+ # The gem currently supports version 1 (`1`). This option is required.
49
+ #
50
+ # @option config [String] http_proxy.host The DNS name or IP address of the
51
+ # proxy host. If nil or unprovided an HTTP proxy will not be used.
52
+ #
53
+ # @option config [String] http_proxy.port The TCP port to use to access the
54
+ # proxy.
55
+ #
56
+ # @option config [String] http_proxy.username username if authorization is
28
57
  # required to use the proxy.
29
58
  #
30
- # @option options [String] :proxy_password password if authorization is
59
+ # @option config [String] http_proxy.password password if authorization is
31
60
  # required to use the proxy.
32
61
  #
33
- def initialize(service_key, options = {})
34
- @service_key = service_key
35
- @transport = transport_from_options(options)
36
- end
37
-
38
- # Send PagerDuty a trigger event to report a new or ongoing problem. When
39
- # PagerDuty receives a trigger event, it will either open a new incident, or
40
- # add a new trigger log entry to an existing incident, depending on the
41
- # provided incident_key.
42
- #
43
- # @param [String] description A short description of the problem that led to
44
- # this trigger. This field (or a truncated version) will be used when
45
- # generating phone calls, SMS messages and alert emails. It will also appear
46
- # on the incidents tables in the PagerDuty UI. The maximum length is 1024
47
- # characters.
62
+ # @return [Pagerduty::EventsApiV1] the built instance.
48
63
  #
49
- # @option options [String] :incident_key Identifies the incident to which
50
- # this trigger event should be applied. If there's no open (i.e. unresolved)
51
- # incident with this key, a new one will be created. If there's already an
52
- # open incident with a matching key, this event will be appended to that
53
- # incident's log. The event key provides an easy way to "de-dup" problem
54
- # reports. If this field isn't provided, PagerDuty will automatically open a
55
- # new incident with a unique key.
64
+ # @raise [ArgumentError] If integration_key or api_version options are not
65
+ # provided. Or if the provided api_version is unsupported.
56
66
  #
57
- # @option options [String] :client The name of the monitoring client that is
58
- # triggering this event.
59
- #
60
- # @option options [String] :client_url The URL of the monitoring client that
61
- # is triggering this event.
62
- #
63
- # @option options [Hash] :details An arbitrary hash containing any data you'd
64
- # like included in the incident log.
65
- #
66
- # @return [PagerdutyIncident] The triggered incident.
67
- #
68
- # @raise [PagerdutyException] If PagerDuty responds with a status that is not
69
- # "success"
70
- #
71
- def trigger(description, options = {})
72
- resp = api_call("trigger", options.merge(description: description))
73
- ensure_success(resp)
74
- PagerdutyIncident.new(
75
- service_key,
76
- resp["incident_key"],
77
- transport: @transport,
78
- )
79
- end
80
-
81
- # @param [String] incident_key The unique identifier for the incident.
82
- #
83
- # @return [PagerdutyIncident] The incident referenced by the key.
84
- #
85
- # @raise [ArgumentError] If incident_key is nil
86
- #
87
- def get_incident(incident_key)
88
- raise ArgumentError, "incident_key is nil" if incident_key.nil?
89
-
90
- PagerdutyIncident.new(
91
- service_key,
92
- incident_key,
93
- transport: @transport,
94
- )
95
- end
96
-
97
- protected
98
-
99
- def api_call(event_type, args)
100
- args = args.merge(
101
- service_key: service_key,
102
- event_type: event_type,
103
- )
104
- @transport.send_payload(args)
105
- end
106
-
107
- def ensure_success(response)
108
- unless response["status"] == "success"
109
- raise PagerdutyException.new(self, response, response["message"])
67
+ def self.build(config)
68
+ unless config.key?(:integration_key)
69
+ raise ArgumentError, "integration_key not provided"
110
70
  end
111
- end
112
-
113
- private
71
+ raise ArgumentError, "incident_key provided" if config.key?(:incident_key)
114
72
 
115
- # @api private
116
- def transport_from_options(options = {})
117
- options[:transport] || Pagerduty::HttpTransport.new(options)
118
- end
119
- end
120
-
121
- class PagerdutyIncident < Pagerduty
122
- attr_reader :incident_key
123
-
124
- # @param [String] service_key The GUID of one of your "Generic API" services.
125
- # This is the "service key" listed on a Generic API's service detail page.
126
- #
127
- # @param [String] incident_key The unique identifier for the incident.
128
- #
129
- def initialize(service_key, incident_key, options = {})
130
- super service_key, options
131
- @incident_key = incident_key
132
- end
133
-
134
- # @param (see Pagerduty#trigger)
135
- # @option (see Pagerduty#trigger)
136
- def trigger(description, options = {})
137
- super(description, { incident_key: incident_key }.merge(options))
138
- end
139
-
140
- # Acknowledge the referenced incident. While an incident is acknowledged, it
141
- # won't generate any additional notifications, even if it receives new
142
- # trigger events. Send PagerDuty an acknowledge event when you know someone
143
- # is presently working on the problem.
144
- #
145
- # @param [String] description Text that will appear in the incident's log
146
- # associated with this event.
147
- #
148
- # @param [Hash] details An arbitrary hash containing any data you'd like
149
- # included in the incident log.
150
- #
151
- # @return [PagerdutyIncident] self
152
- #
153
- # @raise [PagerdutyException] If PagerDuty responds with a status that is not
154
- # "success"
155
- #
156
- def acknowledge(description = nil, details = nil)
157
- modify_incident("acknowledge", description, details)
158
- end
159
-
160
- # Resolve the referenced incident. Once an incident is resolved, it won't
161
- # generate any additional notifications. New trigger events with the same
162
- # incident_key as a resolved incident won't re-open the incident. Instead, a
163
- # new incident will be created. Send PagerDuty a resolve event when the
164
- # problem that caused the initial trigger event has been fixed.
165
- #
166
- # @param [String] description Text that will appear in the incident's log
167
- # associated with this event.
168
- #
169
- # @param [Hash] details An arbitrary hash containing any data you'd like
170
- # included in the incident log.
171
- #
172
- # @return [PagerdutyIncident] self
173
- #
174
- # @raise [PagerdutyException] If PagerDuty responds with a status that is not
175
- # "success"
176
- #
177
- def resolve(description = nil, details = nil)
178
- modify_incident("resolve", description, details)
73
+ version = config.fetch(:api_version) do
74
+ raise ArgumentError, "api_version not provided"
75
+ end
76
+ events_api_class(version).new(config)
179
77
  end
180
78
 
181
- private
182
-
183
- def modify_incident(event_type, description, details)
184
- options = { incident_key: incident_key }
185
- options[:description] = description if description
186
- options[:details] = details if details
187
- resp = api_call(event_type, options)
188
- ensure_success(resp)
189
- self
79
+ def self.events_api_class(version)
80
+ class_name = "Pagerduty::EventsApiV#{version}"
81
+ if const_defined?(class_name)
82
+ const_get(class_name)
83
+ else
84
+ raise ArgumentError, "api_version #{version.inspect} not supported"
85
+ end
190
86
  end
87
+ private_class_method :events_api_class
191
88
  end
@@ -0,0 +1,279 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pagerduty
4
+ # Trigger incidents via the PagerDuty Events API version 1.
5
+ #
6
+ # @see https://v2.developer.pagerduty.com/docs/events-api PagerDuty Events
7
+ # API V1 documentation
8
+ #
9
+ # @see Pagerduty.build
10
+ #
11
+ # @see Pagerduty::EventsApiV1::Incident
12
+ #
13
+ class EventsApiV1
14
+ # Rather than using this directly, use the {Pagerduty.build} method to
15
+ # construct an instance.
16
+ #
17
+ # @option config [String] integration_key Authentication key for connecting
18
+ # to PagerDuty. A UUID expressed as a 32-digit hexadecimal number.
19
+ # Integration keys are generated by creating a new service, or creating a
20
+ # new integration for an existing service in PagerDuty, and can be found
21
+ # on a service's Integrations tab. This option is required.
22
+ #
23
+ # @option config [String] http_proxy.host The DNS name or IP address of the
24
+ # proxy host. If nil or unprovided an HTTP proxy will not be used.
25
+ #
26
+ # @option config [String] http_proxy.port The TCP port to use to access the
27
+ # proxy.
28
+ #
29
+ # @option config [String] http_proxy.username username if authorization is
30
+ # required to use the proxy.
31
+ #
32
+ # @option config [String] http_proxy.password password if authorization is
33
+ # required to use the proxy.
34
+ #
35
+ # @see Pagerduty.build
36
+ #
37
+ def initialize(config)
38
+ @config = config
39
+ end
40
+
41
+ # Send PagerDuty a trigger event to report a new or ongoing problem.
42
+ #
43
+ # @example Trigger an incident
44
+ # incident = pagerduty.trigger(
45
+ # "<A description of the event or outage>"
46
+ # )
47
+ #
48
+ # @example Trigger an incident, providing more context and details
49
+ # incident = pagerduty.trigger(
50
+ # "FAILURE for production/HTTP on machine srv01.acme.com",
51
+ # client: "Sample Monitoring Service",
52
+ # client_url: "https://monitoring.service.com",
53
+ # contexts: [
54
+ # {
55
+ # type: "link",
56
+ # href: "http://acme.pagerduty.com",
57
+ # text: "View the incident on PagerDuty",
58
+ # },
59
+ # {
60
+ # type: "image",
61
+ # src: "https://chart.googleapis.com/chart.png",
62
+ # }
63
+ # ],
64
+ # details: {
65
+ # ping_time: "1500ms",
66
+ # load_avg: 0.75,
67
+ # },
68
+ # )
69
+ #
70
+ # @param [String] description A short description of the problem that led to
71
+ # this trigger. This field (or a truncated version) will be used when
72
+ # generating phone calls, SMS messages and alert emails. It will also
73
+ # appear on the incidents tables in the PagerDuty UI. The maximum length
74
+ # is 1024 characters.
75
+ #
76
+ # @option options [String] client The name of the monitoring client that is
77
+ # triggering this event.
78
+ #
79
+ # @option options [String] client_url The URL of the monitoring client that
80
+ # is triggering this event.
81
+ #
82
+ # @option options [Array] contexts An array of objects. Contexts to be
83
+ # included with the incident trigger such as links to graphs or images.
84
+ #
85
+ # @option options [Hash] details An arbitrary hash containing any data you'd
86
+ # like included in the incident log.
87
+ #
88
+ # @return [Pagerduty::EventsApiV1::Incident] The triggered incident.
89
+ #
90
+ # @raise [PagerdutyException] If PagerDuty responds with a status that is
91
+ # not "success"
92
+ #
93
+ def trigger(description, options = {})
94
+ config = @config.merge(incident_key: options[:incident_key])
95
+ options = options.reject { |key| key == :incident_key }
96
+ Incident.new(config).trigger(description, options)
97
+ end
98
+
99
+ # @param [String] incident_key Identifies the incident to which
100
+ # this trigger event should be applied. If there's no open (i.e.
101
+ # unresolved) incident with this key, a new one will be created. If
102
+ # there's already an open incident with a matching key, this event will be
103
+ # appended to that incident's log. The event key provides an easy way to
104
+ # "de-dup" problem reports. If this field isn't provided, PagerDuty will
105
+ # automatically open a new incident with a unique key. The maximum length
106
+ # is 255 characters.
107
+ #
108
+ # @return [Pagerduty::EventsApiV1::Incident] The incident referenced by the
109
+ # key.
110
+ #
111
+ # @raise [ArgumentError] If incident_key is nil
112
+ #
113
+ def incident(incident_key)
114
+ raise ArgumentError, "incident_key is nil" if incident_key.nil?
115
+
116
+ Incident.new(@config.merge(incident_key: incident_key))
117
+ end
118
+
119
+ class Incident
120
+ attr_reader :incident_key
121
+
122
+ # @option (see Pagerduty::EventsApiV1#initialize)
123
+ #
124
+ # @option config [String] incident_key Identifies the incident to which
125
+ # this trigger event should be applied. If there's no open
126
+ # (i.e. unresolved) incident with this key, a new one will be created.
127
+ # If there's already an open incident with a matching key, this event
128
+ # will be appended to that incident's log. The event key provides an
129
+ # easy way to "de-dup" problem reports. If this field isn't provided,
130
+ # PagerDuty will automatically open a new incident with a unique key.
131
+ # The maximum length is 255 characters.
132
+ #
133
+ def initialize(config)
134
+ @integration_key = config.fetch(:integration_key) do
135
+ raise ArgumentError "integration_key not provided"
136
+ end
137
+ @incident_key = config[:incident_key]
138
+ @transport = Pagerduty::HttpTransport.new(
139
+ path: "/generic/2010-04-15/create_event.json",
140
+ proxy: config[:http_proxy],
141
+ )
142
+ end
143
+
144
+ # Send PagerDuty a trigger event to report a new or ongoing problem. When
145
+ # PagerDuty receives a trigger event, it will either open a new incident,
146
+ # or add a new trigger log entry to an existing incident, depending on the
147
+ # provided incident_key.
148
+ #
149
+ # @example Trigger or update an incident
150
+ # incident.trigger(
151
+ # "<A description of the event or outage>"
152
+ # )
153
+ #
154
+ # @example Trigger or update an incident, providing more context
155
+ # incident.trigger(
156
+ # "FAILURE for production/HTTP on machine srv01.acme.com",
157
+ # client: "Sample Monitoring Service",
158
+ # client_url: "https://monitoring.service.com",
159
+ # contexts: [
160
+ # {
161
+ # type: "link",
162
+ # href: "http://acme.pagerduty.com",
163
+ # text: "View the incident on PagerDuty",
164
+ # },
165
+ # {
166
+ # type: "image",
167
+ # src: "https://chart.googleapis.com/chart.png",
168
+ # }
169
+ # ],
170
+ # details: {
171
+ # ping_time: "1500ms",
172
+ # load_avg: 0.75,
173
+ # },
174
+ # )
175
+ #
176
+ # @param (see Pagerduty::EventsApiV1#trigger)
177
+ # @option (see Pagerduty::EventsApiV1#trigger)
178
+ def trigger(description, options = {})
179
+ if options.key?(:incident_key)
180
+ raise ArgumentError, "incident_key provided"
181
+ end
182
+
183
+ options = options.merge(description: description)
184
+ options[:incident_key] = @incident_key unless @incident_key.nil?
185
+ response = api_call("trigger", options)
186
+ @incident_key = response["incident_key"]
187
+ self
188
+ end
189
+
190
+ # Acknowledge the referenced incident. While an incident is acknowledged,
191
+ # it won't generate any additional notifications, even if it receives new
192
+ # trigger events. Send PagerDuty an acknowledge event when you know
193
+ # someone is presently working on the problem.
194
+ #
195
+ # @example Acknowledge the incident
196
+ # incident.acknowledge
197
+ #
198
+ # @example Acknowledge, providing a description and extra details
199
+ # incident.acknowledge(
200
+ # "Engineers are investigating the incident",
201
+ # {
202
+ # ping_time: "1700ms",
203
+ # load_avg: 0.71,
204
+ # }
205
+ # )
206
+ #
207
+ # @param [String] description Text that will appear in the incident's log
208
+ # associated with this event.
209
+ #
210
+ # @param [Hash] details An arbitrary hash containing any data you'd like
211
+ # included in the incident log.
212
+ #
213
+ # @return [Pagerduty::EventsApiV1::Incident] self
214
+ #
215
+ # @raise [PagerdutyException] If PagerDuty responds with a status that is
216
+ # not "success"
217
+ #
218
+ def acknowledge(description = nil, details = nil)
219
+ modify_incident("acknowledge", description, details)
220
+ end
221
+
222
+ # Resolve the referenced incident. Once an incident is resolved, it won't
223
+ # generate any additional notifications. New trigger events with the same
224
+ # incident_key as a resolved incident won't re-open the incident. Instead,
225
+ # a new incident will be created. Send PagerDuty a resolve event when the
226
+ # problem that caused the initial trigger event has been fixed.
227
+ #
228
+ # @example Resolve the incident
229
+ # incident.resolve
230
+ #
231
+ # @example Resolve, providing a description and extra details
232
+ # incident.resolve(
233
+ # "A fix has been deployed and the service has recovered",
234
+ # {
235
+ # ping_time: "130ms",
236
+ # load_avg: 0.23,
237
+ # }
238
+ # )
239
+ #
240
+ # @param [String] description Text that will appear in the incident's log
241
+ # associated with this event.
242
+ #
243
+ # @param [Hash] details An arbitrary hash containing any data you'd like
244
+ # included in the incident log.
245
+ #
246
+ # @return [Pagerduty::EventsApiV1::Incident] self
247
+ #
248
+ # @raise [PagerdutyException] If PagerDuty responds with a status that is
249
+ # not "success"
250
+ #
251
+ def resolve(description = nil, details = nil)
252
+ modify_incident("resolve", description, details)
253
+ end
254
+
255
+ private
256
+
257
+ def modify_incident(event_type, description, details)
258
+ options = { incident_key: incident_key }
259
+ options[:description] = description if description
260
+ options[:details] = details if details
261
+ api_call(event_type, options)
262
+ self
263
+ end
264
+
265
+ def api_call(event_type, args)
266
+ args = args.merge(
267
+ service_key: @integration_key,
268
+ event_type: event_type,
269
+ )
270
+ response = @transport.send_payload(args)
271
+ unless response["status"] == "success"
272
+ raise PagerdutyException.new(self, response, response["message"])
273
+ end
274
+
275
+ response
276
+ end
277
+ end
278
+ end
279
+ end
@@ -0,0 +1,280 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "time"
4
+
5
+ module Pagerduty
6
+ # Trigger incidents via the PagerDuty Events API version 2.
7
+ #
8
+ # @see https://v2.developer.pagerduty.com/docs/events-api-v2 PagerDuty Events
9
+ # API V2 documentation
10
+ #
11
+ # @see Pagerduty.build
12
+ #
13
+ # @see Pagerduty::EventsApiV2::Incident
14
+ #
15
+ class EventsApiV2
16
+ # Rather than using this directly, use the {Pagerduty.build} method to
17
+ # construct an instance.
18
+ #
19
+ # @option config [String] integration_key Authentication key for connecting
20
+ # to PagerDuty. A UUID expressed as a 32-digit hexadecimal number.
21
+ # Integration keys are generated by creating a new service, or creating a
22
+ # new integration for an existing service in PagerDuty, and can be found
23
+ # on a service's Integrations tab. This option is required.
24
+ #
25
+ # @option config [String] http_proxy.host The DNS name or IP address of the
26
+ # proxy host. If nil or unprovided an HTTP proxy will not be used.
27
+ #
28
+ # @option config [String] http_proxy.port The TCP port to use to access the
29
+ # proxy.
30
+ #
31
+ # @option config [String] http_proxy.username username if authorization is
32
+ # required to use the proxy.
33
+ #
34
+ # @option config [String] http_proxy.password password if authorization is
35
+ # required to use the proxy.
36
+ #
37
+ # @see Pagerduty.build
38
+ #
39
+ def initialize(config = {})
40
+ @config = config
41
+ end
42
+
43
+ # Send PagerDuty a trigger event to report a new or ongoing problem. When
44
+ # PagerDuty receives a trigger event, it will either open a new incident, or
45
+ # add a new trigger log entry to an existing incident, depending on the
46
+ # incident key.
47
+ #
48
+ # @example Trigger an incident, providing only required details
49
+ # incident = pagerduty.trigger(
50
+ # summary: "summary",
51
+ # source: "source",
52
+ # severity: "critical"
53
+ # )
54
+ #
55
+ # @example Trigger an incident providing full context
56
+ # incident = pagerduty.trigger(
57
+ # summary: "Example alert on host1.example.com",
58
+ # source: "monitoringtool:host1.example.com/prod-003",
59
+ # severity: %w[critical error warning info].sample,
60
+ # timestamp: Time.now,
61
+ # component: "postgres",
62
+ # group: "prod-datapipe",
63
+ # class: "deploy",
64
+ # custom_details: {
65
+ # ping_time: "1500ms",
66
+ # load_avg: 0.75
67
+ # },
68
+ # images: [
69
+ # {
70
+ # src: "https://chart.googleapis.com/chart.png",
71
+ # href: "https://example.com/",
72
+ # alt: "Example text",
73
+ # },
74
+ # ],
75
+ # links: [
76
+ # {
77
+ # href: "https://example.com/",
78
+ # text: "Link text",
79
+ # },
80
+ # ],
81
+ # client: "Sample Monitoring Service",
82
+ # client_url: "https://monitoring.example.com"
83
+ # )
84
+ #
85
+ # @option details [String] summary A brief text summary of the event,
86
+ # used to generate the summaries/titles of any associated alerts.
87
+ # The maximum permitted length of this property is 1024 characters.
88
+ #
89
+ # @option details [String] source The unique location of the affected
90
+ # system, preferably a hostname or FQDN.
91
+ #
92
+ # @option details [String] severity The perceived severity of the status
93
+ # the event is describing with respect to the affected system. This can
94
+ # be "critical", "error", "warning" or "info".
95
+ #
96
+ # @option details [Time] timestamp The time at which the emitting tool
97
+ # detected or generated the event.
98
+ #
99
+ # @option details [String] component Component of the source machine
100
+ # that is responsible for the event, for example "mysql" or "eth0".
101
+ #
102
+ # @option details [String] group Logical grouping of components of a
103
+ # service, for example "app-stack".
104
+ #
105
+ # @option details [String] class The class/type of the event, for
106
+ # example "ping failure" or "cpu load".
107
+ #
108
+ # @option details [Hash] custom_details Additional details about the
109
+ # event and affected system
110
+ #
111
+ # @option details [Array] images List of images to include.
112
+ #
113
+ # @option details [Array] links List of links to include.
114
+ #
115
+ # @return [Pagerduty::EventsApiV2::Incident] The triggered incident.
116
+ #
117
+ # @raise [PagerdutyException] If PagerDuty responds with a status that is
118
+ # not "success"
119
+ #
120
+ # @raise [ArgumentError] If details hash is nil
121
+ #
122
+ def trigger(details)
123
+ Incident.new(@config).trigger(details)
124
+ end
125
+
126
+ # @param [String] incident_key The unique identifier for the incident.
127
+ #
128
+ # @return [Pagerduty::EventsApiV2::Incident] The incident referenced by the
129
+ # provided key.
130
+ #
131
+ # @raise [ArgumentError] If incident_key is nil
132
+ #
133
+ def incident(incident_key)
134
+ raise ArgumentError, "incident_key is nil" if incident_key.nil?
135
+
136
+ Incident.new(@config.merge(incident_key: incident_key))
137
+ end
138
+
139
+ class Incident
140
+ attr_reader :incident_key
141
+
142
+ # @option (see Pagerduty::EventsApiV1#initialize)
143
+ #
144
+ # @option config [String] incident_key Identifies the incident to which
145
+ # this trigger event should be applied. If there's no open
146
+ # (i.e. unresolved) incident with this key, a new one will be created.
147
+ # If there's already an open incident with a matching key, this event
148
+ # will be appended to that incident's log. The event key provides an
149
+ # easy way to "de-dup" problem reports. If this field isn't provided,
150
+ # PagerDuty will automatically open a new incident with a unique key.
151
+ # The maximum length is 255 characters.
152
+ #
153
+ def initialize(config = {})
154
+ @integration_key = config.fetch(:integration_key) do
155
+ raise ArgumentError "integration_key not provided"
156
+ end
157
+ @incident_key = config[:incident_key]
158
+ @transport = Pagerduty::HttpTransport.new(
159
+ path: "/v2/enqueue",
160
+ proxy: config[:http_proxy],
161
+ )
162
+ end
163
+
164
+ # Send PagerDuty a trigger event to report a new or ongoing problem. When
165
+ # PagerDuty receives a trigger event, it will either open a new incident,
166
+ # or add a new trigger log entry to an existing incident, depending on
167
+ # the incident key.
168
+ #
169
+ # @example Trigger an incident, providing only required details
170
+ # incident = pagerduty.trigger(
171
+ # summary: "summary",
172
+ # source: "source",
173
+ # severity: "critical"
174
+ # )
175
+ #
176
+ # @example Trigger an incident providing full context
177
+ # incident = pagerduty.trigger(
178
+ # summary: "Example alert on host1.example.com",
179
+ # source: "monitoringtool:host1.example.com/prod-003",
180
+ # severity: %w[critical error warning info].sample,
181
+ # timestamp: Time.now,
182
+ # component: "postgres",
183
+ # group: "prod-datapipe",
184
+ # class: "deploy",
185
+ # custom_details: {
186
+ # ping_time: "1500ms",
187
+ # load_avg: 0.75
188
+ # },
189
+ # images: [
190
+ # {
191
+ # src: "https://chart.googleapis.com/chart.png",
192
+ # href: "https://example.com/",
193
+ # alt: "Example text",
194
+ # },
195
+ # ],
196
+ # links: [
197
+ # {
198
+ # href: "https://example.com/",
199
+ # text: "Link text",
200
+ # },
201
+ # ],
202
+ # client: "Sample Monitoring Service",
203
+ # client_url: "https://monitoring.example.com"
204
+ # )
205
+ #
206
+ # @param (see Pagerduty::EventsApiV2#trigger)
207
+ # @option (see Pagerduty::EventsApiV2#trigger)
208
+ def trigger(details)
209
+ if details.key?(:dedup_key) || details.key?(:incident_key)
210
+ raise ArgumentError, "incident_key or dedup_key provided, "\
211
+ "please use the EventsApiv2::incident method "\
212
+ "to specify an incident key"
213
+ end
214
+
215
+ response = api_call("trigger", trigger_request(details))
216
+ @incident_key = response["dedup_key"]
217
+ self
218
+ end
219
+
220
+ # Acknowledge the referenced incident. While an incident is acknowledged,
221
+ # it won't generate any additional notifications, even if it receives new
222
+ # trigger events. Send PagerDuty an acknowledge event when you know
223
+ # someone is presently working on the problem.
224
+ #
225
+ # @return [Pagerduty::EventsApiV2::Incident] self
226
+ #
227
+ # @raise [PagerdutyException] If PagerDuty responds with a status that is
228
+ # not "success"
229
+ #
230
+ def acknowledge
231
+ api_call("acknowledge")
232
+ self
233
+ end
234
+
235
+ # Resolve the referenced incident. Once an incident is resolved, it won't
236
+ # generate any additional notifications. New trigger events with the same
237
+ # incident_key as a resolved incident won't re-open the incident. Instead,
238
+ # a new incident will be created. Send PagerDuty a resolve event when the
239
+ # problem that caused the initial trigger event has been fixed.
240
+ #
241
+ # @return [Pagerduty::EventsApiV2::Incident] self
242
+ #
243
+ # @raise [PagerdutyException] If PagerDuty responds with a status that is
244
+ # not "success"
245
+ #
246
+ def resolve
247
+ api_call("resolve")
248
+ self
249
+ end
250
+
251
+ private
252
+
253
+ PAYLOAD_ATTR = %i[summary timestamp source severity
254
+ component group class custom_details].freeze
255
+ private_constant :PAYLOAD_ATTR
256
+
257
+ def trigger_request(details)
258
+ payload = details.select { |key| PAYLOAD_ATTR.include?(key) }
259
+ payload[:timestamp] &&= payload[:timestamp].iso8601
260
+ request = details.merge(payload: payload)
261
+ request.reject! { |key| PAYLOAD_ATTR.include?(key) }
262
+ request
263
+ end
264
+
265
+ def api_call(event_action, payload = {})
266
+ payload = payload.merge(
267
+ dedup_key: incident_key,
268
+ routing_key: @integration_key,
269
+ event_action: event_action,
270
+ )
271
+ response = @transport.send_payload(payload)
272
+ unless response["status"] == "success"
273
+ raise PagerdutyException.new(self, response, response["message"])
274
+ end
275
+
276
+ response
277
+ end
278
+ end
279
+ end
280
+ end
@@ -3,19 +3,20 @@
3
3
  require "json"
4
4
  require "net/https"
5
5
 
6
- class Pagerduty
7
- # @api private
6
+ module Pagerduty
7
+ # @private
8
8
  class HttpTransport
9
9
  HOST = "events.pagerduty.com"
10
10
  PORT = 443
11
- PATH = "/generic/2010-04-15/create_event.json"
11
+ private_constant :HOST, :PORT
12
12
 
13
- def initialize(options = {})
14
- @options = options
13
+ def initialize(config)
14
+ @path = config.fetch(:path)
15
+ @proxy = config[:proxy] || {}
15
16
  end
16
17
 
17
- def send_payload(payload = {})
18
- response = post payload.to_json
18
+ def send_payload(payload)
19
+ response = post(payload.to_json)
19
20
  response.error! unless transported?(response)
20
21
  JSON.parse(response.body)
21
22
  end
@@ -23,7 +24,7 @@ class Pagerduty
23
24
  private
24
25
 
25
26
  def post(payload)
26
- post = Net::HTTP::Post.new(PATH)
27
+ post = Net::HTTP::Post.new(@path)
27
28
  post.body = payload
28
29
  http.request(post)
29
30
  end
@@ -39,10 +40,10 @@ class Pagerduty
39
40
 
40
41
  def http_proxy
41
42
  Net::HTTP.Proxy(
42
- @options[:proxy_host],
43
- @options[:proxy_port],
44
- @options[:proxy_username],
45
- @options[:proxy_password],
43
+ @proxy[:host],
44
+ @proxy[:port],
45
+ @proxy[:username],
46
+ @proxy[:password],
46
47
  )
47
48
  end
48
49
 
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file contains patches to provide backwards compatibility with version 2
4
+ # of the pagerduty gem. On the release of the next major version (4.0) it will
5
+ # be deleted, thus breaking backwards compatibility.
6
+
7
+ PagerdutyIncident = Pagerduty::EventsApiV1::Incident
8
+
9
+ Pagerduty::EventsApiV1::Incident.class_eval do
10
+ def service_key
11
+ @integration_key
12
+ end
13
+ end
14
+
15
+ Pagerduty::EventsApiV1.class_eval do
16
+ alias_method :get_incident, :incident
17
+
18
+ def service_key
19
+ @config[:integration_key]
20
+ end
21
+ end
22
+
23
+ Pagerduty.class_eval do
24
+ def self.new(service_key, options = {})
25
+ build(
26
+ integration_key: service_key,
27
+ api_version: 1,
28
+ http_proxy: {
29
+ host: options[:proxy_host],
30
+ port: options[:proxy_port],
31
+ username: options[:proxy_username],
32
+ password: options[:proxy_password],
33
+ },
34
+ )
35
+ end
36
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Pagerduty
4
- VERSION = "2.1.3"
3
+ module Pagerduty
4
+ VERSION = "3.0.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pagerduty
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.3
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Charlie Somerville
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-02-10 00:00:00.000000000 Z
12
+ date: 2020-04-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json
@@ -94,16 +94,19 @@ files:
94
94
  - LICENSE.txt
95
95
  - README.md
96
96
  - lib/pagerduty.rb
97
+ - lib/pagerduty/events_api_v1.rb
98
+ - lib/pagerduty/events_api_v2.rb
97
99
  - lib/pagerduty/http_transport.rb
100
+ - lib/pagerduty/legacy.rb
98
101
  - lib/pagerduty/version.rb
99
102
  homepage: http://github.com/envato/pagerduty
100
103
  licenses:
101
104
  - MIT
102
105
  metadata:
103
106
  bug_tracker_uri: https://github.com/envato/pagerduty/issues
104
- changelog_uri: https://github.com/envato/pagerduty/blob/v2.1.3/CHANGELOG.md
105
- documentation_uri: https://www.rubydoc.info/gems/pagerduty/2.1.3
106
- source_code_uri: https://github.com/envato/pagerduty/tree/v2.1.3
107
+ changelog_uri: https://github.com/envato/pagerduty/blob/v3.0.0/CHANGELOG.md
108
+ documentation_uri: https://www.rubydoc.info/gems/pagerduty/3.0.0
109
+ source_code_uri: https://github.com/envato/pagerduty/tree/v3.0.0
107
110
  post_install_message:
108
111
  rdoc_options: []
109
112
  require_paths: