zuora_api 1.4.12 → 1.5.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 +4 -4
- data/.gitlab-ci.yml +13 -0
- data/lib/zuora_api.rb +1 -0
- data/lib/zuora_api/login.rb +181 -30
- data/lib/zuora_api/metrics_helper.rb +12 -0
- data/lib/zuora_api/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9b2a8ddb2245c12bb0d95d1d838a0d39190de064
|
4
|
+
data.tar.gz: d4ecd28e223f763e3e7113f720f3d7dc6779f5f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7200923efb484248935190b47b402ad2e987e0f92bd22a3c05576a9934ca635d7d0f9dd6b9ac2c45f9e3cb2035adafaaa5dac21ffcdbb9e1dd099cf2cc164e5f
|
7
|
+
data.tar.gz: 4da71d50b312948a08bfee906241a888b9417475fad8dd1d83852940bdb50194ec8142636069b930bd7a16cd3d243bccb81b77e4ebc113320828322b195a2a5a
|
data/.gitlab-ci.yml
CHANGED
@@ -48,3 +48,16 @@ rubygems-deploy:
|
|
48
48
|
- gem push $version
|
49
49
|
only:
|
50
50
|
- master
|
51
|
+
|
52
|
+
rubygems-deploy:
|
53
|
+
stage: deploy
|
54
|
+
allow_failure: false
|
55
|
+
when: manual
|
56
|
+
script:
|
57
|
+
- bundle install
|
58
|
+
- gem install rake
|
59
|
+
- version=$(rake install | grep -o 'pkg/zuora_api-.*gem')
|
60
|
+
- curl -u $USERNAME:$PASSWORD https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials
|
61
|
+
- gem push $version
|
62
|
+
only:
|
63
|
+
- staging
|
data/lib/zuora_api.rb
CHANGED
data/lib/zuora_api/login.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
require "httparty"
|
2
2
|
require "nokogiri"
|
3
|
+
require "uri"
|
4
|
+
|
3
5
|
module ZuoraAPI
|
4
6
|
class Login
|
5
7
|
ENVIRONMENTS = [SANDBOX = 'Sandbox', PRODUCTION = 'Production', PREFORMANCE = 'Preformance', SERVICES = 'Services', UNKNOWN = 'Unknown' ]
|
6
8
|
REGIONS = [EU = 'EU', US = 'US' ]
|
7
|
-
XML_SAVE_OPTIONS = Nokogiri::XML::Node::SaveOptions::AS_XML | Nokogiri::XML::Node::SaveOptions::NO_DECLARATION
|
9
|
+
XML_SAVE_OPTIONS = Nokogiri::XML::Node::SaveOptions::AS_XML | Nokogiri::XML::Node::SaveOptions::NO_DECLARATION
|
8
10
|
attr_accessor :username, :password, :region,:url, :wsdl_number, :current_session, :environment, :status, :errors, :current_error, :user_info, :tenant_id, :tenant_name, :entity_id, :timeout_sleep
|
9
11
|
|
10
12
|
def initialize(username: nil, password: nil, status: nil, url: nil, entity_id: nil, session: nil, **keyword_args)
|
@@ -41,7 +43,6 @@ module ZuoraAPI
|
|
41
43
|
}
|
42
44
|
end
|
43
45
|
|
44
|
-
|
45
46
|
def update_environment
|
46
47
|
if !self.url.blank?
|
47
48
|
env_path = self.url.split('https://').last.split('.zuora.com').first
|
@@ -114,12 +115,12 @@ module ZuoraAPI
|
|
114
115
|
end
|
115
116
|
end
|
116
117
|
end
|
117
|
-
|
118
|
+
|
118
119
|
|
119
120
|
input_xml = Nokogiri::XML(request.to_xml(:save_with => XML_SAVE_OPTIONS).strip)
|
120
121
|
input_xml.xpath('//ns1:session', 'ns1' =>'http://api.zuora.com/').children.remove
|
121
122
|
Rails.logger.debug('Connect') {"Request SOAP XML: #{input_xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip}"} if debug
|
122
|
-
|
123
|
+
|
123
124
|
@response_query = HTTParty.post(self.url,:body => request.to_xml(:save_with => XML_SAVE_OPTIONS).strip, :headers => {'Content-Type' => "text/xml; charset=utf-8"}, :timeout => 10)
|
124
125
|
@output_xml = Nokogiri::XML(@response_query.body)
|
125
126
|
Rails.logger.debug('Connect') {"Response SOAP XML: #{@output_xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip}"} if debug
|
@@ -174,16 +175,16 @@ module ZuoraAPI
|
|
174
175
|
else
|
175
176
|
#If Session only is used for Gem TODO Depercate
|
176
177
|
if (self.password.blank? && self.current_session.present?)
|
177
|
-
self.current_session = self.current_session
|
178
|
+
self.current_session = self.current_session
|
178
179
|
self.username = @output_xml.xpath('//ns1:Username', 'ns1' =>'http://api.zuora.com/').text if self.username.blank?
|
179
|
-
|
180
|
+
|
180
181
|
#Username & password combo
|
181
182
|
elsif (self.password.present? && self.username.present?)
|
182
183
|
retrieved_session = @output_xml.xpath('//ns1:Session', 'ns1' =>'http://api.zuora.com/').text
|
183
184
|
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("No session found for api call.") if retrieved_session.blank?
|
184
185
|
self.current_session = retrieved_session
|
185
186
|
end
|
186
|
-
|
187
|
+
|
187
188
|
self.current_error = nil
|
188
189
|
self.status = 'Active'
|
189
190
|
end
|
@@ -209,6 +210,9 @@ module ZuoraAPI
|
|
209
210
|
|
210
211
|
def soap_call(ns1: 'ns1', ns2: 'ns2', batch_size: nil, single_transaction: false, debug: true, errors: [ZuoraAPI::Exceptions::ZuoraAPISessionError, ZuoraAPI::Exceptions::ZuoraAPIError, ZuoraAPI::Exceptions::ZuoraAPIRequestLimit, ZuoraAPI::Exceptions::ZuoraAPILockCompetition], z_session: true, timeout_retry: false, timeout: 120,**keyword_args)
|
211
212
|
tries ||= 2
|
213
|
+
error_type = ""
|
214
|
+
start_time = Time.now
|
215
|
+
|
212
216
|
xml = Nokogiri::XML::Builder.new do |xml|
|
213
217
|
xml['SOAP-ENV'].Envelope('xmlns:SOAP-ENV' => "http://schemas.xmlsoap.org/soap/envelope/",
|
214
218
|
"xmlns:#{ns2}" => "http://object.api.zuora.com/",
|
@@ -239,13 +243,15 @@ module ZuoraAPI
|
|
239
243
|
input_xml = Nokogiri::XML(xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip)
|
240
244
|
input_xml.xpath('//ns1:session', 'ns1' =>'http://api.zuora.com/').children.remove
|
241
245
|
Rails.logger.debug('Connect') {"Request SOAP XML: #{input_xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip}"} if debug
|
246
|
+
|
242
247
|
response = HTTParty.post(self.url,:body => xml.doc.to_xml(:save_with => XML_SAVE_OPTIONS).strip, :headers => {'Content-Type' => "text/xml; charset=utf-8"}, :timeout => timeout)
|
243
248
|
output_xml = Nokogiri::XML(response.body)
|
244
249
|
Rails.logger.debug('Connect') {"Response SOAP XML: #{output_xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip}"} if debug
|
245
250
|
|
246
251
|
raise_errors(type: :SOAP, body: output_xml, response: response)
|
247
|
-
|
252
|
+
|
248
253
|
rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
|
254
|
+
error_type = "#{ex.class}"
|
249
255
|
if !(tries -= 1).zero? && z_session
|
250
256
|
Rails.logger.debug {"Session Invalid"}
|
251
257
|
self.new_session
|
@@ -258,12 +264,14 @@ module ZuoraAPI
|
|
258
264
|
end
|
259
265
|
end
|
260
266
|
rescue ZuoraAPI::Exceptions::ZuoraAPIError, ZuoraAPI::Exceptions::ZuoraAPIRequestLimit, ZuoraAPI::Exceptions::ZuoraAPILockCompetition => ex
|
267
|
+
error_type = "#{ex.class}"
|
261
268
|
if errors.include?(ex.class)
|
262
269
|
raise ex
|
263
270
|
else
|
264
271
|
return output_xml, input_xml, response
|
265
272
|
end
|
266
273
|
rescue Net::OpenTimeout, Errno::ECONNRESET, Errno::ECONNREFUSED, SocketError => ex
|
274
|
+
error_type = "#{ex.class}"
|
267
275
|
if !(tries -= 1).zero? && timeout_retry
|
268
276
|
Rails.logger.info {"#{ex.class} Timed out will retry after 5 seconds"}
|
269
277
|
sleep(self.timeout_sleep)
|
@@ -272,9 +280,21 @@ module ZuoraAPI
|
|
272
280
|
raise ex
|
273
281
|
end
|
274
282
|
rescue => ex
|
283
|
+
error_type = "#{ex.class}"
|
275
284
|
raise ex
|
276
285
|
else
|
277
286
|
return output_xml, input_xml, response
|
287
|
+
ensure
|
288
|
+
# Writing to telegraf
|
289
|
+
begin
|
290
|
+
end_time = Time.now
|
291
|
+
response_time = end_time - start_time
|
292
|
+
status_code = response.code if response
|
293
|
+
endpoint_name = url.present? ? URI(url).host : url
|
294
|
+
::MetricsHelpers::MetricsHelpers.write_to_telegraf("response_time": response_time, "status_code": status_code, "endpoint_name": endpoint_name, "direction": "outbound", "error_type": error_type, "function_name": "#{self.class}##{__method__}", "method_name": "POST")
|
295
|
+
rescue
|
296
|
+
Rails.logger.info {"Failed to send metric"}
|
297
|
+
end
|
278
298
|
end
|
279
299
|
|
280
300
|
def raise_errors(type: :SOAP, body: nil, response: nil)
|
@@ -287,7 +307,7 @@ module ZuoraAPI
|
|
287
307
|
error = body.xpath('//faultcode').text
|
288
308
|
message = body.xpath('//faultstring').text
|
289
309
|
end
|
290
|
-
|
310
|
+
|
291
311
|
if error.blank? || message.blank?
|
292
312
|
error = body.xpath('//ns1:Code', 'ns1' =>'http://api.zuora.com/').text
|
293
313
|
message = body.xpath('//ns1:Message', 'ns1' =>'http://api.zuora.com/').text
|
@@ -298,9 +318,9 @@ module ZuoraAPI
|
|
298
318
|
error = []
|
299
319
|
success = []
|
300
320
|
body.xpath('//ns1:result', 'ns1' =>'http://api.zuora.com/').each_with_index do |call, object_index|
|
301
|
-
|
321
|
+
|
302
322
|
if call.xpath('./ns1:Success', 'ns1' =>'http://api.zuora.com/').text == 'false'
|
303
|
-
message = "#{call.xpath('./*/ns1:Code', 'ns1' =>'http://api.zuora.com/').text}::#{call.xpath('./*/ns1:Message', 'ns1' =>'http://api.zuora.com/').text}"
|
323
|
+
message = "#{call.xpath('./*/ns1:Code', 'ns1' =>'http://api.zuora.com/').text}::#{call.xpath('./*/ns1:Message', 'ns1' =>'http://api.zuora.com/').text}"
|
304
324
|
error.push(message)
|
305
325
|
else
|
306
326
|
success.push(call.xpath('./ns1:Id', 'ns1' =>'http://api.zuora.com/').text)
|
@@ -332,7 +352,7 @@ module ZuoraAPI
|
|
332
352
|
raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("The total number of concurrent requests has exceeded the limit allowed by the system. Please resubmit your request later.", body, response.code)
|
333
353
|
end
|
334
354
|
|
335
|
-
when :JSON
|
355
|
+
when :JSON
|
336
356
|
if body.class == Hash && (!body["success"] || !body["Success"] || response.code != 200)
|
337
357
|
messages_array = (body["reasons"] || []).map {|error| error['message']}.compact
|
338
358
|
codes_array = (body["reasons"] || []).map {|error| error['code']}.compact
|
@@ -358,7 +378,7 @@ module ZuoraAPI
|
|
358
378
|
end
|
359
379
|
|
360
380
|
#All Errors catch
|
361
|
-
if codes_array.size > 0
|
381
|
+
if codes_array.size > 0
|
362
382
|
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{messages_array.join(', ')}", body, response.code)
|
363
383
|
end
|
364
384
|
|
@@ -375,7 +395,7 @@ module ZuoraAPI
|
|
375
395
|
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("#{body["faultcode"]}::#{body["faultstring"]}", body, response.code)
|
376
396
|
else
|
377
397
|
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{body["faultcode"]}::#{body["faultstring"]}", body, response.code)
|
378
|
-
end
|
398
|
+
end
|
379
399
|
end
|
380
400
|
|
381
401
|
if body["Errors"].present? || body["errors"].present?
|
@@ -387,14 +407,14 @@ module ZuoraAPI
|
|
387
407
|
end
|
388
408
|
end
|
389
409
|
end
|
390
|
-
|
410
|
+
|
391
411
|
#Zuora REST Actions error (Create, Update, Delete)
|
392
412
|
if body.class == Array
|
393
413
|
all_errors = body.select {|obj| !obj['Success'] || !obj['success'] }.map {|obj| obj['Errors'] || obj['errors'] }.compact
|
394
414
|
all_success = body.select {|obj| obj['Success'] || obj['success']}.compact
|
395
415
|
|
396
|
-
if all_errors.size > 0
|
397
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{all_errors.flatten.group_by {|error| error['Message']}.keys.uniq.join(' ')}", body, response.code, all_errors, all_success )
|
416
|
+
if all_errors.size > 0
|
417
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{all_errors.flatten.group_by {|error| error['Message']}.keys.uniq.join(' ')}", body, response.code, all_errors, all_success )
|
398
418
|
end
|
399
419
|
end
|
400
420
|
|
@@ -402,7 +422,7 @@ module ZuoraAPI
|
|
402
422
|
if response.code != 200
|
403
423
|
if response.code == 429
|
404
424
|
raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("The total number of concurrent requests has exceeded the limit allowed by the system. Please resubmit your request later.", body, response.code)
|
405
|
-
else
|
425
|
+
else
|
406
426
|
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{response.message}", body, response.code)
|
407
427
|
end
|
408
428
|
end
|
@@ -449,11 +469,16 @@ module ZuoraAPI
|
|
449
469
|
|
450
470
|
def describe_call(object = nil)
|
451
471
|
tries ||= 2
|
472
|
+
|
473
|
+
error_type = ""
|
474
|
+
start_time = Time.now
|
475
|
+
|
452
476
|
self.get_session
|
453
477
|
base = self.url.include?(".com") ? self.url.split(".com")[0].concat(".com") : self.url.split(".eu")[0].concat(".eu")
|
454
478
|
url = object ? "#{base}/apps/api/describe/#{object}" : "#{base}/apps/api/describe/"
|
455
479
|
headers = !self.entity_id.blank? ? {"entityId" => self.entity_id, 'Content-Type' => "text/xml; charset=utf-8"} : {'Content-Type' => "text/xml; charset=utf-8"}
|
456
|
-
response = HTTParty.get(url, :headers => headers , basic_auth: {:username => self.username, :password => self.password}, :timeout =>
|
480
|
+
response = HTTParty.get(url, :headers => headers , basic_auth: {:username => self.username, :password => self.password}, :timeout => 1)
|
481
|
+
|
457
482
|
output_xml = Nokogiri::XML(response.body)
|
458
483
|
des_hash = Hash.new
|
459
484
|
if object == nil
|
@@ -484,6 +509,7 @@ module ZuoraAPI
|
|
484
509
|
des_hash[:related_objects] = output_xml.xpath(".//related-objects").xpath(".//object").map{ |x| [x.xpath(".//name").text.to_sym, [ [:url, x.attributes["href"].value], [:label, x.xpath(".//name").text ] ].to_h] }.to_h
|
485
510
|
end
|
486
511
|
rescue Net::ReadTimeout, Net::OpenTimeout, Errno::EPIPE, Errno::ECONNRESET, Errno::ECONNREFUSED, SocketError => ex
|
512
|
+
error_type = "#{ex.class}"
|
487
513
|
if !(tries -= 1).zero?
|
488
514
|
Rails.logger.info {"#{ex.class} Timed out will retry after 5 seconds"}
|
489
515
|
sleep(self.timeout_sleep)
|
@@ -492,18 +518,32 @@ module ZuoraAPI
|
|
492
518
|
raise ex
|
493
519
|
end
|
494
520
|
rescue => ex
|
521
|
+
error_type = "#{ex.class}"
|
495
522
|
raise ex
|
496
523
|
else
|
497
524
|
return des_hash
|
525
|
+
ensure
|
526
|
+
# Writing to telegraf
|
527
|
+
begin
|
528
|
+
end_time = Time.now
|
529
|
+
response_time = end_time - start_time
|
530
|
+
status_code = response.code if response
|
531
|
+
endpoint_name = url.present? ? URI(url).host : url
|
532
|
+
::MetricsHelpers::MetricsHelpers.write_to_telegraf("response_time": response_time, "status_code": status_code, "endpoint_name": endpoint_name, "direction": "outbound", "error_type": error_type, "function_name": "#{self.class}##{__method__}", "method_name": "GET")
|
533
|
+
rescue
|
534
|
+
Rails.logger.info {"Failed to send metric"}
|
535
|
+
end
|
498
536
|
end
|
499
537
|
|
500
538
|
def rest_call(method: :get, body: {},headers: {}, url: rest_endpoint("catalog/products?pageSize=4"), debug: true, errors: [ZuoraAPI::Exceptions::ZuoraAPISessionError, ZuoraAPI::Exceptions::ZuoraAPIError, ZuoraAPI::Exceptions::ZuoraAPIRequestLimit, ZuoraAPI::Exceptions::ZuoraAPILockCompetition], z_session: true, timeout_retry: false, timeout: 120, **keyword_args)
|
501
539
|
tries ||= 2
|
502
540
|
headers["entityId"] = self.entity_id if !self.entity_id.blank?
|
503
541
|
raise "Method not supported, supported methods include: :get, :post, :put, :delete, :patch, :head, :options" if ![:get, :post, :put, :delete, :patch, :head, :options].include?(method)
|
542
|
+
|
543
|
+
error_type = ""
|
544
|
+
start_time = Time.now
|
504
545
|
response = HTTParty::Request.new("Net::HTTP::#{method.to_s.capitalize}".constantize, url, body: body, headers: {'Content-Type' => "application/json; charset=utf-8"}.merge(z_session ? {"Authorization" => "ZSession #{self.get_session}"} : {}).merge(headers), timeout: timeout).perform
|
505
546
|
|
506
|
-
Rails.logger.debug('Connect') {"Response Code: #{response.code}" } if debug
|
507
547
|
begin
|
508
548
|
output_json = JSON.parse(response.body)
|
509
549
|
rescue JSON::ParserError => ex
|
@@ -514,6 +554,7 @@ module ZuoraAPI
|
|
514
554
|
raise_errors(type: :JSON, body: output_json, response: response)
|
515
555
|
|
516
556
|
rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
|
557
|
+
error_type = "#{ex.class}"
|
517
558
|
if !(tries -= 1).zero? && z_session
|
518
559
|
Rails.logger.debug {"Session Invalid"}
|
519
560
|
self.new_session
|
@@ -526,12 +567,14 @@ module ZuoraAPI
|
|
526
567
|
end
|
527
568
|
end
|
528
569
|
rescue ZuoraAPI::Exceptions::ZuoraAPIError, ZuoraAPI::Exceptions::ZuoraAPIRequestLimit, ZuoraAPI::Exceptions::ZuoraAPILockCompetition => ex
|
570
|
+
error_type = "#{ex.class}"
|
529
571
|
if errors.include?(ex.class)
|
530
572
|
raise ex
|
531
573
|
else
|
532
574
|
return [output_json, response]
|
533
575
|
end
|
534
576
|
rescue Net::OpenTimeout, Errno::ECONNRESET, Errno::ECONNREFUSED, SocketError => ex
|
577
|
+
error_type = "#{ex.class}"
|
535
578
|
if !(tries -= 1).zero? && timeout_retry
|
536
579
|
Rails.logger.info {"#{ex.class} Timed out will retry after 5 seconds"}
|
537
580
|
sleep(self.timeout_sleep)
|
@@ -540,9 +583,21 @@ module ZuoraAPI
|
|
540
583
|
raise ex
|
541
584
|
end
|
542
585
|
rescue => ex
|
586
|
+
error_type = "#{ex.class}"
|
543
587
|
raise ex
|
544
588
|
else
|
545
589
|
return [output_json, response]
|
590
|
+
ensure
|
591
|
+
# Writing to telegraf
|
592
|
+
begin
|
593
|
+
end_time = Time.now
|
594
|
+
response_time = end_time - start_time
|
595
|
+
status_code = response.code if response
|
596
|
+
endpoint_name = url.present? ? URI(url).host : url
|
597
|
+
::MetricsHelpers::MetricsHelpers.write_to_telegraf("response_time": response_time, "status_code": status_code, "endpoint_name": endpoint_name, "direction": "outbound", "error_type": error_type, "function_name": "#{self.class}##{__method__}", "method_name": "#{method.upcase}")
|
598
|
+
rescue
|
599
|
+
Rails.logger.info {"Failed to send metric"}
|
600
|
+
end
|
546
601
|
end
|
547
602
|
|
548
603
|
def update_create_tenant
|
@@ -598,9 +653,12 @@ module ZuoraAPI
|
|
598
653
|
require 'fileutils'
|
599
654
|
FileUtils.mkdir_p(file_path) unless File.exists?(file_path)
|
600
655
|
|
656
|
+
error_type = ""
|
657
|
+
start_time = Time.now
|
658
|
+
|
601
659
|
begin
|
660
|
+
status_code = nil
|
602
661
|
uri = URI.parse(url)
|
603
|
-
|
604
662
|
http = Net::HTTP.new(uri.host, uri.port)
|
605
663
|
http.read_timeout = timeout #Seconds
|
606
664
|
http.use_ssl = true if uri.scheme.downcase == 'https'
|
@@ -609,6 +667,8 @@ module ZuoraAPI
|
|
609
667
|
response_save = nil
|
610
668
|
http.request_get(uri.path, headers) do |response|
|
611
669
|
response_save = response
|
670
|
+
status_code = response.code if response
|
671
|
+
|
612
672
|
case response
|
613
673
|
when Net::HTTPNotFound
|
614
674
|
Rails.logger.fatal("404 - Not Found")
|
@@ -694,18 +754,32 @@ module ZuoraAPI
|
|
694
754
|
|
695
755
|
file_handle.close
|
696
756
|
Rails.logger.info("Filepath: #{file_handle.path} Size: #{File.size(file_handle.path).to_f/1000000} mb")
|
697
|
-
|
757
|
+
|
698
758
|
return file_handle
|
699
759
|
end
|
700
760
|
end
|
701
761
|
rescue Exception => e
|
762
|
+
error_type = "#{e.class}"
|
702
763
|
Rails.logger.fatal('GetFile') {"Download Failed: #{response_save} - #{e.class} : #{e.message}"}
|
703
764
|
Rails.logger.fatal('GetFile') {"Download Failed: #{e.backtrace.join("\n")}"}
|
704
765
|
raise
|
766
|
+
ensure
|
767
|
+
# Writing to telegraf
|
768
|
+
begin
|
769
|
+
end_time = Time.now
|
770
|
+
response_time = end_time - start_time
|
771
|
+
status_code = response.code if response
|
772
|
+
endpoint_name = url.present? ? URI(url).host : url
|
773
|
+
::MetricsHelpers::MetricsHelpers.write_to_telegraf("response_time": response_time, "status_code": status_code, "endpoint_name": endpoint_name, "direction": "outbound", "error_type": error_type, "function_name": "#{self.class}##{__method__}", "method_name": "GET")
|
774
|
+
rescue
|
775
|
+
Rails.logger.info {"Failed to send metric"}
|
776
|
+
end
|
705
777
|
end
|
706
778
|
end
|
707
779
|
|
708
780
|
def getDataSourceExport(query, extract: true, encrypted: false, zip: true)
|
781
|
+
error_type = ""
|
782
|
+
start_time = Time.now
|
709
783
|
Rails.logger.info('Export') {"Build export"}
|
710
784
|
Rails.logger.debug('Export query') {"#{query}"}
|
711
785
|
request = Nokogiri::XML::Builder.new do |xml|
|
@@ -728,7 +802,23 @@ module ZuoraAPI
|
|
728
802
|
end
|
729
803
|
end
|
730
804
|
end
|
731
|
-
|
805
|
+
|
806
|
+
begin
|
807
|
+
response_query = HTTParty.post(self.url, body: request.to_xml(:save_with => XML_SAVE_OPTIONS).strip, headers: {'Content-Type' => "application/json; charset=utf-8"}, :timeout => 120)
|
808
|
+
rescue => e
|
809
|
+
error_type = "#{e.class}"
|
810
|
+
ensure
|
811
|
+
begin
|
812
|
+
end_time = Time.now
|
813
|
+
response_time = end_time - start_time
|
814
|
+
status_code = response.code if response
|
815
|
+
endpoint_name = url.present? ? URI(url).host : url
|
816
|
+
::MetricsHelpers::MetricsHelpers.write_to_telegraf("response_time": response_time, "status_code": status_code, "endpoint_name": endpoint_name, "direction": "outbound", "error_type": error_type, "function_name": "#{self.class}##{__method__}", "method_name": "POST")
|
817
|
+
rescue
|
818
|
+
Rails.logger.info {"Failed to send metric"}
|
819
|
+
end
|
820
|
+
end
|
821
|
+
|
732
822
|
output_xml = Nokogiri::XML(response_query.body)
|
733
823
|
|
734
824
|
raise 'Export Creation Unsuccessful : ' + output_xml.xpath('//ns1:Message', 'ns1' =>'http://api.zuora.com/').text if output_xml.xpath('//ns1:Success', 'ns1' =>'http://api.zuora.com/').text != "true"
|
@@ -749,15 +839,35 @@ module ZuoraAPI
|
|
749
839
|
end
|
750
840
|
end
|
751
841
|
result = 'Waiting'
|
842
|
+
|
843
|
+
start_time = Time.now
|
844
|
+
error_type = ""
|
845
|
+
|
752
846
|
while result != "Completed"
|
753
847
|
sleep 3
|
754
|
-
|
848
|
+
begin
|
849
|
+
response_query = HTTParty.post(self.url, body: confirmRequest.to_xml(:save_with => XML_SAVE_OPTIONS).strip, headers: {'Content-Type' => "application/json; charset=utf-8"}, :timeout => 120)
|
850
|
+
rescue => e
|
851
|
+
error_type = "#{e.class}"
|
852
|
+
end
|
755
853
|
output_xml = Nokogiri::XML(response_query.body)
|
756
|
-
|
757
854
|
result = output_xml.xpath('//ns2:Status', 'ns2' =>'http://object.api.zuora.com/').text
|
855
|
+
status_code = response_query.code if response_query
|
758
856
|
raise "Export Creation Unsuccessful : #{output_xml.xpath('//ns1:Message', 'ns1' =>'http://api.zuora.com/').text}" if result.blank? || result == "Failed"
|
759
857
|
end
|
760
858
|
|
859
|
+
begin
|
860
|
+
end_time = Time.now
|
861
|
+
response_time = end_time - start_time
|
862
|
+
status_code = response.code if response
|
863
|
+
endpoint_name = url.present? ? URI(url).host : url
|
864
|
+
::MetricsHelpers::MetricsHelpers.write_to_telegraf("response_time": response_time, "status_code": status_code, "endpoint_name": endpoint_name, "direction": "outbound", "error_type": error_type, "function_name": "#{self.class}##{__method__}", "method_name": "POST")
|
865
|
+
rescue
|
866
|
+
Rails.logger.info {"Failed to send metric"}
|
867
|
+
end
|
868
|
+
|
869
|
+
|
870
|
+
|
761
871
|
file_id = output_xml.xpath('//ns2:FileId', 'ns2' =>'http://object.api.zuora.com/').text
|
762
872
|
Rails.logger.info('Export') {'=====> Export finished'}
|
763
873
|
export_file = get_file(:url => self.fileURL(file_id))
|
@@ -785,7 +895,7 @@ module ZuoraAPI
|
|
785
895
|
end
|
786
896
|
end
|
787
897
|
if parse
|
788
|
-
return [] if output_xml.xpath('//ns1:size', 'ns1' =>'http://api.zuora.com/').text == '0'
|
898
|
+
return [] if output_xml.xpath('//ns1:size', 'ns1' =>'http://api.zuora.com/').text == '0'
|
789
899
|
data = output_xml.xpath('//ns1:records', 'ns1' =>'http://api.zuora.com/').map {|record| record.children.map {|element| [element.name, element.text]}.to_h}
|
790
900
|
return data
|
791
901
|
else
|
@@ -794,14 +904,33 @@ module ZuoraAPI
|
|
794
904
|
end
|
795
905
|
|
796
906
|
def createJournalRun(call)
|
907
|
+
error_type = ""
|
908
|
+
start_time = Time.now
|
909
|
+
|
797
910
|
url = rest_endpoint("/journal-runs")
|
798
911
|
uri = URI(url)
|
799
912
|
req = Net::HTTP::Post.new(uri,initheader = {'Content-Type' =>'application/json'})
|
800
913
|
req.basic_auth self.username, self.password
|
801
914
|
req.body = call
|
802
|
-
|
803
|
-
|
915
|
+
|
916
|
+
begin
|
917
|
+
response = Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
|
918
|
+
http.request req
|
919
|
+
end
|
920
|
+
rescue => e
|
921
|
+
error_type = "#{e.class}"
|
922
|
+
ensure
|
923
|
+
begin
|
924
|
+
end_time = Time.now
|
925
|
+
response_time = end_time - start_time
|
926
|
+
status_code = response.code if response
|
927
|
+
endpoint_name = url.present? ? URI(url).host : url
|
928
|
+
::MetricsHelpers::MetricsHelpers.write_to_telegraf("response_time": response_time, "status_code": status_code, "endpoint_name": endpoint_name, "direction": "outbound", "error_type": error_type, "function_name": "#{self.class}##{__method__}", "method_name": "POST")
|
929
|
+
rescue
|
930
|
+
Rails.logger.info {"Failed to send metric"}
|
931
|
+
end
|
804
932
|
end
|
933
|
+
|
805
934
|
Rails.logger.debug('Journal Run') {"Response #{response.code} #{response.message}:
|
806
935
|
#{response.body}"}
|
807
936
|
|
@@ -814,17 +943,39 @@ module ZuoraAPI
|
|
814
943
|
Rails.logger.debug('Journal Run') {"Journal Run failed with message #{message}"}
|
815
944
|
return result
|
816
945
|
end
|
946
|
+
|
817
947
|
end
|
818
948
|
|
819
949
|
def checkJRStatus(jrNumber)
|
950
|
+
error_type = ""
|
951
|
+
|
820
952
|
Rails.logger.info('Journal Run') {"Check for completion"}
|
953
|
+
|
954
|
+
start_time = Time.now
|
955
|
+
|
821
956
|
url = rest_endpoint("/journal-runs/#{jrNumber}")
|
822
957
|
uri = URI(url)
|
823
958
|
req = Net::HTTP::Get.new(uri,initheader = {'Content-Type' =>'application/json'})
|
824
959
|
req.basic_auth self.username, self.password
|
825
|
-
|
826
|
-
|
960
|
+
|
961
|
+
begin
|
962
|
+
response = Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
|
963
|
+
http.request req
|
964
|
+
end
|
965
|
+
rescue => e
|
966
|
+
error_type = "#{e.class}"
|
967
|
+
ensure
|
968
|
+
begin
|
969
|
+
end_time = Time.now
|
970
|
+
response_time = end_time - start_time
|
971
|
+
status_code = response.code if response
|
972
|
+
endpoint_name = url.present? ? URI(url).host : url
|
973
|
+
::MetricsHelpers::MetricsHelpers.write_to_telegraf("response_time": response_time, "status_code": status_code, "endpoint_name": endpoint_name, "direction": "outbound", "error_type": error_type, "function_name": "#{self.class}##{__method__}", "method_name": "GET")
|
974
|
+
rescue
|
975
|
+
Rails.logger.info {"Failed to send metric"}
|
976
|
+
end
|
827
977
|
end
|
978
|
+
|
828
979
|
result = JSON.parse(response.body)
|
829
980
|
|
830
981
|
if result["success"]
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module MetricsHelpers
|
2
|
+
|
3
|
+
class MetricsHelpers
|
4
|
+
def self.write_to_telegraf(response_time: nil, status_code: nil, endpoint_name: nil, direction: nil, error_type: nil, function_name: nil, method_name: nil)
|
5
|
+
if Gem.loaded_specs.has_key?('zuora_connect') && defined?(::ZuoraConnect::AppInstance.write_to_telegraf)
|
6
|
+
Thread.current[:appinstance].present? ? app_instance = Thread.current[:appinstance].id : app_instance = 0
|
7
|
+
ZuoraConnect::AppInstanceBase.write_to_telegraf("response_time": response_time, "status_code": status_code, "endpoint_name": endpoint_name, "direction": "outbound", "error_type": error_type, "app_instance": app_instance, "function_name": function_name, "method_name": method_name)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
data/lib/zuora_api/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zuora_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zuora Strategic Solutions Group
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-08-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -163,6 +163,7 @@ files:
|
|
163
163
|
- lib/zuora_api.rb
|
164
164
|
- lib/zuora_api/exceptions.rb
|
165
165
|
- lib/zuora_api/login.rb
|
166
|
+
- lib/zuora_api/metrics_helper.rb
|
166
167
|
- lib/zuora_api/version.rb
|
167
168
|
- zuora_api.gemspec
|
168
169
|
homepage: https://connect.zuora.com
|