stackify-ruby-apm 1.9.8 → 1.10.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/lib/stackify_apm/config.rb +1 -0
- data/lib/stackify_apm/spies/custom_instrumenter.rb +13 -1
- data/lib/stackify_apm/spies/sidekiq.rb +44 -0
- data/lib/stackify_apm/transport/agent_base.rb +23 -0
- data/lib/stackify_apm/transport/agent_http_client.rb +17 -11
- data/lib/stackify_apm/transport/unix_socket_client.rb +12 -5
- data/lib/stackify_apm/version.rb +1 -1
- data/lib/stackify_ruby_apm.rb +0 -3
- data/stackify-ruby-apm.gemspec +0 -16
- metadata +3 -64
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d62649a9bf57a77665b23b7e42ffe0d19395853a9b0b79e128197691e5bfb62
|
4
|
+
data.tar.gz: '0216963cac56d043591eb797ab64cce012a479de25d9a5fbe202eb6f3d73929a'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5c6c501b6eac9dbad6378a03cf1234468c84480fe15b977e44187d331452c39f6a76d19348b9141616791e564ccc436c48f8d27900796ca06104a67863c5a02f
|
7
|
+
data.tar.gz: 89edd6496518ed877c65e87320a8bbf543f60a34b7e9023e0546b011854077d1c31f656bccbf1947229831b21f1fdf4f352c984cf11931dd3dc1b8e15e17e102
|
data/lib/stackify_apm/config.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
# Monkey patch for the custom instrumentation any values from config/stackify.json will be loop and will
|
4
4
|
# register as a spy.
|
5
5
|
#
|
6
|
+
require 'logger'
|
6
7
|
require 'stackify_apm/instrumenter_helper.rb'
|
7
8
|
require 'stackify_apm/config'
|
8
9
|
require 'json'
|
@@ -10,7 +11,8 @@ require 'json'
|
|
10
11
|
# rubocop:disable Metrics/PerceivedComplexity
|
11
12
|
module StackifyRubyAPM
|
12
13
|
# @api private
|
13
|
-
module Spies
|
14
|
+
module Spies extend Log
|
15
|
+
|
14
16
|
def self.run_custom_instrumentation
|
15
17
|
config = Config.new
|
16
18
|
to_instrument = parse_json_config(config.json_config_file)
|
@@ -27,11 +29,21 @@ module StackifyRubyAPM
|
|
27
29
|
tracked_func = custom_spy['trackedFunction']
|
28
30
|
tracked_func_name = defined?(custom_spy['trackedFunctionName']) ? custom_spy['trackedFunctionName'] : ''
|
29
31
|
transaction = defined?(custom_spy['transaction']) ? custom_spy['transaction'] : nil
|
32
|
+
file_path = defined?(custom_spy['file_path']) ? custom_spy['file_path'] : nil
|
30
33
|
|
31
34
|
tracked_function_tpl = tracked_func_name.nil? ? '{{ClassName}}.{{MethodName}}' : tracked_func_name
|
32
35
|
tracked_function_name = tracked_function_tpl.sub '{{ClassName}}', current_class
|
33
36
|
tracked_function_name = tracked_function_name.sub '{{MethodName}}', current_method
|
34
37
|
|
38
|
+
if !class_exists?(current_class) && !file_path.nil?
|
39
|
+
begin
|
40
|
+
require file_path
|
41
|
+
rescue LoadError => e
|
42
|
+
debug "[StackifyRubyAPM] File path doesn't exist."
|
43
|
+
debug e.inspect
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
35
47
|
# rubocop:disable Style/Next
|
36
48
|
if class_exists?(current_class)
|
37
49
|
mod_constant = Module.const_get(current_class.to_s)
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Monkey patch for the sidekiq class for running async tasks.
|
4
|
+
#
|
5
|
+
|
6
|
+
module StackifyRubyAPM
|
7
|
+
# @api private
|
8
|
+
module Spies
|
9
|
+
# @api private
|
10
|
+
class SidekiqClientSpy
|
11
|
+
def install
|
12
|
+
Sidekiq::Processor.class_eval do
|
13
|
+
alias_method 'process_without_apm', 'process'
|
14
|
+
|
15
|
+
def process(work, *args, &block)
|
16
|
+
ret = nil
|
17
|
+
begin
|
18
|
+
job = nil
|
19
|
+
if defined? work.message
|
20
|
+
job = work.message
|
21
|
+
else
|
22
|
+
job = work.job
|
23
|
+
end
|
24
|
+
job_hash = JSON.parse job
|
25
|
+
name = job_hash["class"]
|
26
|
+
transaction = StackifyRubyAPM.transaction name, 'TASK'
|
27
|
+
ret = process_without_apm(work, *args, &block)
|
28
|
+
rescue StackifyRubyAPM::InternalError
|
29
|
+
raise # Don't report StackifyRubyAPM errors
|
30
|
+
rescue StandardError => e
|
31
|
+
StackifyRubyAPM.report e
|
32
|
+
raise e
|
33
|
+
ensure
|
34
|
+
transaction.submit()
|
35
|
+
end
|
36
|
+
ret
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
register 'Sidekiq::Processor', 'sidekiq/processor', SidekiqClientSpy.new
|
43
|
+
end
|
44
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'json'
|
1
2
|
require 'stackify_apm/root_info'
|
2
3
|
require 'stackify_apm/serializers'
|
3
4
|
|
@@ -12,6 +13,15 @@ module StackifyRubyAPM
|
|
12
13
|
@transaction_serializers = Serializers::Transactions.new(config)
|
13
14
|
end
|
14
15
|
|
16
|
+
def get_protobuf_message(transactions)
|
17
|
+
protobuf_obj = build_message(transactions)
|
18
|
+
StackifyProtoBuf::Traces.encode(protobuf_obj)
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_json_message(transactions)
|
22
|
+
JSON.generate(build_json_message(transactions))
|
23
|
+
end
|
24
|
+
|
15
25
|
# This method will build a group of Stackify::Traces from the protobuf objects.
|
16
26
|
# It accept Array of transactions.
|
17
27
|
def build_message(transactions = [])
|
@@ -28,6 +38,19 @@ module StackifyRubyAPM
|
|
28
38
|
debug "[AgentBaseTransport] build_message() exception: #{e.inspect}"
|
29
39
|
end
|
30
40
|
|
41
|
+
def build_json_message(transactions = [])
|
42
|
+
traces = []
|
43
|
+
transactions.each do |transaction|
|
44
|
+
# convert transaction to json
|
45
|
+
json_transaction = @transaction_serializers.build_json(@config, transaction)
|
46
|
+
# add to traces array
|
47
|
+
traces << json_transaction
|
48
|
+
end
|
49
|
+
return traces
|
50
|
+
rescue StandardError => e
|
51
|
+
debug "[AgentBaseTransport] build_json_message() exception: #{e.inspect}"
|
52
|
+
end
|
53
|
+
|
31
54
|
def post(_transactions = [])
|
32
55
|
raise NotImplementedError
|
33
56
|
end
|
@@ -5,24 +5,32 @@ require 'faraday'
|
|
5
5
|
require 'ostruct'
|
6
6
|
|
7
7
|
module StackifyRubyAPM
|
8
|
-
# This class will handle the sending of
|
8
|
+
# This class will handle the sending of transaction messages through HTTP.
|
9
9
|
# @api private
|
10
10
|
class AgentHTTPClient < AgentBaseTransport
|
11
11
|
include Log
|
12
12
|
|
13
|
-
HEADERS = {
|
14
|
-
'Content-Type' => 'application/x-protobuf'
|
15
|
-
}.freeze
|
16
|
-
|
17
13
|
def initialize(config)
|
18
14
|
@config = config
|
19
15
|
super(config)
|
20
16
|
end
|
21
17
|
|
18
|
+
def get_protobuf_headers
|
19
|
+
{
|
20
|
+
'Content-Type' => 'application/x-protobuf'
|
21
|
+
}.freeze
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_json_headers
|
25
|
+
{
|
26
|
+
'Content-Type' => 'application/json'
|
27
|
+
}.freeze
|
28
|
+
end
|
29
|
+
|
22
30
|
# rubocop:disable Metrics/CyclomaticComplexity
|
23
31
|
# rubocop:disable Metrics/PerceivedComplexity
|
24
32
|
#
|
25
|
-
# This method will send a
|
33
|
+
# This method will send a transction message to HTTP request.
|
26
34
|
# It will accept Array of transactions.
|
27
35
|
def post(transactions = [])
|
28
36
|
debug '[AgentHTTPClient] post()' if ENV['STACKIFY_TRANSPORT_LOG_LEVEL'] == '0'
|
@@ -31,16 +39,14 @@ module StackifyRubyAPM
|
|
31
39
|
retry_count = 0
|
32
40
|
delay = @config.delay_seconds
|
33
41
|
begin
|
34
|
-
|
35
|
-
message = StackifyProtoBuf::Traces.encode(protobuf_obj)
|
36
|
-
# Convert message into binary and send it to http request
|
42
|
+
message = get_json_message(transactions)
|
37
43
|
conn = Faraday.new(ssl: { verify: false })
|
38
44
|
response = conn.post do |req|
|
39
45
|
req.url URI(@config.transport_http_endpoint + @config.agent_traces_url)
|
40
|
-
req.headers =
|
46
|
+
req.headers = get_json_headers
|
41
47
|
req.body = message
|
42
48
|
end
|
43
|
-
if response.
|
49
|
+
if defined?(response.status) && response.status == 200
|
44
50
|
debug '[AgentHTTPClient] Successfully send message via http request.' if ENV['STACKIFY_TRANSPORT_LOG_LEVEL'] == '0'
|
45
51
|
elsif ENV['STACKIFY_TRANSPORT_LOG_LEVEL'] == '0'
|
46
52
|
debug "[AgentHTTPClient] Failure sending via http request: #{response.inspect}"
|
@@ -4,7 +4,7 @@ require 'net_http_unix'
|
|
4
4
|
require 'ostruct'
|
5
5
|
|
6
6
|
module StackifyRubyAPM
|
7
|
-
# This class will handle the sending of
|
7
|
+
# This class will handle the sending of transaction messages through unix domain socket.
|
8
8
|
# @api private
|
9
9
|
class UnixSocketClient < AgentBaseTransport
|
10
10
|
include Log
|
@@ -14,10 +14,18 @@ module StackifyRubyAPM
|
|
14
14
|
super(config)
|
15
15
|
end
|
16
16
|
|
17
|
+
def get_protobuf_headers
|
18
|
+
'application/x-protobuf'
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_json_headers
|
22
|
+
'application/json'
|
23
|
+
end
|
24
|
+
|
17
25
|
# rubocop:disable Metrics/CyclomaticComplexity
|
18
26
|
# rubocop:disable Metrics/PerceivedComplexity
|
19
27
|
#
|
20
|
-
# This method will send a
|
28
|
+
# This method will send a transaction message to the unix domain socket.
|
21
29
|
# It will accept Array of transactions.
|
22
30
|
def post(transactions = [])
|
23
31
|
debug '[UnixSocketClient] post()' if ENV['STACKIFY_TRANSPORT_LOG_LEVEL'] == '0'
|
@@ -27,11 +35,10 @@ module StackifyRubyAPM
|
|
27
35
|
delay = @config.delay_seconds
|
28
36
|
begin
|
29
37
|
# Convert message into binary and send it to unix domain socket
|
30
|
-
|
31
|
-
message = StackifyProtoBuf::Traces.encode(protobuf_obj)
|
38
|
+
message = get_json_message(transactions)
|
32
39
|
client = NetX::HTTPUnix.new('unix://' + @config.unix_socket_path)
|
33
40
|
req = Net::HTTP::Post.new(@config.agent_traces_url)
|
34
|
-
req.set_content_type(
|
41
|
+
req.set_content_type(get_json_headers)
|
35
42
|
req.body = message
|
36
43
|
response = client.request(req)
|
37
44
|
debug "[UnixSocketClient] status_code = #{response.code}" if ENV['STACKIFY_TRANSPORT_LOG_LEVEL'] == '0'
|
data/lib/stackify_apm/version.rb
CHANGED
data/lib/stackify_ruby_apm.rb
CHANGED
@@ -35,9 +35,6 @@ require 'stackify_apm/transport/unix_socket_client'
|
|
35
35
|
require 'stackify_apm/transport/agent_http_client'
|
36
36
|
require 'stackify_apm/transport/aws_lambda_logging'
|
37
37
|
|
38
|
-
require 'google/protobuf'
|
39
|
-
require 'proto/stackify_trace'
|
40
|
-
|
41
38
|
# Checks if the framework using is Rails
|
42
39
|
require 'stackify_apm/railtie' if defined?(::Rails::Railtie)
|
43
40
|
|
data/stackify-ruby-apm.gemspec
CHANGED
@@ -33,20 +33,6 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.add_development_dependency 'bigdecimal'
|
34
34
|
end
|
35
35
|
|
36
|
-
# rubocop
|
37
|
-
if RUBY_VERSION >= '2.2.0'
|
38
|
-
spec.add_development_dependency 'rubocop-performance'
|
39
|
-
end
|
40
|
-
|
41
|
-
# protobuf
|
42
|
-
if RUBY_VERSION >= '2.7'
|
43
|
-
spec.add_development_dependency 'google-protobuf', '= 3.5.0'
|
44
|
-
elsif RUBY_VERSION > '2.3'
|
45
|
-
spec.add_development_dependency 'google-protobuf', '>= 3.5.0'
|
46
|
-
else
|
47
|
-
spec.add_development_dependency 'google-protobuf', '= 3.5.0'
|
48
|
-
end
|
49
|
-
|
50
36
|
spec.add_development_dependency 'bundler', '~> 1.16'
|
51
37
|
spec.add_development_dependency 'rake', '~> 10.0'
|
52
38
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
@@ -57,7 +43,6 @@ Gem::Specification.new do |spec|
|
|
57
43
|
spec.add_development_dependency 'httpclient'
|
58
44
|
spec.add_development_dependency 'mongo'
|
59
45
|
spec.add_development_dependency 'mysql2'
|
60
|
-
spec.add_development_dependency 'net_http_unix', '~> 0.2'
|
61
46
|
spec.add_development_dependency 'pg', '~> 0.20'
|
62
47
|
spec.add_development_dependency 'rack-test'
|
63
48
|
spec.add_development_dependency 'rubocop'
|
@@ -73,7 +58,6 @@ Gem::Specification.new do |spec|
|
|
73
58
|
spec.add_dependency('concurrent-ruby', '~> 1.0')
|
74
59
|
spec.add_dependency('delegate_matcher', '~> 0.4')
|
75
60
|
spec.add_dependency('faraday', '~> 0.8')
|
76
|
-
spec.add_dependency('google-protobuf', '>= 3.5.0', '< 4.0')
|
77
61
|
spec.add_dependency('net_http_unix', '~> 0.2')
|
78
62
|
spec.add_dependency('rufus-scheduler', '~> 3.0')
|
79
63
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stackify-ruby-apm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stackify
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-05-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -38,34 +38,6 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rubocop-performance
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: google-protobuf
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 3.5.0
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: 3.5.0
|
69
41
|
- !ruby/object:Gem::Dependency
|
70
42
|
name: bundler
|
71
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -206,20 +178,6 @@ dependencies:
|
|
206
178
|
- - ">="
|
207
179
|
- !ruby/object:Gem::Version
|
208
180
|
version: '0'
|
209
|
-
- !ruby/object:Gem::Dependency
|
210
|
-
name: net_http_unix
|
211
|
-
requirement: !ruby/object:Gem::Requirement
|
212
|
-
requirements:
|
213
|
-
- - "~>"
|
214
|
-
- !ruby/object:Gem::Version
|
215
|
-
version: '0.2'
|
216
|
-
type: :development
|
217
|
-
prerelease: false
|
218
|
-
version_requirements: !ruby/object:Gem::Requirement
|
219
|
-
requirements:
|
220
|
-
- - "~>"
|
221
|
-
- !ruby/object:Gem::Version
|
222
|
-
version: '0.2'
|
223
181
|
- !ruby/object:Gem::Dependency
|
224
182
|
name: pg
|
225
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -416,26 +374,6 @@ dependencies:
|
|
416
374
|
- - "~>"
|
417
375
|
- !ruby/object:Gem::Version
|
418
376
|
version: '0.8'
|
419
|
-
- !ruby/object:Gem::Dependency
|
420
|
-
name: google-protobuf
|
421
|
-
requirement: !ruby/object:Gem::Requirement
|
422
|
-
requirements:
|
423
|
-
- - ">="
|
424
|
-
- !ruby/object:Gem::Version
|
425
|
-
version: 3.5.0
|
426
|
-
- - "<"
|
427
|
-
- !ruby/object:Gem::Version
|
428
|
-
version: '4.0'
|
429
|
-
type: :runtime
|
430
|
-
prerelease: false
|
431
|
-
version_requirements: !ruby/object:Gem::Requirement
|
432
|
-
requirements:
|
433
|
-
- - ">="
|
434
|
-
- !ruby/object:Gem::Version
|
435
|
-
version: 3.5.0
|
436
|
-
- - "<"
|
437
|
-
- !ruby/object:Gem::Version
|
438
|
-
version: '4.0'
|
439
377
|
- !ruby/object:Gem::Dependency
|
440
378
|
name: net_http_unix
|
441
379
|
requirement: !ruby/object:Gem::Requirement
|
@@ -526,6 +464,7 @@ files:
|
|
526
464
|
- lib/stackify_apm/spies/net_http.rb
|
527
465
|
- lib/stackify_apm/spies/redis.rb
|
528
466
|
- lib/stackify_apm/spies/sequel.rb
|
467
|
+
- lib/stackify_apm/spies/sidekiq.rb
|
529
468
|
- lib/stackify_apm/spies/sinatra.rb
|
530
469
|
- lib/stackify_apm/spies/sinatra_activerecord/mysql_adapter.rb
|
531
470
|
- lib/stackify_apm/spies/sinatra_activerecord/postgresql_adapter.rb
|