instrumental_agent 2.1.0 → 3.0.0.alpha
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.ruby-version +1 -1
- data/.travis.yml +3 -5
- data/CHANGELOG.md +6 -0
- data/Gemfile +1 -6
- data/instrumental_agent.gemspec +2 -2
- data/lib/instrumental/agent.rb +74 -100
- data/lib/instrumental/version.rb +1 -1
- data/spec/agent_spec.rb +78 -11
- metadata +24 -31
- data/certs/equifax.ca.pem +0 -69
- data/certs/geotrust.ca.pem +0 -80
- data/certs/rapidssl.ca.pem +0 -94
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a45dc47aabd6ade8ea7198ea34f4bbc205a4979b1cae1ed18dbfabb4109df0b8
|
4
|
+
data.tar.gz: 67ebcbf6fca85da2087e6196dbcf57752ebe3470411c54241487ce834c2f5cf7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1bfe306e6511e588aa58a258510b18f79fe4b70180b7ee8bd4fea0b967d80cf8cab3765228b4cd385f99537704557f918d92972b9cf6da0b646225b4a5c6bd87
|
7
|
+
data.tar.gz: feaf73f66d1ed593936bcd3aecf4e0ebccbc67fcf104905e28ad67e9d4e14575a0a3259a5c1fc9b2ac21ef212c2be64910c757bfc931668b48799d3466eeacc8
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.6.3
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
### 3.0.0.alpha [August 22, 2019]
|
2
|
+
* Drop support for outdated versions of Ruby
|
3
|
+
* Explicitly add support for new versions of Ruby
|
4
|
+
* Better handling of SSL errors when connecting to Instrumental
|
5
|
+
* Note: the agent API has NOT changed. This is a major release because of the significant changes in Ruby versions officially supported.
|
6
|
+
|
1
7
|
### 2.1.0 [January 19, 2018]
|
2
8
|
* Add support for capistrano 3
|
3
9
|
|
data/Gemfile
CHANGED
@@ -1,11 +1,6 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
2
|
|
3
3
|
gemspec
|
4
|
-
ruby_engine = defined?(RUBY_ENGINE) && RUBY_ENGINE
|
5
|
-
if RUBY_VERSION < "1.9" && !%w{jruby rbx}.include?(ruby_engine)
|
6
|
-
# Built and installed via ext/mkrf_conf.rb
|
7
|
-
gem 'system_timer', '~> 1.2'
|
8
|
-
end
|
9
4
|
|
10
5
|
# fixes 2.3.0 ffi bundle error
|
11
|
-
gem 'ffi', '~> 1.0.11'
|
6
|
+
gem 'ffi', '~> 1.0.11'
|
data/instrumental_agent.gemspec
CHANGED
@@ -4,13 +4,13 @@ require "instrumental/version"
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "instrumental_agent"
|
6
6
|
s.version = Instrumental::VERSION
|
7
|
-
s.authors = ["
|
7
|
+
s.authors = ["Expected Behavior"]
|
8
8
|
s.email = ["support@instrumentalapp.com"]
|
9
9
|
s.homepage = "http://github.com/instrumental/instrumental_agent-ruby"
|
10
10
|
s.summary = %q{Custom metric monitoring for Ruby applications via Instrumental}
|
11
11
|
s.description = %q{This agent supports Instrumental custom metric monitoring for Ruby applications. It provides high-data reliability at high scale, without ever blocking your process or causing an exception.}
|
12
12
|
s.license = "MIT"
|
13
|
-
s.required_ruby_version = '>= 2.
|
13
|
+
s.required_ruby_version = '>= 2.4.6'
|
14
14
|
|
15
15
|
s.files = `git ls-files`.split("\n")
|
16
16
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
data/lib/instrumental/agent.rb
CHANGED
@@ -75,7 +75,6 @@ module Instrumental
|
|
75
75
|
@synchronous = !!options[:synchronous]
|
76
76
|
@pid = Process.pid
|
77
77
|
@allow_reconnect = true
|
78
|
-
@certs = certificates
|
79
78
|
@dns_resolutions = 0
|
80
79
|
@last_connect_at = 0
|
81
80
|
@metrician = options[:metrician].nil? ? true : !!options[:metrician]
|
@@ -271,7 +270,7 @@ module Instrumental
|
|
271
270
|
end
|
272
271
|
|
273
272
|
def report_exception(e)
|
274
|
-
logger.error "Exception
|
273
|
+
logger.error "Exception of type #{e.class} occurred:\n#{e.message}\n#{e.backtrace.join("\n")}"
|
275
274
|
end
|
276
275
|
|
277
276
|
def ipv4_address_for_host(host, port, moment_to_connect = Time.now.to_i)
|
@@ -350,23 +349,7 @@ module Instrumental
|
|
350
349
|
|
351
350
|
def test_connection
|
352
351
|
begin
|
353
|
-
|
354
|
-
# on Ruby 1.8.6, 1.8.7 or 1.9.1, read_nonblock does not exist,
|
355
|
-
# and so the case of testing socket liveliness via a nonblocking
|
356
|
-
# read that catches a wait condition won't work.
|
357
|
-
#
|
358
|
-
# We grab the SSL socket's underlying IO object and perform the
|
359
|
-
# non blocking read there in order to ensure the socket is still
|
360
|
-
# valid
|
361
|
-
if @socket.respond_to?(:read_nonblock)
|
362
|
-
@socket.read_nonblock(1)
|
363
|
-
elsif @socket.respond_to?(:io)
|
364
|
-
# The SSL Socket may send down additional data at close time,
|
365
|
-
# so we perform two nonblocking reads, one to pull any pending
|
366
|
-
# data on the socket, and the second to actually perform the connection
|
367
|
-
# liveliness test
|
368
|
-
@socket.io.read_nonblock(1024) && @socket.io.read_nonblock(1024)
|
369
|
-
end
|
352
|
+
@socket.read_nonblock(1)
|
370
353
|
rescue *wait_exceptions
|
371
354
|
# noop
|
372
355
|
end
|
@@ -427,81 +410,85 @@ module Instrumental
|
|
427
410
|
end
|
428
411
|
|
429
412
|
def run_worker_loop
|
413
|
+
@failures = 0
|
414
|
+
begin
|
415
|
+
logger.info "connecting to collector"
|
430
416
|
command_and_args = nil
|
431
417
|
command_options = nil
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
"
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
418
|
+
with_timeout(CONNECT_TIMEOUT) do
|
419
|
+
@socket = open_socket(@sockaddr_in, @secure, @verify_cert)
|
420
|
+
end
|
421
|
+
logger.info "connected to collector at #{host}:#{port}"
|
422
|
+
hello_options = {
|
423
|
+
"version" => "ruby/instrumental_agent/#{VERSION}",
|
424
|
+
"hostname" => HOSTNAME,
|
425
|
+
"pid" => Process.pid,
|
426
|
+
"runtime" => "#{defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby"}/#{RUBY_VERSION}p#{RUBY_PATCHLEVEL}",
|
427
|
+
"platform" => RUBY_PLATFORM
|
428
|
+
}.to_a.flatten.map { |v| v.to_s.gsub(/\s+/, "_") }.join(" ")
|
429
|
+
|
430
|
+
send_with_reply_timeout "hello #{hello_options}"
|
431
|
+
send_with_reply_timeout "authenticate #{@api_key}"
|
432
|
+
|
433
|
+
loop do
|
434
|
+
command_and_args, command_options = @queue.pop
|
435
|
+
if command_and_args
|
436
|
+
sync_resource = command_options && command_options[:sync_resource]
|
437
|
+
test_connection
|
438
|
+
case command_and_args
|
439
|
+
when 'exit'
|
440
|
+
logger.info "Exiting, #{@queue.size} commands remain"
|
441
|
+
return true
|
442
|
+
when 'flush'
|
443
|
+
release_resource = true
|
444
|
+
else
|
445
|
+
logger.debug "Sending: #{command_and_args.chomp}"
|
446
|
+
@socket.puts command_and_args
|
447
|
+
end
|
448
|
+
command_and_args = nil
|
449
|
+
command_options = nil
|
450
|
+
if sync_resource
|
451
|
+
@sync_mutex.synchronize do
|
452
|
+
sync_resource.signal
|
453
|
+
end
|
468
454
|
end
|
469
455
|
end
|
470
456
|
end
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
when EOFError
|
457
|
+
rescue Exception => err
|
458
|
+
allow_reconnect = @allow_reconnect
|
459
|
+
case err
|
460
|
+
when EOFError
|
476
461
|
# nop
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
462
|
+
when Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::EADDRINUSE, Timeout::Error, OpenSSL::SSL::SSLError
|
463
|
+
# If the connection has been refused by Instrumental
|
464
|
+
# or we cannot reach the server
|
465
|
+
# or the connection state of this socket is in a race
|
466
|
+
# or SSL is not functioning properly for some reason
|
467
|
+
logger.error "unable to connect to Instrumental, hanging up with #{@queue.size} messages remaining"
|
468
|
+
logger.debug "Exception: #{err.inspect}\n#{err.backtrace.join("\n")}"
|
469
|
+
allow_reconnect = false
|
470
|
+
else
|
471
|
+
report_exception(err)
|
472
|
+
end
|
473
|
+
if allow_reconnect == false ||
|
474
|
+
(command_options && command_options[:allow_reconnect] == false)
|
475
|
+
logger.info "Not trying to reconnect"
|
476
|
+
@failures = 0
|
477
|
+
return
|
478
|
+
end
|
479
|
+
if command_and_args
|
480
|
+
logger.debug "requeueing: #{command_and_args}"
|
481
|
+
@queue << command_and_args
|
482
|
+
end
|
483
|
+
disconnect
|
484
|
+
@failures += 1
|
485
|
+
delay = [(@failures - 1) ** BACKOFF, MAX_RECONNECT_DELAY].min
|
486
|
+
logger.error "disconnected, #{@failures} failures in a row, reconnect in #{delay}..."
|
487
|
+
sleep delay
|
488
|
+
retry
|
489
|
+
ensure
|
490
|
+
disconnect
|
496
491
|
end
|
497
|
-
disconnect
|
498
|
-
@failures += 1
|
499
|
-
delay = [(@failures - 1) ** BACKOFF, MAX_RECONNECT_DELAY].min
|
500
|
-
logger.error "disconnected, #{@failures} failures in a row, reconnect in #{delay}..."
|
501
|
-
sleep delay
|
502
|
-
retry
|
503
|
-
ensure
|
504
|
-
disconnect
|
505
492
|
end
|
506
493
|
|
507
494
|
def setup_cleanup_at_exit
|
@@ -541,18 +528,5 @@ module Instrumental
|
|
541
528
|
def allows_secure?
|
542
529
|
defined?(OpenSSL)
|
543
530
|
end
|
544
|
-
|
545
|
-
def certificates
|
546
|
-
if allows_secure?
|
547
|
-
base_dir = File.expand_path(File.join(File.dirname(__FILE__), "..", ".."))
|
548
|
-
%w{equifax geotrust rapidssl}.map do |name|
|
549
|
-
OpenSSL::X509::Certificate.new(File.open(File.join(base_dir, "certs", "#{name}.ca.pem")))
|
550
|
-
end
|
551
|
-
else
|
552
|
-
[]
|
553
|
-
end
|
554
|
-
end
|
555
|
-
|
556
531
|
end
|
557
|
-
|
558
532
|
end
|
data/lib/instrumental/version.rb
CHANGED
data/spec/agent_spec.rb
CHANGED
@@ -9,6 +9,8 @@ def wait(n=0.2, &block)
|
|
9
9
|
if (Time.now - start) < 5
|
10
10
|
sleep n
|
11
11
|
retry
|
12
|
+
else
|
13
|
+
raise ex
|
12
14
|
end
|
13
15
|
end
|
14
16
|
else
|
@@ -226,16 +228,16 @@ shared_examples "Instrumental Agent" do
|
|
226
228
|
allow(agent.logger).to receive(:debug)
|
227
229
|
expect(agent.logger).to receive(:debug).with("Dropping command, queue full(3): increment overflow_test 4 300 1")
|
228
230
|
expect(agent.logger).to receive(:debug).with("Dropping command, queue full(3): increment overflow_test 5 300 1")
|
229
|
-
5
|
230
|
-
agent.increment('overflow_test', i
|
231
|
-
end
|
232
|
-
wait do
|
233
|
-
expect(server.commands).to include("increment overflow_test 1 300 1")
|
234
|
-
expect(server.commands).to include("increment overflow_test 2 300 1")
|
235
|
-
expect(server.commands).to include("increment overflow_test 3 300 1")
|
236
|
-
expect(server.commands).to_not include("increment overflow_test 4 300 1")
|
237
|
-
expect(server.commands).to_not include("increment overflow_test 5 300 1")
|
231
|
+
1.upto(5) do |i|
|
232
|
+
agent.increment('overflow_test', i, 300)
|
238
233
|
end
|
234
|
+
|
235
|
+
wait
|
236
|
+
expect(agent.queue.size).to eq(3)
|
237
|
+
expect(agent.queue.pop.first).to start_with("increment overflow_test 1 300 1")
|
238
|
+
expect(agent.queue.pop.first).to start_with("increment overflow_test 2 300 1")
|
239
|
+
expect(agent.queue.pop.first).to start_with("increment overflow_test 3 300 1")
|
240
|
+
expect(agent.queue.size).to eq(0)
|
239
241
|
end
|
240
242
|
end
|
241
243
|
end
|
@@ -479,7 +481,7 @@ shared_examples "Instrumental Agent" do
|
|
479
481
|
context 'server hangup' do
|
480
482
|
it "should cancel the worker thread when the host has hung up" do
|
481
483
|
# Start the background agent thread and let it send one metric successfully
|
482
|
-
agent.gauge('
|
484
|
+
agent.gauge('connection_failure1', 1, 1234)
|
483
485
|
wait do
|
484
486
|
expect(server.commands.grep(/connection_failure/).size).to eq(1)
|
485
487
|
end
|
@@ -487,7 +489,7 @@ shared_examples "Instrumental Agent" do
|
|
487
489
|
server.stop
|
488
490
|
wait
|
489
491
|
# Send one metric to the stopped server
|
490
|
-
agent.gauge('
|
492
|
+
agent.gauge('connection_failure2', 1, 1234)
|
491
493
|
# The agent thread should have stopped running since the network write would
|
492
494
|
# have failed. The queue will still contain the metric that has yet to be sent
|
493
495
|
wait do
|
@@ -524,6 +526,71 @@ shared_examples "Instrumental Agent" do
|
|
524
526
|
end
|
525
527
|
end
|
526
528
|
|
529
|
+
it "should restart the worker thread after hanging it up during a bad ssl handshake event" do
|
530
|
+
# Start the background agent thread and let it send one metric successfully
|
531
|
+
agent.gauge('connection_failure', 1, 1234)
|
532
|
+
wait do
|
533
|
+
expect(server.commands.grep(/connection_failure/).size).to eq(1)
|
534
|
+
end
|
535
|
+
# Make the agent return the relevant exception on the next connection test
|
536
|
+
test_connection_fail = true
|
537
|
+
tc = agent.method(:test_connection)
|
538
|
+
allow(agent).to receive(:test_connection) do |*args, &block|
|
539
|
+
test_connection_fail ? raise(OpenSSL::SSL::SSLError.new) : tc.call(*args)
|
540
|
+
end
|
541
|
+
|
542
|
+
# Send one metric to the agent
|
543
|
+
agent.gauge('connection_failure', 1, 1234)
|
544
|
+
# The agent thread should have stopped running since the network write would
|
545
|
+
# have failed.
|
546
|
+
wait do
|
547
|
+
expect(agent.send(:running?)).to eq(false)
|
548
|
+
end
|
549
|
+
# The command is not in the queue
|
550
|
+
expect(agent.queue.size).to eq(0)
|
551
|
+
# allow the agent to behave normally
|
552
|
+
test_connection_fail = false
|
553
|
+
# Sending another metric should kickstart the background worker thread
|
554
|
+
agent.gauge('connection_failure', 1, 1234)
|
555
|
+
# The agent should now be running the background thread, and the queue should be empty
|
556
|
+
wait do
|
557
|
+
expect(agent.send(:running?)).to eq(true)
|
558
|
+
expect(agent.queue.size).to eq(0)
|
559
|
+
expect(server.commands.grep(/connection_failure/).size).to eq(2)
|
560
|
+
end
|
561
|
+
end
|
562
|
+
|
563
|
+
it "should accurately count failures so that backoff can work as intended" do
|
564
|
+
# Start the background agent thread and let it send one metric successfully
|
565
|
+
agent.gauge('connection_failure', 1, 1234)
|
566
|
+
wait do
|
567
|
+
expect(server.commands.grep(/connection_failure/).size).to eq(1)
|
568
|
+
end
|
569
|
+
|
570
|
+
# configure test_connection to fail in a way that won't kill the inner loop
|
571
|
+
test_connection_fail = true
|
572
|
+
tc = agent.method(:test_connection)
|
573
|
+
allow(agent).to receive(:test_connection) do |*args, &block|
|
574
|
+
test_connection_fail ? raise("test_connection_fail") : tc.call(*args)
|
575
|
+
end
|
576
|
+
|
577
|
+
# send some metrics
|
578
|
+
agent.gauge('connection_failure_1', 1, 1234)
|
579
|
+
agent.gauge('connection_failure_2', 1, 1234)
|
580
|
+
agent.gauge('connection_failure_3', 1, 1234)
|
581
|
+
wait do
|
582
|
+
expect(agent.instance_variable_get(:@failures)).to be > 0
|
583
|
+
expect(agent.queue.size).to be > 0
|
584
|
+
end
|
585
|
+
|
586
|
+
# let the loop proceed
|
587
|
+
test_connection_fail = false
|
588
|
+
|
589
|
+
wait do
|
590
|
+
expect(agent.send(:running?)).to eq(true)
|
591
|
+
expect(agent.queue.size).to eq(0)
|
592
|
+
end
|
593
|
+
end
|
527
594
|
end
|
528
595
|
|
529
596
|
|
metadata
CHANGED
@@ -1,100 +1,97 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: instrumental_agent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0.alpha
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
8
|
-
- Christopher Zelenak
|
9
|
-
- Kristopher Chambers
|
10
|
-
- Matthew Hassfurder
|
7
|
+
- Expected Behavior
|
11
8
|
autorequire:
|
12
9
|
bindir: bin
|
13
10
|
cert_chain: []
|
14
|
-
date:
|
11
|
+
date: 2019-08-22 00:00:00.000000000 Z
|
15
12
|
dependencies:
|
16
13
|
- !ruby/object:Gem::Dependency
|
17
14
|
name: metrician
|
18
15
|
requirement: !ruby/object:Gem::Requirement
|
19
16
|
requirements:
|
20
|
-
- -
|
17
|
+
- - ">="
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: '0'
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: pry
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
30
|
requirements:
|
34
|
-
- -
|
31
|
+
- - ">="
|
35
32
|
- !ruby/object:Gem::Version
|
36
33
|
version: '0'
|
37
34
|
type: :development
|
38
35
|
prerelease: false
|
39
36
|
version_requirements: !ruby/object:Gem::Requirement
|
40
37
|
requirements:
|
41
|
-
- -
|
38
|
+
- - ">="
|
42
39
|
- !ruby/object:Gem::Version
|
43
40
|
version: '0'
|
44
41
|
- !ruby/object:Gem::Dependency
|
45
42
|
name: rake
|
46
43
|
requirement: !ruby/object:Gem::Requirement
|
47
44
|
requirements:
|
48
|
-
- -
|
45
|
+
- - ">="
|
49
46
|
- !ruby/object:Gem::Version
|
50
47
|
version: '0'
|
51
48
|
type: :development
|
52
49
|
prerelease: false
|
53
50
|
version_requirements: !ruby/object:Gem::Requirement
|
54
51
|
requirements:
|
55
|
-
- -
|
52
|
+
- - ">="
|
56
53
|
- !ruby/object:Gem::Version
|
57
54
|
version: '0'
|
58
55
|
- !ruby/object:Gem::Dependency
|
59
56
|
name: rspec
|
60
57
|
requirement: !ruby/object:Gem::Requirement
|
61
58
|
requirements:
|
62
|
-
- - ~>
|
59
|
+
- - "~>"
|
63
60
|
- !ruby/object:Gem::Version
|
64
61
|
version: '3.0'
|
65
62
|
type: :development
|
66
63
|
prerelease: false
|
67
64
|
version_requirements: !ruby/object:Gem::Requirement
|
68
65
|
requirements:
|
69
|
-
- - ~>
|
66
|
+
- - "~>"
|
70
67
|
- !ruby/object:Gem::Version
|
71
68
|
version: '3.0'
|
72
69
|
- !ruby/object:Gem::Dependency
|
73
70
|
name: fuubar
|
74
71
|
requirement: !ruby/object:Gem::Requirement
|
75
72
|
requirements:
|
76
|
-
- -
|
73
|
+
- - ">="
|
77
74
|
- !ruby/object:Gem::Version
|
78
75
|
version: '0'
|
79
76
|
type: :development
|
80
77
|
prerelease: false
|
81
78
|
version_requirements: !ruby/object:Gem::Requirement
|
82
79
|
requirements:
|
83
|
-
- -
|
80
|
+
- - ">="
|
84
81
|
- !ruby/object:Gem::Version
|
85
82
|
version: '0'
|
86
83
|
- !ruby/object:Gem::Dependency
|
87
84
|
name: timecop
|
88
85
|
requirement: !ruby/object:Gem::Requirement
|
89
86
|
requirements:
|
90
|
-
- -
|
87
|
+
- - ">="
|
91
88
|
- !ruby/object:Gem::Version
|
92
89
|
version: '0'
|
93
90
|
type: :development
|
94
91
|
prerelease: false
|
95
92
|
version_requirements: !ruby/object:Gem::Requirement
|
96
93
|
requirements:
|
97
|
-
- -
|
94
|
+
- - ">="
|
98
95
|
- !ruby/object:Gem::Version
|
99
96
|
version: '0'
|
100
97
|
description: This agent supports Instrumental custom metric monitoring for Ruby applications.
|
@@ -106,19 +103,16 @@ executables: []
|
|
106
103
|
extensions: []
|
107
104
|
extra_rdoc_files: []
|
108
105
|
files:
|
109
|
-
- .gitignore
|
110
|
-
- .rspec
|
111
|
-
- .ruby-version
|
112
|
-
- .travis.yml
|
106
|
+
- ".gitignore"
|
107
|
+
- ".rspec"
|
108
|
+
- ".ruby-version"
|
109
|
+
- ".travis.yml"
|
113
110
|
- CHANGELOG.md
|
114
111
|
- Gemfile
|
115
112
|
- Guardfile
|
116
113
|
- LICENSE
|
117
114
|
- README.md
|
118
115
|
- Rakefile
|
119
|
-
- certs/equifax.ca.pem
|
120
|
-
- certs/geotrust.ca.pem
|
121
|
-
- certs/rapidssl.ca.pem
|
122
116
|
- instrumental_agent.gemspec
|
123
117
|
- lib/instrumental/agent.rb
|
124
118
|
- lib/instrumental/capistrano.rb
|
@@ -145,17 +139,16 @@ require_paths:
|
|
145
139
|
- lib
|
146
140
|
required_ruby_version: !ruby/object:Gem::Requirement
|
147
141
|
requirements:
|
148
|
-
- -
|
142
|
+
- - ">="
|
149
143
|
- !ruby/object:Gem::Version
|
150
|
-
version: 2.
|
144
|
+
version: 2.4.6
|
151
145
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
152
146
|
requirements:
|
153
|
-
- -
|
147
|
+
- - ">"
|
154
148
|
- !ruby/object:Gem::Version
|
155
|
-
version:
|
149
|
+
version: 1.3.1
|
156
150
|
requirements: []
|
157
|
-
|
158
|
-
rubygems_version: 2.0.14.1
|
151
|
+
rubygems_version: 3.0.3
|
159
152
|
signing_key:
|
160
153
|
specification_version: 4
|
161
154
|
summary: Custom metric monitoring for Ruby applications via Instrumental
|
data/certs/equifax.ca.pem
DELETED
@@ -1,69 +0,0 @@
|
|
1
|
-
Certificate:
|
2
|
-
Data:
|
3
|
-
Version: 3 (0x2)
|
4
|
-
Serial Number: 903804111 (0x35def4cf)
|
5
|
-
Signature Algorithm: sha1WithRSAEncryption
|
6
|
-
Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority
|
7
|
-
Validity
|
8
|
-
Not Before: Aug 22 16:41:51 1998 GMT
|
9
|
-
Not After : Aug 22 16:41:51 2018 GMT
|
10
|
-
Subject: C=US, O=Equifax, OU=Equifax Secure Certificate Authority
|
11
|
-
Subject Public Key Info:
|
12
|
-
Public Key Algorithm: rsaEncryption
|
13
|
-
RSA Public Key: (1024 bit)
|
14
|
-
Modulus (1024 bit):
|
15
|
-
00:c1:5d:b1:58:67:08:62:ee:a0:9a:2d:1f:08:6d:
|
16
|
-
91:14:68:98:0a:1e:fe:da:04:6f:13:84:62:21:c3:
|
17
|
-
d1:7c:ce:9f:05:e0:b8:01:f0:4e:34:ec:e2:8a:95:
|
18
|
-
04:64:ac:f1:6b:53:5f:05:b3:cb:67:80:bf:42:02:
|
19
|
-
8e:fe:dd:01:09:ec:e1:00:14:4f:fc:fb:f0:0c:dd:
|
20
|
-
43:ba:5b:2b:e1:1f:80:70:99:15:57:93:16:f1:0f:
|
21
|
-
97:6a:b7:c2:68:23:1c:cc:4d:59:30:ac:51:1e:3b:
|
22
|
-
af:2b:d6:ee:63:45:7b:c5:d9:5f:50:d2:e3:50:0f:
|
23
|
-
3a:88:e7:bf:14:fd:e0:c7:b9
|
24
|
-
Exponent: 65537 (0x10001)
|
25
|
-
X509v3 extensions:
|
26
|
-
X509v3 CRL Distribution Points:
|
27
|
-
DirName:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority/CN=CRL1
|
28
|
-
|
29
|
-
X509v3 Private Key Usage Period:
|
30
|
-
Not After: Aug 22 16:41:51 2018 GMT
|
31
|
-
X509v3 Key Usage:
|
32
|
-
Certificate Sign, CRL Sign
|
33
|
-
X509v3 Authority Key Identifier:
|
34
|
-
keyid:48:E6:68:F9:2B:D2:B2:95:D7:47:D8:23:20:10:4F:33:98:90:9F:D4
|
35
|
-
|
36
|
-
X509v3 Subject Key Identifier:
|
37
|
-
48:E6:68:F9:2B:D2:B2:95:D7:47:D8:23:20:10:4F:33:98:90:9F:D4
|
38
|
-
X509v3 Basic Constraints:
|
39
|
-
CA:TRUE
|
40
|
-
1.2.840.113533.7.65.0:
|
41
|
-
0...V3.0c....
|
42
|
-
Signature Algorithm: sha1WithRSAEncryption
|
43
|
-
58:ce:29:ea:fc:f7:de:b5:ce:02:b9:17:b5:85:d1:b9:e3:e0:
|
44
|
-
95:cc:25:31:0d:00:a6:92:6e:7f:b6:92:63:9e:50:95:d1:9a:
|
45
|
-
6f:e4:11:de:63:85:6e:98:ee:a8:ff:5a:c8:d3:55:b2:66:71:
|
46
|
-
57:de:c0:21:eb:3d:2a:a7:23:49:01:04:86:42:7b:fc:ee:7f:
|
47
|
-
a2:16:52:b5:67:67:d3:40:db:3b:26:58:b2:28:77:3d:ae:14:
|
48
|
-
77:61:d6:fa:2a:66:27:a0:0d:fa:a7:73:5c:ea:70:f1:94:21:
|
49
|
-
65:44:5f:fa:fc:ef:29:68:a9:a2:87:79:ef:79:ef:4f:ac:07:
|
50
|
-
77:38
|
51
|
-
-----BEGIN CERTIFICATE-----
|
52
|
-
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
|
53
|
-
UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
|
54
|
-
dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
|
55
|
-
MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
|
56
|
-
dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
|
57
|
-
AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
|
58
|
-
BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
|
59
|
-
cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
|
60
|
-
AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
|
61
|
-
MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
|
62
|
-
aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
|
63
|
-
ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
|
64
|
-
IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
|
65
|
-
MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
|
66
|
-
A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
|
67
|
-
7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
|
68
|
-
1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
|
69
|
-
-----END CERTIFICATE-----
|
data/certs/geotrust.ca.pem
DELETED
@@ -1,80 +0,0 @@
|
|
1
|
-
Certificate:
|
2
|
-
Data:
|
3
|
-
Version: 3 (0x2)
|
4
|
-
Serial Number: 1227750 (0x12bbe6)
|
5
|
-
Signature Algorithm: sha1WithRSAEncryption
|
6
|
-
Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority
|
7
|
-
Validity
|
8
|
-
Not Before: May 21 04:00:00 2002 GMT
|
9
|
-
Not After : Aug 21 04:00:00 2018 GMT
|
10
|
-
Subject: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA
|
11
|
-
Subject Public Key Info:
|
12
|
-
Public Key Algorithm: rsaEncryption
|
13
|
-
RSA Public Key: (2048 bit)
|
14
|
-
Modulus (2048 bit):
|
15
|
-
00:da:cc:18:63:30:fd:f4:17:23:1a:56:7e:5b:df:
|
16
|
-
3c:6c:38:e4:71:b7:78:91:d4:bc:a1:d8:4c:f8:a8:
|
17
|
-
43:b6:03:e9:4d:21:07:08:88:da:58:2f:66:39:29:
|
18
|
-
bd:05:78:8b:9d:38:e8:05:b7:6a:7e:71:a4:e6:c4:
|
19
|
-
60:a6:b0:ef:80:e4:89:28:0f:9e:25:d6:ed:83:f3:
|
20
|
-
ad:a6:91:c7:98:c9:42:18:35:14:9d:ad:98:46:92:
|
21
|
-
2e:4f:ca:f1:87:43:c1:16:95:57:2d:50:ef:89:2d:
|
22
|
-
80:7a:57:ad:f2:ee:5f:6b:d2:00:8d:b9:14:f8:14:
|
23
|
-
15:35:d9:c0:46:a3:7b:72:c8:91:bf:c9:55:2b:cd:
|
24
|
-
d0:97:3e:9c:26:64:cc:df:ce:83:19:71:ca:4e:e6:
|
25
|
-
d4:d5:7b:a9:19:cd:55:de:c8:ec:d2:5e:38:53:e5:
|
26
|
-
5c:4f:8c:2d:fe:50:23:36:fc:66:e6:cb:8e:a4:39:
|
27
|
-
19:00:b7:95:02:39:91:0b:0e:fe:38:2e:d1:1d:05:
|
28
|
-
9a:f6:4d:3e:6f:0f:07:1d:af:2c:1e:8f:60:39:e2:
|
29
|
-
fa:36:53:13:39:d4:5e:26:2b:db:3d:a8:14:bd:32:
|
30
|
-
eb:18:03:28:52:04:71:e5:ab:33:3d:e1:38:bb:07:
|
31
|
-
36:84:62:9c:79:ea:16:30:f4:5f:c0:2b:e8:71:6b:
|
32
|
-
e4:f9
|
33
|
-
Exponent: 65537 (0x10001)
|
34
|
-
X509v3 extensions:
|
35
|
-
X509v3 Authority Key Identifier:
|
36
|
-
keyid:48:E6:68:F9:2B:D2:B2:95:D7:47:D8:23:20:10:4F:33:98:90:9F:D4
|
37
|
-
|
38
|
-
X509v3 Subject Key Identifier:
|
39
|
-
C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E
|
40
|
-
X509v3 Basic Constraints: critical
|
41
|
-
CA:TRUE
|
42
|
-
X509v3 Key Usage: critical
|
43
|
-
Certificate Sign, CRL Sign
|
44
|
-
X509v3 CRL Distribution Points:
|
45
|
-
URI:http://crl.geotrust.com/crls/secureca.crl
|
46
|
-
|
47
|
-
X509v3 Certificate Policies:
|
48
|
-
Policy: X509v3 Any Policy
|
49
|
-
CPS: https://www.geotrust.com/resources/repository
|
50
|
-
|
51
|
-
Signature Algorithm: sha1WithRSAEncryption
|
52
|
-
76:e1:12:6e:4e:4b:16:12:86:30:06:b2:81:08:cf:f0:08:c7:
|
53
|
-
c7:71:7e:66:ee:c2:ed:d4:3b:1f:ff:f0:f0:c8:4e:d6:43:38:
|
54
|
-
b0:b9:30:7d:18:d0:55:83:a2:6a:cb:36:11:9c:e8:48:66:a3:
|
55
|
-
6d:7f:b8:13:d4:47:fe:8b:5a:5c:73:fc:ae:d9:1b:32:19:38:
|
56
|
-
ab:97:34:14:aa:96:d2:eb:a3:1c:14:08:49:b6:bb:e5:91:ef:
|
57
|
-
83:36:eb:1d:56:6f:ca:da:bc:73:63:90:e4:7f:7b:3e:22:cb:
|
58
|
-
3d:07:ed:5f:38:74:9c:e3:03:50:4e:a1:af:98:ee:61:f2:84:
|
59
|
-
3f:12
|
60
|
-
-----BEGIN CERTIFICATE-----
|
61
|
-
MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
|
62
|
-
MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
|
63
|
-
aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw
|
64
|
-
WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE
|
65
|
-
AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
|
66
|
-
CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m
|
67
|
-
OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu
|
68
|
-
T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c
|
69
|
-
JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR
|
70
|
-
Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz
|
71
|
-
PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm
|
72
|
-
aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM
|
73
|
-
TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g
|
74
|
-
LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO
|
75
|
-
BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv
|
76
|
-
dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB
|
77
|
-
AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL
|
78
|
-
NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W
|
79
|
-
b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S
|
80
|
-
-----END CERTIFICATE-----
|
data/certs/rapidssl.ca.pem
DELETED
@@ -1,94 +0,0 @@
|
|
1
|
-
Certificate:
|
2
|
-
Data:
|
3
|
-
Version: 3 (0x2)
|
4
|
-
Serial Number: 146039 (0x23a77)
|
5
|
-
Signature Algorithm: sha256WithRSAEncryption
|
6
|
-
Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA
|
7
|
-
Validity
|
8
|
-
Not Before: Aug 29 21:39:32 2014 GMT
|
9
|
-
Not After : May 20 21:39:32 2022 GMT
|
10
|
-
Subject: C=US, O=GeoTrust Inc., CN=RapidSSL SHA256 CA - G3
|
11
|
-
Subject Public Key Info:
|
12
|
-
Public Key Algorithm: rsaEncryption
|
13
|
-
RSA Public Key: (2048 bit)
|
14
|
-
Modulus (2048 bit):
|
15
|
-
00:af:54:9b:d9:58:5d:1e:2c:56:c6:d5:e8:7f:f4:
|
16
|
-
7d:16:03:ff:d0:8b:5a:e4:8e:a7:dd:54:2e:d4:04:
|
17
|
-
c0:5d:98:9c:8d:90:0f:bc:10:65:5f:da:9a:d6:44:
|
18
|
-
7c:c0:9f:b5:e9:4a:8c:0b:06:43:04:bb:f4:96:e2:
|
19
|
-
26:f6:61:01:91:66:31:22:c3:34:34:5f:3f:3f:91:
|
20
|
-
2f:44:5f:dc:c7:14:b6:03:9f:86:4b:0e:a3:ff:a0:
|
21
|
-
80:02:83:c3:d3:1f:69:52:d6:9d:64:0f:c9:83:e7:
|
22
|
-
1b:c4:70:ac:94:e7:c3:a4:6a:2c:bd:b8:9e:69:d8:
|
23
|
-
be:0a:8f:16:63:5a:68:71:80:7b:30:de:15:04:bf:
|
24
|
-
cc:d3:bf:3e:48:05:55:7a:b3:d7:10:0c:03:fc:9b:
|
25
|
-
fd:08:a7:8c:8c:db:a7:8e:f1:1e:63:dc:b3:01:2f:
|
26
|
-
7f:af:57:c3:3c:48:a7:83:68:21:a7:2f:e7:a7:3f:
|
27
|
-
f0:b5:0c:fc:f5:84:d1:53:bc:0e:72:4f:60:0c:42:
|
28
|
-
b8:98:ad:19:88:57:d7:04:ec:87:bf:7e:87:4e:a3:
|
29
|
-
21:f9:53:fd:36:98:48:8d:d6:f8:bb:48:f2:29:c8:
|
30
|
-
64:d1:cc:54:48:53:8b:af:b7:65:1e:bf:29:33:29:
|
31
|
-
d9:29:60:48:f8:ff:91:bc:57:58:e5:35:2e:bb:69:
|
32
|
-
b6:59
|
33
|
-
Exponent: 65537 (0x10001)
|
34
|
-
X509v3 extensions:
|
35
|
-
X509v3 Authority Key Identifier:
|
36
|
-
keyid:C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E
|
37
|
-
|
38
|
-
X509v3 Subject Key Identifier:
|
39
|
-
C3:9C:F3:FC:D3:46:08:34:BB:CE:46:7F:A0:7C:5B:F3:E2:08:CB:59
|
40
|
-
X509v3 Basic Constraints: critical
|
41
|
-
CA:TRUE, pathlen:0
|
42
|
-
X509v3 Key Usage: critical
|
43
|
-
Certificate Sign, CRL Sign
|
44
|
-
X509v3 CRL Distribution Points:
|
45
|
-
URI:http://g.symcb.com/crls/gtglobal.crl
|
46
|
-
|
47
|
-
Authority Information Access:
|
48
|
-
OCSP - URI:http://g.symcd.com
|
49
|
-
|
50
|
-
X509v3 Certificate Policies:
|
51
|
-
Policy: 2.16.840.1.113733.1.7.54
|
52
|
-
CPS: http://www.geotrust.com/resources/cps
|
53
|
-
|
54
|
-
Signature Algorithm: sha256WithRSAEncryption
|
55
|
-
a3:58:1e:c6:43:32:ac:ac:2f:93:78:b7:ea:ae:54:40:47:2d:
|
56
|
-
7e:78:8d:50:f6:f8:66:ac:d6:4f:73:d6:44:ef:af:0b:cc:5b:
|
57
|
-
c1:f4:4f:9a:8f:49:7e:60:af:c2:27:c7:16:f1:fb:93:81:90:
|
58
|
-
a9:7c:ef:6f:7e:6e:45:94:16:84:bd:ec:49:f1:c4:0e:f4:af:
|
59
|
-
04:59:83:87:0f:2c:3b:97:c3:5a:12:9b:7b:04:35:7b:a3:95:
|
60
|
-
33:08:7b:93:71:22:42:b3:a9:d9:6f:4f:81:92:fc:07:b6:79:
|
61
|
-
bc:84:4a:9d:77:09:f1:c5:89:f2:f0:b4:9c:54:aa:12:7b:0d:
|
62
|
-
ba:4f:ef:93:19:ec:ef:7d:4e:61:a3:8e:76:9c:59:cf:8c:94:
|
63
|
-
b1:84:97:f7:1a:b9:07:b8:b2:c6:4f:13:79:db:bf:4f:51:1b:
|
64
|
-
7f:69:0d:51:2a:c1:d6:15:ff:37:51:34:65:51:f4:1e:be:38:
|
65
|
-
6a:ec:0e:ab:bf:3d:7b:39:05:7b:f4:f3:fb:1a:a1:d0:c8:7e:
|
66
|
-
4e:64:8d:cd:8c:61:55:90:fe:3a:ca:5d:25:0f:f8:1d:a3:4a:
|
67
|
-
74:56:4f:1a:55:40:70:75:25:a6:33:2e:ba:4b:a5:5d:53:9a:
|
68
|
-
0d:30:e1:8d:5f:61:2c:af:cc:ef:b0:99:a1:80:ff:0b:f2:62:
|
69
|
-
4c:70:26:98
|
70
|
-
-----BEGIN CERTIFICATE-----
|
71
|
-
MIIEJTCCAw2gAwIBAgIDAjp3MA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT
|
72
|
-
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
|
73
|
-
YWwgQ0EwHhcNMTQwODI5MjEzOTMyWhcNMjIwNTIwMjEzOTMyWjBHMQswCQYDVQQG
|
74
|
-
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXUmFwaWRTU0wg
|
75
|
-
U0hBMjU2IENBIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCv
|
76
|
-
VJvZWF0eLFbG1eh/9H0WA//Qi1rkjqfdVC7UBMBdmJyNkA+8EGVf2prWRHzAn7Xp
|
77
|
-
SowLBkMEu/SW4ib2YQGRZjEiwzQ0Xz8/kS9EX9zHFLYDn4ZLDqP/oIACg8PTH2lS
|
78
|
-
1p1kD8mD5xvEcKyU58Okaiy9uJ5p2L4KjxZjWmhxgHsw3hUEv8zTvz5IBVV6s9cQ
|
79
|
-
DAP8m/0Ip4yM26eO8R5j3LMBL3+vV8M8SKeDaCGnL+enP/C1DPz1hNFTvA5yT2AM
|
80
|
-
QriYrRmIV9cE7Ie/fodOoyH5U/02mEiN1vi7SPIpyGTRzFRIU4uvt2UevykzKdkp
|
81
|
-
YEj4/5G8V1jlNS67abZZAgMBAAGjggEdMIIBGTAfBgNVHSMEGDAWgBTAephojYn7
|
82
|
-
qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUw5zz/NNGCDS7zkZ/oHxb8+IIy1kwEgYD
|
83
|
-
VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwNQYDVR0fBC4wLDAqoCig
|
84
|
-
JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMC4GCCsGAQUF
|
85
|
-
BwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDovL2cuc3ltY2QuY29tMEwGA1UdIARF
|
86
|
-
MEMwQQYKYIZIAYb4RQEHNjAzMDEGCCsGAQUFBwIBFiVodHRwOi8vd3d3Lmdlb3Ry
|
87
|
-
dXN0LmNvbS9yZXNvdXJjZXMvY3BzMA0GCSqGSIb3DQEBCwUAA4IBAQCjWB7GQzKs
|
88
|
-
rC+TeLfqrlRARy1+eI1Q9vhmrNZPc9ZE768LzFvB9E+aj0l+YK/CJ8cW8fuTgZCp
|
89
|
-
fO9vfm5FlBaEvexJ8cQO9K8EWYOHDyw7l8NaEpt7BDV7o5UzCHuTcSJCs6nZb0+B
|
90
|
-
kvwHtnm8hEqddwnxxYny8LScVKoSew26T++TGezvfU5ho452nFnPjJSxhJf3GrkH
|
91
|
-
uLLGTxN5279PURt/aQ1RKsHWFf83UTRlUfQevjhq7A6rvz17OQV79PP7GqHQyH5O
|
92
|
-
ZI3NjGFVkP46yl0lD/gdo0p0Vk8aVUBwdSWmMy66S6VdU5oNMOGNX2Esr8zvsJmh
|
93
|
-
gP8L8mJMcCaY
|
94
|
-
-----END CERTIFICATE-----
|